AI开发调试系列第一弹:本地训练和本地推理
背景知识
ModelArts是面向AI开发者的一站式开发平台,提供海量数据预处理及半自动化标注、大规模分布式训练、自动化模型生成及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。点击详情可以查看更多资料。
Modelarts-SDK简介
Modelarts-SDK是Modelarts服务提供的一套开发工具,它以最方便的方式将Modelarts各个子服务连接起来,如在jupyterlab中,使用SDK向训练服务提交训练作业,或向推理服务部署模型等。本文将借助一篇案例一步步介绍如何使用SDK的功能,在notebook本地端到端实现手写数字识别项目的一站式开发。该案例可以在notebook上找到,具体位置如下图所示:
也可以点击tensorflow_mlp_mnist_local_mode一键无痛快速打开,尽享优质服务。
本地训练的使用
在线训练的优势和劣势
我们可以通过UI或者SDK提交在线训练作业,在线训练拥有强大的计算资源,丰富的预置模型支持,可以帮助我们孵化出强有力的模型。但是由于资源有限,在线训练任务往往需要较长时间的排队。当好不容易排上队了,但是又因为一个简单的代码错误或参数不当,导致这次任务无法正常运行,那就真是欲哭无泪了:)。因此,我们隆重推出本地训练,帮助用户快速验证训练脚本和参数的正确性。
本地训练
Notebook创建并启动成功后,modelarts-sdk就已经安装完成了。利用SDK,用户可以先在notebook容器里创建并调试训练作业,保证训练代码、参数和数据都无误后,再将训练作业提交到训练平台上,达到事半功倍的效果。本地训练的流程如下:
Session初始化
Session中包含了认证鉴权的信息,可帮助SDK与OBS服务,modelarts训练服务和推理服务进行交互。使用如下代码进行session初始化:
from modelarts.session import Session
session = Session()
在华为云上使用notebook时,Session类初始化不需要任何信息,SDK会利用notebook创建时预先保存的AKSK信息完成认证鉴权。
准备训练脚本和训练数据
本地训练时,我们需要将训练脚本和数据保存在notebook容器中。训练脚本的内容完全由用户编写,案例中,我们使用的训练脚本保存在目录/home/ma-user/work/tensorflow_mlp_mnist_local_mode/train/中,启动脚本是tensorflow_mlp_mnist.py。该脚本读取mnist训练数据,输入到三层的MLP中,训练20个epoc,最终将模型保存到本地,用来进行后续部分的本地推理。
大部分情况下,数据是保存在OBS上的,因此我们需要将数据下载到本地。如以下代码所示:
source_file_path = /home/ma-user/work/tensorflow_mlp_mnist_local_mode/
dataset_url = "https://modelarts-cnnorth1-market-dataset.obs.cn-north-1.myhuaweicloud.com/dataset-market/Mnist-Data-Set/archiver/Mnist-Data-Set.zip"
dataset_file_names = ["train-images-idx3-ubyte.gz", "train-labels-idx1-ubyte.gz", "t10k-images-idx3-ubyte.gz", "t10k-labels-idx1-ubyte.gz"]
dataset_local_path = source_file_path + 'dataset/'
dataset_local_name = dataset_local_path + 'Mnist-Data-Set.zip'
if not os.path.exists(dataset_local_name):
!wget {dataset_url} -P {dataset_local_path}
!unzip -d {dataset_local_path} -o {dataset_local_name}
数据保存在dataset_url中,我们将其下载到本地目录source_file_path中,供训练脚本调用。
训练环境准备
这里我们介绍如何利用SDK方便地定制一个conda虚拟环境,来帮助用户实现多样的训练环境需求。代码样例如下:
from modelarts.environment import Environment
from modelarts.environment.conda_env import CondaDependencies
env = Environment("tensorflow_mlp_mnist")
cd = CondaDependencies.create(pip_packages=["tensorflow==1.13.1"], conda_packages=["python=3.6.2"])
env.conda = cd
这里我们创建了名为tensorflow_mlp_mnist的虚拟环境,使用的python版本为3.6.2,安装了tenforflow1.13.1。虚拟环境需要什么包完全由训练脚本和训练数据决定。
本地训练
在上一步创建的conda虚拟环境中启动训练作业,示例代码如下:
from modelarts.environment import Environment
from modelarts.environment.conda_env import CondaDependencies
src_local_path = "/home/ma-user/work/tensorflow_mlp_mnist_local_mode/train/"
train_file = "tensorflow_mlp_mnist.py"
estimator = Estimator(modelarts_session=session,
hyperparameters=["--num_epochs", "30"],
code_dir=src_local_path, # 本地训练脚本目录
boot_file=train_file, # 本地训练启动脚本目录
train_instance_type='local', # 指定为本地训练
train_instance_count=1, # 训练节点个数
environment=env) # 训练脚本运行的环境
job_instance = estimator.fit(wait=False, job_name='my_training_job')
重要参数解释如下:
- hyperparameters:训练脚本接收的参数,如训练次数,batch_size,训练数据地址等;
- train_instance_type:使用的训练实例类型,'local’为代表本地训练
本地训练过程中,日志会展示在cell的输出部分,用户可实时查看,以确定训练过程是否正确并及时修改代码。
本地推理
创建本地模型
本地训练完成后,我们将生成的模型文件保存在notebook中,具体位置由用户编写的训练脚本决定。除了模型文件,我们也需要编写模型的配置文件config.json和模型推理代码customize_service.py,可参考资料https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0093.html。下图展示了这些文件:
其中文件夹variables和文件saved_model.pb是训练生成的模型文件,不同的AI框架生成的模型文件形式不同。使用这些文件,我们可以创建本地模型,示例代码如下所示:
from modelarts.model import Model
src_local_path = "/home/ma-user/work/tensorflow_mlp_mnist_local_mode/train/"
model = Model(session,
publish=False,
source_location_type="LOCAL_SOURCE", # 模型文件位置类型,
source_location=src_local_path + 'model', # 模型文件位置
environment=env,
model_version='1.0.1', # 模型版本
model_type='TensorFlow', # 模型使用的AI框架
model_algorithm="image_classification",
model_name="tensorflow_mlp_mnist_local_infer")
参数解释如下:
- session: modelarts session,在2.2.1节介绍过;
- publish: 是否发布模型。创建本地模型时为False;
- source_location_type: 模型位置类型,本地模型时LOCAL_SOURCE;
- source_location:模型的位置;
- environment:模型运行的环境,与2.2.3节介绍的训练环境一样,具体使用哪些包由推理脚本决定;
- model_algorithm:模型算法,表示该模型描述了怎样的算法,如本文中的模型时图像分类算法,这里填” image_classification”;
- model_name:模型名,为自己的模型取一个名字,名字可任意,便于自己识别就行;
这里仅介绍一些重要的参数,更多参数可参考官方文档https://support.huaweicloud.com/sdkreference-modelarts/modelarts_04_0223.html
至此,我们已经创建了本地模型,并得到了对象model,接下来可利用该对象在本地部署服务。
部署本地服务
利用上一节创建的本地模型可部署本地服务。代码示例如下:
configs = []
config1 = ServiceConfig(model_id=model.get_model_id(), weight="100", instance_count=1, specification="local")
configs.append(config1)
predictor = model.deploy_predictor(service_name="TensorFlow_MLP_DigitRecognition", configs=configs)
参数解释如下:
- weight: 该model在推理结果中占的比重,这里只有一个model,因此是100;
- instance_count:部署该model需要使用的节点个数;
- specification: 指定推理服务使用的计算资源规格,本地推理使用’local’即可;
函数deploy_predictor即将model部署为本地服务。如下图,服务部署后,输出信息中会提示服务日志的地址,通过该日志可查看服务运行过程的输出,方便调试。
服务部署成功后,返回实例predictor。利用它我们可以对新的数据进行推理。
测试本地服务
为证明服务已经部署成功,我们对该服务进行测试。如下图,将10张手写数字的图片保存在notebook中。
如下图,将写着数字2的图片输入到上一步生成的predictor中,可以得到推理结果。
停止服务
本地服务部署后,该进程会一致存在于notebook中。当不需要本地服务时,可删除该服务,如下代码所示。
- 点赞
- 收藏
- 关注作者
评论(0)