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

📅 发布时间:2026/8/29 12:53:53
AMD MI250 跑通 DeepSeek-V3:ROCm + FP8 推理完整实操 AMD MI250 跑通 DeepSeek-V3ROCm 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.8FP878.225.818.4FP8 吞吐约为 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_SIZE8 torchrun --nproc_per_node8 \ generate.py --ckpt-path /path/to/ckpt \ --config configs/config_671B.json --interactive8 个进程把模型切开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),仅供参考