戰(zhàn))
在 Atlas 上跑通 DeepSeek-R1KTransformers 昇騰 NPU 部署實(shí)戰(zhàn)【免費(fèi)下載鏈接】ktransformersA Flexible Framework for Experiencing Heterogeneous LLM Inference/Fine-tune Optimizations項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ktr/ktransformers導(dǎo)語為什么要把 LLM 搬到昇騰 NPU 上跑最直接的答案是內(nèi)存和成本。DeepSeek-R1 這類滿血 MoE 模型的路由專家權(quán)重體量巨大GPU 集群要么買不起、要么排隊(duì)。Atlas 服務(wù)器配 1TB DDR5用 CPU NPU 異構(gòu)分工承接推理KTransformers 的 CPU 推理內(nèi)核正好吃下這條路徑——專家權(quán)重放在內(nèi)存里注意力與算子下沉到 NPU 執(zhí)行。本文是一次真實(shí)部署的復(fù)盤從 Atlas 硬件、CANN 軟件棧、雙權(quán)重合并到 balance_serve 服務(wù)啟動(dòng)與性能核對(duì)每一步的坑都標(biāo)在原地。部署前避坑清單先知道會(huì)踩什么坑后面裝環(huán)境時(shí)心里有數(shù)transformers 版本被釘死在4.57.1其他版本未驗(yàn)證裝錯(cuò)了直接報(bào)結(jié)構(gòu)解析異常。torch_npu 不能直接用 pypi 預(yù)編譯包。因?yàn)樯婕靶略鏊阕颖仨殢脑创a編譯 v2.5.1 分支且編譯后版本號(hào)里的哈希后綴要手動(dòng)去掉見下文。兩份權(quán)重缺一不可。Q4 的 GGUF 與 W8A8 的 safetensor 必須先用合并腳本合成一份只放一份進(jìn)模型目錄服務(wù)起不來。400GB 物理內(nèi)存是下限。滿血版 DeepSeek-R1/V3 的路由專家權(quán)重需要約 400GB 物理內(nèi)存內(nèi)存不足的機(jī)器別硬試。CANN 環(huán)境變量沒 source一切白搭。libhccl.so、libascend_hal.so缺失都是同一個(gè)原因速查表里給了解法這里不重復(fù)展開。搭建 Atlas 硬件與操作系統(tǒng)本節(jié)目標(biāo)是把一臺(tái) Atlas 2UP 變成可用的 300I A2 推理節(jié)點(diǎn)。硬件與系統(tǒng)版本按下表核對(duì)項(xiàng)規(guī)格服務(wù)器Atlas 2UPNPU300I A2當(dāng)前 KTransformers 適配的 NPU 型號(hào)CPUHUAWEI Kunpeng 920 7270Z內(nèi)存DDR5 服務(wù)器內(nèi)存1TB操作系統(tǒng)Ubuntu 22.04 for aarch64內(nèi)核5.15.0-25-generic裝完系統(tǒng)后做兩件事關(guān)閉自動(dòng)更新并記錄好 CANN、NPU 驅(qū)動(dòng)的實(shí)際安裝路徑——后面 source 環(huán)境變量要用。硬件插拔與固件確認(rèn)建議拉原廠支持一起完成NPU 的固件版本直接影響后面 Kernel 能否加載。配置 CANN 軟件棧軟件棧分四層HDK 固件驅(qū)動(dòng) → CANN → Python 環(huán)境 → torch_npu。順序不能亂版本必須嚴(yán)格對(duì)齊下表任何一層漂移都會(huì)在算子加載階段報(bào)錯(cuò)組件版本Ascend HDK25.3.RC1CANN8.3.RC1.alpha003需裝 ToolKit、Kernel、NNAL 三件Python3.11conda 環(huán)境一行conda create -n py311 python3.11即可PyTorchtorch2.5.1/torchvision0.20.1/torchaudio2.5.1transformers4.57.1必須無替代torch_npuv2.5.1 分支源碼編譯torch_npu 編譯前先把 CANN 與 NNAL 的環(huán)境加載進(jìn)當(dāng)前 shellsource /usr/local/Ascend/ascend-toolkit/set_env.sh source /usr/local/Ascend/nnal/atb/set_env.sh?? 編譯過程對(duì) github、gitcode 等平臺(tái)的網(wǎng)絡(luò)訪問敏感網(wǎng)絡(luò)不暢通時(shí)子模塊拉取會(huì)靜默失敗。從源碼倉庫Gitcode 上的 Ascend/pytorch獲取代碼后編譯 v2.5.1 分支。編譯裝好后還有一個(gè)反直覺的步驟打開 site-packages 下torch_npu/version.py路徑用pip show torch_npu確認(rèn)把形如__version__ 2.5.1.post4git69550dfc的版本號(hào)改為__version__ 2.5.1.post4去掉哈希后綴。環(huán)境對(duì)版本號(hào)有嚴(yán)格匹配帶后綴會(huì)直接被拒。合并 Q4 與 W8A8 雙權(quán)重KTransformers 對(duì) NPU 路徑的精度要求決定了權(quán)重要走雙份合并Q4_K_M 的 GGUF 權(quán)重負(fù)責(zé)路由專家的 CPU 側(cè)存儲(chǔ)W8A8 的 safetensor 權(quán)重負(fù)責(zé) NPU 側(cè)算子。兩份原始權(quán)重都下載就位后跑倉庫里的合并腳本python merge_safetensor_gguf.py \ --safetensor_path /path/to/DeepSeek-R1-W8A8 \ --gguf_path /path/to/DeepSeek-R1-Q4_K_M \ --output_path /output/merged腳本位于 merge_tensors/。合并完成后后續(xù)啟動(dòng)參數(shù)只指向合并后的目錄兩份原始權(quán)重不再參與推理。初始化項(xiàng)目與編譯擴(kuò)展克隆倉庫并拉取子模塊git clone https://gitcode.com/gh_mirrors/ktr/ktransformers cd ktransformers git submodule update --init --recursive進(jìn)入編譯前先安裝構(gòu)建依賴并加載 CANN 環(huán)境source /usr/local/Ascend/ascend-toolkit/set_env.sh apt install cmake libhwloc-dev pkg-config bash ./install.shinstall.sh 會(huì)編譯 CPU 側(cè)的 kt-kernel 擴(kuò)展與 llamafile 算子庫。?? 在 aarch64ARM82上如果鏈接階段報(bào)iqk_mul_mat相關(guān)錯(cuò)誤把 third_party/llamafile/iqk_mul_mat_arm82.cpp 文件內(nèi)的兩行宏定義注釋掉即可通過編譯// #define iqk_mul_mat iqk_mul_mat_arm82 // #define iqk_mul_mat_moe iqk_mul_mat_moe_arm82這是 aarch64 工具鏈的已知適配點(diǎn)x86 機(jī)器不用動(dòng)這個(gè)文件。啟動(dòng) balance_serve 推理服務(wù)服務(wù)入口是ktransformers/server/main.py關(guān)鍵參數(shù)與 NPU 優(yōu)化規(guī)則文件一起給出export USE_MERGE0 export INF_NAN_MODE_FORCE_DISABLE1 export TASK_QUEUE_ENABLE0 source /usr/local/Ascend/ascend-toolkit/set_env.sh source /usr/local/Ascend/nnal/atb/set_env.sh python ktransformers/server/main.py \ --port 10002 \ --model_path merged_weights \ --gguf_path merged_weights \ --model_name DeepSeekV3ForCausalLM \ --optimize_config_path ./ktransformers/optimize/optimize_rules/npu/DeepSeek-V3-Chat-300IA2-npu-serve.yaml \ --max_new_tokens 1024 \ --cache_lens 20480 \ --backend_type balance_serve環(huán)境變量逐個(gè)說明故障排查時(shí)只需對(duì)照這一段速查表不重復(fù)TASK_QUEUE_ENABLE0關(guān)閉任務(wù)隊(duì)列保證算子下發(fā)順序嚴(yán)格有序這是開啟圖下沉的前置條件USE_BALANCE_SERVE1與USE_NUMA1啟用 balance_serve 后端與 NUMA 綁定啟動(dòng)腳本中按需導(dǎo)出USE_MERGE0權(quán)重已離線合并運(yùn)行時(shí)不再做在線合并INF_NAN_MODE_FORCE_DISABLE1禁用推理期的 NaN 強(qiáng)制檢查省去每步的開銷--backend_type balance_serve指定服務(wù)后端--cache_lens 20480決定 KV cache 預(yù)分配長(zhǎng)度按上下文預(yù)算調(diào)整。優(yōu)化規(guī)則文件位于 ktransformers/optimize/optimize_rules/npu/300I A2 上 DeepSeek-V3 的服務(wù)化配置即上面啟動(dòng)參數(shù)引用的DeepSeek-V3-Chat-300IA2-npu-serve.yaml同目錄還有非 serve 版與 Qwen3 的對(duì)應(yīng)配置可選。用基準(zhǔn)數(shù)據(jù)驗(yàn)證 NPU 推理性能服務(wù)起來后用固定長(zhǎng)度 prompt 壓一遍 prefill 與 decode。以下為 Batchsize4、輸出長(zhǎng)度 1024 條件下的參考值tokens/sPrompt 長(zhǎng)度1K2K4KPrefill174.68169.52167.15Decode16.0716.1216.48實(shí)測(cè)與參考值偏差超過 20% 時(shí)先查 NPU 側(cè)算子是否真的走下去了npu-smi看利用率再查cache_lens是否被默認(rèn)值截?cái)?。需要定位慢算子時(shí)用PROF_PREFILL與PROF_DECODE兩個(gè)環(huán)境變量分別開啟兩階段的 profiling 輸出。故障速查現(xiàn)象處理報(bào)libhccl.so缺失見上文「配置 CANN 軟件?!巩?dāng)前 shell 先source /usr/local/Ascend/ascend-toolkit/set_env.sh報(bào)libascend_hal.so缺失補(bǔ)驅(qū)動(dòng)庫路徑export LD_LIBRARY_PATH/usr/local/Ascend/driver/lib64/driver:$LD_LIBRARY_PATHaarch64 編譯期iqk_mul_mat鏈接錯(cuò)誤注釋 third_party/llamafile/iqk_mul_mat_arm82.cpp 中兩行宏定義見「初始化項(xiàng)目與編譯擴(kuò)展」節(jié)torch_npu 導(dǎo)入即報(bào)錯(cuò)檢查version.py是否仍帶git...哈希后綴服務(wù)啟動(dòng) OOM物理內(nèi)存不足 400GB滿血版無法容納路由專家權(quán)重下一步建議把--cache_lens按業(yè)務(wù)真實(shí)上下文長(zhǎng)度調(diào)到位再用PROF_PREFILL抓一次 prefill 分布——prefill 吞吐從 170 tokens/s 量級(jí)再往上走瓶頸基本都在長(zhǎng)序列的注意力段?!久赓M(fèi)下載鏈接】ktransformersA Flexible Framework for Experiencing Heterogeneous LLM Inference/Fine-tune Optimizations項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ktr/ktransformers創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考