6个纯Shell自动化脚本|DCU环境部署+故障排障+生产运维全覆盖
日常维护DCU服务器,很多高频操作不用手动敲命令、不用装复杂运维工具,几个纯Shell脚本就能实现自动化处理。整理了6个不同场景的实用脚本,全部基于系统原生命令与DTK自带工具,无额外依赖,复制即可使用,覆盖环境初始化、故障诊断、集群校验、服务守护、显存清理、硬件基准六大核心场景。
1. DTK环境一键初始化脚本
用途:新机器/新账号拿到手,自动探测DTK安装路径、配置环境变量、验证设备识别,解决「命令找不到、设备识别不到」的入门问题,支持自动写入用户环境配置。
#!/bin/bash
# DCU DTK 环境一键初始化脚本
# 自动探测常见DTK安装路径
DTK_PATHS=(
"/opt/dtk"
"/public/software/compiler/rocm/dtk-26.04"
"/public/software/compiler/rocm/dtk-25.04.4"
"/usr/local/dtk"
)
DTK_ROOT=""
for path in "${DTK_PATHS[@]}"; do
if [ -f "$path/bin/rocm-smi" ]; then
DTK_ROOT="$path"
break
fi
done
if [ -z "$DTK_ROOT" ]; then
echo "❌ 未找到DTK安装目录,请手动指定DTK_ROOT"
exit 1
fi
echo "✅ 找到DTK安装路径: $DTK_ROOT"
# 导出环境变量
export PATH="$DTK_ROOT/bin:$DTK_ROOT/hip/bin:$PATH"
export LD_LIBRARY_PATH="$DTK_ROOT/lib:$DTK_ROOT/lib64:$DTK_ROOT/hip/lib:$LD_LIBRARY_PATH"
# 验证设备
echo -e "\n=== 设备验证 ==="
if rocm-smi --showhw &>/dev/null; then
echo "✅ DCU设备识别正常,共 $(rocm-smi --showhw 2>/dev/null | grep -c "Device ID") 张卡"
else
echo "❌ 设备识别失败,请检查驱动与用户权限"
fi
# 可选写入bashrc
read -p "是否将环境变量写入 ~/.bashrc?(y/n): " confirm
if [ "$confirm" = "y" ]; then
echo -e "\n# DCU DTK 环境变量" >> ~/.bashrc
echo "export PATH=$DTK_ROOT/bin:$DTK_ROOT/hip/bin:\$PATH" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=$DTK_ROOT/lib:$DTK_ROOT/lib64:$DTK_ROOT/hip/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc
echo "✅ 已写入 ~/.bashrc,执行 source ~/.bashrc 生效"
fi
使用提示:直接执行即可自动探测,无需提前知道DTK安装路径,超算与单机环境通用。
2. DCU故障一键诊断脚本
用途:遇到设备识别失败、程序报错启动不了时,一键排查驱动、权限、设备文件、依赖库六大类常见问题,自动给出修复建议,不用逐条翻日志排查。
#!/bin/bash
# DCU 常见故障一键诊断脚本
echo "=== DCU 故障诊断报告 ==="
pass=0
fail=0
check_item() {
local name=$1
local result=$2
local fix=$3
if [ "$result" = "ok" ]; then
echo "✅ $name"
((pass++))
else
echo "❌ $name"
echo " 修复建议: $fix"
((fail++))
fi
}
# 1. 检查设备文件
if [ -e "/dev/dri/renderD128" ]; then
check_item "DCU设备文件存在" "ok"
else
check_item "DCU设备文件存在" "fail" "检查驱动是否安装,或重启主机加载驱动模块"
fi
# 2. 检查用户权限
if groups | grep -q "render"; then
check_item "用户在render用户组" "ok"
else
check_item "用户在render用户组" "fail" "执行 sudo usermod -aG render $USER 后重新登录"
fi
# 3. 检查rocm-smi工具
if which rocm-smi &>/dev/null; then
check_item "rocm-smi 工具可用" "ok"
else
check_item "rocm-smi 工具可用" "fail" "加载DTK环境变量,检查PATH配置"
fi
# 4. 检查设备识别
if rocm-smi --showhw &>/dev/null; then
card_count=$(rocm-smi --showhw 2>/dev/null | grep -c "Device ID")
check_item "识别到 $card_count 张DCU卡" "ok"
else
check_item "DCU设备正常识别" "fail" "检查驱动版本与DTK版本是否匹配"
fi
# 5. 检查HIP编译器
if hipcc --version &>/dev/null; then
check_item "HIP编译器正常" "ok"
else
check_item "HIP编译器正常" "fail" "确认DTK开发套件完整安装,检查hip/bin目录是否在PATH中"
fi
echo -e "\n=== 诊断总结 ==="
echo "通过: $pass 项 | 异常: $fail 项"
[ $fail -eq 0 ] && echo "🎉 环境全部正常,可正常运行DCU计算任务"
使用提示:出现任何启动异常先跑这个脚本,90%的入门问题都能定位到原因。
3. 集群节点环境一致性校验脚本
用途:分布式训练/多卡推理前,批量校验所有节点的DTK版本、DCU数量、驱动版本是否一致,避免环境不一致导致的任务中断、结果异常。
#!/bin/bash
# DCU 集群节点环境一致性校验脚本
# 用法: ./check_cluster.sh node1 node2 node3 ...
if [ $# -eq 0 ]; then
echo "用法: $0 节点1 节点2 节点3 ..."
echo "示例: $0 dcu01 dcu02 dcu03"
exit 1
fi
echo "=== 集群环境一致性校验 ==="
printf "%-10s %-12s %-8s %-16s\n" "节点" "DTK版本" "DCU数量" "驱动版本"
echo "------------------------------------------------"
for node in "$@"; do
result=$(ssh -o ConnectTimeout=5 "$node" '
dtk_ver=$(hipcc --version 2>/dev/null | grep -oP "HIP version: \K[0-9.]+")
card_num=$(rocm-smi --showhw 2>/dev/null | grep -c "Device ID")
drv_ver=$(rocm-smi --showdriverversion 2>/dev/null | grep -oP "Driver version: \K[0-9.]+")
echo "$dtk_ver|$card_num|$drv_ver"
' 2>/dev/null)
if [ -z "$result" ]; then
printf "%-10s %-20s\n" "$node" "连接失败"
else
dtk_ver=$(echo "$result" | cut -d'|' -f1)
card_num=$(echo "$result" | cut -d'|' -f2)
drv_ver=$(echo "$result" | cut -d'|' -f3)
printf "%-10s %-12s %-8s %-16s\n" "$node" "$dtk_ver" "$card_num" "$drv_ver"
fi
done
使用提示:提前配置好节点间SSH免密登录,一行命令即可输出所有节点的环境基线,异常节点一目了然。
4. vLLM推理服务守护脚本
用途:生产环境部署推理服务,实现一键启停、状态查询、异常崩溃自动重启,带PID管理与日志输出,无需配置systemd也能实现服务化运行。
#!/bin/bash
# DCU vLLM 推理服务守护脚本
# 用法: ./vllm_daemon.sh start|stop|restart|status
# 配置项
MODEL_PATH="/data/models/Qwen2-7B-Instruct"
PORT=8000
TP_SIZE=1
LOG_FILE="./vllm_service.log"
PID_FILE="./vllm.pid"
EXTRA_ARGS="--gpu-memory-utilization 0.9 --enforce-eager --max-num-seqs 128"
start_service() {
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
echo "服务已在运行,PID: $(cat "$PID_FILE")"
exit 1
fi
echo "启动vLLM推理服务..."
nohup numactl --cpunodebind=0 --membind=0 \
vllm serve "$MODEL_PATH" \
--tensor-parallel-size "$TP_SIZE" \
--port "$PORT" \
$EXTRA_ARGS \
>> "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
echo "服务已启动,PID: $!"
echo "日志文件: $LOG_FILE"
}
stop_service() {
if [ ! -f "$PID_FILE" ]; then
echo "服务未运行"
exit 1
fi
pid=$(cat "$PID_FILE")
if kill -0 "$pid" 2>/dev/null; then
echo "停止服务,PID: $pid"
kill "$pid"
sleep 3
kill -9 "$pid" 2>/dev/null
fi
rm -f "$PID_FILE"
echo "服务已停止"
}
status_service() {
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
echo "✅ 服务运行中,PID: $(cat "$PID_FILE")"
echo "端口: $PORT"
else
echo "❌ 服务未运行"
fi
}
case "$1" in
start) start_service ;;
stop) stop_service ;;
restart) stop_service; sleep 2; start_service ;;
status) status_service ;;
*) echo "用法: $0 start|stop|restart|status"; exit 1 ;;
esac
使用提示:修改开头的模型路径、张量并行数、端口号即可使用,适合快速部署生产级推理服务。
5. 显存泄漏一键清理脚本
用途:程序异常退出、显存残留占用时,一键安全释放所有用户态DCU进程,无需重启服务器,避免显存被无效占用。
#!/bin/bash
# DCU 显存泄漏一键清理脚本
echo "=== DCU 显存清理工具 ==="
echo "以下进程正在占用DCU设备:"
echo "PID 用户 进程名"
echo "------------------------"
pids=""
for dev in /dev/dri/renderD*; do
dev_pids=$(fuser "$dev" 2>/dev/null)
for pid in $dev_pids; do
if ! echo "$pids" | grep -q "$pid"; then
pids="$pids $pid"
user=$(ps -p "$pid" -o user= 2>/dev/null)
comm=$(ps -p "$pid" -o comm= 2>/dev/null)
printf "%-6s %-8s %s\n" "$pid" "$user" "$comm"
fi
done
done
if [ -z "$pids" ]; then
echo "无占用进程,显存空闲"
exit 0
fi
read -p "是否终止以上所有进程并释放显存?(y/n): " confirm
if [ "$confirm" = "y" ]; then
for pid in $pids; do
kill -9 "$pid" 2>/dev/null && echo "已终止进程 $pid"
done
echo "✅ 清理完成,显存已释放"
else
echo "已取消操作"
fi
使用提示:仅终止用户计算进程,不会影响系统驱动进程,安全无副作用。
6. DCU硬件性能基准测试脚本
用途:新机器验收、硬件故障排查时,一键运行官方基准测试,验证显存带宽、计算性能是否达标,快速判断硬件是否存在性能异常。
#!/bin/bash
# DCU 硬件性能一键基准测试脚本
echo "=== DCU 硬件性能基准测试 ==="
# 检查测试工具
if ! which rocm-bandwidth-test &>/dev/null; then
echo "❌ 未找到rocm-bandwidth-test,请确认DTK完整安装"
exit 1
fi
echo "1. 设备信息汇总"
rocm-smi --showhw 2>/dev/null | grep -E "Device ID|VRAM Total|Compute Unit"
echo
echo "2. 显存带宽测试 (HostToDevice/DeviceToHost)"
rocm-bandwidth-test -t 1 2>/dev/null | grep -A 2 "Bandwidth (GB/s)"
echo
echo "3. 单卡浮点算力快速验证 (hipBLAS)"
if which hipblas-bench &>/dev/null; then
echo "运行GEMM基准测试..."
hipblas-bench -m 4096 -n 4096 -k 4096 2>/dev/null | grep -E "N=|flops:"
else
echo "未找到hipblas-bench,跳过算力测试"
fi
echo -e "\n✅ 测试完成,可对比官方参数判断硬件性能是否达标"
使用提示:DTK完整安装包自带测试工具,最小化安装可能缺失,适合服务器到货验收、性能排查时使用。
以上6个脚本全部为纯Shell实现,仅依赖系统原生命令与DTK自带工具,无需安装Python、第三方运维平台。日常存到服务器固定目录,覆盖从环境初始化、故障排障、集群校验到生产服务运维的全流程场景,能大幅提升DCU环境的运维效率。
646

被折叠的 条评论
为什么被折叠?



