快速入门
概述
本文档将会通过手写识别体 MNIST 样例来带你快速入门 TaaS 平台的基本功能,包括:
- 数据存储操作:从创建存储到存储基本操作。
- 项目管理:从新建项目、基于项目管理模型训练任务到跟踪模型训练进度。
- 模型训练任务:创建模型训练任务、查看训练状态和日志相关操作,以及如何导出最终训练得到的模型。
- 模型托管:基于上面导出的 MNIST 模型来启动一个托管 Serving,然后演示如何编写 gRPC 或者 RESTful 的 client 端代码来访问模型托管 Serving。
本文档中涉及到的代码可以参考 GitHub 上 caicloud/tensorflow-tutorials 中的 mnist 样例目录。
登录 TaaS 平台
在浏览器中输入 taas.caicloud.io 打开 TaaS 公有云平台,输入用户名和密码,登录,
数据存储操作
更多详情请参考数据存储。
进入 TaaS 操作平台后,点击左边的菜单栏的[数据存储],
用户 taasdemo 当前还没有存储,点击页面中间的[新增存储]按钮,选择要创建的存储空间大小配置,
选好配置之后,点击[确定]按钮,后台会为你动态分配一份固定大小的存储空间。
静候片刻,存储便创建好了,
存储创建成功后,我们便可以上传文件或者进行在线文件操作。但我们现在可以什么都不做。此时,我们可以去创建一个项目,然后启动模型训练任务了。
项目管理
更多详情请参考项目管理
点击 TaaS 平台左边菜单栏的[TensorFlow 模型训练],
点击页面中间的[新增项目]按钮,输入项目名称 mnist,
点击确定后,项目创建成功。项目列表中会显示项目名称,该项目下当前包含多少正在等待、正在训练或者训练成功的模型训练任务。
点击该项目,便可以进入项目详情页面。
该项目当前是空的,我们此时便可以开始创建模型训练任务了。
模型训练任务
更多详情请参考模型训练任务
创建模型训练任务
TaaS 平台内置了手写识别体 MNIST 样例任务,我们可以通过该样例任务来快速体验 TaaS 平台的功能。点击项目详情页面中间的[+TensorFlow 模型训练]按钮。
资源配置中选择的是分布式 TensorFlow 集群的每个计算服务器的资源配置(参考分布式 TensorFlow 工作原理大致介绍)。
应用代码来源选择 Example,表示使用内置样例任务。选择 mnist 样例任务,
在运行参数中设置计算服务器个数、参数服务器个数、训练轮数以及训练日志的自动保存路径。内置的 MNIST 样例任务有个命令行参数 export_dir
用于指定训练模型的导出路径(这里设置为数据存储的路径 /caicloud/taasdemo/saved_model,其中 /caicloud/taasdemo 是当前用户 taasdemo 的数据存储固定路径前缀)。
点击[确定]按钮提交模型训练任务。
模型训练任务详情
刚提交的模型训练任务便放入到等待调度的队列中了,
点击该任务可以查看任务的详细情况,下图是任务已经开始调度执行后的详情页面,
还有该任务申请的资源的使用情况监控图,
拉到页面最下面,我们可以查看每个计算服务器的训练日志,
模型训练结束后,
点击页面顶端导航栏的返回箭头(下图红色标记),
返回到项目 mnist 的详情页面,
切换到项目总览,我们看到刚刚执行的任务训练得到的模型的正确率。当不断调整模型训练的参数来创建更多模型训练任务之后,我们便可以通过项目总览页面来查看该项目的模型训练变化进展。
训练日志和模型
现在我们切换回到我们数据存储页面,多了两个目录:
- logs:TaaS 平台自动保存我们刚刚模型训练任务的训练日志和 checkpoint 文件。
- saved_model:保存了我们训练得到的模型文件。
训练日志路径 /caicloud/taasdemo/logs/mnist01,
保存的最终训练得到的模型文件,
有了训练模型,我们便可以启动模型托管 Serving 了。
模型托管
更多详情请参考模型托管
在 TaaS 平台左边菜单栏点击[TensorFlow 模型托管],
创建模型托管 Serving
点击页面中间的[+TensorFlow 模型托管]按钮来创建新的模型托管 Serving。填写 Serving 名称为 mnist-serving。
模型信息中填写模型托管 Serving 的信息,
- 模型来源:选择“自定义”表示使用任务训练得到的模型。“样例”是内置的模型。
- 模型路径:添加我们刚刚训练得到的模型的路径 /caicloud/taasdemo/saved_model。
- 扩展库文件:用于填写自己编写的 TensorFlow Operation 的 C++ 扩展包(.so 文件),此处我们没有,不需要填写。
- gRPC 最大并行数:表示启动的 Serving 同时最多能处理多少 gRPC 请求。
- 描述信息:模型托管 Serving 的详细描述信息。
选择托管 Serving 所需的资源配置,
点击[确定]按钮提交。
模型托管详情
提交的模型托管 Serving 有需要一小会启动过程,
模型托管 Serving 启动好之后,提供了 gRPC 和 RESTful API 服务地址,
点击该模型托管可以查看具体详情,
现在可以编写访问 gRPC 或者 RESTful API 的 client 端代码。
gRPC 的 client 端代码
关于 caicloud.clever.serving.client.GRPCClient 类
TaaS 平台的本地开发包 caicloud.tensorflow 提供 caicloud.clever.serving.client.GRPCClient
类用于调用模型托管 Serving 的 gRPC 服务。
GRPCClient
类提供了下面两个方法:
__init__(endpoint)
:创建一个 gRPC client 请求对象。
参数
endpoint
为托管模型 Serving 的 gRPC 服务地址。call_predict(inputs, output_filter=None)
:执行 gRPC 请求,执行托管模型的预测方法。
参数
inputs
为输入 tensor 别名到实际输入值的字典;参数
output_filter
用于过滤托管模型计算的输出 tensor,默认为None
,表示计算所有输出 tensor。返回最终托管模型计算的输出 tensor 别名到实际输出值的字典。
如果没有安装 caicloud.tensorflow,先运行下面命令进行安装,
$ sudo pip install caicloud.tensorflow
mnist-serving 的 gRPC client
MNIST 样例任务得到的模型的输入和输出分别是:
- 输入:名称 image,接收 mnist 数据集一张 28*28 图片的像素值。
- 输出:名称 logits,对输入图片分析得到的该图片分别属于哪个数字的概率。
于是,访问模型托管 mnist-serving 的 gRPC client 代码如下:
import tensorflow as tf
from caicloud.clever.serving.client import grpc_client as serving_grpc_client
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets as input_data
client = serving_grpc_client.GRPCClient('192.168.16.42:31372')
# loading mnist data
print("Loading mnist data...")
mnist = input_data("/tmp/mnist-data", one_hot=True)
# prepare request input data
input_data = mnist.test.images[0]
input_data_shape = [1, mnist.test.images[0].size]
inputs = {
'image': tf.contrib.util.make_tensor_proto(input_data, shape=input_data_shape),
}
# call client.call_predict() to do predict.
outputs = client.call_predict(inputs)
# get output: logits
result = tf.contrib.util.make_ndarray(outputs["logits"])
print('logits: {0}'.format(result))
将该代码保存到文件 grpc_client.py 文件,然后运行,
bash-3.2$ python grpc_client.py
Loading mnist data...
Extracting /tmp/mnist-data/train-images-idx3-ubyte.gz
Extracting /tmp/mnist-data/train-labels-idx1-ubyte.gz
Extracting /tmp/mnist-data/t10k-images-idx3-ubyte.gz
Extracting /tmp/mnist-data/t10k-labels-idx1-ubyte.gz
logits: [[-0.37270582 -7.31677485 -0.04589005 2.54814148 -2.60255098 -1.18702579
-5.90019894 8.67759323 -0.52831918 2.18874288]]
RESTful API 的 client 端代码
关于 caicloud.clever.serving.client.RESTfulClient 类
TaaS 平台的本地开发包 caicloud.tensorflow 提供 caicloud.clever.serving.client.RESTfulClient
类用于调用模型托管 Serving 的 RESTful API。
RESTfulClient
类提供了下面两个方法:
__init__(host)
:创建一个 Serving RESTful API 请求客户端对象。
参数
host
为托管模型 Serving RESTful API 服务地址。call_predict(inputs, output_filter=None)
:执行 RESTful API 请求,执行托管模型的预测方法。
参数
inputs
为输入 tensor 别名到实际输入值的字典;参数
output_filter
用于过滤托管模型计算的输出 tensor,默认为None
,表示计算所有输出 tensor。返回最终托管模型计算的输出 tensor 别名到实际输出值的字典。
如果还没有安装 caicloud.tensorflow 包,则通过下面命令进行安装,
$ sudo pip install caicloud.tensorflow
mnist-serving 的 RESTful Client
我们使用 caicloud.clever.serving.client.RESTfulClient
来实现访问模型托管 mnist-serving RESTful API 的 client 端代码,
import tensorflow as tf
from caicloud.clever.serving.client import restful_client
from caicloud.clever.serving.client import serving_error
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets as input_data
client = restful_client.RESTfulClient('192.168.16.42:32638')
# loading mnist data
print("Loading mnist data...")
mnist = input_data("/tmp/mnist-data", one_hot=True)
# prepare request input data
input_data = mnist.test.images[0]
input_data_shape = [1, mnist.test.images[0].size]
inputs = {
'image': tf.contrib.util.make_tensor_proto(input_data, shape=input_data_shape),
}
try:
# call client.call_predict() to do model predict.
outputs = client.call_predict(inputs)
# get output: logits
result = tf.contrib.util.make_ndarray(outputs["logits"])
print('logits: {0}'.format(result))
except serving_error.ServingRESTfulError as e:
print('serving error,\n status: {0},\n reason: {1},\n body: {2}'.format(e.status, e.reason, e.body))
将上面代码保存到 restful_clieint.py 文件,然后运行,
bash-3.2$ python restful_client.py
Loading mnist data...
Extracting /tmp/mnist-data/train-images-idx3-ubyte.gz
Extracting /tmp/mnist-data/train-labels-idx1-ubyte.gz
Extracting /tmp/mnist-data/t10k-images-idx3-ubyte.gz
Extracting /tmp/mnist-data/t10k-labels-idx1-ubyte.gz
logits: [[-0.37270582 -7.31677485 -0.04589005 2.54814148 -2.60255098 -1.18702579
-5.90019894 8.67759323 -0.52831918 2.18874288]]