鲲鹏社区首页
EN
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

部署推理服务(DeepSeek V3/R1)

  1. 按照1下载相应的模型文件。
  2. 模型转换。由于昇腾硬件不支持FP8,因此需先权重转换为BF16;根据需求继续将BF16转换为INT8。
    • FP8转换BF16步骤请参见模型库-DeepSeek-V3-模型使用
    • BF16转换INT8(单卡时转换时间需要7~8h,8卡时转换时间需要1h)步骤如下:
      1. 下载msit并安装。
        git clone -b br_noncom_MindStudio_8.0.0_POC_20251231 https://gitee.com/ascend/msit.git
        cd msit/msmodelslim
        bash install.sh
      2. 昇腾社区下载ascend-toolkit和ascend-cann-kernels。
      3. 检查ascend-toolkit包完整性,并安装ascend-toolkit。
        Ascend-cann-toolkit_8.2.RC1.alpha002_linux-aarch64.run --check
        Ascend-cann-toolkit_8.2.RC1.alpha002_linux-aarch64.run --install
      4. 配置ascend-toolkit环境变量。
        source /usr/local/Ascend/ascend-toolkit/set_env.sh
      5. 安装ascend-cann-kernels。
        Ascend-cann-kernels-910b_8.2.RC1.alpha002_linux-aarch64.run --check
        Ascend-cann-kernels-910b_8.2.RC1.alpha002_linux-aarch64.run --install
      6. 升级transformers。
        pip install transformers==4.48.2
      7. 修改模型权重的modeling_deepseek.py,注释掉“is_flash_attn_2_available”相关内容。
        vim /home/openlab/deepseek-v3-bf16/modeling_deepseek.py
      8. 修改模型config.json,删除“quantization_config”。
        vim /home/openlab/deepseek-v3-bf16/config.json
      9. 配置环境变量并进行转换。
        cd example/DeepSeek/
        export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
        export PYTORCH_NPU_ALLOC_CONF=expandable_segments:False
        python3 quant_deepseek_w8a8.py --model_path /home/openlab/deepseek-v3-bf16/ --save_path /home/openlab/deepseek-v3-w8a8 
  3. 修改模型权重目录下的config.json文件。将“model_type”更改为“deepseekv2”(全小写且无空格)。
    "model_type":"deepseekv2"
  4. 将模型权重目录拷贝到其他节点上。
  5. 配置机器NPU网卡信息(双机直连场景)。
    • 配置设备IP地址和掩码信息。
      1. 配置机器A的NPU网卡IP地址和掩码信息。
        配置举例:
        hccn_tool -i 0 -ip -s address 192.168.190.101 netmask 255.255.255.0
        hccn_tool -i 1 -ip -s address 192.168.190.102 netmask 255.255.255.0
        hccn_tool -i 2 -ip -s address 192.168.190.103 netmask 255.255.255.0
        hccn_tool -i 3 -ip -s address 192.168.190.104 netmask 255.255.255.0
        hccn_tool -i 4 -ip -s address 192.168.190.105 netmask 255.255.255.0
        hccn_tool -i 5 -ip -s address 192.168.190.106 netmask 255.255.255.0
        hccn_tool -i 6 -ip -s address 192.168.190.107 netmask 255.255.255.0
        hccn_tool -i 7 -ip -s address 192.168.190.108 netmask 255.255.255.0
        • -i:指定NPU device的编号。
        • address 192.168.190.101:为指定NPU device规划的IP地址,按实际规划修改。
        • netmask 255.255.255.0:为服务器NPU规划的掩码,按实际规划修改。
      2. 配置机器B的NPU网卡IP地址和掩码信息。
        配置举例:
        hccn_tool -i 0 -ip -s address 192.168.190.109 netmask 255.255.255.0
        hccn_tool -i 1 -ip -s address 192.168.190.110 netmask 255.255.255.0
        hccn_tool -i 2 -ip -s address 192.168.190.111 netmask 255.255.255.0
        hccn_tool -i 3 -ip -s address 192.168.190.112 netmask 255.255.255.0
        hccn_tool -i 4 -ip -s address 192.168.190.113 netmask 255.255.255.0
        hccn_tool -i 5 -ip -s address 192.168.190.114 netmask 255.255.255.0
        hccn_tool -i 6 -ip -s address 192.168.190.115 netmask 255.255.255.0
        hccn_tool -i 7 -ip -s address 192.168.190.116 netmask 255.255.255.0
    • 配置检测对象IP地址信息。
      1. 配置机器A的检测对象IP地址。

        双机直连场景下,每个NPU device的检测对象为其对端NPU device的IP地址。

        配置举例:
        hccn_tool -i 0  -netdetect -s address 192.168.190.109
        hccn_tool -i 1  -netdetect -s address 192.168.190.110
        hccn_tool -i 2  -netdetect -s address 192.168.190.111
        hccn_tool -i 3  -netdetect -s address 192.168.190.112
        hccn_tool -i 4  -netdetect -s address 192.168.190.113
        hccn_tool -i 5  -netdetect -s address 192.168.190.114
        hccn_tool -i 6  -netdetect -s address 192.168.190.115
        hccn_tool -i 7  -netdetect -s address 192.168.190.116
      2. 配置机器B的检测对象IP地址。
        配置举例:
        hccn_tool -i 0  -netdetect -s address 192.168.190.101
        hccn_tool -i 1  -netdetect -s address 192.168.190.102
        hccn_tool -i 2  -netdetect -s address 192.168.190.103
        hccn_tool -i 3  -netdetect -s address 192.168.190.104
        hccn_tool -i 4  -netdetect -s address 192.168.190.105
        hccn_tool -i 5  -netdetect -s address 192.168.190.106
        hccn_tool -i 6  -netdetect -s address 192.168.190.107
        hccn_tool -i 7  -netdetect -s address 192.168.190.108

        斜体部分按实际规划修改。

  6. 检查机器网络状况及机器间互联情况。
    • 检查机器网络状况。
      1. 检查物理链接(双机直连场景无需检查)。
        for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done 

      2. 检查链接。
        for i in {0..7}; do hccn_tool -i $i -link -g ; done

      3. 检查网络健康情况。
        for i in {0..7}; do hccn_tool -i $i -net_health -g ; done

      4. 查看监测的IP地址配置是否正确,即监测IP地址为npu device ip。
        for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done

      5. 查看网关是否配置正确(双机直连场景下,不设置网关)。
        for i in {0..7}; do hccn_tool -i $i -gateway -g ; done

      6. 获取每张卡的IP地址。
        for i in {0..7};do hccn_tool -i $i -ip -g; done

      7. 检测NPU底层TLS行为一致性,每台机器需要是一样的值,建议全0。
        for i in {0..7}; do hccn_tool -i $i -tls -g ; done | grep switch

      8. NPU底层TLS校验行为置0操作。
        for i in {0..7};do hccn_tool -i $i -tls -s enable 0;done

    • 检查机器间互联情况。
      1. 先获取各机器每张卡的IP地址。
      2. 机器A各卡与机器B的每张卡通过ping命令进行连接检查。
        for j in {0..7}; 
            do for i in {90..97};
                do hccn_tool -i ${j} -ping -g address 10.30.4.${i}; 【机器B各个卡的IP地址】
            done;
        done

        斜体内容可根据实际情况进行配置。

        双机直连场景下,检查机器A和机器B中互为对端的NPU device互连情况即可:

        hccn_tool -i {机器A的npu device的id} -ping -g address {机器B的npu device的IP地址}
      3. 机器B各卡与机器A的每张卡通过ping命令进行连接检查,与上述操作一致。
  7. 自行创建rank_table_file.json。
    • 使用多机推理时,需要将包含设备IP地址,服务器IP地址等信息的json文件地址传递给底层通信算子。参考如下格式,配置rank_table_file.json ,参考:
      {
         "server_count": "...", # 总节点数
         # server_list中第一个server为主节点
         "server_list": [
            {
               "device": [
                  {
                     "device_id": "...", # 当前卡的本机编号,取值范围[0,本机卡数)
                     "device_ip": "...", # 当前卡的IP地址,可通过hccn_tool命令获取
                     "rank_id": "..." # 当前卡的全局编号,取值范围[0,总卡数)
                  },
                  ...
               ],
               "server_id": "...", # 当前节点的IP地址
               "container_ip": "..." # 容器IP地址,所有机器的容器IP保持一致
            },
            ...
         ],
         "status": "completed",
         "version": "1.0"
      }
    • rank_table_file.json配置完成后,需要执行命令修改权限为640。
      chmod -R 640 {rank_table_file.json路径}

      需要在所有部署节点上创建rank_table_file.json文件,并确保各节点上的rank_table_file.json内容文件保持一致,除了“server_id”应为该机器的IP地址。

  8. 下载并安装驱动和固件。

    请参见2~3查看Atlas 800I A2推理产品如何安装NPU的驱动和固件。

  9. 访问昇腾社区并下载镜像文件。下载前需要根据链接中的指导申请下载权限。

  10. 启动容器。
    启动容器前,需修改权重路径的执行权限,例如:chmod -R 750 /home/data/deepseekv3
    docker run -itd --privileged  --name= {容器名称}  --net=host --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 \
       --device=/dev/davinci_manager \
       --device=/dev/hisi_hdc \
       --device /dev/devmm_svm \
       -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
       -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
       -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
       -v /usr/local/sbin:/usr/local/sbin \
       -v /etc/hccn.conf:/etc/hccn.conf \
       -v  {/权重路径:/权重路径}  \
       -v  {/rank_table_file.json路径:/rank_table_file.json路径}  \
        {根据加载的镜像名称修改}  \
       bash

    需要在所有部署节点上启动容器。

  11. 配置环境。
    1. 进入容器。
      docker exec -it {容器名称} bash
    2. 设置基础环境变量。
      source /usr/local/Ascend/ascend-toolkit/set_env.sh
      source /usr/local/Ascend/nnal/atb/set_env.sh
      source /usr/local/Ascend/atb-models/set_env.sh
      source /usr/local/Ascend/mindie/set_env.sh
    3. 开启通信环境变量。
      export ATB_LLM_HCCL_ENABLE=1
      export ATB_LLM_COMM_BACKEND="hccl"
      export HCCL_CONNECT_TIMEOUT=7200
      双机:
      export WORLD_SIZE=16
    4. 配置服务化环境变量“expandable_segments”,使能内存池扩展段功能,即虚拟内存特性。
      export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 
      服务化需要在rank_table_file.json中配置“container_ip”字段。 所有使用机器的配置应该保持一致,除了环境变量的“MIES_CONTAINER_IP”为本机IP地址。
      export MIES_CONTAINER_IP= {容器IP地址} 
      export RANK_TABLE_FILE= {rank_table_file.json路径} 
    5. 修改服务化参数。
      vim /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
      按照以下内容修改。
      # 如果网络环境不安全,不开启HTTPS通信,即“httpsEnabled”=“false”时,会存在较高的网络安全风险
      "httpsEnabled" : false, 
      ...
      # 开启多机推理 ... # 若不需要安全认证,则将以下两个参数设为false 
      "multiNodesInferEnabled" : true, 
      "interCommTLSEnabled" : false, 
      "interNodeTLSEnabled" : false,
      ... 
      "npudeviceIds" : [[0,1,2,3,4,5,6,7]], 
      ... 
      "modelName" : "DeepSeek-R1" # 不影响服务化拉起
       "modelWeightPath" : "权重路径", 
      "worldSize":8, 
  12. 启动service服务。以下命令需在所有机器上同时执行。
    1. 解决权重加载过慢问题。
      export OMP_NUM_THREADS=1 
    2. 设置显存比。
      export NPU_MEMORY_FRACTION=0.95 
    3. 拉起服务化,先拉起主节点服务化,再拉起其他副节点的服务化。
      cd /usr/local/Ascend/mindie/latest/mindie-service/ 
      ./bin/mindieservice_daemon 
      执行命令后,首先会打印本次启动所用的所有参数,然后直到出现以下输出,则认为服务启动成功。
      Daemon start success! 
    4. 新建窗口进行接口测试。
      curl -X POST -d '{
          "model":"Deepseek-R1",
          "messages": [{
              "role": "system",
              "content": "你是谁?"
          }],
          "max_tokens": 20,
      "stream": false
      }' http://ip:port/v1/chat/completions