使用EAS Python SDK部署模型
本文為您介紹如何使用阿里云模型在線服務(wù)(EAS)的Python SDK代碼將訓(xùn)練獲得的模型部署為EAS在線服務(wù),再使用EAS的預(yù)測(cè)SDK代碼調(diào)用EAS服務(wù),實(shí)現(xiàn)模型在線推理。
背景信息
本文旨在介紹如何在Python環(huán)境中,通過SDK調(diào)用EAS接口來部署和調(diào)用基于MNIST數(shù)據(jù)集訓(xùn)練的手寫數(shù)字識(shí)別模型服務(wù)。MNIST數(shù)據(jù)集是手寫的數(shù)字0~9的數(shù)據(jù)集,本文會(huì)隨機(jī)選取一個(gè)手寫數(shù)字測(cè)試樣本并輸出其灰度圖像,以此作為輸入數(shù)據(jù)對(duì)模型進(jìn)行模擬預(yù)測(cè)。具體操作流程如下:
參考Tensorflow基礎(chǔ)示例,使用Python SDK代碼訓(xùn)練并產(chǎn)出一個(gè)模型。
使用Python SDK調(diào)用EAS客戶端命令,將訓(xùn)練獲得的模型部署為EAS在線服務(wù)。
創(chuàng)建測(cè)試樣本,對(duì)模型服務(wù)進(jìn)行預(yù)測(cè),驗(yàn)證模型效果。
前提條件
已創(chuàng)建OSS存儲(chǔ)空間(Bucket),用于存儲(chǔ)已獲得的模型文件和配置文件。關(guān)于如何創(chuàng)建存儲(chǔ)空間,詳情請(qǐng)參見創(chuàng)建存儲(chǔ)空間。
已準(zhǔn)備運(yùn)行Python SDK的環(huán)境,請(qǐng)選擇一種準(zhǔn)備即可。
(推薦)使用DSW實(shí)例的Notebook環(huán)境。建議創(chuàng)建DSW實(shí)例時(shí),鏡像選擇tensorflow:2.3-cpu-py36-ubuntu18.04,實(shí)例規(guī)格選擇ecs.c6.large,詳情請(qǐng)參見創(chuàng)建及管理DSW實(shí)例。
使用本地Python環(huán)境。建議Python 3.6或以上版本,編譯環(huán)境推薦使用JupyterLab。同時(shí)您需要在本地下載EASCMD客戶端并進(jìn)行身份認(rèn)證,詳情請(qǐng)參見下載并認(rèn)證客戶端。
步驟一:準(zhǔn)備模型
安裝Python SDK。后續(xù)將使用SDK調(diào)用EAS接口來部署和預(yù)測(cè)模型服務(wù)。
進(jìn)入Notebook頁(yè)面。
如果您使用的是DSW實(shí)例,首先需要單擊目標(biāo)實(shí)例操作列下的打開,打開DSW實(shí)例界面。在Notebook頁(yè)簽,單擊快速開始區(qū)域Notebook下的Python3,進(jìn)入Notebook編輯頁(yè)面,詳情請(qǐng)參見創(chuàng)建及管理DSW實(shí)例。
如果您使用的是本地Python環(huán)境,安裝Python及JupyterLab后,進(jìn)入JupyterLab編輯頁(yè)面。
在Notebook中,執(zhí)行以下代碼安裝Python SDK,安裝過程大約需要持續(xù)15分鐘。
! pip install tensorflow tensorflow_datasets ! pip install opencv-python ! pip install eas-prediction alibabacloud_eas20210701==1.1.2 --upgrade
說明回顯信息中出現(xiàn)的ERROR和WARNING信息可以忽略。
執(zhí)行以下命令驗(yàn)證是否安裝成功。
pip list
返回結(jié)果中,如果能看到
tensorflow
、tensorflow_datasets
、opencv-python
、eas-prediction
,則表示Python包安裝成功。
訓(xùn)練并產(chǎn)出一個(gè)模型。
在Notebook中,參考TensorFlow的基礎(chǔ)示例,執(zhí)行以下代碼來訓(xùn)練一個(gè)TensorFlow模型,并將訓(xùn)練獲得的模型文件輸出到當(dāng)前目錄下的
eas_demo_output3
目錄。訓(xùn)練過程大約需要持續(xù)20分鐘。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) 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(10) ds_test = ds_test.map(normalize_img) ds_test = ds_test.batch(128) ds_test = ds_test.cache() ds_test = ds_test.prefetch(10) 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_output3')
eas_demo_output3目錄下生成的模型文件如下圖所示。
步驟二:部署模型到EAS
在Notebook中,執(zhí)行以下代碼創(chuàng)建EAS的客戶端對(duì)象。后續(xù)將使用該對(duì)象調(diào)用EAS客戶端命令來創(chuàng)建模型服務(wù)。
from alibabacloud_eas20210701.client import Client as eas20210701Client from alibabacloud_tea_openapi import models as open_api_models from alibabacloud_eas20210701 import models as eas_20210701_models from alibabacloud_tea_util import models as util_models from alibabacloud_tea_util.client import Client as UtilClient from alibabacloud_eas20210701.models import (ListServicesRequest, CreateServiceRequest) access_key_id = "<AccessKey>" access_key_secret = "<AccessKeySecret>" import os.path config_path="/mnt/data/pai.config" if os.path.isfile(config_path): with open(config_path) as f: access_key_id = f.readline().strip('\n') access_key_secret = f.readline().strip('\n') config = open_api_models.Config( access_key_id=access_key_id, access_key_secret=access_key_secret ) # 訪問的域名 region = "cn-shanghai" config.endpoint = f'pai-eas.{region}.aliyuncs.com' eas_client = eas20210701Client(config)
其中關(guān)鍵參數(shù)配置如下。
參數(shù)
描述
region
服務(wù)即將部署的地域ID,詳情請(qǐng)參見地域和可用區(qū)。
本文示例值為:cn-shanghai。
說明region需要與OSS Bucket所在地域一致。否則后續(xù)創(chuàng)建EAS服務(wù)時(shí)讀取模型文件失敗。
access_key_id
需要配置您自己的AccessKey和AccessKeySecret。您可以使用阿里云賬號(hào)或RAM用戶來創(chuàng)建EAS客戶端對(duì)象,如何獲取AccessKey,詳情請(qǐng)參見如何獲取AccessKey。
本文以阿里云賬號(hào)為例,如果您使用RAM用戶,需要為RAM用戶授予EAS的操作權(quán)限,具體操作,請(qǐng)參見云產(chǎn)品依賴與授權(quán):EAS。
access_key_secret
準(zhǔn)備模型文件。
將已獲取的
eas_demo_output3
目錄下的所有文件按照下圖所示目錄結(jié)構(gòu)上傳到OSS Bucket中。如何上傳文件,詳情請(qǐng)參見控制臺(tái)上傳文件。在Notebook中,執(zhí)行以下代碼創(chuàng)建EAS服務(wù)。
import json resource_config = { "instance": 1, "memory": 7000, "cpu": 4} model_path = "oss://examplebucket/dsw/eas_demo_output3/" service_config = {"name": "service_from_dsw", "model_path": model_path, "processor": "tensorflow_cpu_2.4", "metadata": resource_config} print(json.dumps(service_config)) service1 = eas_client.create_service(CreateServiceRequest(body=json.dumps(service_config))).body print(service1)
其中關(guān)鍵參數(shù)配置如下。服務(wù)創(chuàng)建過程大約需要持續(xù)5分鐘,服務(wù)創(chuàng)建成功后,會(huì)在控制臺(tái)的PAI EAS模型在線服務(wù)頁(yè)面展示。
參數(shù)
描述
model_path
替換為您的模型文件所在的OSS Bucket路徑。
service_config.name
您可以自定義模型服務(wù)名稱,命名格式為:
只能包含數(shù)字、小寫字母以及下劃線,且必須以字母開頭。
模型服務(wù)名稱需唯一,不能與同地域內(nèi)其他服務(wù)名稱重復(fù)。
本文示例值為:service_from_dsw。
在Notebook中,執(zhí)行以下代碼查看EAS服務(wù)狀態(tài)。
說明cluster_id需要與上述步驟中配置的region保持一致。
service2 = eas_client.describe_service(cluster_id='cn-shanghai', service_name=service1.service_name).body print(service2.status)
當(dāng)返回結(jié)果為Running時(shí),表示服務(wù)創(chuàng)建成功。
步驟三:模擬預(yù)測(cè)
創(chuàng)建測(cè)試樣本。
在Notebook中,執(zhí)行以下代碼從MNIST數(shù)據(jù)集中隨機(jī)選取一個(gè)手寫數(shù)字測(cè)試樣本,并輸出其灰度圖像。每次執(zhí)行代碼會(huì)生成一個(gè)不同的數(shù)字圖像,后續(xù)您可以根據(jù)圖像中的數(shù)字來評(píng)估預(yù)測(cè)結(jié)果是否準(zhǔn)確。您也可以創(chuàng)建自己的測(cè)試數(shù)據(jù),進(jìn)行模擬預(yù)測(cè)。
# 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', data_dir='./cached_datasets', shuffle_files=False) # Build your input pipeline ds = ds.shuffle(1024).take(3) target = [] for example in ds.take(1): image, label = example['image'], example['label'] print(label) target = np.reshape(image, 784) plt.imshow(tf.squeeze(image)) plt.show()
系統(tǒng)返回結(jié)果如下圖所示。您的測(cè)試樣本輸出結(jié)果以實(shí)際為準(zhǔn)。
使用eas_prediction調(diào)用已部署的服務(wù),進(jìn)行在線預(yù)測(cè),具體操作步驟如下。
在Notebook中,執(zhí)行以下代碼查詢模型服務(wù)的詳細(xì)信息,包括:AccessToken、Endpoint等,后續(xù)通過該調(diào)用信息來調(diào)用服務(wù)進(jìn)行模擬測(cè)試。
service3 = eas_client.describe_service(cluster_id='cn-shanghai', service_name='service_from_dsw').body print(service3)
其中關(guān)鍵參數(shù)配置如下。
參數(shù)
描述
cluster_id
服務(wù)所在的地域名稱。
本文示例值為:cn-shanghai。
service_name
替換為上述步驟中部署的模型服務(wù)名稱。
本文示例值為:service_from_dsw。
系統(tǒng)輸出結(jié)果如下圖所示。您的輸出結(jié)果以實(shí)際為準(zhǔn)。
在Notebook中,執(zhí)行以下代碼構(gòu)造PredictClient對(duì)象來調(diào)用服務(wù)。
將步驟1中輸出的灰度圖像作為輸入數(shù)據(jù),使用步驟2中查詢的access_token、Endpoint等信息來調(diào)用服務(wù),并輸出預(yù)測(cè)結(jié)果。
from eas_prediction import PredictClient, TFRequest import urllib client = PredictClient(urllib.parse.urlsplit(service3.internet_endpoint).hostname, service3.service_name) client.set_token(service3.access_token) client.init() req = TFRequest('serving_default') # signature_name 參數(shù):serving_default req.add_feed('flatten_input', [1, 28, 28], TFRequest.DT_FLOAT, target) resp = client.predict(req) print((resp.response.outputs).keys)
預(yù)測(cè)結(jié)果如下圖所示。您的模型服務(wù)預(yù)測(cè)結(jié)果以實(shí)際為準(zhǔn)。
預(yù)測(cè)結(jié)果說明:
float_val從上到下表示數(shù)字0~9,float_val最大值所在的行位置表示預(yù)測(cè)結(jié)果。例如:上圖示例中,第一行float_val的值最大,預(yù)測(cè)結(jié)果為數(shù)字0,與測(cè)試樣本圖像中的數(shù)字一致。