# DCU日常运维5个实用脚本|复制即用,排查效率翻倍
日常维护DCU服务器、跑推理训练,不用依赖复杂运维平台,几个短小的脚本就能覆盖健康检查、进程排查、性能测速、环境校验等高频场景。下面整理的都是日常开发高频使用的工具,代码简短无额外依赖,复制到终端就能跑,新手也能直接上手。
## 1. 一键整机健康巡检脚本
**解决问题**:不用挨个敲命令,一条脚本快速看完所有DCU的算力使用率、显存占用、温度,适合每日开工前快速确认集群状态。
```bash
#!/bin/bash
echo "=== DCU 整机健康巡检 $(date '+%Y-%m-%d %H:%M') ==="
echo "设备总数: $(rocm-smi --showhw 2>/dev/null | grep -c "Device ID") 张"
echo -e "\n编号 | 算力使用率 | 已用显存/总显存 | 核心温度"
echo "---- | ---------- | ---------------- | --------"
# 提取核心指标并格式化输出
rocm-smi --showuse --showmemuse --showtemp --csv 2>/dev/null | tail -n +2 | \
awk -F',' '{
gsub(/ /, "", $3); gsub(/ /, "", $5); gsub(/ /, "", $6); gsub(/ /, "", $8)
printf "%-4s | %-8s%% | %-14s | %-6s℃\n", $1, $3, $5" / "$6, $8
}'
```
直接保存为 `dcu_check.sh`,加执行权限即可运行,异常卡一眼就能识别。
## 2. 显存占用进程排查脚本
**解决问题**:显存被占满却找不到是哪个程序导致的,尤其适合程序异常退出、显存没释放的场景,一键定位进程PID。
```bash
#!/bin/bash
echo "=== 占用DCU设备的进程列表 ==="
count=0
for dev in /dev/dri/renderD*; do
echo -e "\n▶ 设备 $dev:"
processes=$(fuser $dev 2>/dev/null)
if [ -z "$processes" ]; then
echo " 无占用进程"
else
for pid in $processes; do
cmd=$(ps -p $pid -o comm= 2>/dev/null)
user=$(ps -p $pid -o user= 2>/dev/null)
echo " PID: $pid | 用户: $user | 进程: $cmd"
count=$((count+1))
done
fi
done
echo -e "\n共找到 $count 个占用进程"
```
查到异常进程后,用 `kill -9 PID`即可手动释放显存,不用重启服务器。
## 3. 模型推理快速测速脚本
**解决问题**:换模型、调精度参数后,不用搭完整推理服务,几行代码快速验证单卡生成速度,验证环境是否正常。
```python
import time
import 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()
prompt = "请简要介绍大语言模型的应用场景"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
# 预热消除首次编译开销
_ = model.generate(**inputs, max_new_tokens=10)
torch.cuda.synchronize()
# 正式测速
start = time.perf_counter()
outputs = model.generate(**inputs, max_new_tokens=200, do_sample=False)
torch.cuda.synchronize()
cost = time.perf_counter() - start
gen_tokens = outputs.shape[1] - inputs["input_ids"].shape[1]
print(f"生成Token数: {gen_tokens}")
print(f"总耗时: {cost:.2f}s")
print(f"单卡单序列速度: {gen_tokens / cost:.2f} token/s")
print(f"峰值显存: {torch.cuda.max_memory_allocated()/1024**3:.2f} GB")
```
DCU环境无需修改设备名,代码里的 `"cuda"`会通过ROCm兼容层自动映射到DCU硬件。
## 4. 环境依赖一键校验脚本
**解决问题**:新环境部署完成后,一键确认DTK、PyTorch、常用推理库是否齐全,版本是否匹配,避免跑任务到一半才发现缺依赖。
```bash
#!/bin/bash
echo "=== DCU 开发环境基线校验 ==="
echo -n "rocm-smi 工具: "
which rocm-smi &>/dev/null && echo "正常" || echo "未找到(检查DTK环境变量)"
echo -n "HIP 编译器: "
hipcc --version 2>/dev/null | grep "HIP version" || echo "未找到"
echo -e "\n--- Python 核心依赖 ---"
python3 << 'EOF'
check_list = ["torch", "transformers", "vllm"]
for lib in check_list:
try:
module = __import__(lib)
print(f"✅ {lib}: {module.__version__}")
except ImportError:
print(f"❌ {lib}: 未安装")
import torch
print(f"\nDCU 设备可用: {torch.cuda.is_available()}")
print(f"识别 DCU 数量: {torch.cuda.device_count()}")
if torch.cuda.is_available():
print(f"首卡名称: {torch.cuda.get_device_name(0)}")
EOF
```
如果 `torch.cuda.is_available()`返回False,优先检查DTK环境变量和PyTorch版本是否匹配。
## 5. 显存使用率定时监控脚本
**解决问题**:压测、长训练任务运行时,后台自动记录显存和算力波动,事后可回溯峰值占用,不用一直盯着终端。
```bash
#!/bin/bash
# 用法: ./dcu_monitor.sh 日志文件路径 采样间隔(秒)
LOG_FILE=${1:-dcu_monitor.log}
INTERVAL=${2:-5}
echo "开始监控 DCU 状态,日志写入: $LOG_FILE"
echo "采样间隔: ${INTERVAL}s,按 Ctrl+C 停止"
echo "时间,设备ID,算力使用率(%),已用显存(MB),总显存(MB)" > "$LOG_FILE"
while true; do
timestamp=$(date '+%H:%M:%S')
rocm-smi --showuse --showmemuse --csv 2>/dev/null | tail -n +2 | \
awk -F',' -v t="$timestamp" '{
gsub(/ /, "", $1); gsub(/ /, "", $3); gsub(/ /, "", $5); gsub(/ /, "", $6)
print t","$1","$3","$5","$6
}' >> "$LOG_FILE"
sleep "$INTERVAL"
done
```
任务结束后打开日志文件,就能直观看到全程的显存和算力变化,方便定位性能瓶颈。
---
以上5个脚本覆盖了DCU日常运维80%的高频场景,全部基于系统自带命令和原生Python实现,无需安装额外工具。日常存到服务器固定目录,遇到问题直接调用,比每次翻手册、敲零散命令效率高很多。