返回首页

Databricks 披露 Qwen 3.8 27B 微调优化路径:GPU 利用率 98% 下仍提速 6 倍

  • 核心结果:在 FSDP2、激活检查点、8192 token 二维批次的基线配置下,Qwen 3.8 27B 在 HuggingFaceH4/ultrachat_200k 上的完整微调耗时 7 小时 44 分钟,训练吞吐 9,396 token/s,GPU 平均利用率 98%。经三步优化后降至 1 小时 17 分钟,提速约 6 倍。
  • 第一步是换指标:作者指出标准 GPU 利用率只统计 GPU 处于工作状态的时间占比,无法反映活跃时算力被用得多满。torch profiler 显示单个训练步中 CPU 侧准备耗时超过 GPU 执行耗时,共 171 万次调用;GPU 侧单个 step 出现 31,105 次 aten::bmm,逐元素加法与乘法占据主要耗时——问题在于操作数量过多,CPU 无法及时向 GPU 队列投递。
  • 融合内核:模型中的非标准门控 Delta 网络层产生大量小算子。按 transformers 中 Qwen 实现标注的支持列表,安装 flash-linear-attention 与 causal-conv1d 后,操作总数降至约十五分之一,端到端提速 3.7 倍至 2 小时 5 分钟。作者偏好自行安装并预置进 Docker 镜像,而非依赖 Kernel Hub——后者对 torch 与 CUDA 版本有硬依赖,失配时 transformers 会静默回退到未优化内核。
  • 一维打包消除 padding:flash-linear-attention 只支持传统一维打包张量而非 NestedTensor,需要正确传入样本级 position_ids 以保证注意力掩码不跨样本。改用打包后总批次数减少约 36%,耗时进一步降至 1 小时 17 分钟;次要收益是输入形状固定后,FLA 内核的即时编译时间也随之减少。
  • 未采用的路径与取舍:CUDA graphs 与 FSDP2 的动态行为冲突,且限制较多,本次未使用;作者也指出手动融合后 torch.compile 已无进一步优化空间。打包的代价是输入流水线更复杂、更易引入影响模型质量的错误;按长度排序以减少填充则可能让相邻样本产生非预期相关性,带来模型偏差。
  • 行业意义:这一案例说明“GPU 利用率高”并不等于硬件被充分使用,训练吞吐的瓶颈可能完整地藏在框架层与数据布局中。对微调成本敏感的中等规模团队而言,同一份权重、同一批数据在相同硬件上的可压缩空间仍可能达到数倍量级,而其中大部分收益来自复用社区已有的成熟内核,而非改造模型结构。

🔗 Databricks 原文 | AI Runtime 示例代码 | Flash Linear Attention | causal-conv1d