直接使用
请打开介绍如何在DSW中使用EAS命令行工具,并点击右上角 “ 在DSW中打开” 。
概述
针对在线推理场景,PAI平台提供了在线预测服务PAI-EAS(Elastic Algorithm Service),支持基于异构硬件(CPU和GPU)的模型加载和数据请求的实时响应。通过PAI-EAS,您可以将模型快速部署为RESTful API,再通过HTTP请求的方式调用该服务。
同时,您可以使用EAS提供的命令工具:eascmd,来管理PAI-EAS服务。本文为您介绍如何使用eascmd客户端上传文件、创建服务、查看服务列表。以及,使用EAS的预测SDK,来用代码调用EAS服务。
前提条件
试用本文档介绍的内容前,请先确认您的账号满足以下条件:
- 开通PAI-EAS(同时会拥有公共资源组),详情见:《开通及购买》
- 已获取阿里云账户的AccessKey ID和AccessKey Secret,详情请参见获取AccessKey。
- 当前使用的JupyterLab环境,安装了 eascmd,安装步骤可参考:下载并认证客户端(如果您使用PAI-DSW,初始镜像中已预置该CLI)
- 因示例代码中用到了一些python库,请按需决定是否执行以下python包的安装命令
部署前准备工作
步骤一:安装示例需要的Python包
# --------如果需要切换至国内pypi源请取消以下注释-------- # !pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 本示例需要 tensorflow2.6 以上版本,如果您的DSW版本低于此要求,请升级相关python库 # --------可以取消以下注释,运行并安装相应python库-------- # !pip install tensorflow tensorflow_datasets # !pip install opencv-python !pip install eas-prediction
步骤二:训练并产出一个模型
我们参考tensorflow的基础示例(https://www.tensorflow.org/datasets/keras_example ),来训练一个模型,以便演示EAS的使用流程。
import tensorflow as tf import tensorflow_datasets as tfds (ds_train, ds_test), ds_info = tfds.load( 'mnist', split=['train', 'test'], data_dir='./cached_datasets', shuffle_files=True, as_supervised=True, with_info=True, ) def normalize_img(image, label): """Normalizes images: `uint8` -> `float32`.""" return tf.cast(image, tf.float32) / 255., label ds_train = ds_train.map( normalize_img, num_parallel_calls=tf.data.AUTOTUNE) ds_train = ds_train.cache() ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples) ds_train = ds_train.batch(128) ds_train = ds_train.prefetch(tf.data.AUTOTUNE) ds_test = ds_test.map(normalize_img, num_parallel_calls=tf.data.AUTOTUNE) ds_test = ds_test.batch(128) ds_test = ds_test.cache() ds_test = ds_test.prefetch(tf.data.AUTOTUNE)
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10) ]) model.compile( optimizer=tf.keras.optimizers.Adam(0.001), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=[tf.keras.metrics.SparseCategoricalAccuracy()], ) model.fit( ds_train, epochs=6, validation_data=ds_test, ) model.save('./eas_demo_output')
至此,我们已经训练了一个简单的tensorflow模型,并输出到目录:./eas_demo_output/
下一步,我们会将这个模型部署到EAS,并验证服务的正常。
部署模型到EAS(基于eascmd)
PAI-EAS提供了eascmd客户端管理工具,可以对服务进行创建、修改、切换、删除等操作。
步骤一:认证客户端
使用eascmd客户端之前,需要下载此客户端,并完成用户认证。 关于客户端下载和认证,详细可参考:《下载并认证客户端》
假如用户使用PAI-DSW产品,实例镜像内已预置了eascmd,可补全以下命令后,运行完成认证:
# --------需要完善命令信息,并取消代码注释后再运行-------- # !eascmd64 config -i <yourAccessKeyID> -k <yourAccessKeySecret> [-e <yourEndpoint|pai-eas.cn-shanghai.aliyuncs.com>]
- yourAccessKeyID - 阿里云账号的AccessKey ID。
- yourAccessKeySecret - 阿里云账号的AccessKey Secret。
- yourEndpoint - 默认的PAI-EAS服务地域为华东2(上海),如果需要将模型部署至其它地域,可以使用-e参数指定地域对应的Endpoint
步骤二:打包并上传模型
# !eascmd64 upload eas_demo_output.tar.gz --inner
步骤三:创建EAS服务
# !eascmd64 create eas_demo_service_desc.json
步骤四:查看EAS服务状态
# !eascmd64 ls
调用EAS服务进行预测
步骤一:创建测试样本
# import tensorflow.compat.v2 as tf import tensorflow_datasets as tfds import matplotlib.pyplot as plt import numpy as np # Construct a tf.data.Dataset ds = tfds.load('mnist', split='train', shuffle_files=False) # Build your input pipeline ds = ds.shuffle(1024).take(1) target = [] for example in ds.take(3): image, label = example['image'], example['label'] print(label) target = np.reshape(image, 784) plt.imshow(tf.squeeze(image)) plt.show()
tf.Tensor(3, shape=(), dtype=int64)
2022-06-23 19:56:30.621935: W tensorflow/core/kernels/data/cache_dataset_ops.cc:856] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
步骤二:进行在线预测
使用eas_prediction,调用已部署的服务。详细信息请参考公网地址调用
#!/usr/bin/env python from eas_prediction import PredictClient, TFRequest # http://1848217*********.cn-shanghai.pai-eas.aliyuncs.com/api/predict/kears_model client = PredictClient('http://1157703270994901.cn-shanghai.pai-eas.aliyuncs.com', 'dsw_deploy_model_sample_1') # 注意上面的client = PredictClient()内填入的信息,是通过对调用信息窗口(下图)中获取的访问地址的拆分 client.set_token('MjNiNzJmNWRlYjdkNjgxYjY1YTNkMGY4NDhhNjNmMjI5ZjhjM2E0MQ==') # Token信息在“EAS控制台—服务列表—服务—调用信息—公网地址调用—Token”中获取 client.init() req = TFRequest('serving_default') # signature_name 参数:serving_default req.add_feed('flatten_input', [1, 28, 28], TFRequest.DT_FLOAT, target) resp = client.predict(req) print((resp.response.outputs).keys)
<bound method Mapping.keys of {'dense_1': dtype: DT_FLOAT array_shape { dim: 1 dim: 10 } float_val: -2063.09912109375 float_val: 125.97838592529297 float_val: -99.17234802246094 float_val: 956.5430908203125 float_val: -1272.6309814453125 float_val: -2213.461181640625 float_val: -2570.403076171875 float_val: 1942.651611328125 float_val: -1032.1619873046875 float_val: -217.21417236328125 }>