You need to enable JavaScript to run this app.
导航

针对算法工程师的快速入门

最近更新时间2023.12.26 15:44:18

首次发布时间2021.12.03 20:23:08

本文主要面向有一定编码能力的算法工程师。在首次使用火山引擎机器学习平台的情况下,帮助用户快速上手,在平台上完成模型开发调试、训练的关键流程。主要适用场景:

  1. 模型所需的样本和代码已部分或全部开发完成,用户需要在对代码 0 修改的情况下,将相关工作迁移到机器学习平台。利用其提供的 GPU & CPU 算力、数据存储和缓存加速方案、训练任务编排和调度等能力完成模型的高效迭代。
  2. 从 0 开始,在机器学习平台上完成从原始数据到模型训练的完整流程。

下文将以 CIFAR-10 数据集的图片分类任务为范例,演示机器学习平台的核心功能。

相关概念
注册账号,并设置合适的权限
  1. 注册账号,并完成实名认证,详见操作步骤。完成后将获得火山引擎的主账号。
  2. 以主账号登录火山引擎控制台,开通机器学习平台服务以及平台强依赖的对象存储(TOS)和镜像仓库(CR)服务,详见操作步骤
  3. 以主账号登录火山引擎控制台,创建第一个子账号。将该子账号配置为机器学习平台管理员,用来完整地体验机器学习平台功能,详见操作步骤后续在机器学习平台中的所有操作均使用该子账号即可。
准备机器,申请资源组
  1. 以子账号登录火山引擎控制台,在顶部菜单栏中创建【购买及试用咨询】的工单,可参考如下模板填写工单内容:
    • 问题描述:产品试用
    • 意向产品:机器学习平台
  2. 在工单被受理后,与客服人员沟通并确认所需的 GPU 的型号(Tesla-T4 / Tesla-V100 / Tesla-A100 / Tesla-V100-HPC / Tesla-A100-80G-HPC)及数量。
  3. 以子账号登录机器学习平台,在【资源组】模块创建一个资源组。可以参考下图购买 2 台 8 卡 V100 的实例规格(ml.g1v.21xlarge),和极速型SSD FlexPL 云盘容量100GiB用于创建资源组。
    image.png
  4. 在该资源组中创建负载类型包含【开发机】、【自定义任务】和【在线服务】的队列。云盘将用于持久化开发机的运行环境以及存放训练过程中产生的临时数据,因此需要分配一些云盘资源到队列中。
