Sylvain Gugger 谈机器学习模型加速与结果复现

原标题Sylvain Gugger on Accelerating ML Models and Reproducing Results

从学习率调度、GPU 瓶颈到噪声较大的市场数据,Sylvain Gugger 介绍他如何处理实际的机器学习性能问题。

SGSylvain Gugger嘉宾 · Jane Street
频道
Jane Street
发布
2024年10月14日
视频
1:06:23
阅读
11 分钟
原文
英语
在 YouTube 打开
往下滚动阅读时,视频会缩到右下角继续播放。字幕跟随阅读语言。
阅读语言共 2 种语言可读
由 AI 从英语原文翻译。打开“对照原文”可以逐段核对。
摘要

30 秒看懂

Sylvain Gugger 与 Ron Minsky 讨论他从数学教学到 fastai、Hugging Face 和 Jane Street 的经历。两人探讨训练调度、分布式计算、GPU 编程、性能分析、市场数据的限制,以及复现研究所需的严谨习惯。

  1. 1先预热,再降低学习率比赛团队通过先低后高、最后下降的学习率调度,更快达到目标。
  2. 2让研究人员掌握控制权Accelerate 旨在支持不同硬件,而不把训练循环隐藏在单体训练器中。
  3. 3同步可能让 GPU 等待需要 GPU 结果的 Python 操作可能打断异步调度,让昂贵的硬件闲置。
  4. 4数据加载也是性能问题变长样本和同步屏障可能让 GPU 闲置;平衡负载可能需要牺牲随机打乱程度。
  5. 5市场数据具有不同形态微弱且变化的信号和庞大的数据量会影响模型设计与基础设施。
  6. 6记录训练配方代码版本、依赖和超参数对复现有前景的训练结果至关重要。

要点建议

  1. 学习率调度和图像尺寸会影响模型达到目标准确率的速度。
  2. 灵活的训练循环让研究人员能够实验,但要获得性能仍需测量同步、内核启动和数据加载。
  3. 分布式训练需要平衡工作负载和快速通信,同时要权衡吞吐量与训练行为。
  4. 交易数据噪声较大,会随市场适应而变化,相对于模型规模而言数据量也可能很大。
  5. 复现结果需要记录代码、依赖和配置,并考虑非确定性的来源。
全文

按章节阅读整理后的全文

只看原始文稿
01

从数学到 fastai

Gugger 介绍通过课程学习机器学习并参加视觉模型训练比赛的经历。学习率调度和图像缩放提高了训练速度。

Ron Minsky 介绍 Sylvain Gugger:他是 Jane Street 的机器学习工程师,曾维护 Hugging Face Transformers,创建了 Accelerate,并与 Jeremy Howard 合著 Deep Learning for Coders with fastai and PyTorch。Gugger 此前教数学,2015 年搬到美国,2017 年通过在线课程接触机器学习。

Gugger 学习了 Howard 的 fastai 课程,为论坛和库作出贡献,并加入一个比赛团队,目标是尽快将视觉模型训练到指定准确率。他们在大部分比赛期间领先,直到 Google 发布 TPU 并超过他们的成绩。他说,fastai 的教育使命包括让领域专家掌握足够的机器学习知识,以改进放射学等领域的模型。

比赛中的一项改进是学习率调度。梯度下降利用梯度更新权重,而学习率决定步长。团队没有长期使用小学习率训练后再降低,而是从低学习率预热到较高水平,短暂训练后在末期降低,从而更快达到目标准确率。

Gugger 的直觉是,随机初始化的模型可能位于损失曲面陡峭、不规则的区域:一开始步长太大可能使训练不稳定。先用小步有助于稳定,随后大步可以穿越曲面并跳过局部极小值,最后用小步细化结果。两人都指出,二维或三维图像并不能完美类比数百万参数的情况。

第二项改进是逐步调整图像尺寸。卷积网络可以处理不同尺寸的图像,因此训练先使用较小的 128×128 图像,之后再提高分辨率。由于滤波器处理的像素更少,早期迭代成本更低。Gugger 说,这种学习率调度后来得到广泛采用,而逐步调整尺寸仍不太常见。

