第23章 ROCm虚拟化栈Docker化实战

本章是本专栏的核心实战章节,围绕ROCm虚拟化栈的Docker化展开,覆盖驱动/运行时要求、GPU设备映射、镜像选择、Compose编排、性能测试与排障。

23.1 ROCm容器化基础

23.1.1 ROCm组件关系

text 复制代码
ROCm栈概览:

用户空间:
  - ROCm Runtime (HIP, HSA)
  - 数学库 (rocBLAS, MIOpen, rocFFT)
  - 工具链 (rocminfo, rocm-smi)

内核空间:
  - amdgpu驱动
  - /dev/kfd  (Kernel Fusion Driver)
  - /dev/dri  (DRM设备)

23.1.2 容器可见的关键设备

text 复制代码
容器需要的关键设备:
- /dev/kfd  : ROCm计算核心
- /dev/dri  : DRM GPU设备
- /dev/dri/renderD* : 用户态渲染设备

23.2 主机环境要求

23.2.1 驱动与内核

text 复制代码
要求:
✅ 主机已安装ROCm驱动(amdgpu + ROCm runtime)
✅ 内核支持KFD和DRM
✅ /dev/kfd 和 /dev/dri 存在
bash 复制代码
# 检查设备节点
ls -l /dev/kfd /dev/dri

# 查看GPU信息
rocminfo | head -n 30

# 查看驱动状态
rocm-smi

23.2.2 用户组权限

bash 复制代码
# 必要的组权限
# /dev/kfd 和 /dev/dri 通常属于 video/render 组

id
# 示例输出:uid=1000 user gid=1000 user groups=...,video,render

# 加入组(需要重新登录)
sudo usermod -aG video,render $USER

23.3 ROCm镜像选择

23.3.1 官方镜像

text 复制代码
常用镜像:
- rocm/pytorch:latest
- rocm/tensorflow:latest
- rocm/dev-ubuntu-22.04
- rocm/rocm-terminal

23.3.2 镜像选择建议

text 复制代码
开发环境:rocm/dev-ubuntu-22.04
深度学习:rocm/pytorch 或 rocm/tensorflow
诊断工具:rocm/rocm-terminal

23.4 运行ROCm容器

23.4.1 基础运行命令

bash 复制代码
docker run -it --rm \
  --device=/dev/kfd \
  --device=/dev/dri \
  --group-add video \
  --group-add render \
  rocm/rocm-terminal

23.4.2 运行HIP程序

bash 复制代码
docker run -it --rm \
  --device=/dev/kfd \
  --device=/dev/dri \
  --group-add video \
  --group-add render \
  rocm/dev-ubuntu-22.04 \
  bash -lc "rocminfo | head -n 20"

23.4.3 运行PyTorch

bash 复制代码
docker run -it --rm \
  --device=/dev/kfd \
  --device=/dev/dri \
  --group-add video \
  --group-add render \
  rocm/pytorch:latest \
  python - <<'PY'
import torch
print(torch.__version__)
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0))
PY

注意:ROCm环境中torch.cuda仍用于GPU访问,但底层是HIP。

23.5 Docker Compose编排

yaml 复制代码
version: '3.8'
services:
  rocm-dev:
    image: rocm/dev-ubuntu-22.04
    devices:
      - /dev/kfd
      - /dev/dri
    group_add:
      - video
      - render
    volumes:
      - ./workspace:/workspace
    working_dir: /workspace
    command: bash
bash 复制代码
# 启动容器
# docker compose up -d
# 进入容器
# docker compose exec rocm-dev bash

23.6 设备映射与容器权限

23.6.1 常见错误与解决

text 复制代码
错误1:rocminfo报错无设备
→ 检查 /dev/kfd /dev/dri 是否映射

错误2:Permission denied
→ 检查容器是否加入video/render组
→ 检查宿主机用户组权限

23.6.2 运行时安全配置

bash 复制代码
# 仅映射需要的设备
--device=/dev/kfd --device=/dev/dri

# 不推荐使用--privileged

23.7 性能测试与验证

23.7.1 基础性能测试

bash 复制代码
# 运行rocminfo确认设备
rocminfo

# rocm-smi查看利用率
rocm-smi

23.7.2 PyTorch性能测试

python 复制代码
# benchmark.py
import torch
import time

x = torch.randn(4096, 4096, device='cuda')
y = torch.randn(4096, 4096, device='cuda')

# 预热
for _ in range(5):
    z = x @ y

# 计时
start = time.time()
for _ in range(20):
    z = x @ y

torch.cuda.synchronize()
print("Elapsed:", time.time() - start)
bash 复制代码
# 运行
python benchmark.py

23.7.3 ROCm-SMI监控

bash 复制代码
# 持续监控
ocm-smi -a -d 1

23.8 常见问题排查

23.8.1 容器内无法访问GPU

text 复制代码
检查点:
1. /dev/kfd /dev/dri 是否映射
2. video/render组是否添加
3. 主机rocminfo是否正常
4. 容器内rocminfo是否正常

23.8.2 版本不匹配

text 复制代码
镜像ROCm版本需与宿主机驱动兼容。
建议使用与主机ROCm版本匹配的镜像tag。

23.8.3 性能异常

text 复制代码
可能原因:
- NUMA绑定不合理
- PCIe链路瓶颈
- 频率被限制(rocm-smi检查)

23.9 生产最佳实践

text 复制代码
✅ 镜像版本与主机驱动匹配
✅ 使用专用用户运行容器
✅ 仅映射必要设备
✅ 监控GPU温度与功耗
✅ 结合prometheus采集指标

23.10 小结

本章完成了ROCm虚拟化栈Docker化的核心流程:

✅ 主机驱动与设备检查

✅ GPU设备映射与权限配置

✅ ROCm官方镜像选择

✅ Compose编排方案

✅ 性能测试与问题排查

下一步

在第24章中,我们将进入Docker高级特性与安全实践:

  • 容器安全与权限隔离
  • 镜像扫描与签名
  • Rootless模式

本章思考题:

  1. 为什么ROCm容器需要映射/dev/kfd和/dev/dri?
  2. video/render组权限为什么重要?
  3. 镜像版本与宿主机驱动不匹配会带来什么问题?
  4. 如何在容器内验证GPU可用性?
  5. 如何对ROCm容器进行性能基准测试?

相关资源:

相关推荐
xbzb1 小时前
镜像到底存在哪:/var/lib/docker 的四级映射与 daemon.json 配置
docker·容器·json·镜像·daemon.json·四级
Alluxio3 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
Sayai7 小时前
Neo4j 图数据质量检查实战:环路检测、孤立节点与连通分量,两条 Cypher 引出的数据体检清单(含变长路径性能陷阱)
运维·neo4j·图数据库·数据质量·cypher
Elastic 中国社区官方博客8 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎
方便面不加香菜8 小时前
Docker Volume -- 管理卷Volume详解
运维·docker·容器
沫璃染墨9 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
Felven9 小时前
华为鲲鹏920s芯片serdestool工具使用说明
linux·运维·服务器·华为·鲲鹏920·serdestool
江湖有缘9 小时前
Docker实战 | 使用Docker部署lemonitor镜像站点列表程序
运维·docker·容器
莫晓燚9 小时前
mall 电商项目完整部署---实战
linux·运维·docker·容器
爱和冰阔落10 小时前
【Linux网络】JsonCpp 怎么实现序列化?从 Request/Response 到网络计算器消息设计
linux·运维·网络·php