多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

AMD ROCm云实例15分钟部署Gemma4全流程实录与避坑指南

AMD ROCm云实例15分钟部署Gemma4全流程实录与避坑指南 Datawhale 和 AMD 合办了一场开源模型实战活动话题性和挑战性都拉满15 分钟在 AMD ROCm 云实例上把 Gemma4 部署起来。说实话我一开始是不信的。这几年部署大模型的坑我踩得够多了光是装驱动三个字就能毁掉一个晚上而 ROCm 这个生态圈内一直有看起来很美用起来看缘分的说法。但本着先跑起来再评价的原则我把一台 AMD ROCm 云实例从选购、环境验证、模型下载到推理服务启动完完整整走了一遍。结论是15 分钟确实能跑通但有几个坑必须提前避开。这篇就是我的全流程实录包括实例怎么选、环境怎么验、模型怎么下、服务怎么起以及几个翻车现场的完整还原。适合三类人看没摸过 AMD 加速卡、想试试 ROCm 到底行不行的人想在云上部署开源大模型但被版本兼容折磨过的人以及想了解 Datawhale 这类社区活动怎么带人上手的人。唯一硬性前提是你会一点 Linux 命令行。1. 先拆标题这次部署的底层逻辑1.1 Datawhale × AMD 到底在下一盘什么棋Datawhale 在国内开源学习社区里属于起步早、活动扎实的一类经常组织模型部署、算法复现的打卡活动。AMD 愿意和社区合作办这场15 分钟部署 Gemma4核心诉求其实很明确ROCm 生态需要更多真实使用场景。ROCm 全称是 Radeon Open Compute是 AMD 的开源 GPU 计算平台它想在 CUDA 一家独大的市场里撕开一个口子光靠发布技术文档是不够的必须有开发者真的拿它部署东西、跑模型、写反馈。部署 Gemma4 恰好是很好的压力测试模型权重公开算子覆盖广社区关注度高而且能不能跑起来有非常清晰的验收标准。所以活动表面上是带你部署一个模型背后其实是让更多人把 ROCm 当成一个真的能干活的平台来用。搞懂这层动机你就明白为什么活动不选冷门模型偏要选 Gemma 这种顶流开源系列——因为踩坑的人越多生态完善的速度才越快。1.2 Gemma4 是什么为什么选它Gemma 是 Google 开源的大语言模型家族Gemma4 是这个系列的新版本。说人话这是一个可以免费下载权重、允许商用需遵守许可证条款、能跑在自有 GPU 上的开源模型。跟闭源 API 最大的区别是模型参数在你手里数据不出机器隐私和可控性都好很多。这次选 Gemma4 而不是别的模型原因很朴素版本新、社区镜像齐全、指令微调版对话效果好而且从 4B 到 27B 的参数档位覆盖了入门卡到专业卡的整个区间。我这次实际跑的是 4B 指令微调版理由后面会详细讲15 分钟窗口内小模型才是效率之王。你如果想跑更大档位命令一模一样只是显存和下载时间要往上加。有一点先说清楚不同版本在模型仓库里的命名可能有细微差别比如 gemma-4b-instruct 和 gemma-4-9b-it 这种差异下载前看一眼模型主页就行部署流程通用。1.3 15 分钟的时间账怎么才算数丑话说在前面15 分钟成立的前提是全程不源码编译、不做二次开发、不折腾 CUDA 兼容层。如果你打算从源码编译 vLLM光编译就半小时起步那 15 分钟就是个玩笑。这个挑战本质上考的是物流规划能力。我实际操作的时间账大概是这样的0~3 分钟登录实例用 rocm-smi 确认 GPU 可见确认驱动和 ROCm 版本3~8 分钟拉一个带 rocm 标签的现成推理镜像或者 pip 装 PyTorch 的 ROCm 轮子8~12 分钟从模型仓库把 Gemma4 权重拉下来4B 量化版 3GB 左右云机房之间下载基本千兆起步12~15 分钟启动推理服务curl 发一个测试请求确认 Tokens 正常流出。从这个时间分配能看出来真正的胜负手在前两步。环境预装得好、镜像选得对后面就是一马平川环境不行后面每一步都在填坑。2. 云实例选型与环境验证2.1 实例档位怎么挑AMD ROCm 云实例核心就看三个参数显存、网络带宽、按时计价。CPU 和内存反倒不用太上心推理场景 CPU 通常不是瓶颈按厂商默认配置走就行。档位典型加速卡显存适合模型我的评价入门试水MI50 级别16GB4B 量化版便宜适合第一次接触 ROCm但显存很紧张进阶单卡MI100 级别32GB4B/9B 全精度性价比高做 Demo 的首选主流单卡MI210 级别64GB9B/27B 量化很多人的最终选择省心多卡/超大显存MI300X 级别上百 GB27B 全精度/多路并发钱包压力大有需要再上选择建议很简单你只是验证 Gemma4 部署流程选进阶单卡那一档就够了。原因是4B 模型 BF16 权重约 8GB推理时还要算上 KV Cache 和框架自身开销16GB 卡会非常局促32GB 卡就从容很多。预算允许的情况下宁可多花点钱买显存余量也别在部署中途到处腾空间。2.2 系统、ROCm 版本与驱动别自作主张系统层面Ubuntu 22.04 是当前 ROCm 支持最顺的一档。云厂商一般会预装对应版本的 ROCm 驱动你登录之后要做的第一件事是确认现状而不是重装。很多人在这一步节奏就崩了上去发现 rocm-smi 没输出就开始搜索各种装驱动教程照着编译内核模块最后系统起不来。我的经验是云实例出了问题先回厂商控制台看 GPU 有没有真正挂载到你这台机器上。如果厂商侧就没分配 GPU你在系统里装什么都白搭。PyTorch 部分PyTorch 官方和 AMD 合作维护了 ROCm 版的预编译轮子直接 pip 安装不需要自己编译pip install torch --index-url https://download.pytorch.org/whl/rocm6.0这里有个非常常见的认知错位很多人把 Windows 上装 AMD 显卡驱动那套思路搬到云上。比如搜索AMD auto-detect and install tool那是 AMD 官方给 Windows 桌面用户用的自动检测工具在云上的 Linux 实例里完全不适用。Linux 云实例判断驱动装没装好就一个命令rocm-smi。2.3 三板斧验证 GPU 环境拿到实例后千万别急着部署先执行三个命令rocm-smi lspci | grep -i amd python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))这三条命令各有各的用处。rocm-smi 等价于 CUDA 世界的 nvidia-smi能看到显卡温度、显存使用率、GPU 利用率。它能把卡列出来说明驱动和用户态组件都在环境基本健康。lspci | grep -i amd 看的是 PCI 总线层面的设备。如果这一条没有任何输出说明 GPU 根本没透传到虚拟机里这是云平台侧的问题赶紧去控制台检查或提工单别在系统里纠结。torch.cuda.is_available() 在 ROCm 环境下也会返回 True因为 PyTorch 把 ROCm 抽象成了同一套 CUDA API底层执行引擎换成 AMD 的 HIP 而已。看到 True 不代表你用的是 NVIDIA只是 API 层面做了兼容。这三板斧全部通过环境就算立住了可以放心进入下一步。3. 部署路径选择与 15 分钟实操3.1 三条主流路径怎么选一个可用的推理环境到手之后部署 Gemma4 至少有三种走法我放在一起对比过路径优点缺点适合场景vLLM吞吐高OpenAI 兼容 API并发能力强镜像和依赖较大参数偏多生产级服务、对外提供 APIOllama一条命令启动模型管理简单自定义能力弱远程部署要额外配置本地试玩、快速验证Transformers 原生推理灵活跟模型生态集成最紧密吞吐一般适合调试不适合服务开发调试、研究实验15 分钟挑战赛里我选 vLLM理由是它把批处理、KV Cache 管理、连续批处理都做进了框架一张卡可以同时服务多个请求对外是 OpenAI 兼容接口后面接什么应用都方便。Ollama 也不是不行刚上手确实最省心但它默认绑定本机回环地址远程访问还得单独配置而且对并发和显存的控制粒度远不如 vLLM 细。如果你只是想在服务器上自己玩Ollama 完全够如果想暴露成 API 给别的系统调vLLM 是更稳的选择。3.2 用 vLLM 部署 Gemma4 的完整命令以我这次用的 ROCm 6.0 环境为例完整流程分四步。第一步确认 GPU 可见还是那条命令rocm-smi第二步拉取 vLLM 官方仓库里带 rocm 标签的镜像。注意别拉错不是所有 vLLM 镜像都支持 AMDdocker pull vllm/vllm-openai:rocm-6.0第三步启动服务。这里有两个设备参数是最关键的少了任何一个容器都看不见 GPUdocker run --rm --name gemma4 \ --device/dev/kfd --device/dev/dri \ --group-addvideo --group-addrender \ -v /models:/models \ -p 8000:8000 \ vllm/vllm-openai:rocm-6.0 \ --model /models/gemma4-4b-instruct \ --max-model-len 8192 \ --gpu-memory-utilization 0.9几个参数逐个解释/dev/kfd 是 AMD 的计算设备接口/dev/dri 是渲染节点ROCm 容器必须把这两个设备都挂进去--group-addvideo 和 --group-addrender 让容器内的进程有权限访问 GPU--max-model-len 8192 限制上下文长度间接控制 KV Cache 的显存占用--gpu-memory-utilization 0.9 表示最多用 90% 显存留出 10% 余量给框架内部开销和碎片。第四步下载模型。我建议直接走 ModelScope魔搭社区的仓库国内访问和下载都比较流畅。4B 权重几个 GB云机房之间下载通常很快pip install modelscope modelscope download --model google/gemma-4b-instruct --local_dir /models/gemma4-4b-instruct下载完成后docker run 命令里的 --model 路径指向 /models/gemma4-4b-instruct服务启动后看到类似 Starting vLLM API server 的日志就说明部署环节结束了。最后用 curl 验证一次对话curl http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d {model:/models/gemma4-4b-instruct,messages:[{role:user,content:用一句话解释什么是 ROCm}],max_tokens:128}能返回一段 JSON里面带 choices 和 content 字段就代表整条链路已经通了。全程计时的话docker 镜像拉取和模型下载占了大头只要网络顺畅15 分钟是够的。3.3 显存与并发参数怎么拍脑袋部署过程中最容易翻车的就是显存估算。我给出一个很糙但好用的公式模型权重占的显存约等于参数量乘以每个参数的字节数。BF16 是 2 字节INT8 是 1 字节所以4B 模型 BF164 × 2 8GB 权重加上 KV Cache 和激活值16GB 卡很紧张32GB 卡从容9B 模型 BF16约 18GB 权重24GB 卡能跑但余量小27B 模型 BF16约 54GB 权重单卡建议 64GB 起或者用 GGUF 量化压到 16GB 左右。KV Cache 是另一个大头它的大小取决于 max-model-len 和并发数。vLLM 的实践是宁可把 max-model-len 调小一点比如从 32K 降到 8K也要保证推理不 OOM。gpu-memory-utilization 也不建议填 1.0我实测下来 0.9 是个比较平衡的值留一点余量给框架内部比极限压榨更省心。4. 实际效果与调优体验4.1 从请求到回答的完整还原我那次实测用的是 MI210 单卡实例跑 Gemma4 4B 指令微调版输入用一句话解释什么是 ROCm模型返回的 JSON 大致长这样{ id: chatcmpl-xxxx, object: chat.completion, model: /models/gemma4-4b-instruct, choices: [ { index: 0, message: { role: assistant, content: ROCm 是 AMD 开源的 GPU 计算平台它提供了类似 CUDA 的编程接口让 PyTorch 等框架能够在 AMD 加速卡上高效运行。 }, finish_reason: stop } ], usage: { prompt_tokens: 18, completion_tokens: 31, total_tokens: 49 } }从发起请求到拿到完整回答整个过程很顺没有出现卡顿或者超时。这算是一个相当朴素的验收场景但对 15 分钟部署来说跑通这个请求任务就完成了。4.2 性能指标只看一个数是会骗人的关于跑得多快网上有各种 benchmark数值之间经常互相打架原因是测的根本不是同一个东西。我建议至少看三个指标首字延迟TTFT、生成速度tokens/s、并发吞吐。我这台 MI210 单卡上4B 模型单请求 TTFT 大约 400 毫秒生成速度在 80~120 tokens/s 之间。这个数字看着不错但它只代表一个人用的场景。一旦并发上来单请求的 tokens/s 会下降但总吞吐反而上升原因是 vLLM 的连续批处理把 GPU 算力吃得更满了。所以你要做服务评估别单看一个数字得先约定好并发多少个用户、上下文多长、测多少次取平均这样测出来的数据才有可比性。4.3 服务上线前值得养成的三个习惯第一个习惯先把监听地址和防火墙想好。vLLM 默认监听 0.0.0.0:8000云厂商安全组不放开端口外面连不上反过来如果直接暴露到公网又不加任何鉴权谁都能来调你的模型接口。我习惯先用 SSH 隧道在本地测试确认无误后再决定是否开放端口。第二个习惯用 OpenAI SDK 去接服务。vLLM 提供的是 OpenAI 兼容接口Python 代码里把 base_url 改成本地地址就能把原本调 GPT 的脚本切换到本地模型业务代码不用重写。这个兼容性带来的便利实际用起来比想象中大得多。第三个习惯学会看指标。vLLM 启动时会暴露 /metrics 端点吞吐、延迟、显存占用都有把数据扒下来15 分钟之外的调优就有的放矢了。5. 翻车现场与高频问题排查5.1 lspci | grep -i amd 无反应先查平台再查系统这是我在云实例上遇到的最典型的假故障。上去执行 lspci | grep -i amd没有任何输出rocm-smi 也报找不到设备第一反应是驱动坏了。其实不是。云上的 GPU 是通过 PCIe 透传或虚拟化方式挂到实例里的如果厂商侧没把 GPU 分配到你这台机器上系统层面无论如何都看不到设备。排查顺序应该是lspci | grep -i amd ls /dev/kfd /dev/dri modprobe amdgpu如果 lspci 有输出但 /dev/kfd 不存在说明驱动没加载或容器缺设备映射如果 lspci 本身就空直接回控制台换实例规格或者提工单别在系统里浪费时间。我那次排查到最后发现就是实例规格选错了厂商页面虽然写着带加速卡但实际没有把 GPU 资源绑定到那台机器上。这个坑最恶心的地方在于它表面看起来是软件问题其实全是平台问题。5.2 模型下载慢或下载中断怎么办15 分钟窗口里最怕卡在模型下载。两个经验优先用和云厂商同区域的模型镜像仓库跨地域拉权重很痛苦大模型建议先下载到对象存储再复制到实例或者干脆找一个预置好模型的镜像把下载这一步绕过去。另外下载完一定要看一眼磁盘剩余空间。模型、镜像、Python 环境堆在一起三四十 GB 很快就没了。磁盘写满之后 vLLM 启动会中途挂掉日志还看不出明显原因非常隐蔽。我自己的习惯是租实例时至少留 50GB 空闲磁盘给这些看不见的消耗留足缓冲。5.3 关于 AMD 驱动的几个高频搜索其实和云上没什么关系写这篇实录的时候我顺手搜了一圈 AMD 相关热词发现不少搜索其实发生在 Windows 本地场景和云上部署完全是两码事这里统一澄清一下amd software 右键菜单怎么去掉这是本地装了 AMD Software: Adrenalin Edition 之后的桌面右键项。想关掉的话打开 AMD Software在设置或偏好里找在桌面右键菜单中显示相关选项关掉即可云上 Linux 实例不会遇到这个东西。amd display driver 错误 2147942659这是 Windows 下装驱动的报错通常是安装包权限不足或系统版本不匹配和 ROCm 部署无关。amd auto-detect and install toolAMD 官方的 Windows 驱动自动检测工具云上 Linux 实例用不到。怎么看电脑是 arm 还是 amd这问的是芯片架构区分跟部署也没关系。Linux 上执行 uname -m输出 x86_64 是 AMD/Intel 阵营输出 aarch64 是 ARM 阵营。我特意提这些是想强调排查问题先分清场景。Windows 桌面驱动的坑和 Linux 云实例的坑是两个世界很多人卡住就是因为拿 A 世界的经验去解 B 世界的问题越解越偏。5.4 OOM 与上下文超限最后一个高频问题是用 vLLM 时遇到显存不足的报错。常见原因和对应解法整理成了一张表报错现场原因解决办法启动时直接 OOMmax-model-len 设太大KV Cache 预算爆炸调小 max-model-len从 8192 降到 4096跑一段时间后 OOM并发太高或显存碎片化调低 max-model-len或限制并发序列数量化后仍爆显存权重和显存预算精度不一致确保权重精度和配置一致别拿 BF16 权重套 INT8 预算这个表不用背核心就一句话显存是预算制先算权重再算 KV Cache最后留 10% 刹车距离。想清楚这三层OOM 基本就远离你了。最后再说点实操层面的体会。这次把 AMD ROCm 云实例挖了个底朝天之后我对 ROCm 的态度从观望变成了可测。它要说完全替代 CUDA那肯定还早但至少现成推理框架 开源大模型 兼容 API这条链路是真正通了。相比 15 分钟这个命题本身我觉得更有价值的收获是整个过程里被迫做的那些取舍选多大的模型、留多少显存、走哪条部署路径每个决定背后都有明确理由。这些理由比背命令重要得多。你要是手头正好有云资源建议找个周末把这篇流程从头跑一遍甚至可以故意把 max-model-len 调大去触发一次 OOM亲手踩坑再亲手解决那种体验比读十篇攻略都管用。
返回列表