验证多节点间通信

 # 所有节点都需要验证
 # Check the remote switch ports
 for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done 
 # Get the link status of the Ethernet ports (UP or DOWN)
 for i in {0..7}; do hccn_tool -i $i -link -g ; done
 # Check the network health status
 for i in {0..7}; do hccn_tool -i $i -net_health -g ; done
 # View the network detected IP configuration
 for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done
 # View gateway configuration
 for i in {0..7}; do hccn_tool -i $i -gateway -g ; done
 # View NPU network configuration
 cat /etc/hccn.conf

NPU分配IP

节点1

# ========== 服务器1 NPU IP 配置脚本 ==========
# NPU0-7 配置为 192.168.100.1-8
​
echo ">>> 开始配置服务器1 NPU IP..."
​
# 配置各NPU的IP地址
hccn_tool -i 0 -ip -s address 192.168.100.1 netmask 255.255.255.0
hccn_tool -i 1 -ip -s address 192.168.100.2 netmask 255.255.255.0
hccn_tool -i 2 -ip -s address 192.168.100.3 netmask 255.255.255.0
hccn_tool -i 3 -ip -s address 192.168.100.4 netmask 255.255.255.0
hccn_tool -i 4 -ip -s address 192.168.100.5 netmask 255.255.255.0
hccn_tool -i 5 -ip -s address 192.168.100.6 netmask 255.255.255.0
hccn_tool -i 6 -ip -s address 192.168.100.7 netmask 255.255.255.0
hccn_tool -i 7 -ip -s address 192.168.100.8 netmask 255.255.255.0
​
echo ">>> IP配置完成,开始配置netdetect对端地址..."
​
# 配置对端检测地址(指向服务器2的NPU IP)
hccn_tool -i 0 -netdetect -s address 192.168.100.9
hccn_tool -i 1 -netdetect -s address 192.168.100.10
hccn_tool -i 2 -netdetect -s address 192.168.100.11
hccn_tool -i 3 -netdetect -s address 192.168.100.12
hccn_tool -i 4 -netdetect -s address 192.168.100.13
hccn_tool -i 5 -netdetect -s address 192.168.100.14
hccn_tool -i 6 -netdetect -s address 192.168.100.15
hccn_tool -i 7 -netdetect -s address 192.168.100.16
​
echo ">>> 验证配置结果..."
echo ""
echo "--- 已配置的IP地址 ---"
for i in {0..7}; do hccn_tool -i $i -ip -g; done
​
echo ""
echo "--- netdetect 对端地址 ---"
for i in {0..7}; do hccn_tool -i $i -netdetect -g; done
​
echo ""
echo "--- 写入 hccn.conf 的内容 ---"
cat /etc/hccn.conf

节点2

# ========== 服务器2 NPU IP 配置脚本 ==========
# NPU0-7 配置为 192.168.100.9-16
echo ">>> 开始配置服务器2 NPU IP..."
# 配置各NPU的IP地址
hccn_tool -i 0 -ip -s address 192.168.100.9  netmask 255.255.255.0
hccn_tool -i 1 -ip -s address 192.168.100.10 netmask 255.255.255.0
hccn_tool -i 2 -ip -s address 192.168.100.11 netmask 255.255.255.0
hccn_tool -i 3 -ip -s address 192.168.100.12 netmask 255.255.255.0
hccn_tool -i 4 -ip -s address 192.168.100.13 netmask 255.255.255.0
hccn_tool -i 5 -ip -s address 192.168.100.14 netmask 255.255.255.0
hccn_tool -i 6 -ip -s address 192.168.100.15 netmask 255.255.255.0
hccn_tool -i 7 -ip -s address 192.168.100.16 netmask 255.255.255.0
echo ">>> IP配置完成,开始配置netdetect对端地址..."
# 配置对端检测地址(指向服务器1的NPU IP)
hccn_tool -i 0 -netdetect -s address 192.168.100.1
hccn_tool -i 1 -netdetect -s address 192.168.100.2
hccn_tool -i 2 -netdetect -s address 192.168.100.3
hccn_tool -i 3 -netdetect -s address 192.168.100.4
hccn_tool -i 4 -netdetect -s address 192.168.100.5
hccn_tool -i 5 -netdetect -s address 192.168.100.6
hccn_tool -i 6 -netdetect -s address 192.168.100.7
hccn_tool -i 7 -netdetect -s address 192.168.100.8
echo ">>> 验证配置结果..."
echo ""
echo "--- 已配置的IP地址 ---"
for i in {0..7}; do hccn_tool -i $i -ip -g; done
echo ""
echo "--- netdetect 对端地址 ---"
for i in {0..7}; do hccn_tool -i $i -netdetect -g; done
echo ""
echo "--- 写入 hccn.conf 的内容 ---"
cat /etc/hccn.conf

