技术博客

海光DCU + ROCm 环境配置实战:驱动安装、hy-smi监控与PyTorch验证

详解海光DCU(Deep Computing Unit)的完整运维配置流程:DCU驱动安装(dtk工具包)、ROCm环境配置、hy-smi监控命令、PyTorch for DCU安装与验证、DCU Kubernetes Device Plugin部署,以及DCU与NVIDIA GPU混合环境的管理策略。

海光DCUROCm国产GPUAI基础设施驱动安装hy-smi运维

海光 DCU(Deep Computing Unit)是目前CUDA 生态迁移成本最低的国产 GPU 方案。其底层兼容 AMD ROCm 架构(HIP 编程模型),大量 CUDA 代码可通过 hipify 工具自动转换,主流 AI 框架(PyTorch/TensorFlow)均有对应的 ROCm 版本。本文讲解 DCU 的完整运维配置流程。

DCU 软件栈架构

应用层:  PyTorch / TensorFlow / PaddlePaddle

ROCm 生态:hipBLAS / MIOpen(类 cuBLAS/cuDNN)
           HIP(Heterogeneous-Compute Interface for Portability)

DCU 驱动:DTK(DCU ToolKit,海光提供的完整工具包)
         包含:驱动 + ROCm 运行时 + 开发工具

硬件:   海光 Z100L / Z100 DCU

一、系统准备

# 支持的操作系统
# - Ubuntu 20.04 / 22.04 LTS(推荐)
# - CentOS 7.9 / 8.5
# - Kylin V10(麒麟系统,信创场景)

# 检查 DCU 是否识别
lspci | grep -i hygon
# 0000:01:00.0 Display controller: Chengdu Haiguang Integrated Circuit Design Co., Ltd. Device 7100

# 确认 IOMMU 配置(建议关闭或 passthrough)
cat /proc/cmdline | grep iommu

# 安装依赖
apt-get update
apt-get install -y dkms gcc g++ make libelf-dev linux-headers-$(uname -r) \
    python3 python3-pip python3-dev cmake git wget curl

# 创建 DCU 专用用户(可选)
useradd -m -d /home/dcuuser -s /bin/bash dcuuser

二、安装 DTK(DCU ToolKit)

海光将驱动和 ROCm 工具链打包为 DTK,一次安装完成。

# DTK 下载(需向海光商务申请账号)
# 或通过合作伙伴渠道获取
# 文件名示例:dtk-24.04.3-ubuntu22.04-x86_64.tar.gz

# 解压并安装
tar -xzf dtk-24.04.3-ubuntu22.04-x86_64.tar.gz
cd dtk-24.04.3/

# 安装 DTK(包含驱动)
sudo ./install.sh
# 安装过程会自动:
# 1. 编译并安装内核模块
# 2. 安装 ROCm 运行时
# 3. 配置设备文件权限
# 4. 安装 hy-smi 工具

# 重启使内核模块生效
sudo reboot
# 重启后验证
lsmod | grep amdgpu   # DCU 使用 amdgpu 驱动(基于 AMD 驱动)
# amdgpu              12345678  0

# 验证 DCU 设备文件
ls -la /dev/kfd /dev/dri/renderD*
# crw-rw---- 1 root video /dev/kfd
# crw-rw---- 1 root render /dev/dri/renderD128

# 配置用户权限(加入 video 和 render 组)
sudo usermod -aG video,render $USER
newgrp render

# 验证 ROCm 安装
rocminfo | head -30
# ROCk module is loaded
# =====================
# HSA System Attributes
# ...
# *******
# Agent 1
# *******
#   Name:                    gfx926    ← DCU 的 GFX 版本

# 检查 ROCm 版本
cat /opt/dtk/version.txt   # 或
rocm-smi --version

三、hy-smi 监控命令

hy-smi 是海光 DCU 的监控工具,功能类似 nvidia-smi

# 查看所有 DCU 概览
hy-smi

