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 长文档验证与使用指南


参考资料与延伸阅读

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

相关推荐
开开心心就好3 小时前
批量图片OCR识别重命名工具完全免费
随机森林·智能手机·ocr·电脑·word·音视频·最小二乘法
liferecords1 天前
HPD-Parsing: Hierarchical Parallel Document Parsing
人工智能·算法·ocr·idp·vlm
weixin_408099672 天前
2026 扑克牌识别 API 实战:识别牌值、花色、大小王(附 Python/Java/PHP 接入示例)
python·ocr·图像识别·api接口·接口开发·扑克牌识别·石榴智能
开开心心就好2 天前
内存清理工具定时自动清理开机自启动
java·开发语言·elasticsearch·ocr·excel·音视频·big data
王莎莎-MinerU2 天前
别让 Agent 重读 PDF:文档解析要交付可缓存资产
网络·数据库·人工智能·驱动开发·缓存·pdf·ocr
开开心心就好2 天前
电脑内存优化工具一键释放内存超简单
java·开发语言·macos·arcgis·ocr·excel·音视频
m0_726365833 天前
# Chrome纸牌游戏预测工具开发实战:Canvas图表识别、OCR与实时状态监控
chrome·python·游戏·贪心算法·ocr·线性回归·哈希算法
六月的翅膀3 天前
OCR:RapidOCR C++/C#
c++·ocr
molihuan3 天前
最新 Paddle-Lite Android平台编译
android·ocr·paddle·推理·端侧·paddle lite