Unlimited-OCR 部署运行(12/13):RTX 3090 MoE triton autotune config 消除性能警告

Unlimited-OCR 部署运行(12/13):RTX 3090 MoE triton autotune config 消除性能警告

服务跑通、输出正确之后,启动日志里可能还挂着一行恼人的警告:Using default MoE kernel config. Performance might be sub-optimal!。它只影响性能、不影响正确性 ,但会污染日志,而且默认 config 在消费级卡上未必最优。本篇讲清三件事:警告从哪来、为什么盲拷 A100 配置会运行时崩溃、以及如何为 RTX 3090 生成一份安全且有效的 autotune config。


一、警告从哪来

Unlimited-OCR 是 E=64, moe_inter=896, hidden=2560, top_k=6 的 MoE 模型。SGLang 在找不到"匹配当前设备 + triton 版本 + 模型几何"的 autotune 配置时,会打印这条警告(以及 down-sampling 对应的第二条),并退回启发式默认 config。

配置文件的查找逻辑(简化):

复制代码
configs/triton_{triton_version}/E={E},N={N},device_name={get_device_name().replace(' ','_')}{dtype}{block_shape}{per_channel_quant}{_down}.json
  • 目录先按当前 triton 版本(本机 triton 3.7.1triton_3_7_1)找;
  • 找不到再 fallback 到 supported_triton_versions = ["3.4.0","3.3.1","3.2.0","3.1.0"]
  • N = shard_intermediate_size // 2 = 896(当 moe_inter=896、tp=1);
  • 设备名由 torch.cuda.get_device_name(0) 推出 = NVIDIA_GeForce_RTX_3090

所以本机需要的文件名是:

复制代码
E=64,N=896,device_name=NVIDIA_GeForce_RTX_3090.json
E=64,N=896,device_name=NVIDIA_GeForce_RTX_3090_down.json

_down.json 给 down-sampling 复用 gate_up 调优,消除第二条警告。)


二、关键坑:不能盲拷 A100 配置

SGLang 自带 configs/triton_3_1_0/E=64,N=640/1280,device_name=NVIDIA_A100-SXM4-80GB.json 等 Ampere 调优。RTX 3090 = GA102 = sm86 (Ampere) ,与 A100 (sm80) 同架构族,block size 候选集通用 ------这很容易让人想"直接拷 A100 的过来改个文件名就用"。不要这么做。

维度 RTX 3090 A100
架构 GA102 / sm_86 GA100 / sm_80
每 SM 共享内存上限 100 KB(101376 B) 164 KB

A100 E=64 调优里有大量 config 的 shared memory 用量超过 101376 B ,在 3090 上 kernel 启动时会报 OutOfResources: shared memory推理直接崩。实测 6+ 个超限 config,典型特征:

  • BLOCK_SIZE_K = 256BLOCK_SIZE_N = 256
  • GROUP_SIZE_M >= 64num_stages >= 4
  • num_stages >= 5

例如 {16,64,256,...}{64,256,128,...}{16,128,128,G64,w4,s4} 等。

结论:盲拷 A100 配置到 3090 会运行时崩溃,必须剔除超限项再交付。 这正是"编译移植篇"里 第 06 篇 / 第 07 篇 "用不上的就别编 / 不超限才用"思路在 autotune 上的延续。


三、生成方法(gen_moe_config_3090.py

策略(非盲拷、非纯默认):

  1. 以 A100 E=64 N=640 调优为基(N=640 最接近本模型 N=896,block 最保守;同 Ampere 族,候选集合法)。
  2. 对每个 M 条目用 is_risky() 启发式标记超限项BLOCK_K>=256 / BLOCK_N>=256 / G>=64 & stage>=4 / stage>=5),用保守安全 fallback(全部 BLOCK_K<=128, BLOCK_N<=128, stage<=4)按 M 大小桶替换:
    • M <= 8{16,32,64,G16,w4,s4}
    • 8 < M <= 128{16,128,128,G1,w4,s2~3}
    • M > 128{64~128,128,64,G1,w4,s3}
  3. 在真实 RTX 3090 上对每个唯一 config 跑 fused_experts 实测 (含 override_config + MoeRunnerConfig()),任一失败自动降级到最小安全 config 并重测------不靠"猜它能编过"。
  4. 文件名由 triton.__version__ 决定目录triton_3_7_1),N 由 w2.shape[2] 推出 = 896,device 名由 torch.cuda.get_device_name(0) 推出。
  5. 同时写主 config 与 _down.json,消除两条警告。

核心验证片段(真实 3090 实测,而非静态判断):

python 复制代码
from sglang.srt.layers.moe.fused_moe_triton import override_config, fused_experts
from sglang.srt.layers.moe.moe_runner import MoeRunnerConfig

with override_config(cfg):
    out = fused_experts(x, w1, w2, topk, moe_runner_config=MoeRunnerConfig())
# warmup 3 次后取中位数区间均值,记录该 config 的耗时

