海光DCU + ROCm 环境配置实战:驱动安装、hy-smi监控与PyTorch验证
详解海光DCU(Deep Computing Unit)的完整运维配置流程:DCU驱动安装(dtk工具包)、ROCm环境配置、hy-smi监控命令、PyTorch for DCU安装与验证、DCU Kubernetes Device Plugin部署,以及DCU与NVIDIA GPU混合环境的管理策略。
海光 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 是目前投入产出比较高的国产化路径。
