6 个纯 Shell 自动化脚本|DCU 环境部署 + 故障排障 + 生产运维全覆盖

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环境的运维效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值