本文主要面向有一定编码能力的算法工程师。在首次使用火山引擎机器学习平台的情况下,帮助用户快速上手,在平台上完成模型开发调试、训练的关键流程。主要适用场景:
下文将以 CIFAR-10 数据集的图片分类任务为范例,演示机器学习平台的核心功能。
ml.g1v.21xlarge
),和极速型SSD FlexPL 云盘容量100GiB用于创建资源组。在本地电脑(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/
参考样本数据存储方案对比,选择适合自己的存储方案。也可以直接跳过该环节,先从本文中使用到的 TOS 存储方案开始了解。下文将描述使用 TOS 上传和下载数据的具体流程。
阅读使用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
注意
修改步骤如下所示。
a. 执行如下命令获取配置文件的详细路径。
rclone config file
b. 打开配置文件,在连接配置的末尾增加force_path_style = false
和disable_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 用于存放数据 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
机器学习平台支持将 TOS 挂载为 POSIX 接口的文件目录,用户能够像访问本地磁盘文件一样访问 TOS Bucket 中的文件,具体的原理和使用限制请参考训练代码如何访问 TOS。
平台支持的镜像来源一共有 3 种,这 3 种均可以在后文中介绍的【开发机】、【自定义训练】模块中使用。具体如下:
开发机是机器学习平台为机器学习开发者提供的在线编译、调试代码和模型开发的模块。开发机支持使用 WebIDE 在线开发,或通过 SSH 连接开发机远程开发,也提供了持久化的云盘存储服务和共享文件系统用于存储开发中的数据。开发机在关机后,平台会释放开发机的算力,保存之前的操作、下载的数据和配置环境等。
以下教程展示了如何利用 开发机 完成 单机单卡 或者 单机多卡 的训练,更多的内容详见创建开发机、使用 WebIDE 开发代码。
以子账号登录机器学习平台,在左侧导航栏选择【开发机】,点击【创建开发机】。进入创建页面后依次完成基础配置、环境配置、访问配置和共享文件系统挂载的填写。
在环境配置板块,选择预置镜像 pytorch:1.12.1
, 选择前文中创建的队列。
GPU
类型的 ml.g1v.8xlarge
的实例(资源量为 32Core
、128GiB
、4 * Tesla-V100
)。若需要通过 SSH 远程连接访问开发机,则需要填写本地机器的 SSH 公钥。
获取 SSH 公钥:用户在本地 Terminal 中通过 ssh-keygen
命令生成 SSH 密钥对(id_rsa
和 id_rsa.pub
)并默认存放在 $HOME/.ssh/
目录下,带 .pub
后缀的文件即 SSH 公钥文件。
选择公网或私网登录:若发起 SSH 登录的客户端机器可以连接火山引擎私有网络 VPC,建议只选择更安全的私网登录方式,否则需要勾选公网登录。
在共享文件系统挂载板块,单击【+ TOS】,源地址中选择前文中数据的上传路径(选到 Bucket 即可),在挂载地址中填写 /data00
,目的是将之前上传的 TOS 数据挂载到计算节点中。
数据湖
的 CloudFS 实例,然后使用该实例进行 TOS 挂载。单击【确认创建】后等待开发机的状态变成 运行中
后,点击【连接】按钮,选择【WebIDE(新版)】登录开发机,进入 WebIDE 页面。在顶部菜单栏中的【Terminal】-【New Terminal】打开 WebIDE 的 Terminal。在 Terminal 中通过如下指令从 GitHub 上 clone 机器学习平台的官方示例代码。
cd /root/code && git clone http://github.com/volcengine/ml-platform-sdk-python
在 Terminal 中通过如下指令以 PyTorch DDP 的方式运行单机 2 卡任务,此时在 Terminal 能从日志中查看当前的训练进度。
--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 注册到【模型管理】模块并部署成在线服务。下文将继续使用开发机的开发环境介绍如何注册和部署模型。
因为要使用 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
通过预置的代码将模型注册到平台的【模型管理】模块,同时部署成推理服务(需要填写前文中提到的模型目录)。正常情况下会打印模型上传和部署的返回结果,并在【在线服务】模块产生一条名为 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
回到机器学习平台的控制台界面,单击左侧导航栏中的【在线服务】进入服务的列表页面,单击 cifar-demo-service
进入该服务的详情页。在【调用指南】中拷贝服务调用的示例代码,并保存到 WebIDE 中,命名为 client.py
。找到并复制实例列表里的 IP:PORT
供后续运行代码。
通过 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 等常见的分布式训练框架。更多的内容详见发起单机 / 分布式训练任务。
目前能够通过两种方式发起一个自定义训练任务:
ml_task submit
指令发起训练任务。以下教程展示了如何利用 volc 命令行工具,在本地 Terminal 中发起 CIFAR-10 图片分类的 多机多卡 训练任务。
参考命令行工具-使用文档安装 volc 命令行工具并通过 volc configure
指令完成 AK / SK 配置。
将代码下载至本地。
mkdir -p ~/volc_ml_platform_demo/code cd ~/volc_ml_platform_demo/code git clone https://github.com/volcengine/ml-platform-sdk-python
编写训练任务所需的 yaml 配置文件(通常可以使用 volc ml_task list
指令并根据操作提示导出现有任务的 yaml 进行参考)。示例的 yaml 中有如下字段需要根据用户的实际情况填写。
数据湖
的 CloudFS 实例。2
。可根据实际的资源情况进行配置。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
通过如下指令提交任务,提交后该任务将出现在机器学习平台【自定义训练】模块的列表页中,进入该任务的详情页面可查看每个实例的监控数据及日志,同时也支持通过 WebShell 进入训练容器内部进行调试及问题排查。
# 提交任务 volc ml_task submit --conf=./samples/cifar/torch_ddp_task_conf.yaml