验证连通

  • 检查健康状态,两台服务器分别执行

# 等待30秒让HCCL网络初始化
sleep 30
# 检查网络健康状态(目标:全部 Healthy)
echo "=== $(hostname) 网络健康状态 ==="
for i in {0..7}; do
    result=$(hccn_tool -i $i -net_health -g)
    echo "  NPU${i}: ${result}"
done
  • 跨节点NPU通信

  • 节点1

echo "=== 服务器1 -> 服务器2 跨节点NPU PING测试 ==="
for i in {0..7}; do
    peer_ip=$((i + 9))
    result=$(hccn_tool -i ${i} -ping -g address 192.168.100.${peer_ip} 2>&1)
    echo "  NPU${i}(192.168.100.$((i+1))) -> 192.168.100.${peer_ip}: ${result}"
done
  • 节点2

echo "=== 服务器2 -> 服务器1 跨节点NPU PING测试 ==="
for i in {0..7}; do
    peer_ip=$((i + 1))
    result=$(hccn_tool -i ${i} -ping -g address 192.168.100.${peer_ip} 2>&1)
    echo "  NPU${i}(192.168.100.$((i+9))) -> 192.168.100.${peer_ip}: ${result}"
done

配置ranktable文件

每个节点都需要创建该文件

{
    "server_count": "2",
    "server_list": [
        {
            "device": [
                {"device_id": "0", "device_ip": "192.168.100.1", "rank_id": "0"},
                {"device_id": "1", "device_ip": "192.168.100.2", "rank_id": "1"},
                {"device_id": "2", "device_ip": "192.168.100.3", "rank_id": "2"},
                {"device_id": "3", "device_ip": "192.168.100.4", "rank_id": "3"},
                {"device_id": "4", "device_ip": "192.168.100.5", "rank_id": "4"},
                {"device_id": "5", "device_ip": "192.168.100.6", "rank_id": "5"},
                {"device_id": "6", "device_ip": "192.168.100.7", "rank_id": "6"},
                {"device_id": "7", "device_ip": "192.168.100.8", "rank_id": "7"}
            ],
            "server_id": "100.65.1.X1",
            "container_ip": "100.65.1.X1"
        },
        {
            "device": [
                {"device_id": "0", "device_ip": "192.168.100.9",  "rank_id": "8"},
                {"device_id": "1", "device_ip": "192.168.100.10", "rank_id": "9"},
                {"device_id": "2", "device_ip": "192.168.100.11", "rank_id": "10"},
                {"device_id": "3", "device_ip": "192.168.100.12", "rank_id": "11"},
                {"device_id": "4", "device_ip": "192.168.100.13", "rank_id": "12"},
                {"device_id": "5", "device_ip": "192.168.100.14", "rank_id": "13"},
                {"device_id": "6", "device_ip": "192.168.100.15", "rank_id": "14"},
                {"device_id": "7", "device_ip": "192.168.100.16", "rank_id": "15"}
            ],
            "server_id": "100.65.1.X2",
            "container_ip": "100.65.1.X2"
        }
    ],
    "status": "completed",
    "version": "1.0"
}
chmod 640 xxx/ranktable.json

起mindie服务容器

每台服务器上都需要执行

docker run -itd \
  --privileged \
  --name=mindie2.3_qwen3_235B_v2 \
  --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 /usr/local/dcmi:/usr/local/dcmi \
  -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
  -v /etc/hccn.conf:/etc/hccn.conf \
  -v /home/models/Qwen/Qwen3-235B-A22B-Instruct-2507:/home/models/Qwen/Qwen3-235B-A22B-Instruct-2507 \
  -v /home/ranktable:/home/ranktable \
  swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.3.0-800I-A2-py311-openeuler24.03-lts \
  bash

