AI开发调试系列第一弹:本地训练和本地推理

举报
alpha-one 发表于 2021/05/29 14:31:48 2021/05/29
【摘要】 在进行AI开发的过程中,往往需要进行大量的调试才能得到满意的结果。modelarts开发环境提供了训练和推理的调试工具,帮助用户快速验证自己的模型,并无缝衔接modelarts训练和推理服务。本文将借助一篇在线案例,说明如何在开发环境中,利用SDK快速完成AI开发的本地调试工作。

背景知识

ModelArts是面向AI开发者的一站式开发平台,提供海量数据预处理及半自动化标注、大规模分布式训练、自动化模型生成及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。点击详情可以查看更多资料。

Modelarts-SDK简介

Modelarts-SDK是Modelarts服务提供的一套开发工具,它以最方便的方式将Modelarts各个子服务连接起来,如在jupyterlab中,使用SDK向训练服务提交训练作业,或向推理服务部署模型等。本文将借助一篇案例一步步介绍如何使用SDK的功能,在notebook本地端到端实现手写数字识别项目的一站式开发。该案例可以在notebook上找到,具体位置如下图所示:image.png
也可以点击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.cn/engineers-modelarts/modelarts_23_0093.html。下图展示了这些文件:
image.png
其中文件夹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.cn/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部署为本地服务。如下图,服务部署后,输出信息中会提示服务日志的地址,通过该日志可查看服务运行过程的输出,方便调试。
    image.png
    服务部署成功后,返回实例predictor。利用它我们可以对新的数据进行推理。

测试本地服务

为证明服务已经部署成功,我们对该服务进行测试。如下图,将10张手写数字的图片保存在notebook中。
image.png
如下图,将写着数字2的图片输入到上一步生成的predictor中,可以得到推理结果。
image.png

停止服务

本地服务部署后,该进程会一致存在于notebook中。当不需要本地服务时,可删除该服务,如下代码所示。
image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。