大模型部署手册-昇腾服务器

  基于华为昇腾服务器,分为vllm、mindie框架,以及单机、多机场景:

一、vllm-ascend框架

1、单机模型

  • 说明:
  • 准备:
  • 启动:
    docker run -itd --name qwen72b --restart always \
    --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/devmm_svm --device /dev/hisi_hdc -v /usr/local/dcmi:/usr/local/dcmi -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info -v /etc/ascend_install.info:/etc/ascend_install.info \
    -v /app2/.cache:/root/.cache \
    -v /app2/models/:/models/:ro -p 8001:8000 \
    134.175.206.2:10445/mc/quay.io/ascend/vllm-ascend:v0.16.0rc1 \
    vllm serve /models/Qwen/Qwen2.5-72B-Instruct --max_model_len 32768 -tp 8 --served-model-name qwen72b

     

  • 监控
  • 测试

2、双机模型

  • 说明:目前可以双机推理的模型有V3、R1、kimi、glm等。步骤是启动容器,在容器中启动推理,工程化后可以串起来实现重启后自动推理。不同模型要求的镜像不一样
  • 准备:V3、R1匹配的镜像:m.daocloud.io/quay.io/ascend/vllm-ascend:v0.19.1rc1。
  • 启动:
    • 容器启动脚本(R1为例,V3相同),startdocke.sh(2个节点脚本一样)
      # Update --device according to your device (Atlas A2: /dev/davinci[0-7] Atlas A3:/dev/davinci[0-15]).
      # Update the vllm-ascend image according to your environment.
      # Note you should download the weight to /root/.cache in advance.
      # Update the vllm-ascend image
      export IMAGE=m.daocloud.io/quay.io/ascend/vllm-ascend:v0.19.1rc1
      export NAME=vllm-ascend
      
      # Run the container using the defined variables
      # Note: If you are running bridge network with docker, please expose available ports for multiple nodes communication in advance.
      docker run -itd \
      --privileged \
      --restart always \
      --name $NAME \
      --net=host \
      --shm-size=1g \
      --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/devmm_svm \
      --device /dev/hisi_hdc \
      -v /usr/local/dcmi:/usr/local/dcmi \
      -v /etc/hccn.conf:/etc/hccn.conf \
      -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
      -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
      -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
      -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
      -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
      -v /etc/ascend_install.info:/etc/ascend_install.info \
      -v /app1:/app1 \
      $IMAGE /bin/bash -c "cd /app1/scripts && ./node.sh"
    •   推理启动脚本:node.sh(2个节点脚本不一样)
      # node0
      #!/bin/sh
      
      # this obtained through ifconfig
      # nic_name is the network interface name corresponding to local_ip of the current node
      nic_name="bond0"
      local_ip="192.168.231.234"
      
      export HCCL_IF_IP=$local_ip
      export GLOO_SOCKET_IFNAME=$nic_name
      export TP_SOCKET_IFNAME=$nic_name
      export HCCL_SOCKET_IFNAME=$nic_name
      export OMP_PROC_BIND=false
      export OMP_NUM_THREADS=1
      export HCCL_BUFFSIZE=200
      export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
      export VLLM_ASCEND_BALANCE_SCHEDULING=1
      export HCCL_INTRA_PCIE_ENABLE=1
      export HCCL_INTRA_ROCE_ENABLE=0
      export VLLM_USE_MODELSCOPE=True
      
      vllm serve /app1/models/DeepSeek-R1-0528-W8A8 \
        --host 0.0.0.0 \
        --port 8000 \
        --data-parallel-size 4 \
        --data-parallel-size-local 2 \
        --data-parallel-address $local_ip \
        --data-parallel-rpc-port 13389 \
        --tensor-parallel-size 4 \
        --quantization ascend \
        --seed 1024 \
        --served-model-name deepseek_r1 \
        --enable-expert-parallel \
        --async-scheduling \
        --max-num-seqs 16 \
        --max-model-len 16384 \
        --max-num-batched-tokens 4096 \
        --trust-remote-code \
        --gpu-memory-utilization 0.95 \
        --speculative-config '{"num_speculative_tokens":3,"method":"mtp"}' \
        --compilation-config '{"cudagraph_capture_sizes":[4,16,32,48,64], "cudagraph_mode": "FULL_DECODE_ONLY"}'
      # node1
      #!/bin/sh
      
      # this is obtained through ifconfig
      # nic_name is the network interface name corresponding to local_ip of the current node
      nic_name="bond0"
      local_ip="192.168.231.233"
      node0_ip="192.168.231.234"
      
      export HCCL_IF_IP=$local_ip
      export GLOO_SOCKET_IFNAME=$nic_name
      export TP_SOCKET_IFNAME=$nic_name
      export HCCL_SOCKET_IFNAME=$nic_name
      export OMP_PROC_BIND=false
      export OMP_NUM_THREADS=1
      export HCCL_BUFFSIZE=200
      export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
      export VLLM_ASCEND_BALANCE_SCHEDULING=1
      export HCCL_INTRA_PCIE_ENABLE=1
      export HCCL_INTRA_ROCE_ENABLE=0
      export VLLM_USE_MODELSCOPE=True
      
      vllm serve /app1/models/DeepSeek-R1-0528-W8A8 \
        --host 0.0.0.0 \
        --port 8000 \
        --headless \
        --data-parallel-size 4 \
        --data-parallel-size-local 2 \
        --data-parallel-start-rank 2 \
        --data-parallel-address $node0_ip \
        --data-parallel-rpc-port 13389 \
        --tensor-parallel-size 4 \
        --quantization ascend \
        --seed 1024 \
        --served-model-name deepseek_r1 \
        --enable-expert-parallel \
        --async-scheduling \
        --max-num-seqs 16 \
        --max-model-len 16384 \
        --max-num-batched-tokens 4096 \
        --trust-remote-code \
        --gpu-memory-utilization 0.95 \
        --speculative-config '{"num_speculative_tokens":3,"method":"mtp"}' \
        --compilation-config '{"cudagraph_capture_sizes":[4,16,32,48,64], "cudagraph_mode": "FULL_DECODE_ONLY"}'

       

       

        • 监控
        • 测试

        3、4机模型

        二、mindie框架

        1、单机模型

        • 说明:映射config.json、start.sh、模型权重路径到容器内,容器启动时执行start.sh启动模型服务
        • 准备:
          # config.json文件
          {
              "Version" : "1.0.0",
          
              "ServerConfig" :
              {
                  "ipAddress" : "0.0.0.0",
                  "managementIpAddress" : "0.0.0.0",
                  "port" : 1025,
                  "managementPort" : 1026,
                  "metricsPort" : 1027,
                  "allowAllZeroIpListening" : true,
                  "maxLinkNum" : 1000,
                  "httpsEnabled" : false,
                  "fullTextEnabled" : false,
                  "tlsCaPath" : "security/ca/",
                  "tlsCaFile" : ["ca.pem"],
                  "tlsCert" : "security/certs/server.pem",
                  "tlsPk" : "security/keys/server.key.pem",
                  "tlsPkPwd" : "security/pass/key_pwd.txt",
                  "tlsCrlPath" : "security/certs/",
                  "tlsCrlFiles" : ["server_crl.pem"],
                  "managementTlsCaFile" : ["management_ca.pem"],
                  "managementTlsCert" : "security/certs/management/server.pem",
                  "managementTlsPk" : "security/keys/management/server.key.pem",
                  "managementTlsPkPwd" : "security/pass/management/key_pwd.txt",
                  "managementTlsCrlPath" : "security/management/certs/",
                  "managementTlsCrlFiles" : ["server_crl.pem"],
                  "kmcKsfMaster" : "tools/pmt/master/ksfa",
                  "kmcKsfStandby" : "tools/pmt/standby/ksfb",
                  "inferMode" : "standard",
                  "interCommTLSEnabled" : true,
                  "interCommPort" : 1121,
                  "interCommTlsCaPath" : "security/grpc/ca/",
                  "interCommTlsCaFiles" : ["ca.pem"],
                  "interCommTlsCert" : "security/grpc/certs/server.pem",
                  "interCommPk" : "security/grpc/keys/server.key.pem",
                  "interCommPkPwd" : "security/grpc/pass/key_pwd.txt",
                  "interCommTlsCrlPath" : "security/grpc/certs/",
                  "interCommTlsCrlFiles" : ["server_crl.pem"],
                  "openAiSupport" : "vllm",
                  "tokenTimeout" : 600,
                  "e2eTimeout" : 600,
                  "distDPServerEnabled":false
              },
          
              "BackendConfig" : {
                  "backendName" : "mindieservice_llm_engine",
                  "modelInstanceNumber" : 1,
                  "npuDeviceIds" : [[0,1,2,3,4,5,6,7]],
                  "tokenizerProcessNumber" : 8,
                  "multiNodesInferEnabled" : false,
                  "multiNodesInferPort" : 1120,
                  "interNodeTLSEnabled" : true,
                  "interNodeTlsCaPath" : "security/grpc/ca/",
                  "interNodeTlsCaFiles" : ["ca.pem"],
                  "interNodeTlsCert" : "security/grpc/certs/server.pem",
                  "interNodeTlsPk" : "security/grpc/keys/server.key.pem",
                  "interNodeTlsPkPwd" : "security/grpc/pass/mindie_server_key_pwd.txt",
                  "interNodeTlsCrlPath" : "security/grpc/certs/",
                  "interNodeTlsCrlFiles" : ["server_crl.pem"],
                  "interNodeKmcKsfMaster" : "tools/pmt/master/ksfa",
                  "interNodeKmcKsfStandby" : "tools/pmt/standby/ksfb",
                  "kvPoolConfig" : {"backend":"", "configPath":""},
                  "ModelDeployConfig" :
                  {
                      "maxSeqLen" : 6400,
                      "maxInputTokenLen" : 6000,
                      "truncation" : true,
                      "ModelConfig" : [
                          {
                              "modelInstanceType" : "Standard",
                              "modelName" : "im-30b",
                              "modelWeightPath" : "/models/Qwen3-30B-A3B-Instruct-2507",
                              "worldSize" : 8,
                              "cpuMemSize" : 0,
                              "npuMemSize" : -1,
                              "backendType" : "atb",
                              "trustRemoteCode" : false,
                              "async_scheduler_wait_time": 120,
                              "kv_trans_timeout": 10,
                              "kv_link_timeout": 1080
                          }
                      ]
                  },
          
                  "ScheduleConfig" :
                  {
                      "templateType" : "Standard",
                      "templateName" : "Standard_LLM",
                      "cacheBlockSize" : 128,
          
                      "maxPrefillBatchSize" : 50,
                      "maxPrefillTokens" : 6000,
                      "prefillTimeMsPerReq" : 150,
                      "prefillPolicyType" : 0,
          
                      "decodeTimeMsPerReq" : 50,
                      "decodePolicyType" : 0,
          
                      "maxBatchSize" : 100,
                      "maxIterTimes" : 400,
                      "maxPreemptCount" : 0,
                      "supportSelectBatch" : false,
                      "maxQueueDelayMicroseconds" : 5000,
                      "maxFirstTokenWaitTime": 2500
                  }
              },
          
              "LogConfig": {
                  "dynamicLogLevel" : "",
                  "dynamicLogLevelValidHours" : 2,
                  "dynamicLogLevelValidTime" : ""
              }
          }
          # start.sh
          #!/bin/bash
          set -euo pipefail
          export LD_LIBRARY_PATH=/usr/local/lib64/python3.11/site-packages/torch/lib/:$LD_LIBRARY_PATH
          export MIES_SERVICE_MONITOR_MODE=1
          cd $MIES_INSTALL_PATH || exit 1
          
          echo "[$(date)] 停止旧的mindieservice_daemon进程..."
          pkill -9 -f mindie || true
          sleep 5
          
          echo "[$(date)] 启动mindieservice_daemon..."
          nohup ./bin/mindieservice_daemon > output.log 2>&1
          
          # 监控服务进程,进程退出则脚本退出(核心:让脚本随服务进程存活)
          echo "[$(date)] 监控mindieservice_daemon进程..."
          while pgrep -f mindieservice_daemon > /dev/null; do
              sleep 1
          done
          echo "[$(date)] mindieservice_daemon进程退出,脚本退出"
          exit 1
        • 启动:服务端口8001;监控端口1027;环境变量MIES_SERVICE_MONITOR_MODE=prometheus指定metrics接口输出普罗米修斯格式;
          docker run -it -d --shm-size=16g --privileged --restart always --name llm \
          -p 8001:1025 -p 1027:1027 \
          --device=/dev/davinci_manager --device=/dev/hisi_hdc --device=/dev/devmm_svm -v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro -v /usr/local/sbin:/usr/local/sbin:ro \
          -e MIES_SERVICE_MONITOR_MODE=prometheus \
          -v /app2/models:/models -v /app2/scripts/start.sh:/start.sh -v /app2/scripts/config.json:/usr/local/Ascend/mindie/latest/mindie-service/conf/config.json \
          134.175.206.2:10445/mc/mindie:2.2.RC1-800I-A2-py311-openeuler24.03-lts \
          /bin/bash -c "/start.sh"
        • 监控
        • 测试

        2、双机模型

        • 说明:已经不再使用,待填空
        • 准备
        • 启动
        • 监控
        • 测试

三、监控

四、测试

五、FAQ

  • vllm-ascend框架版本问题导致VL模型标识坐标框有偏移。必须使用vllm-ascend:v0.17.0rc1,不能用v0.20.2rc1
posted @ 2026-07-31 10:09  badwood  阅读(19)  评论(0)    收藏  举报
Badwood's Blog