设置容器内环境变量

# 每次重启容器都要刷一下这些命令mind
# 每个节点都需要设置
​
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
source /usr/local/Ascend/cann/set_env.sh 
source mindie-service/set_env.sh
​
export ATB_LLM_HCCL_ENABLE=1
export ATB_LLM_COMM_BACKEND="hccl"
export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export WORLD_SIZE=16
export RANK_TABLE_FILE=/home/ranktable/ranktable.json
export OMP_NUM_THREADS=1
export NPU_MEMORY_FRACTION=0.95
export HCCL_DETERMINISTIC=true
export DP_MOVE_UP_ENABLE=1 
​
# export MIES_CONTAINER_IP=X.X.X.X
export MIES_CONTAINER_IP=X.X.X.X
​

设置mindie的config文件

每个节点都需要设置

{
    "Version" : "1.0.0",
​
    "ServerConfig" :
    {
        "ipAddress" : "X.X.X.X",
        "managementIpAddress" : "X.X.X.X",
        "port" : 1025,
        "managementPort" : 1026,
        "metricsPort" : 1027,
        "allowAllZeroIpListening" : true,
        "maxLinkNum" : 300,
        "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"],
        "metricsTlsCaFile" : ["metrics_ca.pem"],
        "metricsTlsCert" : "security/certs/metrics/server.pem",
        "metricsTlsPk" : "security/keys/metrics/server.key.pem",
        "metricsTlsPkPwd" : "security/pass/metrics/key_pwd.txt",
        "metricsTlsCrlPath" : "security/metrics/certs/",
        "metricsTlsCrlFiles" : ["server_crl.pem"],
        "kmcKsfMaster" : "tools/pmt/master/ksfa",
        "kmcKsfStandby" : "tools/pmt/standby/ksfb",
        "inferMode" : "standard",
        "interCommTLSEnabled" : false,
        "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" : true,
        "multiNodesInferPort" : 1120,
        "interNodeTLSEnabled" : false,
        "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" : 85000,
            "maxInputTokenLen" : 30000,
            "truncation" : false,
            "ModelConfig" : [
                {
                    "modelInstanceType" : "Standard",
                    "modelName" : "qwen3_235b",
                    "modelWeightPath" : "/home/models/Qwen/Qwen3-235B-A22B-Instruct-2507",
                    "worldSize" : 8,
                    "cpuMemSize" : 5,
                    "npuMemSize" : -1,
                    "backendType" : "atb",
                    "trustRemoteCode" : false,
                    "async_scheduler_wait_time": 120,
                    "kv_trans_timeout": 10,
                    "kv_link_timeout": 1080,
                    "tp": 8,
                    "dp": 2,
                    "sp": 1,
                    "moe_ep": 4,
                    "moe_tp": 4,
                    "models": {
                        "qwen_moe": {
                            "ep_level": 1
                        } 
                    }
                }
            ]
        },
​
        "ScheduleConfig" :
        {
            "templateType" : "Standard",
            "templateName" : "Standard_LLM",
            "cacheBlockSize" : 128,
​
            "maxPrefillBatchSize" : 64,
            "maxPrefillTokens" : 30000,
            "prefillTimeMsPerReq" : 150,
            "prefillPolicyType" : 0,
​
            "decodeTimeMsPerReq" : 50,
            "decodePolicyType" : 0,
​
            "maxBatchSize" : 256,
            "maxIterTimes" : 35000,
            "maxPreemptCount" : 0,
            "supportSelectBatch" : false,
            "maxQueueDelayMicroseconds" : 5000,
            "maxFirstTokenWaitTime": 2500
        }
    },
​
    "LogConfig": {
        "dynamicLogLevel" : "",
        "dynamicLogLevelValidHours" : 2,
        "dynamicLogLevelValidTime" : ""
    },
​
    "EnableDynamicAdjustTimeoutConfig": false
}
​

起服务

nohup ./bin/mindieservice_daemon > output.log 2>&1 &
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