# 已有镜像迁移至ModelArts用于训练模型
#### 场景描述
本地已有镜像，需要做云上适配，用于ModelArts模型训练。
#### 操作步骤
1. 参考如下Dockerfile，修改已有镜像，使其符合模型训练的自定义镜像规范。
   ```
   FROM {已有镜像}
   USER root
   # 如果已存在 gid = 100 用户组，则删除 groupadd 命令。
   RUN groupadd ma-group -g 100
   # 如果已存在 uid = 1000 用户，则删除 useradd 命令。
   RUN useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user
   # 修改镜像中相关文件权限，使得 ma-user, uid = 1000 用户可读写。
   RUN chown -R ma-user:100 {Python软件包路径}
   # 设置容器镜像预置环境变量。
   # 请务必设置 PYTHONUNBUFFERED=1, 以免日志丢失。
   ENV PYTHONUNBUFFERED=1
   # 设置容器镜像默认用户与工作目录。
   USER ma-user
   WORKDIR /home/ma-user
   ```
   Dockerfile需要重点关注以下几点：
   1. 为镜像增加模型训练的默认用户组ma-group，"gid = 100"。
      - 如果已存在"gid = 100"用户组，可能会报错"groupadd: GID '100' already exists"。您可以通过命令"cat /etc/group \| grep 100"，查询是否已存在gid = 100用户组。
      
      - 如果已存在"gid = 100"用户组，则该步骤跳过，下文Dockerfile中删除"RUN groupadd ma-group -g 100"命令。
       
   
   2. 为镜像增加模型训练的默认用户ma-user，"uid = 1000"。
      - 如果已存在"uid = 1000"用户，可能会报错"useradd: UID 1000 is not unique"。您可以通过命令"cat /etc/passwd \| grep 1000"，查询是否已存在uid = 1000用户。
      
      - 如果已存在"uid = 1000"用户，则该步骤跳过，下文Dockerfile中删除"RUN useradd -d /home/ma-user -m -u 1000 -g 100 -s /bin/bash ma-user"命令。
       
   
   3. 修改镜像中相关文件权限，使得ma-user，"uid = 1000"用户可读写。
    
2. 编写好Dockerfile后，通过执行如下所示命令进行新镜像构建。
   ```
   docker build -f Dockerfile . -t {新镜像}
   ```
   
