华为云AI开发平台ModelArtsStep1 在Notebook中构建一个新镜像_云淘科技
本章节以ModelArts提供的基础镜像tensorflow为例介绍如何在ModelArts的Notebook中构建一个新镜像并用于AI应用部署。
创建Notebook实例
登录ModelArts控制台,在左侧导航栏中选择“全局配置”,检查是否配置了访问授权。若未配置,请先配置访问授权。参考使用委托授权完成操作。
登录ModelArts控制台,在左侧导航栏中选择“开发环境 > Notebook”,进入“Notebook”管理页面。
单击右上角“创建”,进入“创建Notebook”页面,请参见如下说明填写参数。
填写Notebook基本信息,包含名称、描述、是否自动停止。
填写Notebook详细参数,如选择镜像、资源规格等,如图1所示。
“镜像”:选择公共镜像下任意一个支持CPU类型的镜像,例如:tensorflow2.1-cuda10.1-cudnn7-ubuntu18.04
“资源池”:选择公共资源池或专属资源池,此处以公共资源池为例。
“类型”:推荐选择GPU。
“规格”:推荐选择T4规格,若没有再选择其他规格。
图1 创建Notebook实例
图2 选择资源类型和规格
参数填写完成后,单击“立即创建”进行规格确认。参数确认无误后,单击“提交”,完成Notebook的创建操作。
进入Notebook列表,正在创建中的Notebook状态为“创建中”,创建过程需要几分钟,请耐心等待。当Notebook状态变为“运行中”时,表示Notebook已创建并启动完成。
打开运行中的Notebook实例。
图3 打开Notebook实例
通过功能,上传dockerfile文件和模型包文件到Notebook中,默认工作目录/home/ma-user/work/。
dockerfile文件的具体内容可以参见Dockerfile模板。模型包文件需要用户自己准备,样例内容参见模型包文件样例。
图4 上传dockerfile文件和模型包文件
打开Terminal终端,解压model.zip,解压后删除zip文件。
#解压命令 unzip model.zip
图5 在Terminal终端中解压model.zip
打开一个新的.ipynb文件,启动构建脚本,在构建脚本中指定dockerfile文件和镜像的推送地址。构建脚本当前仅支持华为云北京四和上海一站点。
图6 启动构建脚本
构建脚本内容如下:
from modelarts.image_builder import ImageBuilder from modelarts.session import Session session = Session() image = ImageBuilder(session=session, dockerfile_path="/home/ma-user/work/Dockerfile", image_url="custom_test/tensorflow2.1:1.0.0",#custom_test是组织名,tensorflow2.1是镜像名称,1.0.0是tag context="/home/ma-user/work") result = image.build_push()
等待镜像构建完成。镜像构建完成后会自动推送到SWR中。
图7 等待镜像构建完成
Dockerfile模板
Dockerfile样例,此样例可以直接另存为一个Dockerfile文件使用。此处可以使用的基础镜像列表请参见推理基础镜像列表。
FROM swr.cn-north-4.myhuaweicloud.com/atelier/tensorflow_2_1:tensorflow_2.1.0-cuda_10.1-py_3.7-ubuntu_18.04-x86_64-20221121111529-d65d817 # here create a soft link from '/home/ma-user/anaconda/lib/python3.7/site-packages/model_service' to '/home/ma-user/infer/model_service'. It’s the build-in inference framework code dir # if the installed python version of this base image is python3.8, you should create a soft link from '/home/ma-user/anaconda/lib/python3.8/site-packages/model_service' to '/home/ma-user/infer/model_service'. USER root RUN ln -s /home/ma-user/anaconda/lib/python3.7/site-packages/model_service /home/ma-user/infer/model_service USER ma-user # here we supply a demo, you can change it to your own model files ADD model/ /home/ma-user/infer/model/1 USER root RUN chown -R ma-user:ma-group /home/ma-user/infer/model/1 USER ma-user # default MODELARTS_SSL_CLIENT_VERIFY switch is "true". In order to debug, we set it to be "false" ENV MODELARTS_SSL_CLIENT_VERIFY="false" # change your port and protocol here, default is 8443 and https # ENV MODELARTS_SERVICE_PORT=8080 # ENV MODELARTS_SSL_ENABLED="false" # add pip install here # RUN pip install numpy==1.16.4 # RUN pip install -r requirements.txt # default cmd, you can chage it here # CMD sh /home/ma-user/infer/run.sh
模型包文件样例
模型包文件model.zip中需要用户自己准备模型文件,此处仅是举例示意说明,以一个手写数字识别模型为例。
Model目录下必须要包含推理脚本文件customize_service.py,目的是为开发者提供模型预处理和后处理的逻辑。
图8 推理模型model目录示意图(需要用户自己准备模型文件)
推理脚本customize_service.py的具体写法要求可以参考模型推理代码编写说明。
本案例中提供的customize_service.py文件具体内容如下:
import logging import threading import numpy as np import tensorflow as tf from PIL import Image from model_service.tfserving_model_service import TfServingBaseService class mnist_service(TfServingBaseService): def __init__(self, model_name, model_path): self.model_name = model_name self.model_path = model_path self.model = None self.predict = None # 非阻塞方式加载saved_model模型,防止阻塞超时 thread = threading.Thread(target=self.load_model) thread.start() def load_model(self): # load saved_model 格式的模型 self.model = tf.saved_model.load(self.model_path) signature_defs = self.model.signatures.keys() signature = [] # only one signature allowed for signature_def in signature_defs: signature.append(signature_def) if len(signature) == 1: model_signature = signature[0] else: logging.warning("signatures more than one, use serving_default signature from %s", signature) model_signature = tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY self.predict = self.model.signatures[model_signature] def _preprocess(self, data): images = [] for k, v in data.items(): for file_name, file_content in v.items(): image1 = Image.open(file_content) image1 = np.array(image1, dtype=np.float32) image1.resize((28, 28, 1)) images.append(image1) images = tf.convert_to_tensor(images, dtype=tf.dtypes.float32) preprocessed_data = images return preprocessed_data def _inference(self, data): return self.predict(data) def _postprocess(self, data): return { "result": int(data["output"].numpy()[0].argmax()) }
父主题: 在开发环境中构建并调试推理镜像
同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家