
# 准备推理环境
#### 前提条件
- 准备一台Linux服务器用于构建镜像。
- 安装过程需要连接互联网git clone，确保容器可以访问公网。
 
#### 步骤一：检查环境
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镜像被其他容器挂载。请先正常安装驱动和固件，或释放被挂载的NPU。
   驱动版本要求如表1。如果不符合要求请参考[安装驱动和固件](https://support.huaweicloud.com/resmgmt-modelarts/usermanual-server-0011.html#section4)章节升级驱动。
   表1HDK固件驱动 
   | **昇腾芯片**          | **HDK** **固件\&驱动** |
   |:---|:---|
   | Snt9b23（**标准版本**） | 25.2.1             |
   | Snt9b（**标准版本**）   | 25.2.1             |
      
   
2. 检查docker是否安装。
   ```
   docker -v   #检查docker是否安装
   ```
   如尚未安装，运行以下命令安装docker。
   ```
   yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
   ```
   
 
#### 步骤二：获取基础镜像
建议使用官方提供的镜像部署推理服务。镜像地址{image_url}获取请参见[表2](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908004.html#ZH-CN_TOPIC_0000002451458086__table1512403716473)。
```
docker pull {image_url}
```
#### 步骤三：上传代码包和权重文件
1. 上传推理代码包AscendCloud-LLM-xxx.zip和算子包AscendCloud-OPP-xxx.zip到主机中，包获取路径请参见[表3](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908004.html#ZH-CN_TOPIC_0000002451458086__table1030044252717)。
2. 将权重文件上传到轻量算力节点机器中。权重文件的格式要求为Huggingface格式。开源权重文件获取地址请参见[支持的模型列表](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908002.html)。
3. 权重要求放在磁盘的指定目录，并做目录大小检查，参考命令如下。
   ```
   df -h
   ```
   
 
 #### 步骤四：制作推理镜像
按照以下脚本执行解压操作，请保证环境联网，并支持git clone。
```
# Snt9b机型执行命令：
unzip AscendCloud-*.zip -d AscendCloud && cd AscendCloud \
&& unzip AscendCloud-OPP-*-A2-*.zip && unzip AscendCloud-OPP-*-torch-*-py*.zip -d ./AscendCloud-OPP \
&& unzip AscendCloud-LLM*.zip -d ./AscendCloud-LLM \
&& cp AscendCloud-LLM/llm_inference/ascend_vllm/Dockerfile . \
&& docker build -t ${image} --build-arg BASE_IMAGE=$base_image .
```
```
# Snt9b23机型执行命令：
unzip AscendCloud-*.zip -d AscendCloud && cd AscendCloud \
&& unzip AscendCloud-OPP-*-A3-*.zip && unzip AscendCloud-OPP-*-torch-*-py*.zip -d ./AscendCloud-OPP \
&& unzip AscendCloud-LLM*.zip -d ./AscendCloud-LLM \
&& cp AscendCloud-LLM/llm_inference/ascend_vllm/Dockerfile . \
&& docker build -t ${image} --build-arg BASE_IMAGE=$base_image .
```
**参数说明：**
- ${base_image}：为基础镜像名称，即{image_url}，取值来源于[表2](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908004.html#ZH-CN_TOPIC_0000002451458086__table1512403716473)。
- $image：为制作完成的镜像名称，名字可自定义，需要满足镜像命名规则 image_name:image_tag。 例如: pytorch_ascend:pytorch_2.5.1-cann_8.1.rc2-py_3.11-hce_2.0.2503-aarch64-snt9b23
  
运行完后，会生成推理所需镜像。执行docker images可以找到生成的镜像。
 #### 步骤五：启动容器
启动容器镜像前请先按照参数说明修改${}中的参数。docker启动失败会有对应的error提示，启动成功会有对应的docker id生成，并且不会报错。
```
docker run -itd \
--shm-size=500g \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
-v /etc/localtime:/etc/localtime  \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /etc/ascend_install.info:/etc/ascend_install.info \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /var/log/npu/:/usr/slog \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v ${dir}:${container_model_path} \
--net=host \
--name ${container_name} \
${image_id} \
/bin/bash
```
**参数说明：**
- --device=/dev/davinci0，...， --device=/dev/davinci7：挂载NPU设备。示例中是Snt9b机型，挂载了8张卡davinci0\~davinci7。Snt9b23机型设置为--device=/dev/davinci0，...， --device=/dev/davinci15。
- -v ${dir}:${container_model_path} 表示将宿主机上模型权重目录挂载到容器中模型权重目录。
  ![](https://support.huaweicloud.com/bestpractice-modelarts/public_sys-resources/note_3.0-zh-cn.png)
  - 容器不能挂载到/home/ma-user目录，此目录为ma-user用户家目录。如果容器挂载到/home/ma-user下，拉起容器时会与基础镜像冲突，导致基础镜像不可用。
  
  - driver及npu-smi需同时挂载至容器。
  
  - 不要将多个容器绑到同一个NPU上，会导致后续的容器无法正常使用NPU功能。
    
- --name ${container_name}：容器名称，进入容器时会用到，此处可以自己定义一个容器名称。
- {image_id} 为docker镜像的ID，即[步骤四：制作推理镜像]中生成的新镜像id，在宿主机上可通过docker images查询得到。
 
#### 步骤六：进入容器
1. 进入容器。
   ```
   docker exec -it -u ma-user ${container_name} /bin/bash
   ```
   执行以下命令，确保ma-user用户有权限操作容器中${container_model_path} 路径下的所有文件。${container_model_path} 参数取值和[步骤五：启动容器]保持一致。
   ```
   sudo chown -R ma-user:ma-group ${container_model_path}
   ```
   
2. 评估推理资源。在容器中运行如下命令，返回NPU设备信息可用的卡数。
   ```
   npu-smi info       # 启动推理服务之前检查卡是否被占用、端口是否被占用，是否有对应运行的进程
   ```
   如出现错误，可能是机器上的NPU设备没有正常安装，或者NPU镜像被其他容器挂载。请先正常安装驱动和固件，或释放被挂载的NPU。
   如果不符合要求请参考[安装驱动和固件](https://support.huaweicloud.com/resmgmt-modelarts/usermanual-server-0011.html#section4)章节升级驱动。启动后容器默认端口是8080。
   
3. 配置需要使用的NPU卡为容器中的第几张卡。例如：实际使用的是容器中第1张卡，此处填写"0"。
   ```
   export ASCEND_RT_VISIBLE_DEVICES=0
   ```
   如果启动服务需要使用多张卡，则按容器中的卡号依次编排。例如：实际使用的是容器中第1张和第2张卡，此处填写为"0,1"，以此类推。
   ```
   export ASCEND_RT_VISIBLE_DEVICES=0,1
   ```
   可以通过命令npu-smi info查询NPU卡为容器中的第几张卡。例如下图查询出两张卡，如果希望使用第一和第二张卡，则"export ASCEND_RT_VISIBLE_DEVICES=0,1"，注意编号不是填4、5。
   图1查询结果   
   ![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002451458106.png "点击放大")
   启动推理服务的具体操作步骤请参见[启动推理服务（大语言模型）](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5908007.html)。
   
 
