快速入门

概述

本文档将会通过手写识别体 MNIST 样例来带你快速入门 TaaS 平台的基本功能,包括:

  • 数据存储操作:从创建存储到存储基本操作。
  • 项目管理:从新建项目、基于项目管理模型训练任务到跟踪模型训练进度。
  • 模型训练任务:创建模型训练任务、查看训练状态和日志相关操作,以及如何导出最终训练得到的模型。
  • 模型托管:基于上面导出的 MNIST 模型来启动一个托管 Serving,然后演示如何编写 gRPC 或者 RESTful 的 client 端代码来访问模型托管 Serving。

本文档中涉及到的代码可以参考 GitHub 上 caicloud/tensorflow-tutorials 中的 mnist 样例目录

登录 TaaS 平台

在浏览器中输入 taas.caicloud.io 打开 TaaS 公有云平台,输入用户名和密码,登录,

PNG

数据存储操作

更多详情请参考数据存储

进入 TaaS 操作平台后,点击左边的菜单栏的[数据存储],

PNG

用户 taasdemo 当前还没有存储,点击页面中间的[新增存储]按钮,选择要创建的存储空间大小配置,

PNG

选好配置之后,点击[确定]按钮,后台会为你动态分配一份固定大小的存储空间。

PNG

静候片刻,存储便创建好了,

PNG

存储创建成功后,我们便可以上传文件或者进行在线文件操作。但我们现在可以什么都不做。此时,我们可以去创建一个项目,然后启动模型训练任务了。

项目管理

更多详情请参考项目管理

点击 TaaS 平台左边菜单栏的[TensorFlow 模型训练],

PNG

点击页面中间的[新增项目]按钮,输入项目名称 mnist,

PNG

点击确定后,项目创建成功。项目列表中会显示项目名称,该项目下当前包含多少正在等待、正在训练或者训练成功的模型训练任务。

PNG

点击该项目,便可以进入项目详情页面。

PNG

该项目当前是空的,我们此时便可以开始创建模型训练任务了。

模型训练任务

更多详情请参考模型训练任务

创建模型训练任务

TaaS 平台内置了手写识别体 MNIST 样例任务,我们可以通过该样例任务来快速体验 TaaS 平台的功能。点击项目详情页面中间的[+TensorFlow 模型训练]按钮。

资源配置中选择的是分布式 TensorFlow 集群的每个计算服务器的资源配置(参考分布式 TensorFlow 工作原理大致介绍)。

PNG

应用代码来源选择 Example,表示使用内置样例任务。选择 mnist 样例任务,

PNG

在运行参数中设置计算服务器个数、参数服务器个数、训练轮数以及训练日志的自动保存路径。内置的 MNIST 样例任务有个命令行参数 export_dir 用于指定训练模型的导出路径(这里设置为数据存储的路径 /caicloud/taasdemo/saved_model,其中 /caicloud/taasdemo 是当前用户 taasdemo 的数据存储固定路径前缀)。

PNG

点击[确定]按钮提交模型训练任务。

模型训练任务详情

刚提交的模型训练任务便放入到等待调度的队列中了,

PNG

点击该任务可以查看任务的详细情况,下图是任务已经开始调度执行后的详情页面,

PNG

还有该任务申请的资源的使用情况监控图,

PNG

拉到页面最下面,我们可以查看每个计算服务器的训练日志,

PNG

模型训练结束后,

PNG

点击页面顶端导航栏的返回箭头(下图红色标记),

PNG

返回到项目 mnist 的详情页面,

PNG

切换到项目总览,我们看到刚刚执行的任务训练得到的模型的正确率。当不断调整模型训练的参数来创建更多模型训练任务之后,我们便可以通过项目总览页面来查看该项目的模型训练变化进展。

PNG

训练日志和模型

现在我们切换回到我们数据存储页面,多了两个目录:

  • logs:TaaS 平台自动保存我们刚刚模型训练任务的训练日志和 checkpoint 文件。
  • saved_model:保存了我们训练得到的模型文件。

PNG

训练日志路径 /caicloud/taasdemo/logs/mnist01,

PNG

保存的最终训练得到的模型文件,

PNG

有了训练模型,我们便可以启动模型托管 Serving 了。

模型托管

更多详情请参考模型托管

在 TaaS 平台左边菜单栏点击[TensorFlow 模型托管],

PNG

创建模型托管 Serving

点击页面中间的[+TensorFlow 模型托管]按钮来创建新的模型托管 Serving。填写 Serving 名称为 mnist-serving。

PNG

模型信息中填写模型托管 Serving 的信息,

  • 模型来源:选择“自定义”表示使用任务训练得到的模型。“样例”是内置的模型。
  • 模型路径:添加我们刚刚训练得到的模型的路径 /caicloud/taasdemo/saved_model。
  • 扩展库文件:用于填写自己编写的 TensorFlow Operation 的 C++ 扩展包(.so 文件),此处我们没有,不需要填写。
  • gRPC 最大并行数:表示启动的 Serving 同时最多能处理多少 gRPC 请求。
  • 描述信息:模型托管 Serving 的详细描述信息。

PNG

选择托管 Serving 所需的资源配置,

PNG

点击[确定]按钮提交。

模型托管详情

提交的模型托管 Serving 有需要一小会启动过程,

PNG

模型托管 Serving 启动好之后,提供了 gRPC 和 RESTful API 服务地址,

PNG

点击该模型托管可以查看具体详情,

PNG

现在可以编写访问 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]]

results matching ""

    No results matching ""