本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
如果您希望集成線上服務、驗證性能、或者將訓練好的模型提供給其他系統調用,您可以將PAI-TF模型導出并部署。本文為您介紹PAI-TF模型導出和部署相關說明,包括導出SaveModel通用模型、保存和恢復檢查點以及如何將TF模型部署到EAS。
公共云GPU服務器即將過保下線,您可以繼續提交CPU版本的TensorFlow任務。如需使用GPU進行模型訓練,請前往DLC提交任務,具體操作請參見創建訓練任務。
導出SaveModel通用模型
SavedModel格式
SavedModel是目前官方推薦的模型保存的格式(SessionBundle自Tensorflow 1.0以后不再推薦使用),目錄結構如下。
assets/assets.extra/variables/ variables.data-xxxxx-of-xxxxx variables.indexsaved_model.pb
目錄中各個子目錄和文件的含義請參見TensorFlow SavedModel官方文檔或介紹。
導出SavedModel
代碼片段:
class Softmax(object): def __init__(self): self.weights_ = tf.Variable(tf.zeros([FLAGS.image_size, FLAGS.num_classes]), name='weights') self.biases_ = tf.Variable(tf.zeros([FLAGS.num_classes]), name='biases') def signature_def(self): images = tf.placeholder(tf.uint8, [None, FLAGS.image_size], name='input') normalized_images = tf.scalar_mul(1.0 / FLAGS.image_depth, tf.to_float(images)) scores = self.scores(normalized_images) tensor_info_x = tf.saved_model.utils.build_tensor_info(images) tensor_info_y = tf.saved_model.utils.build_tensor_info(scores) return tf.saved_model.signature_def_utils.build_signature_def( inputs={'images': tensor_info_x}, outputs={'scores': tensor_info_y}, method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME) def savedmodel(self, sess, signature, path): export_dir = os.path.join(path, str(FLAGS.model_version)) builder = tf.saved_model.builder.SavedModelBuilder(export_dir) builder.add_meta_graph_and_variables( sess, [tf.saved_model.tag_constants.SERVING], signature_def_map={ 'predict_images': signature, }, clear_devices=True) builder.save() model = Softmax() signature = model.signature_def() model.savedmodel(sess, signature, mnist.export_path())
代碼說明:
Softmax類封裝了機器學習模型,其中weights和biases是其最主要的模型參數。
signature_def方法描述了預測時,如何從一個placeholder經過數據標準化和前向計算得到輸出的邏輯,并分別作為輸入和輸出構建出一個SignatureDef。
導出SavedModel至OSS:
訓練并導出模型的命令如下。
PAI -name tensorflow -Dscript="file://path/to/mnist_savedmodel_oss.py" -Dbuckets="oss://mnistdataset/?host=oss-test.aliyun-inc.com&role_arn=acs:ram::127488******:role/odps" -DcheckpointDir="oss://mnistdataset/?host=oss-test.aliyun-inc.com&role_arn=acs:ram::127488*********:role/odps";
保存和恢復檢查點
Checkpoint存儲
非交互式TensorFlow存儲模型的示例程序如下。
# -*- coding: utf-8 -*- # usage # pai -name tensorflow -DcheckpointDir="oss://tftest/examples/?host=oss-test.aliyun-inc.com&role_arn=acs:ram::****:role/odps" -Dscript="file:///path/to/save_model.py"; import tensorflow as tf import json import os tf.app.flags.DEFINE_string("checkpointDir", "", "oss info") FLAGS = tf.app.flags.FLAGS print("checkpoint dir:" + FLAGS.checkpointDir) # 定義變量 counter = tf.Variable(1, name="counter") one = tf.constant(2) sum = tf.add(counter, one) new_counter = tf.assign(counter, sum) saver = tf.train.Saver() init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) ret = sess.run(new_counter) print("Counter:%d" % ret) ckp_path = os.path.join(FLAGS.checkpointDir, "model.ckpt") save_path = saver.save(sess, ckp_path) print("Model saved in file: %s" % save_path) coord.request_stop() coord.join(threads)
tf.app.flags.DEFINE_string()和tf.app.flags.FLAGS可以獲取PAI命令中的checkpointDir參數,checkpointDir指定了模型將要存儲到OSS上。
以下代碼完成了new_counter的計算,并將名稱為counter的變量存儲到模型中(值為3),save_path = saver.save(sess, ckp_path)將模型寫到OSS指定路徑。
ret = sess.run(new_counter) print("Counter:%d" % ret) ckp_path = os.path.join(FLAGS.checkpointDir, "model.ckpt") save_path = saver.save(sess, ckp_path) print("Model saved in file: %s" % save_path)
Checkpoint恢復
TensorFlow的Saver類也可以用于模型的恢復,TensorFlow恢復模型的示例如下。
# -*- coding: utf-8 -*- # usage # pai -name tensorflow -Dbuckets="oss://tftest/examples/?host=oss-test.aliyun-inc.com&role_arn=acs:ram::***:role/odps" -Dscript="file:///path/to/restore_model.py"; import tensorflow as tf import json import os tf.app.flags.DEFINE_string("buckets", "", "oss info") FLAGS = tf.app.flags.FLAGS print("buckets:" + FLAGS.buckets) # 定義變量 counter = tf.Variable(1, name="counter") saver = tf.train.Saver() init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) ret = sess.run(counter) print("Before restore counter:%d" % ret) print("Model restore from file") ckp_path = os.path.join(FLAGS.buckets, "model.ckpt") saver.restore(sess, ckp_path) ret = sess.run(counter) print("After restore counter:%d" % ret) coord.request_stop() coord.join(threads)
tf.app.flags.DEFINE_string()和tf.app.flags.FLAGS可以獲取PAI命令中的buckets參數,buckets指定了模型將要從OSS上恢復模型。
以下代碼中,首先定義了名稱counter的變量,初始值為1。調用saver.restore(sess, ckp_path),根據給定的OSS路徑恢復已存儲的模型,最后執行ret = sess.run(counter)得到恢復后的變量的值也是3。
ret = sess.run(counter) print("Before restore counter:%d" % ret) print("Model restore from file") ckp_path = os.path.join(FLAGS.buckets, "model.ckpt") saver.restore(sess, ckp_path) ret = sess.run(counter) print("After restore counter:%d" % ret)
TF模型部署到EAS
EAS是PAI平臺自研的模型部署工具,支持深度學習框架生成的模型,特別是部署TensorFlow SavedModel函數生成的模型。EAS有兩種模型部署方式,一種是通過EAS的線上服務進行部署,另一種是通過EASCMD進行部署:
線上服務部署方式
將模型存儲于OSS中。具體操作,請參見控制臺上傳文件。
進入模型在線服務(EAS)頁面。
登錄PAI控制臺。
在左側導航欄單擊工作空間列表,在工作空間列表頁面中單擊待操作的工作空間名稱,進入對應的工作空間。
在工作空間頁面的左側導航欄選擇 ,進入模型在線服務(EAS)頁面。
在模型在線服務(EAS)頁面,單擊部署服務。
在部署服務頁面,配置以下關鍵參數,更多參數配置詳情,請參見服務部署:控制臺。
部署方式:選擇模型+processor部署服務。
模型文件:選中OSS掛載,并選擇模型文件所在的OSS路徑。
Processor種類:選擇TensorFlow1.12或TensorFlow1.14。
單擊部署。
系統會把SavedModel格式的TensorFlow模型打包上傳,完成模型服務的部署。
EASCMD部署方式
詳情請參見服務部署:EASCMD或DSW