特别声明

推理训练一体化平台的云端训练能力基于阿里云的 PAI-DLC 容器,资源管理基于阿里云 OSS,这些资源在使用过程中可能产生费用,服务的稳定性需要阿里云进行保障,MNN 工作台仅作为服务的使用方而非直接的服务提供者。

简介

MNN 工作台推训一体平台是一款集本地训练、云端训练和端侧验证部署于一体的一站式工作流,通过串联 PAI-DLC, Git 和端侧算法调试基础设施,实现了在同一个工程中同时进行训练、数据管理和端侧部署的工作模式,能极大提高基于 PAI 训练的算法研发,以及端侧部署效率。

操作指引

新建项目

首先选择 Train a deep learning model 打开模式选择页:
image.png
选择 PAI-DLC,随后打开工程配置页面:
image.png

开通 PAI-DLC 服务

为了使用推训一体工作流进行云端训练,你必须先开通 PAI-DLC 相关能力,它是阿里云提供的云原生深度学习训练平台,具体开通方法可参考如下地址和文档:

  • PAI-DLC 官方文档 - https://help.aliyun.com/document_detail/165137.html

    配置 PAI 私钥

    在开通了 PAI-DLC 后,你需要将拥有 PAI-DLC 权限的账号私钥 (AccessKey + AccessSecret) 填写到工程配置中,私钥查看方法为在阿里云控制台右上角点击图像悬浮菜单中的 Access Key 管理。你的私钥会基于本地生成的 key 加密存储,不会上传到云端
    image.png

    配置训练工程模板

    PAI 工程的核心是训练工程,训练工程既可以在本地 PC 的 Python3 虚拟环境下运行,也可以一键推送到 PAI-DLC 容器中运行,在这个步骤中,我们需要配置训练工程的入口文件名称(默认为 train.py):
    image.png

    配置工程创建方式

    目前支持两种模式,从 Git 导入和从空工程创建,工作台内部版我们支持 GitHub, Coding.net 以及 Gitlab 导入工程,这里我们演示从 Empty 创建工程,后续绑定 GitLab:
    image.png
    这里的 Deployment Target 将会额外创建一个端侧部署工程,和 MNN 工作台之前提供的 Playground 能力类似,区别在于在 PAI 一站式推训平台下我们可以同时进行本地 PC 训练、云端训练以及端侧推理部署,将之前的手动训练、导出资源、创建 Playground 工程这些繁琐的步骤合为一体,形成了高效的工作流。

完成工程创建

点击下一步,选择一个目录即可完成工程创建:
image.png

工程结构介绍

Target 介绍

在工程的左上角可以看到一个二级选项,左侧可以切换训练(Training)和部署(Deployment) Target:
image.png
其中 Training Target 包含了两个代码运行的目标平台,本地 Mac 和 PAI-DLC:
image.png
Deployment Target 的目标平台为端侧,当切换到 Deployment Target 时,可扫码连接端侧设备,使用方法与 Playground 一致:
image.png

工程配置介绍

点击顶部右侧的设置按钮,可以打开 PAI 工程的高级设置页:
image.png
image.png

工程全局配置介绍

为了避免创建多个 PAI 工程时重复配置私钥等信息,MNN 工作台还为 PAI 工程提供了一份全局配置,修改全局配置仅影响新建工程的默认值,查看和修改方法为顶部菜单 File -> Global Configuration:
image.png

第一个训练工程 Training Hello World

下面我们编写一个简单的训练代码,演示整个本地 + 云端训练流程。

训练工程结构

为了实现本地和云端训练一体,需要遵循一定的目录约定去编写训练代码:

  1. 将数据集、训练集等训练所需的数据放到 resource 下,以便云端训练时能正确识别和挂载数据;
  2. 将所有训练产物写入到 result 下,以便正确收集和回传云端训练产物;
  3. 在 src 下编写源代码

image.png

本地 PC 验证

我们简单演示一个写入文件到本地的工程来模拟训练,打开 train/src/train.py 编写如下代码:

  1. import os
  2. import time
  3. current_path = os.path.dirname(os.path.realpath(__file__))
  4. print('[+] current_path', current_path)
  5. result_path = os.path.join(current_path, '..', 'result')
  6. print('[+] train result path', result_path)
  7. result_model_path = os.path.join(result_path, 'test.model.txt')
  8. with open(result_model_path, 'w') as f:
  9. f.write('current time: ' + str(time.time()))
  10. print('[+] train succeeded')

切换到 Training Target,目标平台为 Mac,点击运行:
image.png稍后我们可以看到底部日志输出,以及 result 中被写入的文件:
image.png

远程 PAI-DLC 验证

一站式工作流的一个优点是本地验证后不需要任何修改和打包即可一键推送到 PAI-DLC 容器中进行训练,下面我们将顶部的目标平台设置为 PAI-DLC:
image.png
为了进行云端训练,还需要进行几步配置:

  1. 为项目绑定一个 Git 地址并完成代码推送,这是因为 PAI-DLC 需要以 Git 为媒介读取本地的代码和配置;
  2. 选择 PAI-DLC 容器的集群规格;
  3. 配置 OSS 地址,OSS 用于传输 resource 目录下的资源。

