大模型部署手册-昇腾服务器
基于华为昇腾服务器,分为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、双机模型
- 说明:已经不再使用,待填空
- 准备
- 启动
- 监控
- 测试
-
- 容器启动脚本(R1为例,V3相同),startdocke.sh(2个节点脚本一样)
三、监控
四、测试
五、FAQ
- vllm-ascend框架版本问题导致VL模型标识坐标框有偏移。必须使用vllm-ascend:v0.17.0rc1,不能用v0.20.2rc1
浙公网安备 33010602011771号