日常用DCU做开发、跑任务,很多效率问题和常见坑其实不用大费周章改代码、调环境,几个随手就能用的小命令、小配置就能解决。整理了8个实测高频好用的小技巧,覆盖环境校验、性能提效、排障运维、开发提效四大场景,新手看完能少走一大段弯路,老用户也能捡几个实用小操作。

技巧1:3秒快速校验环境可用性

适用场景:刚登录节点、加载完DTK模块,想快速确认DCU设备能不能被正常识别,不用写完整的C++测试程序。

一行命令快速校验PyTorch与设备的连通性,搭配编译器检查,10秒就能排除基础环境问题:

# 校验PyTorch是否能正常识别DCU
python3 -c "import torch;print('设备可用:',torch.cuda.is_available());print('DCU数量:',torch.cuda.device_count())"

# 校验HIP编译器是否正常加载
hipcc --version | grep "HIP version"

如果第一行返回True和对应卡数,说明驱动、环境变量、框架版本基本对齐,不用再反复翻驱动文档、查路径配置。超算平台切换DTK版本后先跑这一行,能快速定位问题出在环境还是代码。

技巧2:显存残留一键清理,不用等节点重启

适用场景:程序异常崩溃、手动中断任务后,显存被残留进程占满,rocm-smi看显存占用居高不下,但找不到运行中的程序。

fuser定位所有占用DCU设备文件的进程,一键终止释放显存,全程不用找管理员、不用重启节点:

# 查看所有占用DCU设备的进程(仅查看不终止)
fuser /dev/dri/renderD128 2>/dev/null

# 一键终止所有占用首卡的进程(谨慎使用,会结束所有对应DCU任务)
fuser -k /dev/dri/renderD128 2>/dev/null

单卡节点直接用,多卡节点按需指定对应的render设备号(从renderD128开始依次递增)。日常调试频繁启停程序时,这个命令能省掉大量等显存释放的时间。

技巧3:零代码改动提性能:跑任务前加个前缀

适用场景:跑多卡推理、大计算量任务,不想改代码、不想调参数,只想简单提升一下运行效率。

在启动命令前加numactl做NUMA绑核,将CPU和DCU绑定在同一个NUMA节点上,避免跨节点通信损耗,单任务就能带来10%-30%的性能提升,完全零成本:

# 先查DCU对应的NUMA节点归属
rocm-smi --showtopo

# 示例:将程序绑定到NUMA 0节点的CPU和内存
numactl --cpunodebind=0 --membind=0 python your_train_script.py

主流8卡DCU服务器通常分为2个NUMA组,每组对应4张卡,绑核后跨NUMA通信的开销会大幅降低。这是性价比最高的性能优化手段,没有之一,推理、训练、科学计算场景都通用。

技巧4:rocm-smi的3个宝藏参数,告别冗余信息

默认的rocm-smi输出信息又多又乱,日常用只需要记住3个参数,就能精准拿到想要的核心信息:

  1. 日常巡检组合:只看算力使用率、显存使用率、温度三个核心指标,清爽直观
    rocm-smi --showuse --showmemuse --showtemp
    
  2. --csv格式化输出:输出标准CSV格式,方便写脚本解析、做自动化监控
  3. --showtopo查拓扑:查看卡间互联带宽、NUMA归属,做多卡优化前必查

技巧5:一劳永逸解决编译忘加架构参数的问题

适用场景:新手编译HIP程序总忘记加--offload-arch,编译全程零报错,但运行时设备数返回0,排查半天找不到原因。

hipcc加一个永久别名,自动带上目标架构参数,以后直接敲hipcc就行,不用每次手动加参数:

# 把下面这行加到 ~/.bashrc 末尾,永久生效(架构按自己的卡调整)
alias hipcc='hipcc --offload-arch=gfx906'

# 生效后直接编译,自动带上架构参数
source ~/.bashrc
hipcc -std=c++14 -O2 -o myapp myapp.cpp

深算一号Z100对应gfx906,深算二号K100对应gfx926,根据硬件型号改一下就行,能彻底规避90%的“编译通过但运行无设备”问题。

技巧6:5行代码快速测单卡推理基线

适用场景:拿到新节点、换了新模型,想快速摸一下单卡的推理速度基线,不用搭vLLM服务、不用写完整测试脚本。

用transformers自带接口,几行代码就能跑完测速,结果直观可对比:

import time, torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_path = "Qwen/Qwen2-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.float16, device_map="cuda").eval()

inputs = tokenizer("测试输入文本", return_tensors="pt").to("cuda")
_ = model.generate(**inputs, max_new_tokens=10) # 预热消除首次编译开销
start = time.perf_counter()
out = model.generate(**inputs, max_new_tokens=200, do_sample=False)
print(f"单卡生成速度: {(out.shape[1]-inputs['input_ids'].shape[1]) / (time.perf_counter()-start):.2f} token/s")

跑一次就能知道单卡的单序列生成速度,心里有个基准线,后续优化、排查性能问题都有参照。

技巧7:SLURM作业两个省心小技巧

两个超算提交任务的实用小操作,日常用能省很多事:

  1. 自动记录环境版本:在SLURM脚本开头加上hipcc --versionpython3 -c "import torch;print(torch.__version__)",把版本信息打进日志,后续出问题不用再回忆当时用的哪个版本,排查效率翻倍。
  2. 实时跟踪作业输出:作业刚提交不用等跑完,直接用tail -f slurm-xxx.out实时看日志,或者用watch -n 2 squeue -u $USER盯着作业状态,不用反复敲命令刷新。

技巧8:装PyTorch避坑:一行命令装对ROCm版本

适用场景:很多新手直接pip install torch,默认装成CUDA版本,怎么都识别不到DCU,反复重装浪费时间。

指定ROCm版本的PyTorch源,一行命令装对适配版本:

# DTK 26.04 对应 ROCm 6.0,安装对应版本PyTorch
pip install torch==2.4.0 torchvision==0.19.0 \
  --index-url https://download.pytorch.org/whl/rocm6.0

DTK版本和ROCm版本是一一对应的:DTK 25.x对应ROCm 5.x,DTK 26.x对应ROCm 6.x,版本对不上大概率识别不到设备,这是新手环境配置的第一大坑。


以上8个都是日常开发运维里高频用到的小技巧,没有复杂的原理和代码改动,复制粘贴就能用,覆盖了从环境配置、日常开发到任务提交的全流程小痛点。DCU的使用逻辑和CUDA大同小异,只是很多细节习惯不一样,多攒一些实用小工具,上手会越来越顺手。

Logo

一站式 AI 云服务平台

更多推荐