# 典型输出:
# ====================== ROCm System Management Interface ======================
# ========================================    =================   =========
# DCU     Temp     AvgPwr     Perf     PwrCap     VRAM%    DCU%
# ========================================    =================   =========
# 0       45.0c    65.0W      auto     350.0W     15%      92%
# 1       43.0c    62.0W      auto     350.0W     14%      89%
# ====================== End of ROCm SMI Log ============================

# 查看详细信息
hy-smi -i 0       # 查看 DCU 0 详情
hy-smi --showtemp  # 查看所有温度
hy-smi --showuse   # 查看 GPU 利用率
hy-smi --showmemuse # 查看显存使用
hy-smi --showpower  # 查看功耗
hy-smi --showclocks # 查看频率

# 查看 DCU 内存使用详情
hy-smi --showmeminfo vram --alldevices

# 查看 DCU 进程(哪些进程在用 DCU)
hy-smi --showpids

# 持续监控(每 2 秒刷新)
watch -n 2 hy-smi

# 设置性能模式
hy-smi --setperflevel high   # 高性能模式(训练时用)
hy-smi --setperflevel auto   # 自动模式(默认)

# 重置 DCU 状态
hy-smi --gpureset -i 0   # 慎用,会中断所有任务

四、安装 PyTorch for DCU

# 方法1:使用海光定制版 PyTorch(推荐,开箱即用)
# 从 DTK 中获取对应版本的 PyTorch wheel
pip3 install /opt/dtk/torch/torch-2.1.0+gitxxxxxx-cp310-cp310-linux_x86_64.whl

# 方法2:使用 ROCm 官方 PyTorch
pip3 install torch==2.3.0 torchvision==0.18.0 torchaudio==2.3.0 \
    --index-url https://download.pytorch.org/whl/rocm6.0

# 安装 DCU 专用通信库(类似 NCCL)
pip3 install /opt/dtk/rccl/rccl-*.whl   # RCCL(ROCm CCL)

# 验证 DCU 可用
python3 << 'EOF'
import torch

print(f"PyTorch 版本: {torch.__version__}")
print(f"ROCm 可用: {torch.cuda.is_available()}")  # DCU 使用 CUDA 接口(HIP 透明)
print(f"DCU 数量: {torch.cuda.device_count()}")
print(f"DCU 名称: {torch.cuda.get_device_name(0)}")

# 测试矩阵运算
x = torch.randn(1000, 1000).cuda()   # .cuda() 在 DCU 上就是 .dcu()
y = torch.randn(1000, 1000).cuda()
z = torch.mm(x, y)
print(f"矩阵乘法结果 shape: {z.shape}")
print("✅ DCU 运算正常")
EOF

注意: 海光 DCU 使用 HIP 透明兼容层,代码里写 .cuda() / torch.cuda.* 在 DCU 上是可以工作的,不需要把代码改成 .dcu()


五、CUDA 代码迁移(hipify)

# hipify 工具:自动将 CUDA 代码转换为 HIP 代码
# DTK 中包含 hipify-perl(快速)和 hipify-clang(精确)

# 安装 hipify
which hipify-perl  # DTK 已包含

# 转换单个文件
hipify-perl cuda_kernel.cu > hip_kernel.cpp

# 批量转换目录
hipify-perl --print-stats -inplace \
    --include-dirs ./cuda_src \
    $(find ./cuda_src -name "*.cu" -o -name "*.cuh")

# 典型的 CUDA → HIP 替换:
# cuda       → hip
# CUDA       → HIP
# cudaMalloc → hipMalloc
# cudaMemcpy → hipMemcpy
# __global__ → __global__  (不变)
# threadIdx  → threadIdx   (不变)

# 编译 HIP 代码(使用 hipcc)
hipcc -o my_kernel hip_kernel.cpp -lhipblas

# 验证转换后的代码
python3 check_ops.py   # 运行单元测试对比 CUDA 和 DCU 输出