准备数据
  1. 在本地电脑(Mac 或 Linux 操作系统)的 Terminal 中通过如下命令下载示例数据 CIFAR-10 到本地目录。

    mkdir -p ~/volc_ml_platform_demo/data
    
    curl "https://ml-platform-public-examples-cn-beijing.tos-cn-beijing.volces.com/datasets/cifar/cifar-10-python.tar.gz" -o ~/volc_ml_platform_demo/data/cifar-10-python.tar.gz
    
    tar zxvf ~/volc_ml_platform_demo/data/cifar-10-python.tar.gz -C ~/volc_ml_platform_demo/data/
    
  2. 参考样本数据存储方案对比,选择适合自己的存储方案。也可以直接跳过该环节,先从本文中使用到的 TOS 存储方案开始了解。下文将描述使用 TOS 上传和下载数据的具体流程。

  3. 阅读使用Rclone访问TOS,下文以 Rclone(Rclone 是一款功能强大的开源命令行工具,支持对接各种云存储系统,因为 TOS 兼容了标准 S3 协议,可以直接使用 Rclone 进行相关操作)的方式演示如何将本地数据上传至 TOS。

    • 上传数据需要配置子账号的密钥(AK / SK)用于身份认证,关于 AK / SK 的获取详见管理当前子账号的密钥

    • 上传数据之前需要先配置 Rclone 的连接信息,依次选择如下选项或输入相关信息。

    # 安装 Rclone,本文以在 MacOS 操作系统下安装 Rclone 为例 
    curl https://rclone.org/install.sh | sudo bash
    
    # 在 Rclone 工具中配置 TOS 连接
    rclone config
    
    # 依次选择如下选项或输入相关信息
    n) New remote                                      //新建远程连接。
    name> volces-tos                                   //输入连接名称,本文中以 volces-tos 为例。 
    5 / Amazon S3 Compliant Storage Providers including AWS, .... 
    	\ s3                                           //选择兼容 S3 协议的存储类型。
    25 / Any other S3 compatible provider
    	\ Other                                        //选择其他 S3 兼容的存储提供商。
    1 / Enter AWS credentials in the next step
      \ false                                          //在下一步输入密钥。
    access\_key\_id> AKLTYTBjY*******                  //输入用户实际的 AK。
    secret\_access\_key> TVdaaFkyRTNNa*****            //输入用户实际的 SK。
    region> cn-beijing                                 //输入 Region。
    endpoint> https://tos-s3-cn-beijing.volces.com     //输入 Endpoint。
    location\_constraint>                              //按 Enter 键置空,保持默认即可。
    acl>                                               //按 Enter 键置空,保持默认即可。
    Edit advanced config?
    n) No (default)                                    //不编辑高级配置,保持默认即可。
    --------------------
    y) Yes this is OK (default)                        //查看配置预览信息,然后选择y。
    --------------------
    q) Quit config                                     //退出配置界面。
    
    # 配置完成后,可执行如下命令查看当前已存在的连接信息 
    rclone config show
    
    

    注意

    • 配置完成后,Rclone默认会使用Path模式访问对象存储,在访问TOS时需要您修改为虚拟主机模式。
    • Rclone默认会使用HTTP2访问对象存储,在访问TOS时需要禁用HTTP2模式。

    修改步骤如下所示。
      a. 执行如下命令获取配置文件的详细路径。

    rclone config file
    

      b. 打开配置文件,在连接配置的末尾增加force_path_style = falsedisable_http2 = true内容,修改后的配置文件如下所示。

    [volces-tos]
    type = s3
    provider = Other
    access_key_id = AKLTYTBjY*******
    secret_access_key = TVdaaFkyRTNNa*****
    region = cn-beijing
    endpoint = https://tos-s3-cn-beijing.volces.com
    force_path_style = false
    disable_http2 = true
    
    • 创建存储桶(Bucket),Bucket 的名称需要全局唯一,且只能包含数字、横线(-)以及小写字母(a-z),横线不能出现在开头和结尾,长度限制为 3-63。
    # 创建一个新的 Bucket 用于存放数据 
    rclone mkdir volces-tos:${repleace_with_your_bucket_name}
    
    # 将本地的 CIFAR-10 的数据目录上传至 TOS 的 Bucket 中 
    rclone copy ~/volc_ml_platform_demo/data/cifar-10-batches-py volces-tos:${repleace_with_your_bucket_name}/datasets/cifar/cifar-10-batches-py
    
  4. 机器学习平台支持将 TOS 挂载为 POSIX 接口的文件目录,用户能够像访问本地磁盘文件一样访问 TOS Bucket 中的文件,具体的原理和使用限制请参考训练代码如何访问 TOS

准备镜像

平台支持的镜像来源一共有 3 种,这 3 种均可以在后文中介绍的【开发机】、【自定义训练】模块中使用。具体如下:

  1. 预置镜像:机器学习平台预置了 TensorFlow、PyTorch 等框架主流版本的镜像,方便用户直接使用。 本文将使用预置镜像演示代码开发、模型训练等功能。
  2. 外部(或本地的)镜像:当用户本地或其它外部镜像仓库中有正在使用的镜像,可以参考迁移外部镜像到镜像仓库将该部分镜像快速地迁移到机器学习平台的【镜像仓库】。
  3. 构建镜像:机器学习平台【镜像仓库】支持按需构建自定义镜像,支持在基础镜像上安装依赖项、Dockerfile 和保存开发机环境为新的镜像三种构建方式,详见构建自定义镜像
模型代码开发与调试 —— 开发机

