全部产品
云市场
云游戏

PAI-TF模型导出和部署说明

更新时间:2020-02-25 11:55:17

目录

导出SaveModel通用模型

1. SavedModel格式

SessionBundle自Tensorflow1.0以后不再推荐使用,SavedModel是目前官方推荐的模型保存的格式,SavedModel目录结构如下:

  1. assets/
  2. assets.extra/
  3. variables/
  4. variables.data-?????-of-?????
  5. variables.index
  6. saved_model.pb

目录中各个子目录和文件的含义可以参见官方文档 或者介绍

2. 导出SavedModel

代码片段:

  1. class Softmax(object):
  2. def __init__(self):
  3. self.weights_ = tf.Variable(tf.zeros([FLAGS.image_size, FLAGS.num_classes]),
  4. name='weights')
  5. self.biases_ = tf.Variable(tf.zeros([FLAGS.num_classes]),
  6. name='biases')
  7. # ...
  8. def signature_def(self):
  9. images = tf.placeholder(tf.uint8, [None, FLAGS.image_size],
  10. name='input')
  11. normalized_images = tf.scalar_mul(1.0 / FLAGS.image_depth,
  12. tf.to_float(images))
  13. scores = self.scores(normalized_images)
  14. tensor_info_x = tf.saved_model.utils.build_tensor_info(images)
  15. tensor_info_y = tf.saved_model.utils.build_tensor_info(scores)
  16. return tf.saved_model.signature_def_utils.build_signature_def(
  17. inputs={'images': tensor_info_x},
  18. outputs={'scores': tensor_info_y},
  19. method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
  20. def savedmodel(self, sess, signature, path):
  21. export_dir = os.path.join(path, str(FLAGS.model_version))
  22. builder = tf.saved_model.builder.SavedModelBuilder(export_dir)
  23. builder.add_meta_graph_and_variables(
  24. sess, [tf.saved_model.tag_constants.SERVING],
  25. signature_def_map={
  26. 'predict_images':
  27. signature,
  28. },
  29. clear_devices=True)
  30. builder.save()
  31. #...
  32. model = Softmax()
  33. signature = model.signature_def()
  34. #...
  35. model.savedmodel(sess, signature, mnist.export_path())

代码说明:

  • Softmax 类封装了机器学习模型,其中 weights 和 biases 是其最主要模型参数;

  • signature_def 方法描述了预测时如何从一个 placeholder 经过数据标准化和前向计算得到输出的逻辑,并分别作为输入和输出构建出一个SignatureDef;

导出SavedModel至OSS

训练并导出模型的命令如下:

  1. pai -name tensorflow
  2. -Dscript="file://path/to/mnist_savedmodel_oss.py"
  3. -Dbuckets="oss://mnistdataset/?host=oss-test.aliyun-inc.com&role_arn=acs:ram::127488******:role/odps"
  4. -DcheckpointDir="oss://mnistdataset/?host=oss-test.aliyun-inc.com&role_arn=acs:ram::127488*********:role/odps";

保存和恢复检查点

Checkpoint存储

下面是非交互式TensorFlow存储模型的示例程序。

  1. # -*- coding: utf-8 -*-
  2. # usage
  3. # 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";
  4. import tensorflow as tf
  5. import json
  6. import os
  7. tf.app.flags.DEFINE_string("checkpointDir", "", "oss info")
  8. FLAGS = tf.app.flags.FLAGS
  9. print("checkpoint dir:" + FLAGS.checkpointDir)
  10. # 定义变量
  11. counter = tf.Variable(1, name="counter")
  12. one = tf.constant(2)
  13. sum = tf.add(counter, one)
  14. new_counter = tf.assign(counter, sum)
  15. saver = tf.train.Saver()
  16. init_op = tf.global_variables_initializer()
  17. with tf.Session() as sess:
  18. sess.run(init_op)
  19. coord = tf.train.Coordinator()
  20. threads = tf.train.start_queue_runners(coord=coord)
  21. ret = sess.run(new_counter)
  22. print("Counter:%d" % ret)
  23. ckp_path = os.path.join(FLAGS.checkpointDir, "model.ckpt")
  24. save_path = saver.save(sess, ckp_path)
  25. print("Model saved in file: %s" % save_path)
  26. coord.request_stop()
  27. coord.join(threads)

其中,

tf.app.flags.DEFINE_string()tf.app.flags.FLAGS可以获取PAI命令中的checkpointDir参数,checkpointDir指定了模型将要存储到Oss上。

  1. ret = sess.run(new_counter)
  2. print("Counter:%d" % ret)
  3. ckp_path = os.path.join(FLAGS.checkpointDir, "model.ckpt")
  4. save_path = saver.save(sess, ckp_path)
  5. print("Model saved in file: %s" % save_path)

这几句代码完成了new_counter的计算,并将名称为counter的Variable存储到模型中(值为3),save_path = saver.save(sess, ckp_path)将模型写到Oss指定路径。

Checkpoint恢复

TensorFlow的Saver类也可以用于模型的恢复,如下是TensorFlow恢复模型的例子:

  1. # -*- coding: utf-8 -*-
  2. # usage
  3. # 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";
  4. import tensorflow as tf
  5. import json
  6. import os
  7. tf.app.flags.DEFINE_string("buckets", "", "oss info")
  8. FLAGS = tf.app.flags.FLAGS
  9. print("buckets:" + FLAGS.buckets)
  10. # 定义变量
  11. counter = tf.Variable(1, name="counter")
  12. saver = tf.train.Saver()
  13. init_op = tf.global_variables_initializer()
  14. with tf.Session() as sess:
  15. sess.run(init_op)
  16. coord = tf.train.Coordinator()
  17. threads = tf.train.start_queue_runners(coord=coord)
  18. ret = sess.run(counter)
  19. print("Before restore counter:%d" % ret)
  20. print("Model restore from file")
  21. ckp_path = os.path.join(FLAGS.buckets, "model.ckpt")
  22. saver.restore(sess, ckp_path)
  23. ret = sess.run(counter)
  24. print("After restore counter:%d" % ret)
  25. coord.request_stop()
  26. coord.join(threads)

其中,

tf.app.flags.DEFINE_string()tf.app.flags.FLAGS可以获取PAI命令中的buckets参数,buckets指定了模型将要从Oss上恢复模型。

  1. ret = sess.run(counter)
  2. print("Before restore counter:%d" % ret)
  3. print("Model restore from file")
  4. ckp_path = os.path.join(FLAGS.buckets, "model.ckpt")
  5. saver.restore(sess, ckp_path)
  6. ret = sess.run(counter)
  7. print("After restore counter:%d" % ret)

在模型恢复这个例子中,我们首先定义了名称counter的Variable,初始值为1。调用saver.restore(sess, ckp_path)将根据给定的Oss路径恢复前面存储的模型,最后执行ret = sess.run(counter)可以得到恢复后的变量的值也是3。

TF模型部署到EAS

EAS是PAI平台自研的模型部署工具,支持深度学习框架生成的模型,特别是TensorFlow savemodel函数生成的模型的部署。EAS有两种模型部署方式,一种是通过PAI-EAS的线上服务进行部署,另一种是通过EAS CMD进行部署。

1.线上服务部署方式

首先用户需要将模型存储于OSS中,然后进入PAI控制台,选中左侧”EAS-模型在线服务“,在右侧的配制栏中将Processor种类设置为TensorFlow,把savemodel格式的TensorFlow模型打包上传即可完成模型服务的部署。

2.EAS CMD模型部署方式

可参考文档:https://help.aliyun.com/document_detail/111031.html