上述配置位于 PAI 的工程配置面板中,可通过点击右上角的配置按钮打开,下面我们分别介绍这些配置的获取方法。

为当前工程绑定 GitLab

image.png
PAI-DLC 云端与本地基于 Git 进行文件交换,因此这里需要给你的工程配置一个 Git 地址,在这里你可以使用任何支持 Access Token 的平台,例如 GitHub, Coding.net, Gitee 等,具体步骤如下:

  1. 点击工程右上角的配置
  2. 在任意平台创建 Git 工程,并且将 Git 的 http url 填写到工程配置中的 Git URL 处,注意一定要是 http url,因为 PAI-DLC 在云端拉取时走的是 http + token 的形式;
  3. 将 git 用户名独立填入 Git Username 中,可能有人会疑惑在 Git 链接中不是已经包含了 username,这是为了兼容某些 Git 平台在生成 token 时会独立分配一个用户名。

将训练代码推送到 GitLab

PAI 容器将会从用户配置的 Git 仓库中读取代码,因此需要先提交训练代码到 GitLab,MNN 工作台移植了 VS Code 的 Git 组件,因此你有两种选择:

  1. 使用 Git 组件直接完成提交;
  2. 命令行手动提交

下面我们介绍 Git 组件的使用方法,点击工作台左侧 ActivityBar 的第二个按钮打开 Git 面板,将需要提交的变更添加到暂存区:
image.png
添加之后,在输入框中输入 commit 信息,点击✔️按钮即可完成提交:
image.png
到这里,我们已经将 Commit 提交到本地环境中,下一步是要将他推送到 remote,这里有两个工作要做,第一个是绑定当前 git 仓库的 remote,第二个是 push。

首先介绍 remote 绑定的方法,注意这里 git 组件将以你的身份直接执行命令,因此 remote 需要选用 ssh 形式,先输入 ssh url,再输入名称 (一般用 origin 即可):
image.png
最后我们选择 Push to 将代码推送到 master 分支:
image.png
选择 Push to 后,会要求对 remote 进行选择,由于我们只有一个 remote,直接回车即可完成 Push:
image.png
操作结束之后,Git 的工作区应该不再有任何内容。一般的,GIt 组件在操作成功后是无回显的,如果要确定执行情况,可以选择 Show Git Output 来查看输出:
image.png

配置 OSS

目前 MNN 工作台仅支持基于 stsToken 访问 OSS 的形式,这种方式能够有效保证您的私钥安全,OSS 的配置注意事项如下:

  1. 您需要创建一个计算函数,用于返回临时授权的私钥(stsToken);
  2. 您需要将 bucket 的读权限设置为 public,并授予 stsToken 写权限。

有关 OSS 的配置方法可参考阿里云官方文档,如果你没有服务端资源,可使用阿里云的函数计算功能搭建一个 node 的 stsToken 生成服务:

  • 使用 STS 临时访问凭证访问OSS - https://help.aliyun.com/document_detail/100624.html

    设置 PAI-DLC 集群规格

    点击右上角的设置,选择 PAI-DLC 面板,配置 Image 和 Spec,其中 Image 是 PAI-DLC 使用的镜像,Spec 为集群规格(注意由于本地开发环境是 Python 3.x,这里的镜像一定要选择 Python 3 镜像):
    image.png
    选择完毕后,保存并关闭面板,即可点击顶部运行按钮一键部署代码:
    image.png在这里可以二次确认选择的镜像和集群规格,在确认无误后点击 Confirm 即可提交到云端执行:
    image.png

    云端训练任务管理

    PAI 工程会以当前工程名称去命名与其相关的训练任务,在顶部将会显示最新一条任务的执行状态:
    image.png
    点击最左侧 Activity Bar 的烧瓶形状 Tab 可以查看和管理所有任务:
    image.png

    从远端拉取训练产物

    等待上述提交的任务训练完成,可以看到顶部的进度为 Finish:
    image.png
    此时我们可以打开 deploy 文件夹,在 deploy 或 deploy/resource 上右键选择第一项 Sync Latest Train Result 即可同步训练产物到本地:
    image.png
    image.png
    稍作等待后,可以发现远端的训练结果已经被写回本地,接下来就可以在 Deployment Target 中使用模型编写推理代码了:
    image.png
    推理部分的编写可参考 从开源工程到 MNN 三端一体 Playground 教程

常见问题

修改代码后远程训练不生效

PAI 容器基于 Git 拉取训练代码,因此需要保证本地代码全部提交后再提交训练任务(提交任务的检查面板会提示 本地 Git 工作空间的当前状态)。

数据集上传方式

MNN 工作台会默认将 train/resource 下的资源打包上传到 OSS 以便 PAI 容器能够远程拉取,同一个工程下,如果 resource 不变不会重复上传(通过 train/resource-spec.json 控制)。

如果你希望自己管理资源包,可以在 train 下新建一个 .use_my_resource 文件,内容为资源包对应的 OSS 链接,在这种情况下任务会使用你提供的 url 作为资源包地址:
image.png
注意:资源包解压后的内容应当包含一个名为 resource 的文件夹,文件夹内包含资源,即解压后的结构要与本地 train/resource 一致。