
# 准备镜像
#### 步骤一：检查环境
1. SSH登录机器后，检查NPU设备检查。运行如下命令，返回NPU设备信息。
   ```
   npu-smi info                    # 在每个实例节点上运行此命令可以看到NPU卡状态
   npu-smi info -l | grep Total    # 在每个实例节点上运行此命令可以看到总卡数，用来确认对应卡数已经挂载
   npu-smi info -t board -i 1 | egrep -i "software|firmware"   #查看驱动和固件版本
   ```
   如出现错误，可能是机器上的NPU设备没有正常安装，或者NPU镜像被其他容器挂载。请先正常[安装驱动和固件](https://support.huaweicloud.com/resmgmt-modelarts/usermanual-server-0011.html#section4)，或释放被挂载的NPU。
   驱动版本要求参考[镜像驱动版本](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_train_590605.html#ZH-CN_TOPIC_0000002397247010__table10556173812297)，如果不符合要求请参考[安装驱动和固件](https://support.huaweicloud.com/resmgmt-modelarts/usermanual-server-0011.html#section4)章节升级驱动。
   
   
2. 检查docker是否安装。
   ```
   docker -v   #检查docker是否安装
   ```
   如尚未安装，运行以下命令安装docker。
   ```
   yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
   ```
   
3. 配置IP转发，用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项，如果配置项存在且值为1，可跳过此步骤。
   ```
   sysctl -p | grep net.ipv4.ip_forward
   ```
   如果net.ipv4.ip_forward配置项的值不为1，执行以下命令配置IP转发。
   ```
   sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf
   sysctl -p | grep net.ipv4.ip_forward
   ```
   如果net.ipv4.ip_forward配置项不存在，执行以下命令配置IP转发。
   ```
   sed -i '$a\net.ipv4.ip_forward=1' /etc/sysctl.conf
   sysctl -p | grep net.ipv4.ip_forward
   ```
   
4. 检查Super Pod ID一致，执行以下命令。
   ```
   for i in {0..7}; do npu-smi info -i $i -c 0 -t spod-info;done  # 查看Super Pod ID
   ```
   图1检查Super Pod ID   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002397247018.png "点击放大") 
 
#### 步骤二：获取基础镜像
建议使用官方提供的镜像部署训练服务。镜像地址{image_url}参见[表4](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_train_590605.html#ZH-CN_TOPIC_0000002397247010__table10556173812297)获取。
```
docker pull {image_url}
```
#### 步骤三：制作训练镜像
进入解压后代码包目录下的Dockerfile文件同级目录（见[软件包结构](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_train_590605.html#ZH-CN_TOPIC_0000002397247010__section890416191069)中的"AscendCloud-LLM代码包关键训练文件"），通过DockerFile文件构建训练镜像制作训练镜像。
安装过程需要连接互联网git clone，请确保机器环境可以访问公网。
1. 进入代码包Dockerfile文件同级目录，${work_dir}指宿主机存放解压后的AscendCloud-LLM代码目录，根据实际修改。
   ```
   cd ${work_dir}/llm_train/AscendFactory
   ```
   
2. 构建新镜像。
   ```
   docker build --build-arg install_type=xxx -t <镜像名称>  .
   ```
   如无法访问公网则需配置代理，增加\`--build-arg\`参数指定代理地址确保访问公网。
   ```
   docker build --build-arg "https_proxy=http://xxx.xxx.xxx.xxx" --build-arg "http_proxy=http://xxx.xxx.xxx.xxx" --network=host --build-arg install_type=xxx -t <镜像名称>  .
   ```
   \<镜像名称\>：定义镜像名称。示例：pytorch_2_3_ascend:20241106
   install_type：安装类型，可选mindspeed-llm、llamafactory、verl、mindspeed-rl、mindspeed-mm，根据实际要求选择。
   
![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/caution_3.0-zh-cn.png)
1. Dockerfile制作镜像后，默认代码工作目录为${work_dir}/llm_train/AscendFactory，如需修改代码内容则在[启动容器镜像]时修改镜像内默认代码工作目录中代码内容或重新制作镜像。
2. 构建镜像前需保证Dockerfile文件内容中镜像名与本文档[表4](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_train_590605.html#ZH-CN_TOPIC_0000002397247010__table10556173812297)保持一致，如不同则需修改为一致。
```
# 修改以下内容：
FROM swr.cn-southwest-2.myhuaweicloud.com/atelier/xxx
```
 #### 步骤四：启动容器镜像
1. 启动容器镜像前请先按照参数说明修改${}中的参数，可以根据实际需要增加修改参数，启动容器命令如下：
   ```
   export work_dir="自定义挂载的工作目录"     # 容器内挂载的目录，如果挂载SFS可使用挂载目录
   export container_work_dir="自定义挂载到容器内的工作目录"
   export container_name="自定义容器名称"
   export image_name="镜像名称"
   docker run -itd \
       --device=/dev/davinci_manager \
       --device=/dev/devmm_svm \
       --device=/dev/hisi_hdc \
       -e ASCEND_VISIBLE_DEVICES=0-15 \
       -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
       -v /usr/local/dcmi:/usr/local/dcmi \
       -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
       --cpus 320 \
       --memory 2048g \
       --shm-size 1024g \
       --net=host \
       -v ${work_dir}:${container_work_dir} \
       --name ${container_name} \
       $image_name \
       /bin/bash
   ```
   **参数说明：**
   - --name ${container_name} 容器名称，进入容器时会用到，此处可以自己定义一个容器名称，例如ascendspeed。
   
   - -v ${work_dir}:${container_work_dir} 代表需要在容器中挂载宿主机的目录。宿主机和容器使用不同的文件系统。work_dir为宿主机中工作目录，目录下存放着训练所需代码、数据等文件。container_work_dir为要挂载到的容器中的目录。为方便两个地址可以相同。
     ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
     - 容器不能挂载/home/ma-user目录，此目录为ma-user用户家目录。
     
     - driver及npu-smi需同时挂载至容器。
     
     - 不要将多个容器绑到同一个NPU上，会导致后续的容器无法正常使用NPU功能。
       
   
   - ${image_name} 为docker镜像的ID，在宿主机上可通过docker images查询得到
   
   - --shm-size：表示共享内存，用于多进程间通信。由于需要转换较大内存的模型文件，因此大小要求1024g及以上。
   
   - --cpus：宿主机的 CPU 核心数，一般**Snt9b** 机型设置为**192** ，**Snt9b23** 机型设置为**320**。
   
   - --e ASCEND_VISIBLE_DEVICES=0-7 ：设置卡号ID,一般**Snt9b** 机型设置**0-7** ，**Snt9b23** 机型设置为**0-15**。
   
   - --memory：一般**Snt9b** 机型设置为**1024g** ，**Snt9b23** 机型设置为**2048g**
    
2. 通过容器名称进入容器中。启动容器时默认用户为ma-user用户。
   ```
   docker exec -it ${container_name} bash
   ```
   
 