02

Hugging Face 与 Accelerate

他讨论开源模型工具和灵活训练循环的必要性。Accelerate 帮助研究人员用少量改动适配不同硬件。

参与 fastai 的库和课程后,Gugger 合著了这本书,作为偏好阅读者的参考资料。他于 2020 年加入 Hugging Face,维护开源库、开发教程和 Transformers 课程。他将其平台描述为分享模型权重的地方,而相关库提供实例化这些模型所需的代码。

Hugging Face 的研究人员发现,随着选项不断增加,单体训练器越来越难修改。Gugger 创建 Accelerate,让研究人员能够自行编写训练循环,只需少量改动就能在不同硬件上运行。与黑箱训练器相比,目标是以最小侵入性提供灵活性。

数据并行将数据集分给多个 GPU,分别并行计算训练的一部分。Accelerate 处理样板代码、GPU、TPU 和 CPU 环境之间的差异以及混合精度。Ron 指出,当权重无法放进单个 GPU 时,还需要模型并行。

03

分布式训练与 GPU

两人解释数据、流水线和张量并行,以及网络和 GPU 执行。他们对比即时实验、编译图与内核融合。

将不同层分布到多个设备可以容纳大型模型,但后面的 GPU 可能需要等待。流水线并行让不同阶段在连续的数据部分上重叠工作,包括前向与反向计算。张量并行则拆分权重本身,需要特别快速的通信来合并矩阵运算结果。

Ron 和 Gugger 讨论了网络在分布式训练中的核心作用。RDMA 可以将数据从网络接口直接移入内存,甚至 GPU 内存,无需 CPU 参与传输。快速互连和物理距离更近的 GPU 可以降低通信成本;Gugger 以正在出现的机柜级系统为例。

在 Jane Street,研究人员会带着训练缓慢的模型来找 Gugger。他通过性能分析定位瓶颈。PyTorch 的即时执行很灵活,但看起来无害的代码也可能效率低下,例如某个操作需要 CPU 与 GPU 同步,或将工作移出 GPU。

CPU 通常异步调度 GPU 操作,并能提前安排后续工作。当 Python 需要 GPU 的结果时,CPU 必须等待,随后 GPU 也可能因等待新任务而闲置。反复启动微小操作并同步的循环代价尤其高;启动内核本身也有开销。

Ron 区分了向量化的两种含义:在底层 CPU 编程中,它可能意味着使用 SIMD 指令;在 Python 中,它通常意味着把循环移入 NumPy 等原生代码。两种情况下,避免缓慢的解释型循环都很重要,但 GPU 工作还需要避免不必要的同步。

Ron 问,尽管 TensorFlow 和 JAX 的编译计算图很有吸引力,PyTorch 为什么取得成功。Gugger 将很大一部分原因归结为研究人员希望灵活实验和快速迭代;如果想法有价值,以后再优化也可以。代码避免同步时,异步调度仍然可以很快。

随着 GPU 变快,Python 调度可能难以足够快地启动内核。`torch.compile` 捕获计算图,并可以将连续操作融合成更大的内核。融合降低启动开销,还可能把中间值保留在寄存器中,避免先写入 GPU 内存再读回。

Gugger 将 Triton 描述为生成 GPU 内核的类 Python 领域专用语言,也是这种编译方法使用的组件。它尤其适合矩阵类工作负载,因为张量核心能提供高吞吐量。如果工作负载不符合其支持的模式,编译和调试可能很困难。

两人讨论的 CUDA 是 NVIDIA 的底层编程环境,具有显式并行内核,也有类似 C 的风险,例如指针错误和未定义行为。GPU 线程按称为 warp 的组运行,线程块共享局部内存。寄存器和快速调度的 warp 让 GPU 在一组等待时运行其他工作,从而隐藏部分内存延迟。

04

性能分析与 GPU 工具

Gugger 讨论 CUDA、Triton 等工具,接着讲解同步、混合精度、图和流。性能分析可以发现源代码中难以察觉的瓶颈。

