目标很明确:
- 不用 Docker 作为主运行入口
- 不走海光私有 demo 路线
- 用更接近主流开源栈的方式在本机跑通 `vLLM + Gemma4`
当前这台机器上,已经验证成功的路线是:
- 底层继续使用海光 `DTK/HIP`
- 上层使用**自编 PyTorch**
- `vLLM` 使用**源码树 + 本地补丁**
- 模型先用:
- `google/gemma-4-E2B-it` 做最小成功验证
- `cyankiwi/gemma-4-26B-A4B-it-AWQ-4bit` 做 32GB 显卡上的实际运行验证
## 1. 这篇教程对应的真实环境
下面这些信息不是建议值,而是**这次实际跑通的环境快照**。
### 系统
- Ubuntu `22.04.5 LTS`
- 内核 `5.15.0-174-generic`
### GPU / 驱动 / 工具链
- GPU:`Z100L`
- LLVM target:`gfx906`
- DTK:`/opt/dtk-26.04`
- 软链:`/opt/dtk -> /opt/dtk-26.04`
- HIP 实现不是标准 AMD ROCm 布局,而是:
- `libgalaxyhip.so` 为核心实现
- `libamdhip64.so -> libgalaxyhip.so`
### Python / PyTorch / vLLM
- Python:`3.10.12`
- venv:`/home/muyi/venvs/torch-gpu-z100l`
- PyTorch 运行版本:`2.9.1a0+gitd38164a`
- HIP 版本:`6.3.3`
- 当前运行的 vLLM 版本:`0.19.1.dev0+g2a69949bd.d20260417`
### 关键源码树
- PyTorch:`/home/muyi/src/pytorch-clean-v291`
- vLLM:`/home/muyi/src/vllm`
注意:
- `vLLM` 这里不是直接 `pip install vllm` 的纯净 wheel 路线
- 而是**源码树运行**
- 当前成功依赖的是本地补丁后的 `vLLM` 源码树
## 2. 先说结论:这套路线里什么是必须的
这几件事是这套方案的硬前提:
1. 必须先 `source` 固化好的 DTK 环境脚本
2. 必须使用已经编好的 GPU 版 PyTorch venv
3. 必须把 `PYTHONPATH` 指到 `/home/muyi/src/vllm`
4. 必须设置 `USE_LIBUV=0`
5. 运行 `Gemma4` 时,当前这台机子上必须显式指定 `TRITON_ATTN`
6. 当前主入口是 **host 直接运行**,不是 Docker
如果你把其中任何一项换成“看起来更标准”的默认值,往往就会回退到不能跑的状态。
## 3. 目录布局
先确认远端目录是这些:
```bash
/home/muyi/envs/dtk26-z100l.sh
/home/muyi/venvs/torch-gpu-z100l
/home/muyi/src/pytorch-clean-v291
/home/muyi/src/vllm
/home/muyi/z100l-smoke
/home/muyi/models/google/gemma-4-E2B-it
/home/muyi/models/cyankiwi/gemma-4-26B-A4B-it-AWQ-4bit
```
如果你的目录不一样,可以改路径,但不要改技术路线。
## 4. 第一步:加载 DTK 环境
先执行:
```bash
source /home/muyi/envs/dtk26-z100l.sh
```
这份脚本会统一设置:
- `ROCM_SOURCE_DIR=/opt/dtk-26.04`
- `ROCM_PATH=/opt/dtk-26.04`
- `HIP_PATH=/opt/dtk-26.04/hip`
- `PATH`
- `LD_LIBRARY_PATH`
- `PYTHONPATH`
- `CMAKE_PREFIX_PATH`
- `CMAKE_MODULE_PATH`
这一步不要省略。当前机器的 DTK 不是标准 `/opt/rocm` 布局,省略这一步后很多库和头文件都会找不到。
## 5. 第二步:激活 Python 环境
执行:
```bash
source /home/muyi/venvs/torch-gpu-z100l/bin/activate
```
然后加上源码版 vLLM 的路径:
```bash
export PYTHONPATH=/usr/local/hyhal/share/amd_smi:/home/muyi/src/vllm${PYTHONPATH:+:$PYTHONPATH}
export USE_LIBUV=0
```
这里的 `USE_LIBUV=0` 不是可选项。当前这台机器上,PyTorch distributed/TCPStore 相关问题绕开它最稳。
## 6. 第三步:先做底层 smoke test
不要直接上大模型。先确认 GPU 计算链路没坏。
执行:
```bash
cd /home/muyi/z100l-smoke
bash /home/muyi/z100l-smoke/run_all.sh
```
这一步会依次验证:
- HIP runtime
- hipBLAS SGEMM
- Python ctypes 直接调用 HIP runtime
如果这一步不过,就先别碰 vLLM。
## 7. 第四步:验证当前 PyTorch / vLLM 版本
执行:
```bash
python -c 'import torch; print(torch.__version__); print(torch.version.hip)'
python -c 'import vllm; print(vllm.__version__)'
```
本机当前应接近:
```text
2.9.1a0+gitd38164a
6.3.3
0.19.1.dev0+g2a69949bd.d20260417
```
这里 `vLLM` 的关键点是:
- 你现在用的是**源码树运行**
- 不是一个干净上游 wheel
- 因为 `gfx906/Z100L` 的兼容性修正都在这棵树里
## 8. 第五步:做最小成功验证(Gemma 4 E2B)
这是最适合先验证“整条链路已经通了”的模型。
### 启动 API 服务
```bash
source /home/muyi/envs/dtk26-z100l.sh
source /home/muyi/venvs/torch-gpu-z100l/bin/activate
export PYTHONPATH=/usr/local/hyhal/share/amd_smi:/home/muyi/src/vllm${PYTHONPATH:+:$PYTHONPATH}
export USE_LIBUV=0
cd /home/muyi/src/vllm
python -m vllm.entrypoints.openai.api_server \
--host 0.0.0.0 \
--port 8000 \
--model /home/muyi/models/google/gemma-4-E2B-it \
--tokenizer /home/muyi/models/google/gemma-4-E2B-it \
--dtype float16 \
--gpu-memory-utilization 0.7 \
--max-model-len 512 \
--enforce-eager \
--attention-backend TRITON_ATTN
```
### 另开一个终端验证
```bash
curl -s http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "/home/muyi/models/google/gemma-4-E2B-it",
"messages": [
{"role": "user", "content": "Say hello in exactly five words."}
],
"temperature": 0.0,
"max_tokens": 16
}'
```
本机当前实测返回过:
```json
{
"choices": [
{
"message": {
"role": "assistant",
"content": "Hello, how are you today?"
}
}
]
}
```
这一步如果通过,说明:
- 模型加载
- tokenizer
- Triton attention
- decode
- API server
这整条用户路径已经成立。
## 9. 第六步:跑 32GB 显卡上真正实用的 Gemma 4 26B AWQ
如果你的目标是“在 32GB Z100L 上尽量跑更大的 Gemma4”,那当前实际可用的是这个模型:
```text
/home/muyi/models/cyankiwi/gemma-4-26B-A4B-it-AWQ-4bit
```
### 方式 A:最小 smoke test
直接运行:
```bash
source /home/muyi/envs/dtk26-z100l.sh
source /home/muyi/venvs/torch-gpu-z100l/bin/activate
export PYTHONPATH=/usr/local/hyhal/share/amd_smi:/home/muyi/src/vllm${PYTHONPATH:+:$PYTHONPATH}
export USE_LIBUV=0
python /home/muyi/docker-build/z100l-gemma4/smoke-gemma4-26b-awq.py
```
本机最近一次复测结果:
```text
LOAD_S=107.586
GEN_S=3.015
TOKENS_OUT=32
OUT_TPS=10.614
```
这个结果已经说明当前 host 侧 baseline 没回退。
### 方式 B:启动 API 服务
```bash
source /home/muyi/envs/dtk26-z100l.sh
source /home/muyi/venvs/torch-gpu-z100l/bin/activate
export PYTHONPATH=/usr/local/hyhal/share/amd_smi:/home/muyi/src/vllm${PYTHONPATH:+:$PYTHONPATH}
export USE_LIBUV=0
cd /home/muyi/src/vllm
python -m vllm.entrypoints.openai.api_server \
--host 0.0.0.0 \
--port 8000 \
--model /home/muyi/models/cyankiwi/gemma-4-26B-A4B-it-AWQ-4bit \
--tokenizer /home/muyi/models/cyankiwi/gemma-4-26B-A4B-it-AWQ-4bit \
--dtype float16 \
--gpu-memory-utilization 0.82 \
--max-model-len 512 \
--enforce-eager \
--attention-backend TRITON_ATTN
```
然后测试:
```bash
curl -s http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "/home/muyi/models/cyankiwi/gemma-4-26B-A4B-it-AWQ-4bit",
"messages": [
{"role": "user", "content": "Say hello in exactly five words."}
],
"temperature": 0.0,
"max_tokens": 32
}'
```
## 10. 当前已经验证过的结果
截至本文写作时,这台机器上已经验证过这些结果:
### Gemma 4 E2B
- `vLLM` 可正常启动
- API 请求可正常返回
- 输出内容正确
### Gemma 4 26B AWQ 4bit
- 单卡 `32GB Z100L` 可运行
- host 侧短输出实测约 `10.6 tok/s`
- 之前已验证过最大 prompt 长度约 `21967` tokens
这里要特别注意:
- 这个 `21967` 是这套 patched host 路线的验证结果
- 不是任意机器、任意镜像、任意 `vLLM` 版本都自动成立
## 11. 为什么这套方法能跑通
一句话概括:
**不是把海光底层换掉,而是保留海光 DTK,尽量把上层拉回通用的 PyTorch + vLLM 路线。**
具体来说:
- 底层继续用 `DTK/HIP/HSA`
- PyTorch 用自编的 `2.9.1` 分支
- vLLM 用源码树版本
- 对 `gfx906/Z100L` 做少量必要兼容
真正关键的点主要是:
- `gfx906` 下的 Triton attention / decode 兼容
- `Gemma4 + compile` 的错误区间 containment
- `USE_LIBUV=0`
- 不走 Docker 主路径
## 12. 已知坑
### 坑 1:不要默认以为 `/opt/rocm` 可用
这台机器不是标准 AMD ROCm 布局。
必须走 `/opt/dtk-26.04`,而且要先 `source /home/muyi/envs/dtk26-z100l.sh`。
### 坑 2:不要直接装一个干净的上游 vLLM wheel 就指望能跑
当前可运行的是:
- `/home/muyi/src/vllm`
- 配合本地补丁
如果你换成干净 wheel,大概率会直接回到不能跑的状态。
### 坑 3:不要把 Docker 路线当主入口
当前 Docker 镜像已经能打包和导出,但**容器内完整 vLLM 推理仍然有已知阻塞**。
现在真正可用的路线是 **host 直接运行**。
### 坑 4:看到这条 warning 不要立刻误判失败
```text
rocblaslt warning: No paths matched /opt/dtk-26.04/lib/hipblaslt/library/*gfx906*co
```
当前它是一个已知 warning,不等于这次启动一定失败。真正要看的是:
- 模型能否加载完
- API 是否能返回
- 输出是否正确
## 13. 推荐的最小日常启动模板
如果你只是想“以后直接照着跑”,最小模板就是:
```bash
source /home/muyi/envs/dtk26-z100l.sh
source /home/muyi/venvs/torch-gpu-z100l/bin/activate
export PYTHONPATH=/usr/local/hyhal/share/amd_smi:/home/muyi/src/vllm${PYTHONPATH:+:$PYTHONPATH}
export USE_LIBUV=0
cd /home/muyi/src/vllm
python -m vllm.entrypoints.openai.api_server \
--host 0.0.0.0 \
--port 8000 \
--model /home/muyi/models/google/gemma-4-E2B-it \
--tokenizer /home/muyi/models/google/gemma-4-E2B-it \
--dtype float16 \
--gpu-memory-utilization 0.7 \
--max-model-len 512 \
--enforce-eager \
--attention-backend TRITON_ATTN
```
如果你想跑更大的 26B AWQ,就把模型路径换成:
```text
/home/muyi/models/cyankiwi/gemma-4-26B-A4B-it-AWQ-4bit
```
并把:
- `--gpu-memory-utilization` 改成 `0.82`
## 14. 最后一句
这套教程最重要的不是“某个命令行参数怎么写”,而是:
**Z100L 现在已经证明可以沿着更通用的 PyTorch + vLLM 路线运行 Gemma4,而不是只能依赖海光私有 demo。**
如果后面继续升级 `vLLM`、继续上更大的模型、继续做 4 卡部署,应该都基于这条 host 侧成功基线继续推进,而不是回到 Docker 或 vendor demo 路线。
## 以下是海光卡有群,有兴趣的加入