六、DCU Kubernetes Device Plugin

# 安装海光 DCU Device Plugin
# 下载:https://github.com/ROCm/k8s-device-plugin(或海光提供的版本)

# 部署 DaemonSet
cat << 'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: dcu-device-plugin
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: dcu-device-plugin
  template:
    metadata:
      labels:
        name: dcu-device-plugin
    spec:
      nodeSelector:
        accelerator: hygon-dcu
      tolerations:
        - key: dcu
          operator: Exists
          effect: NoSchedule
      containers:
        - name: device-plugin
          image: rocm/k8s-device-plugin:1.25.2.6
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: ["ALL"]
          volumeMounts:
            - name: dp
              mountPath: /var/lib/kubelet/device-plugins
            - name: sys
              mountPath: /sys
            - name: dev
              mountPath: /dev
      volumes:
        - name: dp
          hostPath:
            path: /var/lib/kubelet/device-plugins
        - name: sys
          hostPath:
            path: /sys
        - name: dev
          hostPath:
            path: /dev
EOF

# 验证
kubectl get node -o custom-columns="NAME:.metadata.name,GPU:.status.capacity.amd\.com/gpu"
# NAME           GPU
# dcu-node-01    8   ← 8 个 DCU
# DCU Pod 示例
apiVersion: v1
kind: Pod
metadata:
  name: dcu-test
spec:
  nodeSelector:
    accelerator: hygon-dcu
  containers:
    - name: dcu-container
      image: rocm/pytorch:rocm6.0_ubuntu22.04_py3.11_pytorch_2.3.0
      command: ["python3", "-c"]
      args: ["import torch; print(torch.cuda.is_available()); print(torch.cuda.device_count())"]
      resources:
        limits:
          amd.com/gpu: 1     # 申请 1 个 DCU

七、常见问题

# 问题1:rocminfo 报错 "HSA_STATUS_ERROR_OPEN_FAILED"
# 原因:用户没有 /dev/kfd 的访问权限
ls -la /dev/kfd
# crw-rw---- 1 root video /dev/kfd
sudo usermod -aG video $USER && newgrp video

# 问题2:PyTorch 报 "HIP error: invalid device function"
# 原因:PyTorch 编译的 GFX 版本与 DCU 不匹配
rocminfo | grep "gfx"   # 查看 DCU 的 GFX 版本
# 确保 PyTorch 支持该 GFX 版本(例如 gfx926)
# 解决:使用海光官方提供的 PyTorch wheel(已针对 DCU 编译)

# 问题3:多卡训练 RCCL 通信失败
# 查看 RCCL 日志
export NCCL_DEBUG=INFO   # 开启 RCCL 调试(DCU 上 NCCL 对应 RCCL)
python3 train_multi_gpu.py 2>&1 | grep -E "NCCL|RCCL|error"

# 问题4:hy-smi 显示 DCU 频率异常低
# 检查性能模式
hy-smi --showperflevel
hy-smi --setperflevel high  # 切换到高性能模式

# 问题5:hipify 转换后代码编译报错
# 检查未支持的 CUDA API
hipify-perl --print-stats cuda_code.cu 2>&1 | grep "not supported"
# 未支持的 API 需要手动实现 HIP 等价逻辑

小结

海光 DCU 的核心优势是 ROCm 生态兼容:现有 CUDA 代码通过 hipify 工具大部分可自动转换,PyTorch 代码中的 .cuda() 调用无需修改即可在 DCU 上运行。配置链路:DTK 一键安装(驱动+ROCm)→ hy-smi 验证 DCU 状态 → 安装海光 PyTorch wheel → K8s Device Plugin 部署。最大的坑在于 GFX 版本匹配(必须用对应 DCU 型号编译的 PyTorch)和多卡通信(使用 RCCL 替代 NCCL)。在信创+AI 训练场景,海光 DCU 是目前投入产出比较高的国产化路径。