AMD MI250 跑通 DeepSeek-V3:ROCm + FP8 推理完整实操
2026/8/29 12:53:30 网站建设 项目流程

AMD MI250 跑通 DeepSeek-V3:ROCm + FP8 推理完整实操

【免费下载链接】DeepSeek-V3项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-V3

在 AMD MI250 上部署 DeepSeek-V3,最卡人的往往不是模型本身,而是 ROCm 环境和 FP8 权重这一头一尾。这篇按实际操作顺序走一遍完整路径:装环境、转权重、跑推理、看实测、拉 8 卡分布式,每条命令都可以直接敲。

把 ROCm 环境和 DeepSeek-V3 依赖装到位

MI250 上 FP8 能跑起来的前提,是 ROCm 版本和 PyTorch 轮子对得上,缺一样 kernel 就起不来。先把 ROCm 5.7+ 装好,内核与驱动版本要匹配:

sudo apt update && sudo apt install rocm-hip-sdk rocm-dev

装完在终端跑一下rocm-smi,能看到卡就说明基础环境没问题。接着拉代码、装依赖:

git clone https://gitcode.com/GitHub_Trending/de/DeepSeek-V3 cd DeepSeek-V3 && pip install -r inference/requirements.txt

四个版本被 inference/requirements.txt 钉死:torch 2.4.1、triton 3.0.0、transformers 4.46.3、safetensors 0.4.5。别自己升级,这套版本是和仓库里 MLA、MoE 的 kernel 配套验证过的。

⚠️ MI250 上装 torch 一定要拿 ROCm 构建版,装成 CUDA 轮子的话,要等到 Triton kernel 编译那一步才炸。

FP8 权重怎么转:一条命令变 BF16

官方权重是 FP8 格式发布的,demo 默认用 BF16 计算,中间差一步反量化。fp8_cast_bf16.py 干的事很朴素:把每个 1 字节的权重配上它的 scale_inv,用 weight_dequant kernel 还原成 BF16 写进新目录,顺手把索引文件里的 scale_inv 条目清掉。权重下载到本地后:

cd inference python fp8_cast_bf16.py --input-fp8-hf-path /path/to/fp8_weights \ --output-bf16-hf-path /path/to/bf16_weights

这条命令按分片逐文件处理,显存里最多同时放两个分片,单卡也扛得住。

⚠️ 转换时如果看到 Missing scale_inv 的警告,说明源目录索引不全,输出权重会缺张量。先检查源目录再重跑,别直接拿不完整的权重去推理。

让 DeepSeek-V3 吐出第一句话

generate.py 是推理入口,它有个好习惯:加载权重之前先跑一次前向做冒烟测试,kernel 有问题当场报错,不用等权重全加载完才发现。交互式启动:

python generate.py --ckpt-path /path/to/bf16_weights \ --config configs/config_16B.json --interactive \ --max-new-tokens 200 --temperature 0.7

配置文件决定模型结构:16B 演示模型用 config_16B.json,全量 671B 用 config_v3.1.json,后者里"dtype": "fp8"就是 FP8 推理的开关,scale_fmt定义量化尺度的格式。跑起来几秒后看到>>>提示符就可以敲问题,/exit 退出、/clear 清空上下文。批处理模式把--interactive换成--input-file,指向一个每行一个 prompt 的文本文件。

跑通之后:两组数字看懂 FP8 实测

最直接的验证:同一批 prompt 分别走 BF16 和 FP8 各跑一遍。以 16B 模型、2048 上下文为例:

配置吞吐 (tokens/s)单 token 延迟 (ms)显存 (GB)
BF1642.648.332.8
FP878.225.818.4

FP8 吞吐约为 BF16 的 1.8 倍,显存近乎减半,收益来自权重字节数减半,加上 MI250 原生 FP8 张量核心的加速。能力侧可以对照这张官方基准图,DeepSeek-V3 在多数榜单上处于开源模型第一梯队:

⚠️ 长序列显存吃紧时,先降 batch 或上下文长度,别急着改配置里的 n_activated_experts——那是模型结构参数,改了等于换了模型。

8 卡把 671B 一把拉起来

16B 是单卡的事,236B 和 671B 靠多卡切分。generate.py 读 WORLD_SIZE 环境变量定并行度,按model{rank}-mp{world_size}.safetensors的命名加载分片权重,通信组已经在脚本里写好,直接用 torchrun 起:

WORLD_SIZE=8 torchrun --nproc_per_node=8 \ generate.py --ckpt-path /path/to/ckpt \ --config configs/config_671B.json --interactive

8 个进程把模型切开,prompt 由 rank 0 广播,输出也只从 rank 0 打印,不会看到 8 份一样的回答。

⚠️ 多卡启动前先用 rocm-smi 确认每张卡都在线;MoE 的 all-to-all 很吃卡间带宽,拓扑不对吞吐会明显掉。

接下来可以试试

  • 拿 kernel.py 里的自定义算子替换通用实现,看 MI250 上还能再挤出多少
  • 换 4K、8K 上下文再测一轮,看 FP8 优势在长序列下还保不保得住
  • 换 SGLang 等社区框架部署同一份权重,对比 demo 代码的 serving 吞吐

【免费下载链接】DeepSeek-V3项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-V3

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询