8個(gè)實(shí)用小技巧|零代碼改動(dòng),提效又避坑)
日常用DCU做開發(fā)、跑任務(wù)很多效率問題和常見坑其實(shí)不用大費(fèi)周章改代碼、調(diào)環(huán)境幾個(gè)隨手就能用的小命令、小配置就能解決。整理了8個(gè)實(shí)測(cè)高頻好用的小技巧覆蓋環(huán)境校驗(yàn)、性能提效、排障運(yùn)維、開發(fā)提效四大場(chǎng)景新手看完能少走一大段彎路老用戶也能撿幾個(gè)實(shí)用小操作。技巧13秒快速校驗(yàn)環(huán)境可用性適用場(chǎng)景剛登錄節(jié)點(diǎn)、加載完DTK模塊想快速確認(rèn)DCU設(shè)備能不能被正常識(shí)別不用寫完整的C測(cè)試程序。一行命令快速校驗(yàn)PyTorch與設(shè)備的連通性搭配編譯器檢查10秒就能排除基礎(chǔ)環(huán)境問題# 校驗(yàn)PyTorch是否能正常識(shí)別DCUpython3-cimport torch;print(設(shè)備可用:,torch.cuda.is_available());print(DCU數(shù)量:,torch.cuda.device_count())# 校驗(yàn)HIP編譯器是否正常加載hipcc--version|grepHIP version如果第一行返回True和對(duì)應(yīng)卡數(shù)說明驅(qū)動(dòng)、環(huán)境變量、框架版本基本對(duì)齊不用再反復(fù)翻驅(qū)動(dòng)文檔、查路徑配置。超算平臺(tái)切換DTK版本后先跑這一行能快速定位問題出在環(huán)境還是代碼。技巧2顯存殘留一鍵清理不用等節(jié)點(diǎn)重啟適用場(chǎng)景程序異常崩潰、手動(dòng)中斷任務(wù)后顯存被殘留進(jìn)程占滿rocm-smi看顯存占用居高不下但找不到運(yùn)行中的程序。用fuser定位所有占用DCU設(shè)備文件的進(jìn)程一鍵終止釋放顯存全程不用找管理員、不用重啟節(jié)點(diǎn)# 查看所有占用DCU設(shè)備的進(jìn)程僅查看不終止fuser/dev/dri/renderD1282/dev/null# 一鍵終止所有占用首卡的進(jìn)程謹(jǐn)慎使用會(huì)結(jié)束所有對(duì)應(yīng)DCU任務(wù)fuser-k/dev/dri/renderD1282/dev/null單卡節(jié)點(diǎn)直接用多卡節(jié)點(diǎn)按需指定對(duì)應(yīng)的render設(shè)備號(hào)從renderD128開始依次遞增。日常調(diào)試頻繁啟停程序時(shí)這個(gè)命令能省掉大量等顯存釋放的時(shí)間。技巧3零代碼改動(dòng)提性能跑任務(wù)前加個(gè)前綴適用場(chǎng)景跑多卡推理、大計(jì)算量任務(wù)不想改代碼、不想調(diào)參數(shù)只想簡單提升一下運(yùn)行效率。在啟動(dòng)命令前加numactl做NUMA綁核將CPU和DCU綁定在同一個(gè)NUMA節(jié)點(diǎn)上避免跨節(jié)點(diǎn)通信損耗單任務(wù)就能帶來10%-30%的性能提升完全零成本# 先查DCU對(duì)應(yīng)的NUMA節(jié)點(diǎn)歸屬rocm-smi--showtopo# 示例將程序綁定到NUMA 0節(jié)點(diǎn)的CPU和內(nèi)存numactl--cpunodebind0--membind0python your_train_script.py主流8卡DCU服務(wù)器通常分為2個(gè)NUMA組每組對(duì)應(yīng)4張卡綁核后跨NUMA通信的開銷會(huì)大幅降低。這是性價(jià)比最高的性能優(yōu)化手段沒有之一推理、訓(xùn)練、科學(xué)計(jì)算場(chǎng)景都通用。技巧4rocm-smi的3個(gè)寶藏參數(shù)告別冗余信息默認(rèn)的rocm-smi輸出信息又多又亂日常用只需要記住3個(gè)參數(shù)就能精準(zhǔn)拿到想要的核心信息日常巡檢組合只看算力使用率、顯存使用率、溫度三個(gè)核心指標(biāo)清爽直觀rocm-smi--showuse--showmemuse--showtemp--csv格式化輸出輸出標(biāo)準(zhǔn)CSV格式方便寫腳本解析、做自動(dòng)化監(jiān)控--showtopo查拓?fù)洳榭纯ㄩg互聯(lián)帶寬、NUMA歸屬做多卡優(yōu)化前必查技巧5一勞永逸解決編譯忘加架構(gòu)參數(shù)的問題適用場(chǎng)景新手編譯HIP程序總忘記加--offload-arch編譯全程零報(bào)錯(cuò)但運(yùn)行時(shí)設(shè)備數(shù)返回0排查半天找不到原因。給hipcc加一個(gè)永久別名自動(dòng)帶上目標(biāo)架構(gòu)參數(shù)以后直接敲hipcc就行不用每次手動(dòng)加參數(shù)# 把下面這行加到 ~/.bashrc 末尾永久生效架構(gòu)按自己的卡調(diào)整aliashipcchipcc --offload-archgfx906# 生效后直接編譯自動(dòng)帶上架構(gòu)參數(shù)source~/.bashrc hipcc-stdc14-O2-omyapp myapp.cpp深算一號(hào)Z100對(duì)應(yīng)gfx906深算二號(hào)K100對(duì)應(yīng)gfx926根據(jù)硬件型號(hào)改一下就行能徹底規(guī)避90%的“編譯通過但運(yùn)行無設(shè)備”問題。技巧65行代碼快速測(cè)單卡推理基線適用場(chǎng)景拿到新節(jié)點(diǎn)、換了新模型想快速摸一下單卡的推理速度基線不用搭vLLM服務(wù)、不用寫完整測(cè)試腳本。用transformers自帶接口幾行代碼就能跑完測(cè)速結(jié)果直觀可對(duì)比importtime,torchfromtransformersimportAutoModelForCausalLM,AutoTokenizer model_pathQwen/Qwen2-7B-InstructtokenizerAutoTokenizer.from_pretrained(model_path)modelAutoModelForCausalLM.from_pretrained(model_path,torch_dtypetorch.float16,device_mapcuda).eval()inputstokenizer(測(cè)試輸入文本,return_tensorspt).to(cuda)_model.generate(**inputs,max_new_tokens10)# 預(yù)熱消除首次編譯開銷starttime.perf_counter()outmodel.generate(**inputs,max_new_tokens200,do_sampleFalse)print(f單卡生成速度:{(out.shape[1]-inputs[input_ids].shape[1])/(time.perf_counter()-start):.2f}token/s)跑一次就能知道單卡的單序列生成速度心里有個(gè)基準(zhǔn)線后續(xù)優(yōu)化、排查性能問題都有參照。技巧7SLURM作業(yè)兩個(gè)省心小技巧兩個(gè)超算提交任務(wù)的實(shí)用小操作日常用能省很多事自動(dòng)記錄環(huán)境版本在SLURM腳本開頭加上hipcc --version、python3 -c import torch;print(torch.__version__)把版本信息打進(jìn)日志后續(xù)出問題不用再回憶當(dāng)時(shí)用的哪個(gè)版本排查效率翻倍。實(shí)時(shí)跟蹤作業(yè)輸出作業(yè)剛提交不用等跑完直接用tail -f slurm-xxx.out實(shí)時(shí)看日志或者用watch -n 2 squeue -u $USER盯著作業(yè)狀態(tài)不用反復(fù)敲命令刷新。技巧8裝PyTorch避坑一行命令裝對(duì)ROCm版本適用場(chǎng)景很多新手直接pip install torch默認(rèn)裝成CUDA版本怎么都識(shí)別不到DCU反復(fù)重裝浪費(fèi)時(shí)間。指定ROCm版本的PyTorch源一行命令裝對(duì)適配版本# DTK 26.04 對(duì)應(yīng) ROCm 6.0安裝對(duì)應(yīng)版本PyTorchpipinstalltorch2.4.0torchvision0.19.0\--index-url https://download.pytorch.org/whl/rocm6.0DTK版本和ROCm版本是一一對(duì)應(yīng)的DTK 25.x對(duì)應(yīng)ROCm 5.xDTK 26.x對(duì)應(yīng)ROCm 6.x版本對(duì)不上大概率識(shí)別不到設(shè)備這是新手環(huán)境配置的第一大坑。以上8個(gè)都是日常開發(fā)運(yùn)維里高頻用到的小技巧沒有復(fù)雜的原理和代碼改動(dòng)復(fù)制粘貼就能用覆蓋了從環(huán)境配置、日常開發(fā)到任務(wù)提交的全流程小痛點(diǎn)。DCU的使用邏輯和CUDA大同小異只是很多細(xì)節(jié)習(xí)慣不一樣多攢一些實(shí)用小工具上手會(huì)越來越順手。