开发机是机器学习平台为机器学习开发者提供的在线编译、调试代码和模型开发的模块。开发机支持使用 WebIDE 在线开发,或通过 SSH 连接开发机远程开发,也提供了持久化的云盘存储服务和共享文件系统用于存储开发中的数据。开发机在关机后,平台会释放开发机的算力,保存之前的操作、下载的数据和配置环境等。
以下教程展示了如何利用 开发机 完成 单机单卡 或者 单机多卡 的训练,更多的内容详见创建开发机使用 WebIDE 开发代码

  1. 以子账号登录机器学习平台,在左侧导航栏选择【开发机】,点击【创建开发机】。进入创建页面后依次完成基础配置、环境配置、访问配置和共享文件系统挂载的填写。

  2. 在环境配置板块,选择预置镜像 pytorch:1.12.1, 选择前文中创建的队列。

    • 根据队列中实际包含的资源情况选择一个计算规格。该教程中选择计算规格为 GPU 类型的 ml.g1v.8xlarge 的实例(资源量为 32Core128GiB4 * Tesla-V100)。
    • 云盘将作为持久化存储挂载在根目录/,该目录下的数据在关机或重启后均会被保留。创建一个开发机的最小云盘容量为20GiB。
  3. 若需要通过 SSH 远程连接访问开发机,则需要填写本地机器的 SSH 公钥。

    • 获取 SSH 公钥:用户在本地 Terminal 中通过 ssh-keygen 命令生成 SSH 密钥对(id_rsaid_rsa.pub)并默认存放在 $HOME/.ssh/ 目录下,带 .pub 后缀的文件即 SSH 公钥文件。

    • 选择公网或私网登录:若发起 SSH 登录的客户端机器可以连接火山引擎私有网络 VPC,建议只选择更安全的私网登录方式,否则需要勾选公网登录。

  4. 在共享文件系统挂载板块,单击【+ TOS】,源地址中选择前文中数据的上传路径(选到 Bucket 即可),在挂载地址中填写 /data00,目的是将之前上传的 TOS 数据挂载到计算节点中。

    • 机器学习平台支持挂载 TOS、NAS、vePFS 多种类型的共享文件系统,该教程以 TOS 为例进行介绍,其它类型的使用方法详见挂载共享文件系统
    • 由于 TOS 中的数据是用户私有,所以需要填写用户的 AK / SK 才能完成数据的挂载,可以参照前文中的方法获取当前用户的 AK / SK(后续将优化成无需填写密钥,只需配置要挂载的数据即可)。
    • 挂载 TOS 需要提前在机器学习平台【全局配置】模块中绑定某个应用场景为数据湖 的 CloudFS 实例,然后使用该实例进行 TOS 挂载。
  5. 单击【确认创建】后等待开发机的状态变成 运行中 后,点击【连接】按钮,选择【WebIDE(新版)】登录开发机,进入 WebIDE 页面。在顶部菜单栏中的【Terminal】-【New Terminal】打开 WebIDE 的 Terminal。在 Terminal 中通过如下指令从 GitHub 上 clone 机器学习平台的官方示例代码。

    cd /root/code && git clone http://github.com/volcengine/ml-platform-sdk-python
    
  6. 在 Terminal 中通过如下指令以 PyTorch DDP 的方式运行单机 2 卡任务,此时在 Terminal 能从日志中查看当前的训练进度。

    • 若实际使用的资源组中仅有 1 张 GPU 时,可将如下指令中的 --nproc_per_node 2 替换成 --nproc_per_node 1,从而变成运行单机单卡的训练任务。
    # 安装 Demo 所需的少量依赖项
    cd /root/code/ml-platform-sdk-python/samples/cifar && python -m pip install -r requirements.txt
    
    # 启动训练
    python -m torch.distributed.launch --nproc_per_node 2 /root/code/ml-platform-sdk-python/samples/cifar/torch_ddp.py
    
    • 训练结束后会打印模型的保存路径,其中 /data00/models/cifar/xxxxxxxx/ 为模型所在目录,在后续的步骤中需要用该目录来注册模型。
    finish save model to /data00/models/cifar/xxxxxxxx/cifar_demo.pt
    
模型注册及部署 —— 开发机