底层 CUDA 和高层框架之间还有多种语言和工具。Gugger 列举了 Triton、Numba 和 Google 的项目。他和 Ron 谨慎讨论了新兴的类 Python 语言 Mojo,并指出录制时他们的理解及其 GPU 支持仍带有前瞻性。

对于缓慢的模型,Gugger 会反复进行性能分析,寻找 CPU 与 GPU 的同步点。有些同步可以通过换一种计算表达方式消除。一个隐蔽的例子是在 Python 中检查 GPU 算出的损失是否为 NaN:CPU 必须等待结果才能选择分支。

处理 NaN 检查的一种方法是让另一个线程执行检查,同时主线程继续运行,接受在检查停止训练前可能多运行几次迭代。消除同步后,编译可以启用内核融合。这些性能选择需要测量,并不保证每个模型都能获得同样收益。

混合精度可以加快训练:矩阵可使用 16 位浮点数,而累加使用 32 位精度。Gugger 表示,根据问题和硬件,使用张量核心及 bfloat16 等方式可能带来 2 到 4 倍的加速。他和 Ron 将更低精度格式视为新兴技术,并不假定它们适用于所有情况。

Ron 问用户是否容易看出代码何时运行缓慢。Gugger 说,PyTorch 对数据位置的显式控制有所帮助,但仍需要性能分析来发现隐藏的同步。团队正努力让性能分析和跟踪更容易使用,并自动识别异常缓慢的步骤。

如果研究人员的想法无法用现有操作高效表达,团队可能需要自定义 Triton 或 CUDA 内核。CUDA graphs 提供另一种降低重复内核启动开销的方法:记录并重放一串操作。与融合不同,graph 不会消除内核之间中间数据的内存写入和读取。

CUDA streams 允许并发调度互不依赖的工作,例如计算当前批次的同时传输下一批。Gugger 提醒,stream 是一种提示,硬件可能选择不重叠执行;尝试同时运行大量独立 stream 也未必高效。

05

为 GPU 提供数据

变长数据和同步屏障使加载变得复杂。平衡工作负载可能影响数据打乱和训练行为。

高效地为 GPU 提供数据与优化内核同样重要。如果将短序列填充到最长样本的长度,变长样本可能浪费内存。打包表示可以减少浪费,但分布式训练还需要平衡 GPU 之间的工作量,避免短批次在同步屏障处等待长批次。

按长度分组有助于平衡负载,却可能降低数据打乱的随机性,并可能影响训练准确率。两人将其描述为性能与训练之间的权衡。Gugger 还指出,批次形状变化时,PyTorch 的即时执行很方便;编译系统处理变化的形状可能需要更多工作。

06

市场数据上的机器学习

两人讨论模块化内部工具,以及交易数据特有的噪声、规模和延迟需求。定制的数据加载和模型用于应对这些需求。

Ron 问 Jane Street 的内部工具与开源生态相比如何。Gugger 说,性能分析有时发现简单修改就能让一次训练快 4 倍,但他认为需要更模块化的训练基础设施。研究人员希望获得可以修改、可组合的构件,而不是带有大量选项的巨大训练器。

Ron 区分了公司通用 AI 应用、用于交易的外部图像或文本数据,以及直接基于市场数据训练的模型。前两类情况可以使用现有架构。直接建模市场数据则不同:数据噪声大、信号微弱,但仍可能支持有价值的交易决策。

随着参与者利用规律,市场也会适应,因此几年前有用的模型现在可能不再有效。Gugger 说,市场数据每天可达数 TB,而模型可能比最大型语言模型小。由此形成的计算量与数据量之比,使高效加载和硬件利用率十分重要,往往需要定制模型和研究。

推理要求差异很大。Ron 举例说,有些应用要求极低延迟,约 100 纳秒;其他应用则可能接受微秒、毫秒,甚至每小时一次预测。Gugger 补充说,吞吐量也很重要:即使不必立即返回每次预测,为跟上高事件速率,每个事件也可能只能用几微秒处理。