注意:triton kernel 按 (config, M) 编译、缓存不跨 M 复用------逐 M 实测 autotune 极慢(每个 M 一次全量编译)。本方法只对"替换后保留的少数唯一 config"做实测,而非对所有 M 盲跑,正是为了避开这个坑。


四、验证结果

  • gen_moe_config_3090.py:替换 8 个超限 M(1, 2, 8, 16, 24, 256, 512, 1536),7 个唯一 config 全部在 3090 实测通过 (无 OutOfResources、无崩溃)。

  • 启动 SGLang 后日志确认两条加载行:

    复制代码
    Using MoE kernel config from .../triton_3_7_1/E=64,N=896,device_name=NVIDIA_GeForce_RTX_3090.json.
    Using MoE kernel config from .../triton_3_7_1/E=64,N=896,device_name=NVIDIA_GeForce_RTX_3090_down.json.

    sub-optimal / Using default MoE 警告计数 = 0。

  • 一次完整 OCR 请求实测生成 36465 token,MoE 内核正确执行、无 OOM / 崩溃 → 配置有效。

交付文件位置:

复制代码
.venv/Lib/site-packages/sglang/srt/layers/moe/fused_moe_triton/configs/triton_3_7_1/
  E=64,N=896,device_name=NVIDIA_GeForce_RTX_3090.json
  E=64,N=896,device_name=NVIDIA_GeForce_RTX_3090_down.json

五、如何适配你自己的 GPU

如果你不是 3090,按这个流程走:

  1. 先放任务打默认 config 跑一次,从日志拿到你的 device_name 和 triton 版本目录名。
  2. 找同架构族(Ampere / Ada / Hopper...)的官方 A100 / 对应卡 config 作基。
  3. 查你的 GPU 每 SM 共享内存上限 (技术规格站可查),据此调整 is_risky() 阈值------上限比 3090 高的卡可以放宽,比 3090 低的要更保守。
  4. 务必在真实卡上实测每个唯一 config,不要只做静态 shared-memory 预算。

六、小结与下一篇

本篇的要点:

  • 警告来自"找不到匹配设备的 MoE autotune config",只影响性能。
  • 盲拷 A100 配置会在 3090 上 OutOfResources 崩溃------根因是 3090 共享内存上限(100KB)远低于 A100(164KB)。
  • 正确做法:以同架构 A100 调优为基 + 剔除超限项 + 真实卡实测 + 主 / _down 双文件 → 警告归零、性能更贴合消费级卡。

第 13 篇 (本系列终篇)讲长文档 OCR 验证、gundam 图模式、两个 Windows 特有的运维坑(代理污染 health check、端口 10000 被遗留服务占用),以及给读者的完整使用指南------怎么用 OpenAI 兼容 API 实际调用这个服务。


系列导航(全 14 篇) (同前,略)

部署运行篇:09 正确启动 · 10 排障①乱码 · 11 排障②环境变量崩溃 · 12 MoE 性能调优(本篇) · 13 长文档验证与使用指南


参考资料与延伸阅读

以下为本文涉及的官方仓库、文档与规格站,建议发布前点一遍确认可达:

相关推荐
HAHAXX816 小时前
RPA 大模型集成踩坑总结:NLP、OCR 处理非结构化数据避坑指南
自然语言处理·ocr·rpa
Albart5753 天前
保姆级教程|Python+DeepSeek-V4-Pro实现AI客服Demo 支持OCR扫描PDF+全格式RAG知识库(附完整源码)
人工智能·python·ocr·ai客服·大模型api·私有知识库·deepseek
SamChan903 天前
对比 4 种主流 PDF 文档解析方案:PyMuPDF vs pdfplumber vs Apache PDFBox vs 大模型 OCR
python·ai·pdf·ocr·apache·机器翻译
zhonyu鱼3 天前
Pot 翻译:开源免费的跨平台划词翻译与 OCR 工具
windows·macos·开源·ocr·开源软件
AI人工智能+4 天前
医疗器械生产备案凭证识别技术,以AI为核心驱动力,为构建透明、高效、安全的医疗器械流通秩序提供了坚实的技术支撑。
人脸识别·ocr·医疗器械生产备案凭证识别
Zguigo4 天前
OCR 核心原理 + 模型 + 检测与识别
数据库·ocr
楚识科技4 天前
从感知到执行:OCR RPA深度融合构建端到端智能流程自动化新范式
自动化·ocr·rpa
楚识科技4 天前
破除通用瓶颈——企业级OCR定制化开发的架构思维与实战范式
架构·ocr
程序员-李俞4 天前
Mistral OCR 4真正改变的不是“识字”:文档AI正在变成Agent的数据入口
人工智能·windows·ai作画·aigc·ocr·ai编程·ai写作
楚识科技5 天前
不动产证OCR赋能金融房产:从字段提取到核验闭环的落地逻辑
金融·数据挖掘·ocr