(2026.2.5更新)AMD RDNA ROCm vllm后端和pipeline后端完整适配分享 #3662
healy-hub
started this conversation in
Show and tell
Replies: 4 comments 8 replies
-
|
非常赞的patch,能详细说说为啥7900 要这样手动调的原因?--- 针对7900xtx的手动调优配置,其他GPU的最优组合可能需要自行寻找,AMD的autotune效果就是没有效果 |
Beta Was this translation helpful? Give feedback.
6 replies
-
|
大佬啥时候更新呀~ |
Beta Was this translation helpful? Give feedback.
2 replies
-
|
大佬是否支持 mineru 3.x版本? |
Beta Was this translation helpful? Give feedback.
0 replies
-
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
2026.2.12 folk了几个相关的仓库,准备抽空精简一下教程,直接clone我的仓库反而更方便。排查了一下flash_attn的triton实现,最新的提交实现了RDNA上的flash_attn v3,带了问题是仅推理会导致速度反而不如v2。另外每个实现都没有做形状的分类归一,导致在mineru这种视觉处理上只要有一点点的长度不一样就会导致triton重新启用新的kernel。这些问题均解决了,空了我更新一下教程。另外triton后端建议在安装结束后采用一个大的PDF文件生成缓存,这是triton的特性无解。这个缓存文件一次即可,重启等不会丢失。
2026.2.5 更新,设置了flash_attn仓库回退,最新的triton 后端合并在RDNA 3 7900xtx上的性能回退30%左右,回退到12月的版本即可,git checkout bba578d43974c1d3ba157ab597124dd0fe2ccdb4, 最新的合并实现了Fused Bwd,只能说暂时还不好用
2026.1.31更新,放弃所有的triton实现,难以在不同的GPU上都实现最好的性能,因此转向于利用AMD 优化好的无问题的后端提供适配。目前在7900xtx测试下来,300页的PDF,vllm后端的速度大概能跑到1.8~2.01it/s,pipeline ocr速度也能到几百it/s。有些国产GPU的pipeline后端也许可以参考这个实现,好像有看到过vllm后端没问题,但是pipeline后端几个模型反而没有实现的。
吐槽:ROCm 7.2 并没有解决RDNA上3D卷积,2D卷积的基数倍数,空洞卷积的问题。。。。绷不住了,真特么幽默的RDNA CK后端优化。开始觉得不用自己来AMD官方能解决,想多了。
在开头先解释一下原因,为什么在RDNA AMD GPU上推理速度如此之慢。第一个是vllm的conv3d,torch.Size([56700, 3, 2, 14, 14])这种batch_size 根本找不到MIOPEN的kernel实现,它回退到了fp64的双精度计算,并且搜索kernel花了12s,但是啥也没找到,vllm后端只有这一个问题。
接下来是pipeline后端,这个问题就多了,首先是第一步Layout Predict用的空洞卷积,自定义的doclayout_yolo/nn/modules/g2l_crm.py找不到kernel,回退+1。然后是ocr部分,这里有两个问题,一个是conv2d在MIOPEN上,遇到(1, 3, 544, 672)这种,后面两个都是32的奇数倍数时,每次都会冷启动,导致需要1s多搜索最佳kernel的时间,另一个问题是mineru每次ocr的batch是6个送过去的,到最后一次的时候,很可能不是6个,这个时候同时面对batch和形状的冷启动,会带来一个7s左右的延迟,对,你没听错,是7s。。。。。。
下面是做的一个适配修改,需要修改的部分比之前多一点,,其实可以写一个脚本自动实现,也不是非要自己手动修改,但是尽可能详细一点:
如果有疏漏,可以在下面评论,看到会解决的
1.环境介绍
System: Ubuntu 24.04.3 Kernel: Linux 6.14.0-37-generic ROCm version: 7.1.1 CPU 13900K 内存 64G 6800MHz ddr5
python环境:
python 3.13.8
pytorch-triton-rocm 3.6.0+git5261b273
torch 2.10.0.dev20251208+rocm7.1
torchvision 0.25.0.dev20251209+rocm7.1
vllm 0.15.2rc1.dev2+g72bb24e2d.rocm720
amd-aiter 0.1.11.dev27+g1f5a39227
flash_attn 2.8.3
不同版本无所谓,处理方法是一样的,这个版本的fp16和bf16矩阵乘能到104tflops的结果。新版AMD 官方的ROCm 7.2 torch 性能也不错更好,但是torch 2.10 官方只给了python 3.12的,没有python 3.13,参见https://repo.radeon.com/rocm/manylinux/rocm-rel-7.2/ 。Pytorch这边的preview版的暂时没有更新ROCm 7.2版的,得等等,参见https://pytorch.org/ 。
2.前置环境安装
已有完整python vllm和mineru环境直接跳转第3步!!!建议使用推荐版本的vllm和Torch这里我用的uv python环境,conda等均可,但是切记使用pip 安装mineru而不要使用uv pip,uv pip会安装英伟达的torch后端等。。。。日志显示 Flash Attention (Triton backend) for ViT model on RDNA。
vllm 安装参考官方手册Vllm
3.patch环节
mineru和doclayoutyolo 两个仓库的改动可以参考我做的 MinerU-AMD-RDNA 和 DocLayout-YOLO-AMD-RDNA 的commit。下面我还是给出完整的patch部分:
3.1 vllm patch部分
定位自己vllm位置XXX
关键更改
XXX/vllm/model_executor/models/qwen2_vl.py文件:
35行下面增加一个import:
446行class Qwen2VisionPatchEmbed(nn.Module) 函数修改为下面的,直接用F.linear来实现conv3d,速度极快,拉满rocblas:
3.2 pipline doclayout_yolo patch部分
可以去仓库直接复制该文件:DocLayout-YOLO-AMD-RDNA
定位自己doclayout_yolo位置XXX
修改XXX/doclayout_yolo/nn/modules/g2l_crm.py,比如我的在/home/XXX/Pytorch/MinerUvllm/.venv/lib/python3.13/site-packages/doclayout_yolo/nn/modules/g2l_crm.py:
代码不长直接替换好了:
3.3 pipline mineru patch部分
可以去仓库直接复制对应文件,MinerU-AMD-RDNA :
定位自己mineru位置XXX
XXX/mineru/model/utils/tools/infer/predict_rec.py的136行下面增加将 imgW 对齐到 32:
XXX/mineru/model/utils/tools/infer/predict_rec.py的355行下面增加
XXX/mineru/model/utils/tools/infer/predict_rec.py的433行附近修改for rno in range(len(rec_result))为for rno in range(actual_batch_size):
XXX/mineru/model/utils/tools/infer/predict_det.py 312行下面增加两行形式检查,是否连续:
差不多就这么多,仓库里我额外改了两个文件,只是为了修复一个warming的,不重要
4.运行一个预热脚本,在这个环境提前存好所有的MIOPEN conv2d的kernel缓存,避免用的时候寻找。
抓取模型运行时的张量形状得到的问题形状,冷启动需要1s搜索的,就是后两个都是32的奇数次时:
让AI帮我重新写了一个预热脚本,我自己是通过加载模型预热过的,但是每个人电脑模型存储位置可能不一样,那还是预热形状吧。建一个cache_warmer.py 直接运行就行。
5.最后整三个环境变量后愉快玩耍即可
6.运行结果
下面vllm的PDF来自https://github.com/krahets/hello-algo/releases/tag/1.3.0 中文python版
PS:mineru保存的jpg图片很不清晰,并且命名也不是序号来的,我自用版本改成了webp格式图片,并且按照真实顺序保存的,方便使用,300dpi压缩95%的webp图像就非常清晰了,而且每张图体积也非常小。所以其实推荐使用这个格式来保存图片。
Beta Was this translation helpful? Give feedback.
All reactions