本文檔將詳細闡述基于物理機服務的 Deepseek-R1-671b 多機部署方案,基于四卡昇騰910bGPU物理機進行最佳實踐,內容涵蓋環境準備、服務啟動與可視化界面三個方面。
Tips:DeepSeek-R1-671b的bf16版本部署需要4臺昇騰910B物理機服務器,w8a8量化版本需要2臺昇騰910B物理機服務器。
一、環境準備
開通物理機資源
可選規格(推薦):建議客戶根據實際需求選擇。
| 服務器類型 | 規格名 | 資源池 | CPU | 內存(GB) | GPU |
|---|---|---|---|---|---|
| 910b液冷 | physical.lcas910b.2xlarge11 | 上海15(彈性裸金屬)杭州7 (彈性裸金屬)武漢41(彈性裸金屬)蕪湖4 (彈性裸金屬)西南1 (彈性裸金屬)華北2 (彈性裸金屬) | 4路48核 | 1536 | 8*昇騰910B |
| 910b風冷 | physical.acas910b.2xlarge11 | 華北2 (標準裸金屬)華南2 (標準裸金屬)西南2 (標準裸金屬)中衛5 (標準裸金屬)沈陽8 (彈性裸金屬) | 4路48核 | 1536 | 8*昇騰910B |
1.1 物料下載
①針對具備充足空間的nvme磁盤做lvm虛擬化,或設置掛載點:
mkdir -p /mnt/data
sudo mkfs.ext4 /dev/nvme0n1
sudo mount /dev/nvme0n1 /mnt/data
blkid /dev/nvme1n1 記錄uuid字段
vi /etc/fstab在最下面增加一行:
UUID=xxxxxxxx /mnt/data ext4 defaults 0 0
②設置機器免密,便于文件傳輸:
在發送端ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub root@接收端ip:/tmp/
登陸接收端:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
sudo systemctl restart sshd
R1模型下載鏈接:,修改模型文件夾屬組為root,執行權限為750:chown -R root:root /path-to-weights/DeepSeek-R1 && chmod -R 750 /path-to-weights/DeepSeek-R1
昇騰鏡像下載鏈接:。下載2.0.T3 PoC版本(2.0.T3-800I-A2-py311-openeuler24.03-lts),該版本支持DeepSeek-V3/R1的BF16/W8A8格式。
docker login -u cn-south-1@{{用戶名}} swr.cn-south-1.myhuaweicloud.com
密碼:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
拉取鏡像:docker pull swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3-800I-A2-py311-openeuler24.03-lts
1.2 配置鏡像源(可選)
(僅針對ctyunos系統)根據天翼云鏡像站ctyunos的指導文檔()配置/etc/yum.repos.d/CTyunOS.repo,并且執行yum clean all && yum makecache
安裝依賴(僅供報錯時參考,實測ctyunos23.01系統不執行以下操作不影響部署,系統自帶python3.9):
sudo yum install -y gcc make net-tools python3 python3-dev python3-pip
pip3 install attrs cython numpy==1.24.0 decorator sympy cffi pyyaml pathlib2 psutil protobuf==3.20 scipy requests absl-py --user
python3 --version(后續步驟中用于量化的CANN支持Python3.7.x至3.11.4版本)
pip3 --version
1.3 NPU側權重轉換
fp8轉為bf16(目前npu轉換腳本不會自動復制tokenizer等文件)
git clone //gitee.com/ascend/ModelZoo-PyTorch.git
cd ModelZoo-PyTorch\MindIE\LLM\DeepSeek\DeepSeek-V2\NPU_inference
python fp8_cast_bf16.py --input-fp8-hf-path /path/to/DeepSeek-R1 --output-bf16-hf-path /path/to/deepseek-R1-bf16
- /path/to/DeepSeek-R1 表示DeepSeek-R1原始權重路徑,/path/to/deepseek-R1-bf16 表示權重轉換后的新權重路徑。
- 由于模型權重較大,請確保您的磁盤有足夠的空間放下所有權重,可依據磁盤大小自行選擇是否創建LVM磁盤虛擬化,DeepSeek-R1的fp8格式權重約為640G,bf16格式的權重約為1.3T。
- 推理作業時,也請確保您的設備有足夠的空間加載模型權重,并為推理計算預留空間。
- 部署DeepSeek-R1模型用bf16權重進行推理至少需要4臺Atlas 800I A2(8乘64G)服務器,用W8A8量化權重進行推理則至少需要2臺Atlas 800I A2 (8乘64G)。
1.4 權重量化(僅671b在兩機部署需要)
1.4.1 CANN安裝
說明權重量化(bf16-W8A8)需要安裝CANN、msit和msModelSlim,若想直接獲取量化后的W8A8文件,可直接跳轉本文第1.4.3章節
cd /mnt/matrix/CANN
下載鏈接://www.hiascend.com/developer/download/community/result?module=pt+cann&product=4&model=32
下載安裝包:①Ascend-cann-toolkit_8.0.0_linux-aarch64.run ②Ascend-cann-kernels-910b_8.0.0_linux-aarch64.run ③Ascend-cann-nnal_8.0.0_linux-aarch64.run
針對安裝包①Ascend-cann-toolkit_8.0.0_linux-aarch64.run:
增加對軟件包的可執行權限,校驗軟件包安裝文件的一致性和完整性。
chmod +x Ascend-cann-toolkit_8.0.0_linux-aarch64.run
./Ascend-cann-toolkit_8.0.0_linux-aarch64.run --check
出現如下回顯信息,表示軟件包校驗成功。
Verifying archive integrity... 100% SHA256 checksums are OK. All good.
安裝軟件包
./Ascend-cann-toolkit_8.0.0_linux-aarch64.run --install
執行以上命令會打屏華為企業業務最終用戶許可協議(EULA)的條款和條件,請輸入Y或y同意協議,繼續安裝流程。
安裝完成后,若顯示如下信息,則說明軟件安裝成功:
xxx install success
xxx表示安裝的實際軟件包名。
說明如果用戶未指定安裝路徑,則軟件會安裝到默認路徑下,默認安裝路徑如下。root用戶:“/usr/local/Ascend”,非root用戶:“${HOME}/Ascend”,${HOME}為當前用戶目錄。
配置環境變量,當前以root用戶安裝后的默認路徑為例,請用戶根據set_env.sh的實際路徑執行如下命令。
source /usr/local/Ascend/ascend-toolkit/set_env.sh
安裝后檢查。執行如下命令查詢CANN版本信息,查詢結果與安裝軟件包的版本一致時,則驗證安裝成功。
cd /usr/local/Ascend/ascend-toolkit/latest/aarch64-linux/
執行命令,查看version字段提供的版本信息。
cat ascend_toolkit_install.info
針對安裝包②Ascend-cann-kernels-910b_8.0.0_linux-aarch64.run
chmod +x Ascend-cann-kernels-910b_8.0.0_linux-aarch64.run
./Ascend-cann-kernels-910b_8.0.0_linux-aarch64.run --check
./Ascend-cann-kernels-910b_8.0.0_linux-aarch64.run --install
./Ascend-cann-kernels-910b_8.0.0_linux-aarch64.run --devel
中間輸入Y或y同意條款,繼續安裝流程。
cd /usr/local/Ascend/ascend-toolkit/latest/opp_kernel
cat version.info
針對安裝包:③Ascend-cann-nnal_8.0.0_linux-aarch64.run
chmod +x Ascend-cann-nnal_8.0.0_linux-aarch64.run
./Ascend-cann-nnal_8.0.0_linux-aarch64.run --check
./Ascend-cann-nnal_8.0.0_linux-aarch64.run --install
中間輸入Y或y同意條款,繼續安裝流程。
source /usr/local/Ascend/nnal/atb/set_env.sh
說明自動配置:執行set_env.sh腳本時,若不加任何參數,且已檢測到PyTorch環境時會自動調用torch.compiled_with_cxx11_abi()接口,自動選擇PyTorch編譯時abi參數作為ATB的abi參數,
如果沒有檢測到PyTorch環境則默認配置abi=1。
手動配置:執行set_env.sh時,支持用戶通過--cxx_abi=1和--cxx_abi=0參數指定ATB的abi參數。
cd /usr/local/Ascend/nnal/atb/latest
cat version.info
1.4.2 msit和msModelSlim安裝
說明DeepSeek模型當前已驗證的量化方法:
W8A8量化:DeepSeek-V2-Lite-Chat-16B, DeepSeek-V2-Chat-236B, DeepSeek-V3, DeepSeek-R1
W8A16量化:DeepSeek-V2-Lite-Chat-16B, DeepSeek-V2-Chat-236
msModelSlim是msit的組件,需依次安裝(CANN8.0.RC3之后的版本,將會只支持開源方式使用,通過CANN包直接使用的方式將不再受支持。后續功能優化、新增將更新在開源版本中。):
pip config set global.index-url //xxxxx(可自行配置較快的鏡像源)
git clone //gitee.com/ascend/msit.git
cd /mnt/matrix/msit/msit-br_noncom_MindStudio_8.0.0_POC_20251231/msit
bash install.sh
cd /mnt/matrix/msit/msit-br_noncom_MindStudio_8.0.0_POC_20251231/msmodelslim
bash install.sh
創建虛擬環境:
python3 -m venv ~/venv3
source /root/venv3/bin/activate
***\*cd /mnt/matrix/msit/msit-br_noncom_MindStudio_8.0.0_POC_20251231/msmodelslim/example/DeepSeek\****
export PYTHONPATH="/mnt/matrix/msit/msit-br_noncom_MindStudio_8.0.0_POC_20251231/msmodelslim:$PYTHONPATH"
cat /usr/local/Ascend/ascend-toolkit/set_env.sh
量化權重可使用quant_deepseek_w8a8.py腳本生成:
DeepSeek-V2/V3/R1 w8a8 混合量化(MLA:w8a8量化,MOE:w8a8 dynamic量化)
生成DeepSeek-V2/V3/R1模型 w8a8 混合量化權重(當前量化只支持輸入bf16格式模型):
python3 quant_deepseek_w8a8.py --model_path /mnt/matrix/model/deepseek-R1-bf16 --save_path /mnt/matrix/model/DeepSeek-R1-W8A8`
(python3 quant_deepseek_w8a8.py --model_path {浮點權重路徑} --save_path {W8A8量化權重路徑} )
說明fp8(640G左右)轉bf16(1.3T左右)轉w8a8(600G左右)
1.4.3 直接下載w8a8模型文件(可選)
首先安裝git-lfs(git large file管理工具)
(ctyunos系統無法使用官方的安裝腳本,需要手動編譯,其它系統可執行:
安裝方式一(較慢):
apt/deb類型存儲庫: curl -s //packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash && apt-get install git-lfs
yum/rpm類型存儲庫: curl -s //packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash && yum install git-lfs)
安裝方式二:
wget //github.com/git-lfs/git-lfs/releases/download/v3.6.1/git-lfs-linux-arm-v3.6.1.tar.gz
(或者直接下載//github.com/git-lfs/git-lfs/releases/download/v3.6.1/git-lfs-linux-arm-v3.6.1.tar.gz,并拷貝至服務器)
tar -xvzf git-lfs-linux-arm64-v3.6.1.tar.gz
cd git-lfs-3.6.1/
./install.sh
git lfs install
mkdir -p /mnt/matrix/model/(自己在NVMe盤下做LVM,把模型下到對應目錄)
cd /mnt/matrix/model/ && git clone //modelers.cn/State_Cloud/DeepSeek-R1-W8A8.git
此時會顯示“卡住”,這是因為git在下載全量模型權重,并不顯示。因此此時需要ctrl+c停止后執行:git lfs fetch
git lfs checkout
(tmux new -s xxx啟一個tmux防止傳輸中斷)
1.5 多機通信檢查
1.5.1 TLS檢查
每臺TLS的加密配置,多機通信,需要保證每臺機器TLS配置一致,默認TLS處于開啟狀態,需要關閉:
for i in {0..7}; do hccn_tool -i $i -tls -g ; done |grep switch
如圖,此時機器TLS配置是打開,使用以下命令關閉:
for i in {0..7}; do hccn_tool -i $i -tls -s enable 0 ; done
1.5.2 健康狀態檢查
檢查物理鏈接
for i in {0..7}; do hccn_tool -i $i -lldp -g | grep Ifname; done
檢查鏈接情況
for i in {0..7}; do hccn_tool -i $i -link -g ; done
檢查網絡健康情況
for i in {0..7}; do hccn_tool -i $i -net_health -g ; done
查看偵測ip的配置是否正確
for i in {0..7}; do hccn_tool -i $i -netdetect -g ; done
查看網關是否配置正確
for i in {0..7}; do hccn_tool -i $i -gateway -g ; done
如果某一臺讀取配置不輸出,可以嘗試重置NPU,-i 后面的編號0就是卡號,只需要復位一張卡,所有卡都會重置
npu-smi set -t reset -i 0 -c 0
注意執行熱復位命令,可能會導致NPU閃斷,并影響NPU網絡通信大概一分鐘。
1.5.3 卡間通信測試(可選)
cd /usr/local/Ascend/ascend-toolkit/latest/tools/hccl_test
cat hostfile
第一種配置方式,配置格式“節點IP:每節點進程數”,僅支持使用IPv4協議進行通信的場景
將集群內參與測試的服務器IP都添加到hostfile文件,其中執行測試命令的訓練服務器IP放在第1行,每個計算節點進程數需要和NPU數量一致,默認為8。
示例:
訓練節點ip:每節點的進程數
203.83.233.236:8
203.83.233.242:8
203.83.238.29:8
203.83.236.35:8
第二種配置方式,配置格式“節點名:每節點進程數”,該配置方式支持使用IPv4或者IPv6協議進行通信的場景。節點名即表14-5中配置的“HostName”;用戶也可在服務器上執行hostname查看節點名。
# 訓練節點名:每節點的進程數
test1:8
test2:8
test3:8
test4:8
測試前,請確保hccp進程未啟動,執行如下命令查看hccp進程是否啟動。
for i in {0..7}; do hccn_tool -i $i -process -g; done
執行hccl_test測試工具:
以32個計算節點,總共256個NPU(每個計算節點包含8個NPU)為例,進入/usr/local/Ascend/ascend-toolkit/latest/tools/hccl_test目錄,集合通信性能測試文件為“/usr/local/Ascend/ascend-toolkit/latest/tools/hccl_test/bin/all_reduce_test”,執行以下命令,一般測試使用1G數據量,可以根據現場NPU總數量(服務器數量*8),修改-n參數值。
cd /usr/local/Ascend/ascend-toolkit/latest/tools/hccl_test
mpirun -f hostfile -n 256 ./bin/all_reduce_test -p 8 -b 1G -e 1G -f 2
如果現場用戶有需求進行集合通信長穩測試時,可以執行以下命令進行持續測試。
nohup mpirun -f hostfile -n 256 ./bin/all_reduce_test -p 8 -b 1G -e 1G -i 0 > /home/hccl_test.log 2>&1 &
執行如下命令,監測測試過程。
tail -f /home/hccl_test.log
長穩測試結束后,執行以下命令結束測試。
ps -ef |grep -i all_reduce_test |grep -i [name] |grep -v grep |awk '{print $2}' |xargs -t -I {} kill -9 {}
二、容器化啟動
2.1 啟動并進入容器
docker run -itd --net=host --shm-size=500g \
--name=deepseek-r1 \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
--device=/dev/davinci{0,1,2,3,4,5,6,7} \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
-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 /var/log/npu/conf/slog/slog.conf:/var/log/npu/conf/slog/slog.conf \
-v /var/log/npu/profiling/:/var/log/npu/profiling \
-v /var/log/npu/dump/:/var/log/npu/dump \
-v /etc/hccn.conf:/etc/hccn.conf \
-v /var/log/npu/:/usr/slog \
-v /etc/localtime:/etc/localtime \
-v /mnt/data/model:/mnt/data/model \
-v /mnt/data/model/mindie-service/config.json:/usr/local/Ascend/mindie/latest/mindie-service/conf/config.json \
-v /mnt/data/model/DeepSeek-R1-bf16:/mnt/data/model/DeepSeek-R1-bf16 \ # 模型權重路徑,根據自己情況調整
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:2.0.T3.1-800I-A2-py311-openeuler24.03-lts bash
進入容器:docker exec -it deepseek-r1 bash
2.2 開啟通信環境變量
每臺機器進入容器后,修改如下環境變量:
export MASTER_IP=192.168.0.20 # 當前節點IP
export MIES_CONTAINER_IP=192.168.0.27 # 當前機器IP
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export RANKTABLEFILE=/usr/local/Ascend/mindie/latest/mindie-service/rank_table_file.json # 本機上ranktable.json文件路徑
export NPU_MEMORY_FRACTION=0.95
export ATB_LLM_BENCHMARK_ENABLE=1
export ATB_LLM_ENABLE_AUTO_TRANSPOSE=0
export ATB_LLM_HCCL_ENABLE=1
export ATB_LLM_COMM_BACKEND="hccl"
export HCCL_CONNECT_TIMEOUT=7200
export HCCL_EXEC_TIMEOUT=0
export OMP_NUM_THREADS=1
export WORLD_SIZE=16 # 根據多機使用的總卡數調整
以下幾條環境變量配置通過三個調整優化程序性能:(1) 禁用確定性通信(HCCL參數)來提升分布式計算任務間的協同效率;(2) 啟用多核并行(OMP_NUM_THREAD=10)釋放Python多線程處理能力;(3) 綁定CPU核心(NUMA節點內調度)減少內存訪問延遲,整體提升運算速度和資源利用率。
export HCCL_DETERMINISTIC=false
export HCCL_OP_EXPANSION_MODE="AIV"
export OMP_NUM_THREAD=10
export CPU_AFFINITY_CONF=2
如果只是調優的話,可以試下:升級OS內核版本(4.19.90->5.10)
所有環境變量可在/usr/local/Ascend/ascend-toolkit/set_env.sh查看:
2.3 純模型測試
2.3.1 前置準備
修改權重目錄所在目錄下的config.json文件
將 model_type 更改為 deepseekv2 (全小寫且無空格)
注意:在本次實現中,DeepSeek-R1目前沿用DeepSeek-V2代碼框架
在每臺機器上執行如下命令(容器外操作),獲取每張NPU卡的ip地址:
for i in {0..7};do hccn_tool -i $i -ip -g; done
參考如下格式,配置rank_table_file.json(該文件用于給節點和npu卡排序,節點機器有幾個,server_list的字段就有幾段):
{
"version": "1.0",
"server_count": "4", # 總節點數
"server_list": [
{
"server_id": "172.16.0.3", # 主節點(此處為節點1)ip
"container_ip": "172.16.0.3",
"device": [
{ "device_id": "0", "device_ip": "100.97.0.1", "rank_id": "0" },# server_list中第一個server為主節點。。。device_id是當前卡的本機編號,取值范圍[0, 本機卡數)。。。device_ip是當前卡的ip地址,可通過hccn_tool命令獲取。。。rank_id是當前卡的全局編號,取值范圍[0, 總卡數)
{ "device_id": "1", "device_ip": "100.97.0.2", "rank_id": "1" },
{ "device_id": "2", "device_ip": "100.97.0.3", "rank_id": "2" },
{ "device_id": "3", "device_ip": "100.97.0.4", "rank_id": "3" },
{ "device_id": "4", "device_ip": "100.97.0.5", "rank_id": "4" },
{ "device_id": "5", "device_ip": "100.97.0.6", "rank_id": "5" },
{ "device_id": "6", "device_ip": "100.97.0.7", "rank_id": "6" },
{ "device_id": "7", "device_ip": "100.97.0.8", "rank_id": "7" }
]
},
{
"server_id": "172.16.0.4", # 節點2的ip
"container_ip": "172.16.0.4", # 容器ip地址(服務化部署時需要),若無特殊配置,則與server_id相同
"device": [
{ "device_id": "0", "device_ip": "100.97.0.25", "rank_id": "8" },
{ "device_id": "1", "device_ip": "100.97.0.26", "rank_id": "9" },
{ "device_id": "2", "device_ip": "100.97.0.27", "rank_id": "10" },
{ "device_id": "3", "device_ip": "100.97.0.28", "rank_id": "11" },
{ "device_id": "4", "device_ip": "100.97.0.29", "rank_id": "12" },
{ "device_id": "5", "device_ip": "100.97.0.30", "rank_id": "13" },
{ "device_id": "6", "device_ip": "100.97.0.31", "rank_id": "14" },
{ "device_id": "7", "device_ip": "100.97.0.32", "rank_id": "15" }
]
},
{
"server_id": "172.16.0.5", # 節點3的ip
"container_ip": "172.16.0.5",
"device": [
{ "device_id": "0", "device_ip": "100.97.0.65", "rank_id": "16" },
{ "device_id": "1", "device_ip": "100.97.0.66", "rank_id": "17" },
{ "device_id": "2", "device_ip": "100.97.0.67", "rank_id": "18" },
{ "device_id": "3", "device_ip": "100.97.0.68", "rank_id": "19" },
{ "device_id": "4", "device_ip": "100.97.0.69", "rank_id": "20" },
{ "device_id": "5", "device_ip": "100.97.0.70", "rank_id": "21" },
{ "device_id": "6", "device_ip": "100.97.0.71", "rank_id": "22" },
{ "device_id": "7", "device_ip": "100.97.0.72", "rank_id": "23" }
]
},
{
"server_id": "172.16.0.6", # 節點4的ip
"container_ip": "172.16.0.6",
"device": [
{ "device_id": "0", "device_ip": "100.97.0.73", "rank_id": "24" },
{ "device_id": "1", "device_ip": "100.97.0.74", "rank_id": "25" },
{ "device_id": "2", "device_ip": "100.97.0.75", "rank_id": "26" },
{ "device_id": "3", "device_ip": "100.97.0.76", "rank_id": "27" },
{ "device_id": "4", "device_ip": "100.97.0.77", "rank_id": "28" },
{ "device_id": "5", "device_ip": "100.97.0.78", "rank_id": "29" },
{ "device_id": "6", "device_ip": "100.97.0.79", "rank_id": "30" },
{ "device_id": "7", "device_ip": "100.97.0.80", "rank_id": "31" }
]
}
],
"status": "completed"
}
重要:刪除此文本中所有注釋!!!
:wq保存退出后,將rank_table_file.json文件權限設置為640:
sudo chmod 640 /path-to-ranktablefile.json
2.3.2 精度測試(可選)
進入modeltest路徑:
cd /usr/local/Ascend/llm_model/tests/modeltest/
運行測試腳本,需在所有機器上同時執行:
bash run.sh pa_bf16 [dataset] ([shots]) [batch_size] [model_name] ([is_chat_model]) [weight_dir] [rank_table_file] [world_size] [node_num] [rank_id_start] [master_address]
Example: 在DeepSeek-R1跑CEVAl數據集主節點的命令。
bash run.sh pa_bf16 full_CEval 5 16 deepseekv2 /path/to/weights/DeepSeek-R1 /path/to/xxx/ranktable.json 32 4 0 {主節點IP}
0 代表從0號卡開始推理,之后的機器依次從8,16,24。
參數說明:
dataset可選full_BoolQ、full_CEval等,部分數據集需要設置shots
model_name為deepseekv2
weight_dir為模型權重路徑
rank_table_file為“前置準備”中配置的rank_table_file.json路徑
world_size為總卡數
node_num為當前節點編號,即rank_table_file.json的server_list中順序確定
rank_id_start為當前節點起始卡號,即rank_table_file.json中當前節點第一張卡的rank_id
master_address為主節點ip地址,即rank_table_file.json的server_list中第一個節點的ip
2.3.3 性能測試(可選)
進入modeltest路徑:
cd /usr/local/Ascend/llm_model/tests/modeltest/
運行測試腳本,需在所有機器上同時執行:
bash run.sh pa_bf16 performance [case_pair] [batch_size] [model_name] ([is_chat_model]) [weight_dir] [rank_table_file] [world_size] [node_num] [rank_id_start] [master_address]
參數含義同“精度測試”
Example: 在DeepSeek-R1跑性能測試主節點的命令
bash run.sh pa_bf16 performance [[256,256]] 16 deepseekv2 /path/to/weights/DeepSeek-R1 /path/to/xxx/ranktable.json 32 4 0 {主節點IP}
0 代表從0號卡開始推理,之后的機器依次從8,16,24。
2.3.4 服務化配置
首先配置服務化環境變量:
說明所有機器的容器內外映射的rank_table_file.json和config.json配置應該保持一致,(rank_table_file.json可在容器外創建,映射到容器內),除了環境變量的MIES_CONTAINER_IP為本機ip地址。每個節點使用的rank_table_file.json是一樣的。
說明以下所有export的參數配置均可在/mnt/data/model/serve_run.sh中找到并修改。
export MIES_CONTAINER_IP=xxx # 當前機器IP
export RANKTABLEFILE=/mnt/data/model/ranktable.json # 每臺機器容器內rank_table_file.json地址
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
其次修改服務化參數:
cd /usr/local/Ascend/mindie/latest/mindie-service/
vim conf/config.json
修改以下參數:
"httpsEnabled" : false,
...
"multiNodesInferEnabled" : true, # true為開啟多機推理
...
# 若不需要安全認證,則將以下兩個參數設為false
"interCommTLSEnabled" : false,
"interNodeTLSEnabled" : false,
...
"modelName" : "DeepSeek-R1" # 不影響服務化拉起
"modelWeightPath" : "權重路徑",
說明以下為完整的conf/config.json示例,僅供參考,建議對注釋部分進行修改:
{
"Version" : "1.0.0",
"LogConfig" :
{
"logLevel" : "Info",
"logFileSize" : 20,
"logFileNum" : 20,
"logPath" : "logs/mindie-server.log"
},
"ServerConfig" :
{
"ipAddress" : "192.168.1.3", # 改成當前節點IP
"managementIpAddress" : "192.168.1.3", # 改成當前節點IP
"port" : 11025, # 根據實際情況修改
"managementPort" : 11026, # 根據實際情況修改
"metricsPort" : 11027, # 根據實際情況修改
"allowAllZeroIpListening" : false,
"maxLinkNum" : 300, # 如果是4機,建議300
"httpsEnabled" : false, # 默認是true
"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" : false,
"interCommPort" : 11121, # 根據實際修改
"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" : "openai" # 默認是vllm,此處改成openai
},
"BackendConfig" : {
"backendName" : "mindieservice_llm_engine",
"modelInstanceNumber" : 1,
"npuDeviceIds" : [[0,1,2,3,4,5,6,7]], # 默認是[0,1,2,3]
"tokenizerProcessNumber" : 8,
"multiNodesInferEnabled" : true, # 默認是false,多機需要設置為true
"multiNodesInferPort" : 11120, # 根據實際修改
"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",
"ModelDeployConfig" :
{
"maxSeqLen" : 4096,
"maxInputTokenLen" : 2048,
"truncation" : true,
"ModelConfig" : [
{
"modelInstanceType" : "Standard",
"modelName" : "DeepSeek-R1", # 此處改為該名,最后在webui顯示該名
"modelWeightPath" : "/mnt/data/model/DeepSeek-R1-bf16",#路徑
"worldSize" : 8,
"cpuMemSize" : 5,
"npuMemSize" : -1,
"backendType" : "atb",
"trustRemoteCode" : false
}
]
},
"ScheduleConfig" :
{
"templateType" : "Standard",
"templateName" : "Standard_LLM",
"cacheBlockSize" : 128,
"maxPrefillBatchSize" : 8,
"maxPrefillTokens" : 2048,
"prefillTimeMsPerReq" : 150,
"prefillPolicyType" : 0,
"decodeTimeMsPerReq" : 50,
"decodePolicyType" : 0,
"maxBatchSize" : 8,
"maxIterTimes" : 8192, # 默認1024
"max_new_tokens" : 8192, # 新增的字段哦
"maxPreemptCount" : 0,
"supportSelectBatch" : false,
"maxQueueDelayMicroseconds" : 5000
}
}
}
2.3.5 服務啟動與測試
說明對于容器外主機的內存要求:內存>= 權重大小/機器數x1.3 (free -h)
建議啟動服務前清理緩存:
sync; echo 3 > /proc/sys/vm/drop_caches
在每臺機器容器內分別執行:
cd /usr/local/Ascend/mindie/latest/mindie-service/
./bin/mindieservice_daemon(若想退出終端仍然保持運行,需使用nohup ./bin/mindieservice_daemon > /var/log/mindieservice.log 2>&1 &)并通過tail -f /var/log/mindieservice.log 查看輸出。
停止服務:ps aux | grep mindieservice_daemon,kill -9 pid
執行命令后,首先會打印本次啟動所用的所有參數,然后直到出現以下輸出:
Daemon start success!
則認為服務成功啟動!
# 執行以下命令向服務發送請求
curl -i --location '//{ip}:{port}/v1/chat/completions' --header 'Content-Type: application/json' --data '{ "model": "DeepSeek-R1", "stream": false, "messages": [ {"role": "user", "content": "你是誰"} ] }'
# 參數說明
- 服務ip為master節點IP地址,即為ranktable.json文件中server_list中第一個server_id的IP
- 服務port為前置步驟中配置的config.json中的["ServerConfig"]["port"]字段的值
- 請求體中"model"為2.3.4步驟中配置的config.json中的["BackendConfig"]["ModelDeployConfig"]["ModelConfig"]["modelName"]字段的值
三、OpenWebUI可視化
3.1 安裝Open-WebUI
創建獨立Python3.11環境(安裝Open-WebUI要求python3.11版本):
sudo yum groupinstall -y "Development Tools"
sudo yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel
wget ``//www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz``(拉取較慢,可直接本地下載后上傳)
tar -xvzf Python-3.11.0.tgz
cd Python-3.11.0
./configure --enable-optimizations
make -j$(nproc)
sudo make altinstall
python3.11 --version
python3.11 -m venv /opt/webui-env
激活虛擬環境(退出虛擬環境命令為deactivate):source /opt/webui-env/bin/activate
在虛擬環境中可使用pip形式安裝:pip install open-webui(本文基于ctyunos23.01系統,ctyunos22系統及其他系統安裝時肯能會產生系統不兼容的報錯,此時可使用docker方式啟動OpenWebUI)
啟動Open-WebUI服務:nohup open-webui serve > /var/log/open-webui.log 2>&1 &
查看最新的日志內容:tail -f /var/log/open-webui.log
Open-WebUI默認使用8080端口,如果機器8080端口默認是封了的,需要使用Nginx做代理,將8080端口服務代理到其他可用端口,如8081。
3.2 Nginx反向代理
安裝Nginx
yum install -y nginx
在/etc/nginx/conf.d/目錄下創建文件openwebui.conf,在文件openwebui.conf中添加以下內容:
# HTTPS server for 你的域名 #填入你的域名
server {
listen 8081;
#server_name 你的域名;#填入你的域名
# SSL 配置
#ssl_certificate /etc/nginx/certs/cert.pem; #證書
#ssl_certificate_key /etc/nginx/certs/key.pem; #證書密鑰
# WebSocket support
location /ws/ {
proxy_pass //127.0.0.1:8080/ws/; # 根據實際 WebSocket 服務路徑調整
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 其他 SSL 配置(例如 TLS 強化配置)
#ssl_protocols TLSv1.2 TLSv1.3;
#ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
# 默認 location 配置
location / {
proxy_pass //127.0.0.1:8080; #填入你的openwebui的容器名+端口號
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Nginx啟動會默認使用80端口,可將/etc/nginx/nginx.conf文件里的include /etc/nginx/sites-enabled/*注釋掉:
啟動Nginx
systemctl start nginx
3.3 DeepSeek容器內配置
vim /usr/local/Ascend/mindie/latest/mindie-service/conf/config.json
端口設置為11025。因為接下來Open-WebUI將使用OpenAI API調用DS模型服務,因此"openAiSupport"字段需將“vllm”修改為任意其他字段,如 "openai"。
3.4 Open-WebUI界面配置指引
訪問Open-WebUI服務頁面 //<公網IP>:8081
創建賬號,
在“設置--管理員設置--外部連接”中設置OpenAI API,
- API端點://localhost:11025/v1 #11025是前面DS模型部署時config.json文件內設置的端口
- 模型標識:DeepSeek-R1(需與config.json中modelName一致) #模型 ID可以不用添加,留空表示包含來自該端口的所有模型。
Tips:使用OpenAI API時可以選擇將Ollama API關閉。
3.5 Open-WebUI服務啟動
- 選擇設置的模型ID對應的模型,例如:DeepSeek-R1。
- 設置完這些,就可以愉快地使用DeepSeek模型服務開啟對話了。
TIPS:①可在/opt/webui-env/lib/python3.11/site-packages/open_webui/routers/openai.py添加如下內容,從而去除 <|end_of_sentence|>字段。
payload["stop"] = ["<|end_of_sentence|>"]
payload["include_stop_str_in_output"] = False
payload["skip_special_tokens"] = True
②OpenWebUI可視化界面輸入賬號密碼后可能會白屏,原因是:OpenWebUI默認會查詢,需要修改/opt/webui-env/lib/python3.11/site-packages/open_webui/config.py路徑下的文件OPENAI_API_BASE_URL = "api.openai.com/v1"為OPENAI_API_BASE_URL = "對應機器ip:端口/v1",例如“10.0.1.4:11025/v1”
四、 服務安全配置
為確保模型服務的安全性,建議遵循以下安全配置原則:
4.1 設置訪問控制
本指南OpenWebUI使用的端口為8081。
通過配置安全組或ufw/iptables設置IP白名單,對于必須開放的端口(如OpenWebUI的8081端口),通過防火墻規則限制訪問來源IP:
# ufw 限制8081端口訪問來源ip
sudo ufw allow from <IP地址> to any port 8081
sudo ufw deny 8081/tcp # 禁用其他ip訪問8081端口
sudo ufw reload
# iptables 限制8081端口訪問來源ip
sudo iptables -A INPUT -p tcp --dport 8081 -s <IP地址> -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8081 -j DROP # 禁用其他ip訪問8081端口
如需禁用所有公網ip訪問OpenWebUI的8081端口,可配置安全組或使用ufw或iptables關閉非必要端口:
# ufw 關閉8081端口
sudo ufw deny 8081/tcp
sudo ufw reload
# iptables 關閉8081端口
sudo iptables -A INPUT -p tcp --dport 8081 -j DROP
4.2 身份驗證與權限管理
在OpenWebUI中關閉允許用戶注冊功能(參考“3.1節 安裝Open-WebUI”),并定期審計用戶列表。
五、常見問題
1、如何傳輸模型文件?
rsync -avz --progress /mnt/data/DeepSeek-R1-W8A8/ root@主機ip:/mnt/data/DeepSeek-R1-W8A8/
2、為什么配置文件沒問題,服務化拉起后報錯吶?
請檢查節點間通信:
服務端啟動監聽端口:nc -lkv 1025
客戶端連接監聽端口:nc -vz <IP> 1025
檢查異常時執行以下命令,執行前確認無其他業務:
iptables -F
systemctl restart docker
重啟docker后需要重新EXPORT環境變量
3、兩臺機器能否部署滿血版671B模型??
不能,兩機部署建議下載w8a8版本模型權重,四機部署建議下載origin權重后進行FP8—BF16格式轉換。
4、pip方式無法安裝OpenWebUI,報錯怎么辦??
建議使用docker方式安裝:
docker run -d -p 8081:8080 --privileged=true -e ENABLE_SIGNUP=true -e ENABLE_OPENAI_API=False -v open-webui:/app/backend/data --name open-webui --restart always