
# 在ModelArts使用run.sh脚本实现OBS和训练容器间的数据传输
自定义容器在ModelArts上训练和本地训练的区别如下图：
图1本地与ModelArts上训练对比   
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002004158441.png "点击放大")
ModelArts上进行训练比本地训练多了一步OBS和容器环境的数据迁移工作。
增加了和OBS交互工作的整个训练流程如下：
![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
建议使用OBSutil作为和OBS交互的工具，如何在本机安装obsutil可以参考[安装和配置OBS命令行工具](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_20_2003.html#ZH-CN_TOPIC_0000001967677176__section49511735617)。
1. 训练数据、代码、模型下载。（本地使用硬盘挂载或者docker cp，在ModelArts上使用OBSutil）
2. 启动脚本，用法无切换，一般就是到达执行目录，然后python xxx.py。
3. 训练结果、日志、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
```
![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/notice_3.0-zh-cn.png)
ModelArts的容器会有一个/cache目录，这个目录挂载的硬盘容量最大。建议下载数据和中间数据都存到这个目录中，防止因硬盘占满导致任务失败。