07

教育与可复现性

Gugger 介绍向领域专家教授机器学习,并强调实证测试。记录代码、依赖和配置有助于在 notebook 和 GPU 存在非确定性的情况下复现结果。

Jane Street 为这些需求开发定制加载工具和模型,而大部分训练过程仍使用熟悉的随机梯度下降。Gugger 也参与教育工作:训练营帮助交易员和研究人员学习机器学习,让他们的领域知识能够影响模型选择,有些人之后还会自己训练模型。

Gugger 说,尤其难传达的一课是机器学习仍然依赖实证。理论解释了拟合的某些方面,但神经网络为什么能如此有效地泛化尚未完全弄清;看似可能解决过拟合的技术,仍必须实际尝试。他将这一过程比作做饭:准备材料,让模型训练一段时间,再看结果如何。

可复现性是另一项难学的课程。如果几个月后没人知道一个有希望的结果是如何产生的,它的价值就很有限。Gugger 建议保存准确的代码版本、依赖、训练配置,以及学习率和批次大小等超参数。Ron 指出,工具应当让遵守这些习惯更容易,尽管研究仍然需要谨慎。

Notebook 单元可以按任意顺序执行,可能留下来源不清楚的结果。GPU 并行带来另一个非确定性来源:浮点加法不满足结合律,而并行工作可能按不同顺序完成。在某些情况下可以实现确定性执行,但可能付出巨大的性能代价。

Ron 提到 Hogwild 等高度异步的方法,其中并发更新可能发生数据竞争。这类方法在数值上可能有效,但 Gugger 说,得到的模型可能难以解释或复现。对谈以可复现性与速度并列为实际约束结束。

同频道的其他文章

1:48:29EN → 简体中文
JSJane Street· 2026年10月16日AI 如何改变编程:John Krazit 与 Ron Minsky 的对话Ron Minsky, John Krazit · Jane StreetJane Street 的 AI 工具负责人和 Signals and Threads 主持人探讨智能体基础设施、安全、代码审查,以及软件开发体验的变化。编程智能体Developer productivity评估+2
1:36:37EN → 简体中文
JSJane Street· 2026年9月23日Aaron Bauer:在 AI 时代教授软件工程Ron Minsky, Aaron Bauer · Jane Street当模型能够生成代码时,学习目标、主动练习和编辑器设计如何影响工程教育。AI in EducationSoftware engineeringEducation+2
9 张幻灯片1:05:45EN → 简体中文
JSJane Street· 2026年9月11日Cyrus Omar:实时编程与人与 AI 共享的计算公共空间Cyrus Omar通过 Hazel 演示,探讨即时反馈、结构化协作和精细权限如何帮助人类与 AI 智能体共同工作。Programming LanguagesHuman-AI Collaboration开发流程与测试+2
1:25:00EN → 简体中文
JSJane Street· 2026年9月2日Eric Mannes:如何将杂乱的外部数据用于交易研究Ron, Eric Mannes · Jane Street从商品期货和 Excel 风险系统,到时点数据集和 AI,Eric Mannes 解释 Jane Street 数据工程背后的领域知识。Data quality & curation开发流程与测试Investing+2
7 张幻灯片1:16:29EN → 简体中文
JSJane Street· 2026年8月26日Grant Sanderson 与 Alok Puranik:从群论看位置编码Grant Sanderson, Alok Puranik · 3Blue1Brown从注意力机制的假设出发,他们推导矩阵指数,并将旋转、衰减和 Jordan 块与 RoPE、ALiBi 联系起来。Transformers & attentionMathematics机器学习基础+1
27:39EN → 简体中文
JSJane Street· 2026年8月21日3Blue1Brown 与 Jane Street 谈交易、机器学习和文化Grant Sanderson, Nitya, In Young, Craig, Alok · 3Blue1BrownGrant Sanderson 与 Jane Street 的同事讨论做市、共享算力、研究,以及他们加入公司的不同经历。Machine LearningFintechCompany Culture+2