在ModelArts Standard使用run.sh脚本实现OBS和训练容器间的数据传输
自定义容器在ModelArts上训练和本地训练的区别如下图:
ModelArts上进行训练比本地训练多了一步OBS和容器环境的数据迁移工作。
增加了和OBS交互工作的整个训练流程如下:
建议使用OBSutil作为和OBS交互的工具,如何在本机安装obsutil可以参考安装和配置OBS命令行工具。
- 训练数据、代码、模型下载。(本地使用硬盘挂载或者docker cp,在ModelArts上使用OBSutil)
- 启动脚本,用法无切换,一般就是到达执行目录,然后python xxx.py。
- 训练结果、日志、checkpoints上传。(本地使用硬盘挂载或者docker cp,在ModelArts上使用OBSutil)
可以用一个run脚本把整个流程包起来。run.sh脚本的内容可以参考如下示例:
#!/bin/bash ##认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 ##本示例以AK和SK保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 ##安装obsutil,完成AKSK配置。建议在基础镜像里做好。 #mkdir -p /opt && cd /opt #wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz #tar -xzvf obsutil_linux_amd64.tar.gz && mv obsutil_linux_amd64_*/ utils #alias obsutil='/opt/utils/obsutil' #obsutil config -i=${HUAWEICLOUD_SDK_AK} -k=${HUAWEICLOUD_SDK_SK} -e=obs.cn-north-4.myhuaweicloud.com ##训练输入复制到容器镜像本地。 #/cache目录的容量较大。 DATA_URL=`echo ${DLS_DATA_URL} | sed /s/s3/obs/` mkdir –p /cache/data /opt/utils/obsutil cp –r –f ${DATA_URL} /cache/data ##执行训练作业。 #涉及conda env切换时。 source /xxxxx/etc/profile.d/conda.sh conda activate xxxenv conda info --envs #启动训练脚本。 cd xxxx python xxx.py ##复制输出结果到OBS目录。 TRAIN_URL=`echo ${DLS_TRAIN_URL} | sed /s/s3/obs/` /opt/utils/obsutil cp –r –f /cache/out ${TRAIN_URL}
把run.sh放到/opt目录,在实际启动任务的时候,使用以下命令启动任务即可:
bash –x /opt/run.sh
把run.sh放到/root目录,可以在原镜像里增加一层,这一层就只是COPY这个run脚本。在基础镜像里可以一起把obsutil安装、配置好。参考如下dockerfile:
FROM $your_docker_image_tag RUN mkdir -p /opt && cd /opt && \ wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz && \ tar -xzvf obsutil_linux_amd64.tar.gz && mv obsutil_linux_amd64_*/ utils && \ /opt/utils/obsutil config -i=${HUAWEICLOUD_SDK_AK} -k=${HUAWEICLOUD_SDK_SK} -e=obs.cn-north-4.myhuaweicloud.com COPY run.sh /opt/run.sh
ModelArts的容器会有一个/cache目录,这个目录挂载的硬盘容量最大。建议下载数据和中间数据都存到这个目录中,防止因硬盘占满导致任务失败。