3. 构建成功后将新镜像上传至SWR（参考[6](https://support.huaweicloud.com/docker-modelarts/docker-modelarts_0118.html#ZH-CN_TOPIC_0000002561500173__zh-cn_topic_0000001986011760_li159974352719)）。
4. 在ModelArts上创建训练作业。
   1. 登录[ModelArts管理控制台](https://console.huaweicloud.com/modelarts/)，在左侧导航栏按需选择以下操作。
      - 新版控制台：选择"模型开发与训练 \> 模型训练"，进入训练作业列表。
      
      - 旧版控制台：选择"模型训练 \> 训练作业"，进入训练作业列表。
       
   
   2. 单击"创建训练作业"，进入创建训练作业页面，填写作业信息。根据新版和旧版控制台不同，配置方法如下：
      - 新版控制台：创建方式参考[表1]，其他创建训练任务参数参考[创建训练自定义作业（新版控制台页面）](https://support.huaweicloud.com/develop-modelarts/develop-modelarts-0006.html)。
         表1训练配置 
        | 参数名称      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
        |:---|:---|
        | 预置模板（可选）  | 单击"选择预置模板"，根据需求过滤预置模板的类型（当前支持文本生成和图像理解）、品牌（当前支持Qwen），选择模板。 选择预置模板后，部分模板将自动填充当前作业的描述（可选）、选择镜像、启动命令、代码目录、本地代码目录和环境变量等。请以实际情况为准。 用户也可在此基础上进行调整配置。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
        | 选择镜像      | 指定运行训练代码的容器镜像，有以下两种镜像： **预置镜像：**选择平台提供的常用框架镜像（如PyTorch 1.8、TensorFlow 2.1），适合大多数常见场景。 **自定义镜像：**选择使用您自己制作并推送至SWR镜像仓库的镜像或已注册镜像。 - 支持在SWR基础版和企业版的仓库中选择镜像。  - 已注册镜像：用户在ModelArts的"资产管理 \> 镜像"中已注册的镜像。   当平台预置的基础镜像无法满足您的依赖需求时，支持自定义镜像进行训练，所需镜像需提前注册到ModelArts镜像管理上。                                                                                                                                                                                                |
        | 启动命令     | 容器启动后执行的命令，用以启动您的训练脚本。 - 如果训练启动脚本用的是py文件，例如"train.py"，则启动命令如下所示。 ``` python ${MA_JOB_DIR}/demo-code/train.py ```   - 如果训练启动脚本用的是sh文件，例如"main.sh"，则启动命令如下所示。 ``` bash ${MA_JOB_DIR}/demo-code/main.sh ```    启动命令支持使用";"和"\&\&"拼接多条命令，命令中的"demo-code"为存放代码目录的最后一级OBS目录，以实际情况为准。 说明： 为保证数据安全，请勿输入敏感信息，例如明文密码。                                                                                                                                                                                                                                               |
        | 代码目录（可选） | 选择训练代码文件所在的OBS目录。当"选择镜像"选择"预置镜像"时，该参数必填；当"选择镜像"选择"自定义镜像"时，该参数可选。用户自己的OBS桶可以在界面选择，也可以手动输入路径，路径格式以"obs://"开头并以"/"结尾，例如"obs://bucketname/path/"。其他人的共享桶路径仅支持手动输入地址。obs桶中后缀为.txt、.py、.sh、.yaml的文件可以在线编辑，后缀为.log、.json、.md的文件可以在线查看。 - 需要提前将代码上传至OBS桶中，目录内文件总大小必须小于或等于5GB，文件数必须小于或等于1000个，文件深度必须小于或等于32。如果有预训练模型也请放置在代码目录下。  - 训练代码文件会在训练作业启动的时候被系统自动下载到训练容器的"${MA_JOB_DIR}/demo-code"目录中，"demo-code"为存放代码目录的最后一级OBS目录。例如，"代码目录"选择的是"obs://test/code"，则训练代码文件会被下载到训练容器的"${MA_JOB_DIR}/code"目录中。   |
        | 代码备份目录（可选） | 选择将**代码目录**下的文件备份到指定OBS目录。 - 需要提前创建obs目录。比如obs中创建目录为obs://test/record-dir。  - 训练作业启动的时候会自动地将训练容器本地代码最后一级**文件** **夹** 及文件夹中的**所有** **文件** 备份至${MA_RECORD_CODE_DIR_OBS}/${ma_job_name}-${MA_TASK_NAME}-${task_index}/user-job-dir/demo-code，demo-code为训练容器中本地代码目录的最后一级文件夹名称。 例如，代码备份目录选择的是obs://test/record-dir，训练容器中本地代码目录默认是/home/ma-user/modelarts/user-job-dir/test-code，则训练容器中本地代码文件夹test-code及test-code文件夹下的文件会被备份至obs://test/record-dir/job_name-work-0/user-job-dir/test-code目录中。                                                                                                                         |
        | 本地代码目录   | 用于指定训练容器的本地目录，启动训练时系统会将代码目录下载至此目录，默认本地代码目录为"/home/ma-user/modelarts/user-job-dir"。 本地代码目录不支持在/home/ma-user/modelarts/\*，/home/ma-user/modelarts-dev/\*，/home/ma-user/infer/\*目录下，也不支持配置成/home/ma-user。 单击右侧的"运行环境预览"，可以查看训练作业的工作目录。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
        | 环境变量        | 根据业务需求增加环境变量。训练容器中预置的环境变量请参见[管理训练容器环境变量](https://support.huaweicloud.com/develop-modelarts/develop-modelarts-0104.html)。 - 单击"添加"，添加环境变量信息，总数不超过100条。  - 单击"本地上传"可以本地批量导入环境变量，需要按模板填写环境变量且总数不能超过100条，否则会导入失败。   说明： 为保证数据安全，请勿输入敏感信息，例如明文密码。                                                                                                                                                                                                                                                                                                                   |
           
        
      
      - 旧版控制台：创建方式参考[表2](https://support.huaweicloud.com/docker-modelarts/docker-modelarts_0118.html#ZH-CN_TOPIC_0000002561500173__zh-cn_topic_0000002022451813_table867813531911)，其他参数填写请参考[创建生产训练作业](https://support.huaweicloud.com/develop-modelarts/develop-modelarts-0022.html)。
        表2创建训练作业的创建方式（使用自定义镜像） 
        | 参数名称 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
        |:---|:---|
        | 创建方式   | 必选，选择"自定义算法"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
        | 启动方式   | 必选，选择"自定义"。 ![](https://support.huaweicloud.com/docker-modelarts/figure/zh-cn_image_0000002631242962.png "点击放大")                                                                                                                                                                                                                                                                                                                                                                                                                                  |
        | 镜像      | 必填，单击右边的"选择"，从容器镜像中选择[构建成功后将新镜像上传至SWR]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
        | 代码目录  | 选择训练代码文件所在的OBS目录。如果自定义镜像中不含训练代码则需要配置该参数，如果自定义镜像中已包含训练代码则不需要配置。 - 需要提前将代码上传至OBS桶中，目录内文件总大小要小于或等于5GB，文件数要小于或等于1000个，文件深度要小于或等于32。  - 训练代码文件会在训练作业启动的时候被系统自动下载到训练容器的"${MA_JOB_DIR}/demo-code"目录中，"demo-code"为存放代码目录的最后一级OBS目录。例如，"代码目录"选择的是"obs://test/code"，则训练代码文件会被下载到训练容器的"${MA_JOB_DIR}/code"目录中。                                                     |
        | 运行用户ID  | 容器运行时的用户ID，该参数为选填参数，建议使用默认值1000。 如果需要指定uid，则uid数值需要在规定范围内，不同资源池的uid范围如下： - 公共资源池：1000-65535  - 专属资源池：0-65535                                                                                                                                                                                          |
        | 启动命令   | 必填，镜像的启动命令。 运行训练作业时，当"代码目录"下载完成后，"启动命令"会被自动执行。 - 如果训练启动脚本用的是py文件，例如"train.py"，则启动命令如下所示。 ``` python ${MA_JOB_DIR}/demo-code/train.py ```   - 如果训练启动脚本用的是sh文件，例如"main.sh"，则启动命令如下所示。 ``` bash ${MA_JOB_DIR}/demo-code/main.sh ```    启动命令支持使用";"和"\&\&"拼接多条命令，命令中的"demo-code"为存放代码目录的最后一级OBS目录，以实际情况为准。 |
        | 本地代码目录  | 指定训练容器的本地目录，启动训练时系统会将代码目录下载至此目录。 此参数可选，默认本地代码目录为"/home/ma-user/modelarts/user-job-dir"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
        | 工作目录   | 训练时，系统会自动cd到此目录下执行启动文件。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
           
        
       
    
 
