
# 准备基础镜像
由于准备模型时可能需要使用基础镜像，因此需要提前准备基础镜像。
![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
Kubernetes社区已经在v1.24版本中[移除Dockershim](https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/)，建议将容器引擎从Docker逐步迁移至官方推荐的Containerd，以确保未来与Kubernetes版本的兼容性和持续支持。所以**轻量算力集群目前推荐使用Containerd作为容器引擎，安装镜像**。
#### 步骤一：检查环境
1. SSH登录机器后，检查NPU设备检查。运行如下命令，返回NPU设备信息。
   ```
   npu-smi info                    # 在每个实例节点上运行此命令可以看到NPU卡状态
   npu-smi info -l | grep Total    # 在每个实例节点上运行此命令可以看到总卡数
   ```
   如出现错误，可能是机器上的NPU设备没有正常安装，或者NPU镜像被其他容器挂载。请先正常[安装NPU设备和驱动](https://support.huaweicloud.com/resmgmt-modelarts/umn-cluster-modelarts-0011.html)，或释放被挂载的NPU。
   
2. 检查Containerd是否安装。
   ```
   containerd -v   # 检查containerd是否安装
   ```
   在创建CCE集群时，会选择Containerd作为容器引擎，并默认给机器安装。**如尚未安装，说明机器操作系统安装错误。需要重新纳管机器，重新安装操作系统。**
   
3. 安装nerdctl工具。nerdctl是Containerd的一个客户端命令行工具，使用方式和docker命令基本一致，可用于后续镜像构建步骤中。
   ```
   # 下载 nerdctl 工具，注意使用的是1.7.6 arm64版本
   wget https://github.com/containerd/nerdctl/releases/download/v1.7.6/nerdctl-1.7.6-linux-arm64.tar.gz
   # 将程序解压至运行目录中
   tar -zxf nerdctl-1.7.6-linux-arm64.tar.gz -C /usr/bin/
   # 查看是否安装成功
   nerdctl -v
   ```
   
4. 安装buildkit工具。buildkit是从Docker开源出来的下一代镜像构建工具，支持OCI标准的镜像构建。buildkit由两部分组成：buildkitd和buildkitctl，nerdctl需要结合buildkit一起使用。 buildkitd（服务端）：负责镜像构建，目前支持runc和containerd作为镜像构建环境，默认是runc。
   buildkitctl（客户端）：负责解析Dockerfile文件，并向服务端buildkitd发出构建请求。
   buildkit的安装和启动可以参考如下工具install_buildkit.sh，执行如下命令进行安装启动。
   ```
   bash install_buildkit.sh
   ```
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002523128633.png "点击放大")
   install_buildkit.sh脚本内容如下：
   ```
   #!/bin/bash
   function echo_with_time() {
       echo "$(date '+%Y-%m-%d %H:%M:%S') | $1"
   }
   function main() {
       download_buildkit
       config_buildkit
       start_buildkit
   }
   function download_buildkit() {
       # 下载 buildkit 工具，注意使用的是0.15.1 arm64版本
       wget https://github.com/moby/buildkit/releases/download/v0.15.1/buildkit-v0.15.1.linux-arm64.tar.gz
       mkdir /usr/local/buildkit
       tar -zxf buildkit-v0.15.1.linux-arm64.tar.gz -C /usr/local/buildkit
       chmod -R 777 /usr/local/buildkit
   }
   function config_buildkit() {
       ln -sf /usr/local/buildkit/bin/buildkitd /usr/local/bin/buildkitd
       cat > /usr/lib/systemd/system/buildkitd.service <<'EOF'
   [Unit]
   Description=buildkitd
   After=network.target
   [Service]
   Environment=PATH=/usr/local/buildkit/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
   ExecStart=/usr/local/buildkit/bin/buildkitd
   Restart=always
   [Install]
   WantedBy=multi-user.target
   EOF
   }
   function start_buildkit() {
       # 重新加载Unit file
       systemctl daemon-reload || {
           echo_with_time "systemctl daemon-reload 失败"
           return 1
       }
       # 开机自启动
       systemctl enable buildkitd || {
           echo_with_time "设置开机启用buildkitd服务失败"
           return 1
       }
       systemctl start buildkitd || {
           echo_with_time "启动buildkitd服务失败"
           return 1
       }
       echo_with_time "BuildKit服务状态:"
       systemctl status buildkitd --no-pager -l
   }
   main
   ```
   
 
 #### 步骤二：获取基础镜像
建议使用官方提供的基础镜像进行标注作业，基础镜像见[表1](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_auto_data_911007.html#ZH-CN_TOPIC_0000002516481433__table1412351765111)。
Containerd 容器引擎有命名空间的概念，Kubernetes下使用Containerd默认命名空间是k8s.io。在导入镜像时需要指定命令空间为k8s.io，否则使用crictl images 无法查询到。拉取镜像有两种方式，以下命令可以选择其中一种执行。
- 使用 containerd 自带的工具 ctr 拉取镜像。
  ```
  ctr -n k8s.io pull {image_url}
  ```
  
- 使用nerdctl工具拉取镜像。
  ```
  nerdctl --namespace k8s.io pull {image_url}
  ```
  
镜像获取完成后可选用如下任一命令查看结果。
```
# ctr 工具查看
ctr -n k8s.io image list
# crictl工具查看
crictl image
# nerdctl 工具查看
nerdctl --namespace k8s.io image list
```