根据上述步骤完成了一次单机训练,得到的模型可以通过机器学习平台的 SDK 注册到【模型管理】模块并部署成在线服务。下文将继续使用开发机的开发环境介绍如何注册和部署模型。

  1. 因为要使用 Python SDK 注册和部署模型,所以需要先通过 volc configure 指令配置当前用户的 AK / SK,关于 AK / SK 的获取详见前文。

    volc configure
    volc access key [********yM2I]:          填写用户的 AK
    volc secret access key [********TQ==]:   填写用户的 SK
    volc region [cn-beijing]: █              填写所在地域,支持 cn-beijing、cn-shanghai、cn-guangzhou
    
  2. 通过预置的代码将模型注册到平台的【模型管理】模块,同时部署成推理服务(需要填写前文中提到的模型目录)。正常情况下会打印模型上传和部署的返回结果,并在【在线服务】模块产生一条名为 cifar-demo-service 的记录。

    • 部署模型时会使用队列的资源,请提前创建一个负载类型包含在线服务的队列,或者将前文用到的队列的负载类型中增加在线服务(先停止队列再单击【负载类型】即可进入对应的配置页面,完成负载类型的调整)。
    # 安装最新版本的 SDK
    cd /root/code/ml-platform-sdk-python && python -m pip install .
    
    # 注册和部署模型
    cd samples/cifar/
    python model_register_and_deploy.py  --local-path=<前文中模型所在的目录> --resource-queue-id <某个支持在线服务的队列id> --image-id ml_platform/tritonserver:22.08
    
  3. 回到机器学习平台的控制台界面,单击左侧导航栏中的【在线服务】进入服务的列表页面,单击 cifar-demo-service 进入该服务的详情页。在【调用指南】中拷贝服务调用的示例代码,并保存到 WebIDE 中,命名为 client.py。找到并复制实例列表里的 IP:PORT 供后续运行代码。

    image.png

  4. 通过 python client.py --endpoint <复制得到的 IP:PORT> 执行脚本即可查看模型推理的结果(该脚本中默认以随机数据向模型发送请求,用户可以通过修改脚本中的 build_input_value 函数测试真实图片的推理效果),当看到如下结果时证明服务调用成功,OUTPUT__0 代表模型的分类结果。

    Parse output OUTPUT__0
    {'OUTPUT__0': array([[ 1.6467931 , -3.3858938 ,  2.7385912 ,  1.3113481 ,  1.3528742 ,  1.2039534 ,  0.03783764, -2.6522038 ,  1.4433903 , -2.8726275 ]], dtype=float32)}
    
模型训练 —— 自定义任务

【自定义任务】将模型训练 Job 化,结合资源组对机器进行统一池化管理。当资源不足时,任务会先排队,资源充足时触发任务的执行,待任务结束后资源再次回到对应的资源组中,大幅提升机器的利用率。 同时支持 Horovod / PyTorchDDP / BytePS / TensorFlowPS 等常见的分布式训练框架。更多的内容详见发起单机 / 分布式训练任务

目前能够通过两种方式发起一个自定义训练任务:

  • 方式 1:通过机器学习平台的【自定义任务】Web页面,填写表单配置发起训练任务。
  • 方式 2:通过命令行 volc 命令行工具中的 ml_task submit 指令发起训练任务。

