HelloGPU-P00-入门与硬件速通
本系列学习笔记源自开源项目:https://github.com/datawhalechina/hello-gpu 。是自己在学习过程上的记录与心得。
第0篇 入门与硬件速通
0.0 项目介绍与学习提示
| 篇 | 你要学什么 | 学完能做什么 | 大约时间 |
|---|---|---|---|
| 第 0 篇 入门 | 环境验证、GPU 体系结构、第一个程序 | 跑通环境,建立硬件直觉 | 1-2 天 |
| 第 1 篇 Profiling | benchmark、rocprof、性能记录 | 找到 kernel 慢在哪里 | 2-3 天 |
| 第 2 篇 算子 + 刷题 | Reduction / Softmax / GEMM / Attention + 刷题 | 从 naive 优化到接近极限 | 5-7 天 |
| 第 3 篇 Agent 算子层 | Agent 入门、工具封装、多轮优化 | 让 Agent 自动优化 kernel | 3-4 天 |
| 第 4 篇 真实模型 + Agent | YOLO / LLM + Agent 优化 | 对真实模型做自动优化 | 3-4 天 |
0.1 环境准备
参考文档:第 1 章 环境准备
根据环境修改配置
此处使用“AUP Learning
Cloud”的环境,账号申请通过后,登录启动: 
启动学习环境后,只能以jovyan用户操作,进入如下目录/home/jovyan/hello-gpu/code/part0-intro,在左侧目录树中也打开此目录,双击pyproject.toml文件打开它进行编辑(因为无法以jovyan用户安装工具,所以无法安装vim之类的工具),将如下这些两处进行注释或修改。
修改处1:(猜测:应该是容器有代理且能正常访问外网)国内镜像站(清华源/北外源)对这个相关翻墙代理/IP
返回了403
阻断/禁封,或者镜像站本身的防刷机制触发了封禁,故直接使用默认的 Python
官方源(PyPI)。将如下行注释掉。 1
2
3
4
5
6
7...
# 大概第21行处
#[[tool.uv.index]]
#name = "pypi-mirror"
#url = "https://mirrors.bfsu.edu.cn/pypi/web/simple"
#default = true
...
修改处2:参考 附录
B · 换一张卡:切换 ROCm 10.0 的 GPU 架构
根据自己使用GPU型号与构架修改device-gfx1201 为 合适的 “AMD GPU
硬件架构”的依赖扩展标记。此次使用的是,故修改成如下(即将第8行附近的device-gfx1201全部替换成device-gfx1151,共有3处需要替换):
1
2
3
4
5
6
7
8
9
10
11
12[project]
name = "part0-intro"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = [
"numpy>=2.4.4",
"matplotlib>=3.9",
"torch[device-gfx1151]==2.13.0+rocm10.0.0",
"torchvision[device-gfx1151]==0.28.0+rocm10.0.0",
"torchaudio==2.11.0.2+rocm10.0.0",
"rocm[devel,device-gfx1151]==10.0.0",
]
同步本篇 uv 环境:
1 | |
同步完成后,激活本篇环境: 1
2
3
4
5
6
7
8(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro$ source ./activate-rocm.sh
Activated ROCm uv environment:
PROJECT: /home/jovyan/hello-gpu/code/part0-intro
VENV: /home/jovyan/hello-gpu/code/part0-intro/.venv
ROCM_PATH: /home/jovyan/hello-gpu/code/part0-intro/.venv/lib/python3.12/site-packages/_rocm_sdk_devel
Python: /home/jovyan/hello-gpu/code/part0-intro/.venv/bin/python
ROCm SDK: 10.0.0
Python 3.12.31
2
3
4(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro$ rocm-sdk version
10.0.0
(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro$ python -c "import torch; print(torch.__version__)"
2.13.0+rocm10.0.0
验证 GPU 可见性
1 | |
rocminfo 识别到 gfx1151 GPU(AMD Ryzen AI Max+ 395 (Radeon 8060S))。
查看 GPU 的当前状态: 1
2
3
4
5(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro$ amd-smi version
AMDSMI Tool: 27.0.0+6b0e43f3 | AMDSMI Library version: 27.0.0 | ROCm version: 10.0.0 | amdgpu version: N/A | ionic version: N/A
(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro$ amd-smi monitor
GPU XCP POWER GPU_T MEM_T GFX_CLK GFX% MEM% ENC% DEC% VRAM_USAGE
0 0 7 W 24 °C N/A 610 MHz 0 % N/A N/A N/A 0.1/ 64.0 GB
验证 PyTorch ROCm
1 | |
这个脚本做了三件事:导入 PyTorch、检查 GPU 后端、在 GPU 上跑一次
1024 × 1024 矩阵乘。
此处出现的cuda相关字样,并不代表底层使用NVIDIA
GPU,而是由于历史命名原因,将加速设备名称前缀写成固定的了,而不是根据不同的设备厂商来读取或映射不同的设备名称。
验证最小 HIP 程序
先确认一下 hipcc 版本 1
2
3
4
5
6
7# 这个命令顺带还能验证编译器路径是否在 `_rocm_sdk_devel` 下面
(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro$ hipcc --version
HIP version: 7.15.26333-0000000
AMD clang version 23.0.0git (https://github.com/ROCm/llvm-project.git 8f497e0992fb7513f7f78a6f6b6f1056c375e961)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/jovyan/hello-gpu/code/part0-intro/.venv/lib/python3.12/site-packages/_rocm_sdk_devel/lib/llvm/bin
然后编译 HIP 程序: 1
2
3
4# 检验 HIP 编译器能不能找到 GPU 对应的 device library
(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro$ cd chapter1/
(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro/chapter1$ hipcc vector_add.hip -O2 -o vector_add && echo "compile_status: PASS"
compile_status: PASS
运行程序: 1
2
3
4
5
6
7(part0-intro) jovyan@jupyter-sanyinjiang:~/hello-gpu/code/part0-intro/chapter1$ ./vector_add
device_name: AMD Radeon 8060S Graphics
vector_size: 1048576
blocks: 4096
threads_per_block: 256
max_error: 0
status: PASS