以下教程展示了如何利用 volc 命令行工具,在本地 Terminal 中发起 CIFAR-10 图片分类的 多机多卡 训练任务。

  1. 参考命令行工具-使用文档安装 volc 命令行工具并通过 volc configure 指令完成 AK / SK 配置。

  2. 将代码下载至本地。

    mkdir -p ~/volc_ml_platform_demo/code
    cd ~/volc_ml_platform_demo/code
    git clone https://github.com/volcengine/ml-platform-sdk-python
    
  3. 编写训练任务所需的 yaml 配置文件(通常可以使用 volc ml_task list 指令并根据操作提示导出现有任务的 yaml 进行参考)。示例的 yaml 中有如下字段需要根据用户的实际情况填写。

    • ResourceQueueID:队列 ID。需要替换成用户在前文中创建的队列的 ID,在【队列】的列表页查看。
      image.png
    • Bucket:待挂载到训练容器中的 TOS Bucket。需要替换成用户在前文中创建的 Bucket 的名称。
      • 此处使用了 TOS 挂载的功能,所以需要提前在机器学习平台【全局配置】模块中绑定某个应用场景为数据湖 的 CloudFS 实例。
    • RoleReplicas:训练 worker 的个数,默认为 2。可根据实际的资源情况进行配置。
    • Flavor:每个 worker 使用的实例规格,默认 ml.g1v.8xlarge,即每个 worker 使用 4 张 GPU。可根据实际的资源情况并参考实例规格及定价进行配置。
    cd ml-platform-sdk-python
    
    # 为任务编写 yaml 配置文件,将前方中提到的字段(`ResourceQueueID`、`RoleReplicas`、`Bucket`、`Flavor`等)替换成用户实际的值
    vi samples/cifar/torch_ddp_task_conf.yaml
    
    
    

    torch_ddp_task_conf.yaml 示例如下:

    # 1. 按照volc命令行工具
    # 2. volc ml_task submit --conf=./samples/cifiar/torch_ddp_task_conf.yaml
    # 自定义训练任务名称
    TaskName: "pytorch_ddp_example_from_cli"
    # 自定义训练任务描述
    Description: ""
    # 运行入口命令
    Entrypoint: "python -m torch.distributed.launch --nproc_per_node $MLP_WORKER_GPU --master_addr $MLP_WORKER_0_HOST --node_rank $MLP_ROLE_INDEX --master_port $MLP_WORKER_0_PORT --nnodes=$MLP_WORKER_NUM /root/code/samples/cifar/torch_ddp.py --epoch 1000 --batch-size 256"
    # 标签
    Tags: [] 
    # 待上传代码的本地路径, 如是目录且以 '/' 结尾, 则将该目录下的所有内容上传到 RemoteMountCodePath,
    # 如是目录且不以 '/' 结尾, 则将该目录及该目录下所有内容上传到 RemoteMountCodePath
    UserCodePath: "./samples"
    # 容器中的代码挂载路径
    RemoteMountCodePath: "/root/code/"
    # 环境变量
    Envs: []
    # 镜像 URL 地址, 执行任务时, 会自动下载该地址的镜像并使用
    ImageUrl: "vemlp-cn-beijing.cr.volces.com/preset-images/pytorch:1.12.1"
    # 提交到火山引擎机器学习平台的某个队列 ID, 可以访问https://console.volcengine.com/ml-platform/resourceQueue 查看有权限的队列
    ResourceQueueID : "replace_with_your_resource_queue_id"  
    # 训练框架,支持:TensorFlowPS, PyTorchDDP, Horvod, BytePS, Custom
    Framework: "PyTorchDDP"
    # 实例配置, 包含角色名称(RoleName), 角色数量(RoleReplicas)以及具体的实例规格(Flavor):2机4卡
    TaskRoleSpecs:
      - RoleName: "worker"
        RoleReplicas: 2 
        Flavor: "ml.g1v.8xlarge"
    # 该自定义任务最长运行时间, 支持 1h, 2h45m, 30s 等方式表达时间段, 如未带单位, 则默认单位为秒
    ActiveDeadlineSeconds: 432000
    # 是否开启 TensorBoard. 如需开启, 则可以反注释下方配置. 同时需将 TensorBoard 数据写入训练容器预置的环境变量($TENSORBOARD_LOG_PATH)下
    EnableTensorBoard: False
    # 挂载分布式数据盘至训练容器中, 支持 Tos, vePFS 等数据盘挂载方式
    Storages:
      - Type: "Tos"
        MountPath: "/data00"  # 在分布式训练容器中挂载的路径
        Bucket: "repleace_with_your_tos_bucket" # 可访问的 tos 下某个具体的 bucket 名字, 例如: default_bucket
    
  4. 通过如下指令提交任务,提交后该任务将出现在机器学习平台【自定义训练】模块的列表页中,进入该任务的详情页面可查看每个实例的监控数据及日志,同时也支持通过 WebShell 进入训练容器内部进行调试及问题排查。

    # 提交任务
    volc ml_task submit --conf=./samples/cifar/torch_ddp_task_conf.yaml