在本节课中,我们将学习PyTorch基金会的最新发展,包括其从单一框架向“伞形基金会”的转型、新加入的项目、社区计划以及未来的活动安排。
大家好,感谢各位的参与。我们现在正式开始今天的活动。
在开始之前,我要感谢CSDN和GoS主办此次活动。这是首届PyTorch Day,我们很高兴能在巴黎启动这个活动。
接下来,我将快速介绍PyTorch的使命。我知道用这张幻灯片开始演讲可能最无聊,但它确实反映了基金会近期的一些变化。
最初的愿景是专注于PyTorch框架本身。我提前透露一些消息,如果你现在在线,可能已经看到了。我们现在正转向成为一个更全面、更广泛的基金会,我们称之为“伞形基金会”,它涵盖了解决整个AI生命周期问题的开源项目。
我要快速感谢我们所有的首要成员、普通成员和准成员。PyTorch基金会现在拥有超过30名成员,我们最近欢迎了高通和Snowflake加入这个大家庭。
并非所有人都知道,我们拥有一个蓬勃发展的PyTorch生态系统。目前它由超过70个项目组成,并且还在持续增长。你可能认识幻灯片上的一些标志。如果你有项目,请与我们联系,我们仍在接纳并将继续接纳生态系统项目。
我有很多公告要宣布,我会尽量简洁。正如我提到的,PyTorch现在是一个伞形基金会。别问为什么伞在着火,这只是我的设计。
那么,伞形基金会到底意味着什么?它基本上意味着PyTorch基金会现在可以托管多个项目,不仅仅是PyTorch核心框架,我们现在正扩展到AI生命周期中的其他新项目。我们希望建立一个可信、可互操作的项目生态系统,从根本上减少下游用户、开发者、工程师以及研究人员的摩擦。
这有助于我们统一治理,使项目进入供应商中立的空间,在需要时协调路线图,并真正加强不同项目之间的协作。
它还支持来自我们将要合作的所有不同领域的多样化创新,从工具和推理,到基础设施之外,再到基准测试、智能体框架和其他领域。
这将真正帮助社区依赖这个生态系统中的项目获得长期性、可靠性,确保它们在未来得到长期支持。

以下是PyTorch全景图的快速概览。我们有很多不同的术语,全景图和生态系统可能有点令人困惑。但全景图涵盖了一切。显然,PyTorch核心今天仍然存在,然后我们增加了两个新的基金会托管领域:平台项目和垂直领域。
平台项目更为通用,它们是像推理、服务、微调和训练这样的工具,可以作为通用工具使用。
然后是垂直领域,垂直领域非常特定于领域,比如蛋白质折叠,或者非常特定于行业或应用场景的用例。

我们仍然有生态系统项目,这些是自托管项目。这些项目不由PyTorch基金会托管,它们没有相同的福利和保证,但它们是优秀的项目,有助于完善整个开源AI生态系统。
那么,成为基金会托管项目意味着什么?我提到了基金会托管与自托管的区别。进入这种供应商中立治理模式的项目将受益于PyTorch伞形基金会。例如,商标和域名由基金会持有,这样其他公司就无法垄断商标的使用。
然后是CI基础设施,你可以依赖我们的CI基础设施并与之集成,你也可以管理自己的,但这是一个选项。我们还提供营销、活动等许多其他福利。
我们确实宣布了两个新项目,这是除了PyTorch生态系统(或PyTorch核心)之外的前两个新项目。

第一个是vLLM,我相信你们许多人都熟悉vLLM。它是一个推理和服务引擎,是一个出色的项目,它解决了生命周期中的一个实际领域,即下游的推理环节。
第二个是DeepSpeed,我们也很高兴欢迎DeepSpeed加入。他们的项目真正关乎抽象和处理从训练到推理的整个AI生命周期。这同样是一个卓越的项目,我们很高兴它加入我们的大家庭。
以下是托管项目的一些好处,我不会深入探讨,因为我们已经严重超时了。我们提供大量基础设施支持,许多开发软件的人并不想处理的非核心支持,我们很乐意承担这些。我们帮助项目成长,我们的目标是帮助生态系统中的项目扩大影响、获得更广泛的采用,并为用户创造真正无摩擦的体验。
我们还有大量的运营支持,例如安全审计、技术**实践,以及许多其他方面,甚至包括治理建设,这不是很多人真正习惯的领域,而这些正是我们可以真正提供帮助的地方。
我也很高兴地宣布,我们启动了PyTorch大使计划。该计划是一项全球性倡议,于今天启动,将使我们能够将社区扩展到全球,找到社区中能够推广PyTorch及其项目、主办地区活动、维护他们自己的社交媒体或其他渠道以帮助推广PyTorch的人士。
我们的目标是今年在全球举办大约20场不同的社区活动。我们真的希望展示本地创新,看看有哪些新兴项目,真正放大开源AI生态系统的影响力。如果你想申请,链接在这里。
我们还有一个新网站,有一些小的改动。显然,现在我们是一个伞形基金会,我们拥有多个项目,因此我们做了一些微调。这是一个响应更快的网站,运行速度更快一些。我们很高兴能推出这个网站,它将使我们能够更敏捷地将我们的项目推向公众领域。
显然,你们现在在法国PyTorch Day现场。我们还有PyTorch Day中国,将于6月7日在北京举行。今年我们还将宣布在印度举办PyTorch Day。
当然,我们还有PyTorch Conference,将于今年10月22日至23日在旧金山举行,地点在莫斯科尼中心,这是一个非常棒的场地。请加入我们。今年我们实际上在创造额外的一天,即“第零天”活动,这将是我们的峰会。我们将有模型推理峰会、AI基础设施峰会,然后我们还将与Triton Conference联合举办活动。此外,我们还有半天的初创企业活动,今年我们将再次举办初创企业展示会,但会有更大规模的VC和能够帮助你的项目成长和融资的人士参与。
同一周,我们还在组织开源AI周。这将是开源AI周的第一年,我们正在与开源领域的许多不同合作伙伴合作,使这个活动得以实现。这实际上是九天的开源盛会。


我不会在这个话题上停留太久,也不会在我的主题演讲中花太多时间。我谈到了我们在ELF关注的四个领域。这些是我们在PyTorch内部真正希望建立一个非常强大和凝聚的AI生态系统的四个领域。因此,所有这些领域和项目类别正是我们现在真正在探索的。
我们有一些即将推出的项目启动计划。PyTorch基金会持续发展,我们将在六月启动演讲者局。这基本上是为全球各地的活动提供高质量演讲者,他们可以介绍他们的材料并谈论我们在PyTorch基金会的工作。这些演讲者可能是大使,也可能不是,但我们希望扩大这个项目。
我们还有一个学术推广计划,将于夏季开始。该计划从根本上将我们与AI研究实验室联系起来,让开发者、研究人员和工程师能够使用PyTorch。
培训和认证项目将在PyTorch Conference上启动,届时人们将有机会在现场进行培训和认证。
本节课中,我们一起学习了PyTorch基金会的最新动态。我们了解到基金会已转型为“伞形基金会”,旨在托管和培育一个更广泛的AI项目生态系统。我们认识了新加入的vLLM和DeepSpeed项目,了解了基金会托管带来的益处。此外,我们还介绍了新启动的PyTorch大使计划、更新的网站以及今年一系列重要的全球活动,包括PyTorch Day、PyTorch Conference和首届开源AI周。最后,我们看到了基金会未来在演讲者支持、学术推广和培训认证方面的计划。
说到这里,我将结束我的演讲。如果你还不是PyTorch社区的一部分,请扫描这个二维码,加入我们的某个社交媒体,我们很高兴你的加入。
非常感谢。
在本节课中,我们将探讨人工智能与机器人学这两个领域的交汇点。我们将从机器人学的视角出发,了解AI如何推动机器人技术的发展,以及机器人如何为AI系统提供真实世界的测试平台。课程将涵盖机器人学的历史演变、AI带来的关键进步、当前面临的挑战以及面向未来的开源项目。
上一节我们介绍了课程概述,本节中我们来看看机器人学的发展历程。
在过去的十年左右,机器人学经历了一个重大趋势,即从工厂环境走向更开放的空间。在工厂中,一切都被严格约束和设定。你精确地知道机器人的位置、周围环境以及几乎所有情况。基本上,唯一的交互是当出现异常时,系统会冻结、停止并呼叫工程师来修复程序,然后恢复例行工作。这更像是自动化。
但最近,我们看到了变化。机器人开始进入非结构化环境。然而,我们仍然倾向于让这些环境变得更加可预测。如今,我们看到许多大型研究实验室和公司正致力于将机器人产品推向家庭,使其更具反应性和交互性。
我们见证了机器人领域的巨大进步,这主要归功于人工智能,尤其是在以下两个关键领域。

视觉感知对于机器人适应环境至关重要。机器人需要能够检测周围环境,理解上下文以分析情况并采取行动。在这方面,AI模型表现出色。例如,如果你想识别一个“水杯”,它并没有非常特定的形状。水杯有多种形状、纹理,可能位于不同位置。这就需要一种真正的零样本学习方法,能够真正适应眼前的事物。
另一个显著的进步体现在交互方面。如今,我们可以将大语言模型直接连接到机器人,并使用非常自然的提示。例如,你可以给出“抓起你的扳手,把它放进棕色袋子里”这样的指令。LLM可以填补所有其他所需的上下文细节和基本逻辑,以真正执行这个任务。
我想提到的另一个领域是运动控制,AI在此也带来了巨大进步。大约10年前,运动控制仍被认为极其复杂。但如今我们已经看到了巨大的进展。许多公司和研究机构已经让仿人机器人不仅能行走,还能跑步、跳跃,甚至表演功夫。在我看来,这些进步主要归功于使用了强大的强化学习算法,以及能够紧密模拟机器人内部物理和电机行为的仿真工具。我们正在这个领域努力缩小仿真与现实之间的差距。
需要指出的是,尽管这些运动任务看起来非常复杂和困难,但对于机器人而言,它们实际上是目标明确、功能定义清晰的任务。可以简化为:机器人需要遵循特定的轨迹,并满足一些约束条件,例如保持头部稳定或保持平衡。
实际上,我们仍在其中挣扎的领域可能令人有些困惑。我的意思是,在座的大多数人都能清理自己的厨房,但我不确定所有人都会功夫。然而对机器人来说,情况恰恰相反。清理厨房在某种意义上实际上是困难得多的任务。
这种任务更加不受控制、更加通用。首先,你需要处理大量的泛化问题。厨房里有许多不同的盘子,它们形状、纹理、重量和物理交互特性都不同。厨房里的所有其他物品配置也略有不同。你所看到的视频是由Physical Intelligence公司制作的最新成果,他们是机器人操作领域的知名机构。他们使用机器人在旧金山的不同公寓中进行训练,以适应不同的配置。但你仍然可以看到,这是一个相当标准化、已经格式化过的厨房。但这正是我们努力的方向,也是我们仍在挣扎的地方。
试图解释为什么这更困难。如果我问房间里的另外五个人来清理厨房,他们可能会提出略有不同的解决方案、略有不同的步骤和执行路径。可能的一个解释是,与运动控制只需要规划未来几步(例如几秒钟)不同,这类任务需要规划更长的时段,比如30秒或1分钟。这正是现有模型仍然面临巨大挑战的地方。
可能的主要原因之一是,正如AI在许多重大突破中所经历的那样,我们需要数据。我并不是说这是我们面临的唯一问题,但至少我们可以确定,我们需要更多这类数据。
实际上,我认为这是一种与我们目前拥有的数据不同的数据。这不像仅仅从整个互联网抓取大量视频那么容易。我们可能更需要一种嵌入式的第一人称视角数据,在这种数据中,你真正是试图解决的任务的主体。这类视频应该更具交互性,对环境的反应更灵敏,而不是我们目前使用的更静态的数据集。
我们需要封装这种我们希望更好地理解的世界的物理性和现实性。
因此,你可以看到,在我的幻灯片顶部,是一些人们尝试使用机器人在现场直接收集数据的例子。你可以想象,目前大多数研究机构甚至公司都在购买或组建自己的机器人车队,让它们在现场执行任务并收集数据。
但显然,这种方法的扩展性并不好。尤其是如果我们不确定需要多少这类视频,但很可能需要数百万个,所以这将耗费大量时间且难以实现。因此,也有大量工作集中在仿真上,或者直接使用人类执行任务的视频。但这里又存在仿真到现实世界或人类到机器人的差距,跨越这个差距并不容易,而且我们能否走这条路也不确定。

实际上,目前在这个领域有很多争论。关于数据,你有研究论文指出:“我在整个数据库中使用10%的真实世界机器人数据,我应该使用更多吗?还是应该使用仿真数据?”我认为另一方面,这也是Sage Levin(机器人操作领域的知名研究者)的一句话所表达的观点。其核心思想是:如果我们能够制造出真正以有用方式执行有用任务的机器人,这显然很好,因为它们可以完成任务。但它也可能成为我们获取新型数据的主要方式——那种真正具有交互性、封装了物理性以及我们与世界互动方式的数据。我认为这非常有趣,我想把它放在这里,因为我认为这可能也是AI和机器人学未来更加交叉融合的地方。
实际上,虽然我不会详细解释为什么我们需要开源解决方案(Matthew在之前的演讲中已经做了很好的阐述),但我认为在谈论机器人学时,这一点尤其重要。因为我们仍然需要硬件才能开始,而硬件可能成本高昂、难以构建或维护,甚至可能具有威胁性。因此,我们确实需要在这个方向上付出大量努力,以便让来自不同领域的许多不同社区和人们都能在这些项目上工作,而不仅仅是机器人实验室或公司。
因此,实际上,我想通过介绍三个主要项目来结束我的演讲。在我看来,这些项目是启动这类进程并朝着这个方向前进的好方法。
以下是三个旨在降低机器人学门槛、促进创新的开源项目:
- LocoManipulator by Locomotion Team
这是一个由Locomotion团队制造的灵巧操作机器人。你可能已经看到他们刚刚在走廊里举办了一场黑客松。这个项目的核心理念是任何人都可以购买或自己构建这种机器人。你可以获得设计图,可以用3D打印机自己打印部件,也可以在线订购零件。你拥有所需的所有电机和电子元件的物料清单。它直接兼容你的代码库,并且你可以直接访问最先进的学习算法库。例如,他们有一个教程,展示如何训练你自己的机器人来倒茶。目前,全球已有超过1000人构建了这种机器人并贡献了他们的数据集。
- Mini-Dog by Open Dynamic Robot Initiative
另一个项目思路类似,但更侧重于运动控制,由在场的Wenxuan发起。我之前提到过运动控制,但你可以想象,大型仿人机器人仍然相当昂贵、复杂、易损坏甚至危险,尽管它们功能强大。这个项目的核心理念是构建一个低成本、任何人都可以接触和构建的东西。因此,他设计出了这个机器人,其灵感来自迪士尼的机器人。再次强调,其理念是让任何人都能开始训练自己的机器人,并开始复现研究结果,以更好地理解如何为商业应用训练机器人。他们还花了大量时间研究仿真到现实的迁移,这对于那些行为可能相当随机(或者至少更难预测)且随时间变化的模块化机器人尤其关键。他们致力于更好地理解这一点,并拥有接近现实的仿真环境。实际上,你在幻灯片左侧看到的是在真实Mini-Dog机器人上运行的策略与在仿真中运行的策略的对比。
- 从设计到部署的自动化流程
他们希望更进一步。其理念是:好的,我们有了这个机器人,可以训练它工作。但如果你想构建自己的机器人、自己的设计呢?我们如何建立从基本构思到设计,再到仿真,最后到真实机器人的流程?我们如何使这个过程尽可能简单和快速,以便你可以迭代尝试新事物,并拥有多种多样的机器人来测试算法?
本节课中,我们一起学习了人工智能与机器人学的交叉领域。我们回顾了机器人学从结构化工厂环境向非结构化家庭环境的发展历程。我们探讨了AI在视觉感知、自然语言交互和运动控制方面为机器人带来的关键进步。同时,我们也认识到,在需要长时程规划和高度泛化的复杂现实世界操作任务中,机器人仍然面临巨大挑战,而高质量、交互式的第一人称视角数据是突破这些瓶颈的关键。最后,我们介绍了三个重要的开源机器人项目,它们通过降低硬件和软件门槛,致力于让更广泛的社区能够参与进来,共同推动AI与机器人学的融合与创新。开源和可及性对于加速这一领域的进步至关重要。
如果你对这些项目感兴趣,可以在整个会议期间看到Mini-Dog机器人。Charlotte今天下午也将做一个关于如何使用LLM通过情感让这个机器人更具表现力的演讲。你可以在Discord等平台上找到所有这些项目的详细信息。如果你有任何问题,欢迎提出。
在本教程中,我们将学习 PyTorch Codec,这是一个用于解码视频和音频数据的 PyTorch 库。我们将了解其核心功能、使用方法以及性能优化技巧。


大家好,我是 Nicolas,是 Meta 伦敦 PO 团队的一名软件工程师。我主要负责 TorchVision 的维护与开发。近期,我致力于开发 Torch Codec,这是 PyTorch 全新的媒体编解码库。本次教程将介绍这个库。
Torch Codec 是一个 PyTorch 库,专注于解码和编码媒体数据。目前我们主要支持解码功能,编码功能正在开发中。它的作用是解码视频和音频数据,无论是本地文件、网络 URL 还是其他来源,最终都能输出为 PyTorch 张量。
我们支持在 CPU 和 GPU 上进行解码。我们的目标是易于使用,主要面向机器学习工程师。用户无需了解解码的内部原理,就能轻松获取所需数据。同时,我们也注重安装的便捷性,避免用户从源码构建的麻烦。此外,我们追求高速解码,并确保与 PyTorch 生态系统(如 TorchVision 和 TorchAudio)无缝集成。
Torch Codec 底层封装了 FFmpeg 库,我们将其复杂性抽象出来,为用户提供了一个简洁、符合 Python 习惯的接口。
接下来,我们将通过一些代码片段来展示 Torch Codec 的各项功能。所有示例均可在我们的在线教程中找到。
使用 Torch Codec 进行视频解码时,主要交互对象是 VideoDecoder。你可以通过传入视频文件路径或 URL 来实例化它,并指定在 CPU 还是 GPU 上进行解码。
import torchcodec # 实例化视频解码器,可指定设备 decoder = torchcodec.VideoDecoder("video.mp4", device="cuda:0")
实例化后,你可以获取视频的元数据。这些信息可能来自视频文件头,也可能由 Torch Codec 通过分析计算得出,以确保准确性。
GPT plus 代充 只需 145metadata = decoder.metadata
获取视频帧非常简单,可以直接对解码器对象进行索引或切片操作,就像操作列表一样。输出是一个 PyTorch 张量,其形状为 [通道数, 高度, 宽度]。
# 获取第一帧(张量) first_frame_tensor = decoder[0]
如果你需要更多关于帧的信息(如显示时间戳),可以使用 get_frame_at 方法。它会返回一个包含张量数据和元数据的 Frame 对象。
GPT plus 代充 只需 145# 获取第一帧(Frame对象) first_frame = decoder.get_frame_at(0) frame_data = first_frame.data # 张量数据 pts = first_frame.pts # 显示时间戳 duration = first_frame.duration # 帧持续时间
为了提高性能,解码多帧时不应循环调用单个帧的获取方法。我们提供了 get_frames_at 方法用于批量解码,它会返回一个批处理版本的 FrameBatch 对象。
# 批量获取第0, 10, 20帧 indices = [0, 10, 20] frame_batch = decoder.get_frames_at(indices) # frame_batch.data 的形状为 [3, C, H, W] # frame_batch.pts 是一个包含3个时间戳的张量
除了基于帧索引的API,我们还提供了基于时间(秒)的API,方便你根据时间点获取帧。
GPT plus 代充 只需 145# 获取视频第1.0秒到第2.0秒之间的所有帧 frames = decoder.get_frames_between(1.0, 2.0)
在训练机器学习模型时,通常需要输入按时间顺序排列的帧序列,我们称之为“片段”。Torch Codec 提供了灵活的采样器来生成这些片段。
以下是获取随机时间点起始片段的示例:
# 随机采样3个片段,每个片段包含2帧,帧间隔为3秒 clips = decoder.get_clips_at_random_timestamps( num_clips=3, frames_per_clip=2, frame_step=3.0 # 秒 ) # clips.data 的形状为 [3, 2, C, H, W]
我们也支持按固定间隔采样的片段采样器,并且所有采样器都同时提供基于时间和基于索引的版本。
默认情况下,实例化 VideoDecoder 时会执行一次视频“扫描”。这个过程并非完全解码视频,而是读取数据包以计算准确的元数据并建立关键帧索引,从而确保定位帧时的精确性。
虽然扫描开销不是特别大,但它与视频长度成线性关系。在某些情况下,你可以通过启用“近似模式”来跳过此扫描,从而显著加快解码器的实例化速度。
GPT plus 代充 只需 145# 使用近似模式,跳过初始扫描以提升速度(可能牺牲少量定位精度) decoder_fast = torchcodec.VideoDecoder("video.mp4", precise=False)
在随机采样等场景下,微小的定位误差通常是可以接受的,因此我们推荐在一般情况下使用近似模式。
除了本地文件和URL,你还可以传递任何具有 read 和 seek 方法的 Python 对象(即类文件对象)给 Torch Codec。
import fsspec # 使用 fsspec 创建类文件对象,支持从S3、HTTP等流式读取 file_obj = fsspec.open("s3://my-bucket/video.mp4").open() decoder_stream = torchcodec.VideoDecoder(file_obj)
这种方式非常有用,因为它允许你在 read 方法中实现自定义逻辑,例如仅下载视频中你感兴趣的部分,而不是整个文件,从而节省带宽和时间。
Torch Codec 同样支持音频解码,其接口与视频解码高度一致。
GPT plus 代充 只需 145# 实例化音频解码器 audio_decoder = torchcodec.AudioDecoder("audio.mp3") # 获取元数据 audio_metadata = audio_decoder.metadata # 获取所有音频样本(张量) all_samples = audio_decoder[:] # 或获取特定时间范围的样本 some_samples = audio_decoder.get_samples_between(10.0, 20.0)
音频解码没有“扫描”步骤,因此实例化速度很快。

TorchVision 和 TorchAudio 中旧的视频/音频解码器 API 已被弃用,并计划在 2025 年底移除。如果你正在使用它们,现在应该开始迁移到 Torch Codec。

目前,TorchVision 中的图像解码器暂时安全,但未来也可能整合到 Torch Codec 中,以实现编解码功能的统一。
我们的未来计划包括:
- 实现编码功能:将解码后的视频帧重新编码为视频文件。
- 集成预处理:探索在解码器内部直接执行缩放、裁剪等预处理操作的可能性,这可能会比解码后再调用变换函数更高效。我们将谨慎设计此功能,以确保训练和推理阶段处理方式的一致性,避免结果出现偏差。
- 支持更多后端:我们正在努力增加更多硬件后端支持,例如集成 DirectShow 以更好地支持 Windows 平台。
本节课我们一起学习了 PyTorch Codec 媒体解码库。我们了解了它的设计目标:易用、易安装、快速且与 PyTorch 生态无缝集成。我们通过代码示例学习了如何使用 VideoDecoder 和 AudioDecoder 对象来解码媒体、获取元数据、批量处理帧以及进行灵活的片段采样。我们还探讨了使用“近似模式”来优化性能的技巧,以及如何通过类文件对象支持流式处理和自定义数据源。最后,我们了解了从旧API迁移的必要性以及库未来的发展方向。
如果你有任何功能需求或问题,欢迎在 GitHub 上提交 issue。

在本教程中,我们将学习如何使用 vLLM 来扩展大语言模型的推理能力。我们将探讨如何利用多加速器进行扩展,以及如何通过量化技术来优化模型部署。内容涵盖 vLLM 的核心优势、多种并行技术以及量化模型的选择与评估。
大家好,今天我们将讨论如何使用 vLLM 来扩展大语言模型的推理。我们将探讨如何利用多个加速器进行扩展,以及如何在大型平台上进行扩展。首先,让我们快速介绍一下自己。
我是 Red Hat 的产品经理,负责跟踪所有 Red Hat 产品的开发。我们关注开发平台,也与其他平台合作,因此我们今天在这里讨论。


大家好,我叫 Alda,是 Red Hat 和奥地利科学研究所的研究员。我主要研究量化领域。
世界在 2022 年发生了变化。当 OpenAI 发布 GPT 时,世界开始关注生成式人工智能。对于公司和开源社区来说,OpenAI 的模型通过扩展数据集大小和参数数量,在流行系统和软件系统方面取得了巨大成功,使得开源模型难以与之竞争。
但在开源社区和优秀贡献者的努力下,情况发生了变化。2022 年,我们没有开源模型,因此无法与任何创意模型竞争。然而,Meta 的团队开始推出开源模型,许多法国团队也参与其中,这些模型在基准测试中表现越来越好。
今天,如果我们关注这些进展,开源模型在能力方面已经可以与闭源模型竞争。Meta 的 Llama 模型可以与最好的闭源模型竞争。

开源平台也得到了广泛应用。PyTorch 是这些平台的基础。同时,vLLM 也崭露头角。Hugging Face 创建的 TGI 在初期被广泛使用,而 vLLM 正逐渐成为推理平台的事实标准。它提供了先进的算法,可以从单服务器扩展到大规模数据中心环境,适用于任何用例。
在初期,TensorRT-LLM 引擎限制了所有开源模型的性能,但现在它可以与 TensorRT-LLM 竞争,成为任何替代方法的比较基准。
vLLM 易于使用。通过 vLLM,你可以直接下载模型。下载量惊人,平均每天达到 10 万次,上个月某些日子甚至达到 30 万次。Python 库也是如此,因此它被广泛使用。公司可以在这里贡献和合作。例如,Llama 4 在发布第一天就得到了支持,这就是为什么我们在社区中工作,并在新模型发布前 10 天收到通知。
此外,vLLM 提供了 OpenAI 兼容的 API,因此很容易与代理或现有平台集成。vLLM 是 GLM 的重要贡献者。Magic 是 GLM 的早期贡献者之一,该项目由 UC Berkeley 创建,现在我们是 GLM 的第一贡献者。
vLLM 的一个关键优势是与垂直加速器的集成。它不仅仅局限于一种特定技术,而是支持任何模型和任何加速器。我们为这些加速器提供了不同级别的支持,但真正的优势在于开放性和贡献。许多公司和加速器都参与其中,例如 NVIDIA 的 H100 和 AMD 的 GPUs。
最近在 Google Next 大会上,我们的同事宣布了 Red Hat 对 Google TPU 集成的贡献。许多贡献者通过插件机制轻松集成加速器,支持多个加速器。
作为用户,你可以在笔记本电脑上使用 vLLM,也可以在云上使用,甚至可以添加自己的加速器。但对于最近的模型来说,一个模型可能无法完全适配一个 GPU。因此,我们需要使用量化技术,并探讨如何从单设备扩展到多设备。
对于每种场景,vLLM 都可以扩展,并提供更高的计算能力和内存容量。但当你扩展到多设备和多节点时,硬件要求也会增加。例如,GPU 之间的网络连接和内存带宽会成为瓶颈。扩展需要平台具备额外的能力。
vLLM 集成的一种关键技术是张量并行算法。张量并行允许在多个 GPU 上分割权重。这样,vLLM 就不需要加载全部数据,从而可以扩展并加载大型模型。
以下是张量并行的基本公式:
output = split(weight) * input
它提供了优化的实现,适用于输入和输出的水平分割。当设备数量较少时,这种方法效果很好,例如经典的边缘服务器。
当你想要扩展到多个节点时,除了张量并行,还需要使用流水线并行技术。在这种情况下,你将使用点对点通信,而不是扩展通信。每个 GPU 可以处理一定数量的层,从而连接这些层并允许更多的 GPU 参与。
在 vLLM 中实现这一点,你需要使用 Ray 进行通信共享,并使用流水线并行来运行。你可以通过设置 pipeline_parallel_size 参数来混合多个并行技术。
我们还广泛使用专家混合模型。与分割层或复制层不同,vLLM 提供了一种机制,可以在每个设备或 GPU 上分配特定的专家模型。通过这种技术,你可以将特定的计算分配给正确的设备。然而,专家之间的平衡可能很复杂,但你可以混合使用这些技术。许多最近的模型已经使用了专家混合。
接下来,我们将讨论量化实践。标准的量化生命周期在实践中应该如下所示。
基本上,当你想部署一个模型时,可以采取两种路径。第一种是从 Hugging Face 获取模型,然后通过 LM Compressor 进行量化。LM Compressor 是一个实现了最先进量化算法的库,支持不同的量化方案。这应该是一个迭代过程:量化模型、评估准确性、如果不满意则重复此过程。
或者,你可以使用像 Red Hat Model Zoo 这样的平台,它包含超过 400 个量化模型,并且我们每天都在积极发布新模型。
一旦你对量化模型的准确性满意,就需要对模型的推理性能进行基准测试,以了解量化带来的收益。这里我展示了 KLLF,这是我们的库,用于在部署上模拟真实工作负载。它与 vLLM、TGI 和其他 OpenAI 兼容库兼容。
在这里,你可以看到延迟如何变化,以及在不同负载下的吞吐量表现。一旦你满意,就可以部署模型,例如在 vLLM 中。
今天,关于量化,我想分享三个主要要点。
- 并非所有量化模型都是相同的:量化在过去一年中变得非常流行,许多模型出现在 Hugging Face 上。但不幸的是,量化因此获得了一些不好的声誉,因为大多数模型没有经过适当的评估。例如,用户可能会看到 FP8 量化模型的准确性比未量化基线低 5 个百分点,这导致社区对量化模型在实际部署中的采用产生了怀疑。
我的意思是,当我们应用特定的量化格式时,有无数不同的选择,从使用哪种格式、如何应用、使用哪种算法,到是静态量化还是动态量化,是否使用校准数据,使用哪种观察器,以及量化的粒度等等。这促使我们启动了一个名为 “Give me BF16 or give me that” 的项目。我们量化了所有流行模型,从解码器模型到 MoE 模型,模型大小从 11B 到 671B 不等,并将它们量化为三种不同格式:FP8、INT8 和 INT4。我们通过适当的校准调优,获得了满意的准确性恢复。
我们发现,当校准调优适当时,INT8 和 FP8 量化模型的准确性恢复率可以达到 98% 到 99%,而 INT4 模型的恢复率在 95% 到 99% 之间,通常取决于模型的大小。非常小的模型通常在 95% 到 96% 的恢复范围内,而更大的模型则更容易恢复。
- 量化为我们提供了改进 LLM 部署质量的新途径:在学术环境中,我们通常设计新的量化算法,并始终关注相对于未量化模型的准确性恢复。这是一个完美的公平设置,用于比较不同算法。
然而,在现实世界中,我们主要问自己的问题是:给定我的部署约束,我可以部署的**模型是什么? 通常,主要的部署约束是我们可以为该应用程序分配的 GPU 内存量。
例如,假设我们的部署目标有 14GB 的 GPU 内存。在没有量化的情况下,我们可以部署的**模型是 7B 模型,其准确性得分为 65。但量化使我们能够部署更大的模型,例如 14B 模型。原始未量化的 14B 模型占用 28GB 内存,但通过 8 位量化,我们可以将其减少到 14GB 以内。这样,我们可以享受更高的准确性,即使相对于未量化模型损失了一两个百分点,但仍然比小的未量化模型好得多。
- 没有通用的**量化格式:当我们对量化模型的准确性满意时,下一个问题是:对于我的特定部署和特定目的,**的量化格式是什么? 这里我们展示了交互延迟如何随着每秒查询数的变化而变化。我们在单个 A6000 GPU 上测试了 Llama 8B 模型,并观察了三种不同的量化格式:BF16(未量化基线)、INT8 权重和激活量化、以及 INT4 权重量化。
有三个主要观察点:
- 当每秒查询数少于 4 次时,**的量化格式是 INT4,因为它提供了最低的延迟。
- 一旦达到每秒 4 次查询以上,我们就从内存带宽限制转变为计算限制。在这种情况下,仅权重量化不是**选择,INT8 权重和激活量化成为更好的选择。
- 最后,当我们进一步增加每秒查询数时,在某些情况下,量化模型的性能可能比未量化基线更差。这主要是因为在这种情况下,我们严重受限于计算能力,而权重量化并不能改善这一点,反而需要支付额外的量化成本。
因此,最后的结论是:没有通用的**解决方案。你应该了解你的部署情况,并通过使用 Gu LLM 或其他库来自动化这个过程,从而找到最适合你部署的量化格式。

在本教程中,我们一起学习了如何使用 vLLM 扩展大语言模型的推理能力。我们探讨了 vLLM 的核心优势,包括其开放性和多加速器支持。我们还深入讨论了多种并行技术,如张量并行、流水线并行和专家混合模型,以及如何通过这些技术实现从单设备到多设备的扩展。

此外,我们详细介绍了量化实践,包括量化模型的评估和选择。我们强调了并非所有量化模型都是相同的,量化可以为我们提供部署更大模型的机会,并且没有通用的**量化格式,需要根据具体部署情况选择。
最后,我们提供了一些资源链接,如 LM Compressor、Gu LLM、Ray 和 vLLM,帮助你进一步探索和实践。希望本教程对你有所帮助,祝你在扩展和优化大语言模型推理的旅程中取得成功!
在本节课中,我们将学习 Meta 最新发布的大语言模型 Llama 4 系列,了解其核心特性、技术栈构成、应用场景以及如何负责任地构建 AI 应用。
大家好,我是 Christian。我在 Meta 工作了六年,之前在美国,现在在巴黎。我曾在 PyTorch 团队工作,后来领导了 Llama 的发布。目前,我在 Meta 的基础人工智能研究实验室担任产品经理,专注于世界模型的研究。今天,我们将聚焦于 Llama。
上一节我们介绍了背景,本节中我们来看看大语言模型的现状。大语言模型正在改变世界,每个人都在讨论它。AI 被集成到许多产品中,从创意工具到广告,无论是图像生成还是文本处理。
AI 不仅仅是生成式模型,它最初也用于图像分类和推荐系统等。生成式 AI 现在占据了主导地位。我们的目标是让这些模型“思考”得更好,朝着通用人工智能迈进。Llama 4 虽然不是通用人工智能,但它是迈向该目标的一步。

很多人不知道的是,Llama 1 和 Llama 2 是在巴黎的办公室构建的。我个人参与了 Llama 3 的工作。Llama 3 的发布是我们表明要在这个领域认真竞争的方式,特别是拥有 4500 亿参数的 Llama 3.1 模型。去年年底,我们发布了 Llama 3.3,成功地将 Llama 3.1 的很多能力压缩到了一个 700 亿参数的模型中。
创新有两种形式:一是提升模型的能力以解锁新应用;二是提高效率,降低成本,从而让更多用例在经济上可行。
今年四月,我们发布了 Llama 4 系列的前两个模型:Llama 4 Sc 和 Llama 4 Maverick。
Llama 在 Hugging Face 上的下载量已超过 10 亿次。这背后是一个活跃的社区,有超过 20 万个基于 Llama 构建的衍生模型。Llama 的力量不仅在于模型本身,还在于其完整的生态栈、灵活的部署选项以及围绕它构建的工具。
以下是 Llama 模型的主要优势:
- 功能强大且灵活:可用于翻译、内容创作、教育等多种任务。
- 可随处部署:无论是在本地环境还是在云端,这增强了对数据和隐私的控制。
- 丰富的生态系统:社区构建了大量工具,用于连接和改进智能体行为。
- 易于定制:产品经理等非专业研究人员也可以使用 PyTorch 等工具进行微调。
- 掌控未来技术栈:允许围绕模型构建完整的技术栈,并随模型更新而演进。

Llama 技术栈是一个抽象层,旨在让开发者的生活更轻松。它连接了不同的部署方式、硬件后端和云服务提供商。
以下是两个关键的 PyTorch 工具示例:
- TorchTune:这是一个用于微调 Llama 模型的工具。例如,你可以使用它来微调 Llama 3.1,有详细的教程指导整个过程。
GPT plus 代充 只需 145
# 示例:使用 TorchTune 微调 Llama 的伪代码框架 from torchtune import Recipe, Config recipe = Recipe.from_config(Config.from_yaml(“llama_finetune_config.yaml”)) recipe.run() - Executorch:这是我个人很关注的项目,它允许你将 Llama 或其他模型部署在边缘设备上。我们为 Executorch 提供了优化版的 Llama,能以极低的开销在各种目标设备上运行。
现在,让我们深入了解 Llama 4 系列模型。我们发布了两个模型:Llama 4 Sc 和 Llama 4 Maverick。
它们引入了几项创新:
- 混合专家模型:它们在任意时刻激活使用 170 亿参数,总共有 128 个专家。
- 超长上下文:Llama 4 Sc 拥有 1000 万的上下文长度,足以加载整个代码库进行处理。
- 原生多模态:能够理解和处理图像及文本输入。
- 多语言支持:支持 12 种语言,性能优于以往。
- 高性价比:Llama 4 Sc 可以运行在单个 NVIDIA H100 GPU 上,降低了基础设施门槛。
选择模型时,没有万能方案。对于许多用例,参数更少的密集模型如 Llama 3 70B 可能更易于部署。Llama 4 则提供了更多选项和更强的基准测试表现。

以下是 Llama 4 的核心特性总结:
- 模型类型:混合专家模型。
- 核心特性:原生多模态、超长上下文窗口、图像理解、多语言支持、更低成本下的卓越性能。
在评估模型时,建议不要只看所有基准测试,而是找到最能代表你目标任务的基准,并以此为依据进行选择和后续微调。


由于我们开源模型,无法在 API 层面控制使用,因此构建全流程的安全机制至关重要。
我们提供了 Llama Guard 工具。Llama Guard 是一个被微调为分类器的 Llama 模型,用于判断内容是否安全。
一个典型的负责任部署系统流程如下:
- 用户输入首先经过 Llama Guard 进行风险分类。
- 根据分类结果,决定是否将输入发送给主 LLM 模型。
- 模型在调用外部工具(如数据库)前,会再次经过安全检查。
- 模型的输出在返回给用户前,也会经过内容适当性检查。
我们为不同用例(视觉模型、纯文本等)提供了不同版本的 Llama Guard。Meta 在负责任 AI 领域已有超过十年的研究积累,我们发起了 AI 联盟,并为每个模型发布系统卡片,详细说明安全措施。网上也有相关的教育资源。
本节课中,我们一起学习了 Llama 4 系列模型的核心特性、其强大的开源生态与技术栈、以及如何利用工具进行模型定制和安全部署。Llama 不仅仅是一个模型,它是一个包含工具、社区和**实践的完整平台,旨在赋能开发者和研究者构建下一代 AI 应用。

如果你想了解更多关于 Llama 的信息,可以扫描相关二维码访问我们的资源页面。
本节课中我们一起学习了:
- Llama 模型的发展历程与社区影响力。
- Llama 4 Sc 和 Maverick 模型的核心技术创新(混合专家、长上下文、多模态)。
- Llama 技术栈及其关键工具(如 TorchTune, Executorch)。
- 如何负责任地部署 AI 系统,并利用 Llama Guard 构建安全护栏。
在本节课中,我们将学习如何利用 Common Crawl 这一庞大的网络爬取数据集来支持 AI 和机器学习项目。我们将了解 Common Crawl 的基本情况、其在 AI 领域的应用、数据处理流程,以及如何参与社区倡议来改善数据覆盖。


Common Crawl 是一个非营利性基金会,致力于提供免费、开放的网络爬取数据。它已持续运行超过 17 年,累积了约 2750 亿个网页,被超过 10,000 篇研究论文引用。该数据集每月更新,是当前预训练大型语言模型的主要数据来源之一。
Common Crawl 始于 2007 年,最初旨在服务于研究和搜索引擎索引。如今,随着大型语言模型的兴起,它已成为预训练模型的关键数据基础。
截至 2024 年底,Common Crawl 已发布超过 100 次爬取数据,总量超过 9 PB。数据可以通过 AWS S3 存储桶或 HTTPS 免费获取。
数据以三种主要格式发布:
- WARC 文件:包含原始的 HTML 文件。
- WET 文件:包含从 HTML 中提取的纯文本。
- WAT 文件:包含元数据和链接信息,对于构建多模态数据集(如图像数据集)非常有用。
Common Crawl 遵循机器人排除协议,并每月生成一个网络图,可供用户使用。为了方便下载,项目还提供了一个专用的客户端工具。
Common Crawl 使用基于 Apache Nutch 的开源爬虫进行工作。其流程始于一个种子 URL 列表,通过跟踪链接发现更多内容。爬取过程会使用“调和中心性”等指标对网页进行排名,并始终尊重网站的 robots.txt 规则。
上一节我们介绍了 Common Crawl 的基本情况,本节中我们来看看其运作原则。负责任地爬取网络并非易事,Common Crawl 秉持以下原则:
- 尊重
robots.txt规则。 - 响应删除和法律请求。
- 缓慢爬取,避免对网站造成过大负担。
Common Crawl 鼓励研究者和开发者使用其现有数据,而非自行进行大规模爬取,并正在与国际组织合作,探索为 AI 训练数据引入偏好信号的新标准。

在大型语言模型兴起之前,Common Crawl 已被用于词嵌入项目。一个有趣的转折是,在 2018 年左右,一些公司曾认为网络数据过于嘈杂,不适合训练 LLM。然而,Meta 公司的 RoBERTa 和 CamemBERT 等项目证明了网络数据的价值,它能提供丰富的语言风格和用例覆盖。
目前,主流大型语言模型的训练数据中,约有 80% 来源于网络数据。但需要指出的是,网络数据应作为基础,还需要补充书籍、学术论文等来源,以确保数据的语言多样性和质量。

了解了 Common Crawl 的应用价值后,我们来看看如何处理这些海量数据。一个高效的数据处理管道至关重要,尤其是当计算资源有限时。
以下是构建处理管道的核心思路:优先进行可并行化且成本较低的操作,以尽早过滤掉大量数据;将不可并行或计算成本高昂的操作(如复杂的质量过滤)放在流程末尾,从而减少需要昂贵处理的数据量。
一个典型的数据处理管道可能包括以下步骤(顺序可调整以优化资源):
- 文本提取:从 WARC 或 WET 文件中提取原始文本。
- 基础过滤:进行去重、语言识别、移除低质量文本(如导航栏、模板文字)等操作。
- 文档质量评估:使用启发式方法或机器学习模型评估文档的整体信息量和可读性。
- 内容质量过滤:应用更复杂的过滤器,例如基于教育价值或特定领域质量的筛选(此步骤通常计算成本较高)。


除了内容处理,Common Crawl 还提供了一项未被充分利用的资源:网络图及基于此的域名排名。

网络图可以计算每个节点(如域名)的“调和中心性”。其公式简单表示为:

HC(v) = sum( 1 / distance(v, u) ) (对于图中所有其他节点 u)
其中,distance(v, u) 是节点 v 到节点 u 的最短路径距离。孤立节点的调和中心性为 0。这个指标衡量了一个节点在网络中的连接重要性。
你可以在数据处理管道的后期,利用 Common Crawl 提供的域名排名信息,对你筛选后的文档进行优先级排序,从而为模型训练选择更重要的内容。
最后,我们关注一个关键挑战:语言覆盖。当前的语言识别工具在干净数据上表现良好,但在论坛、社交媒体等嘈杂的网络文本上性能会显著下降。
为了改善非主流语言的数据覆盖,Common Crawl 推动了两项社区倡议:
- 网络语言项目:邀请用户提交其常用语言网站的 URL,以丰富爬虫的种子列表。
- LangID 项目:提供一个众包平台,让用户帮助标注文本片段的语言,以此生成高质量的训练数据来改进语言识别模型。
这对于推动英语之外的语言 AI 技术发展至关重要。


本节课中我们一起学习了 Common Crawl 数据集及其在 AI 领域的核心作用。我们了解了如何获取其数据、构建高效的处理管道以应对海量数据挑战,并探索了利用网络图排名和参与社区倡议来进一步提升数据质量与多样性的方法。对于希望利用真实网络数据开展 AI 研究的开发者和研究者而言,Common Crawl 是一个不可或缺的宝贵资源。
在本节课中,我们将学习如何将大语言模型的训练扩展到数千个GPU上。我们将探讨数据并行、张量并行、流水线并行和专家并行这四种核心并行策略,理解它们如何协同工作以克服内存、计算和通信的限制,从而实现高效的大规模训练。

上一节我们介绍了课程目标,本节中我们来看看训练所依赖的硬件环境。在集群中,我们使用GPU进行工作。这些GPU通常以节点为单位组织,每个节点包含四到八个GPU,它们之间通过高速内部互连(如NVLink)连接。多个节点则通过速度较慢的网络(如以太网)连接成一个集群。这种速度差异意味着我们需要高效地利用内部互连进行通信。


以下是硬件架构的关键点:
- 节点包含4-8个GPU,内部通过高速互连。
- 节点之间通过速度较慢的网络(如以太网)连接。
- 通信策略必须考虑这种带宽差异,以优化训练效率。
在单GPU上训练模型的过程很简单:前向传播、反向传播、计算梯度,然后执行优化器步骤来更新模型。当处理大批量数据时,由于无法一次性将整个批次放入GPU内存,我们会使用梯度累积,即分多个小步骤顺序执行前向和反向传播。
既然数据批次是独立的,为什么不在多个GPU上并行处理呢?这就是数据并行的核心思想。我们将不同的数据批次分配给不同的GPU,让它们并行执行前向和反向传播,然后通过通信同步梯度,确保所有GPU上的模型保持一致。
其计算-通信流程如下:每个GPU独立完成前向和反向传播,然后进入一个同步梯度的通信步骤。在这个过程中,GPU在通信阶段会处于空闲状态。为了充分利用GPU,理想情况是在进行计算的同时进行网络通信。PyTorch的DDP(分布式数据并行)通过其分桶系统,巧妙地实现了反向传播与梯度同步的重叠,从而减少了GPU的空闲时间。
既然DDP效果很好,为什么不能简单地使用与GPU数量相同的数据并行规模来加速所有训练呢?这引出了第一个限制:我们需要满足全局批次大小的要求。研究表明,如果用于每次优化器更新的全局批次过大,会因更新次数减少而影响模型性能。通常,训练会使用一个相对较小的批次大小(例如百万token级别)。因此,如果设置了32K的批次大小,却使用32,000个GPU进行纯数据并行,会迅速超过这个全局批次大小限制,损害性能。
另一个限制是,数据并行假设整个模型可以放入单个GPU。以Llama 3 70B模型为例,它需要约140GB内存,无法加载到单个GPU中。此外,可用的GPU数量本身也是一个限制。
因此,我们的目标是高效利用可用GPU,尽可能快地训练。这需要优化吞吐量。回顾之前的数据并行示意图,我们发现网络有时处于空闲。一个想法是:能否在计算的同时进行通信?

上一节我们看到了数据并行的通信瓶颈,本节中我们来看看如何通过分片模型参数来进一步优化。为什么不将模型参数分片,并尝试在前向传播过程中就重叠通信呢?这就是FSDP(完全分片数据并行)所做的。
FSDP将模型参数分片。例如,当需要执行模型某部分的前向传播时,我们会预取该部分所需的参数。通过这种方式,我们可以在前向和反向传播中实现计算与通信的良好重叠。集群保持高效工作,因为GPU一直在忙碌。
然而,FSDP仍然受限于数据并行的扩展性。如果我们拥有大量GPU,不能仅仅依赖FSDP。另一个问题是,当我们使用一种并行形式(如DDP或FSDP)时,通信可能会穿过节点,从而无法高效利用节点内的高速NVLink连接。例如,如果我们有8个GPU进行张量并行,那么这8个GPU会高效使用NVLink,而集群的其他部分则使用较慢的以太网。既然为整个集群付费,我们希望充分利用每一部分资源。
这就引出了第二种并行形式:张量并行。其背后的直觉是,矩阵乘法可以在维度上进行分割。对于两个矩阵的乘法同样成立。每个GPU持有部分权重,并且只执行部分计算,但处理相同的数据。这就是TP的巧妙之处:数据并行是分割数据,而张量并行可以使用相同的数据,通过分割计算来分布计算负载。
但TP在每次前向和反向传播内部都有一个关键的、必须进行的同步通信。这意味着,如果不完成同步,就无法继续前向传播。因此,TP需要非常高的内部互联带宽。TP的优点在于可以分片模型、分布计算负载(特别是在计算密集的注意力层和FFN层),帮助克服模型无法放入单卡的限制,但它对互联带宽要求很高。
第三种并行是序列并行,当需要扩展序列长度时使用。显然,更长的序列会占用更多内存。CP所做的是沿着序列维度分割数据。例如,用128K上下文长度训练时,就沿着这个维度分片。
在Transformer中,需要看到完整序列的模块是注意力机制。因此,我们需要调整注意力层的计算,这意味着在每个注意力层都需要进行通信。同时,由于每个GPU看到的是序列的不同部分,在反向传播时需要同步梯度。通过预取机制,序列并行中的计算也可以很好地重叠。
接下来是流水线并行。其背后的思想是,Transformer有很多层,我们可以沿着层数进行分片。假设一个模型有四层,我们将每一层放在一个GPU上。我们有一些数据批次,从第一个批次开始,在第一层GPU上前向传播,然后将激活值发送到第二层GPU,以此类推。反向传播过程类似。
PP的问题是存在较大的“流水线气泡”,导致某些GPU处于空闲状态。为了解决这个问题,DeepSpeed提出了一个非常精巧的流水线调度器,称为“1F1B”(一次前向对应一次反向)调度。通过这种调度,GPU的空闲时间几乎被消除,每个GPU都能高效工作。


最后是专家并行,它用于混合专家模型。在MoE中,有多个专家网络,路由器会将不同的token分发到对应的专家。如果专家被分片到不同设备上,路由器就需要将token发送到正确的设备,这涉及all-to-all通信。在专家计算完成后,结果也需要通过另一次all-to-all通信收集回来。因此,EP只在MoE层增加通信,并且专用于MoE模型训练。当然,DeepSpeed也提供了高效的EP实现,能很好地重叠计算与通信。

总而言之,我们制作了一个很好的图表来总结所有并行策略,清晰地展示了在哪些环节会发生通信(例如,序列并行影响注意力层,专家并行影响MoE层),以及这些通信影响的是参数还是激活值。我们还制作了一个速查表,包含了我们进行训练时的配置推荐。更多细节可以在torch.distributed文档和DeepSpeed中找到。

最后,当我们将训练扩展到数千个GPU时,必须意识到其能源影响,并负责任地使用它们。我们的目标就是尽可能高效地使用所有GPU进行训练,尽可能快地完成训练,以避免能源浪费。

本节课中我们一起学习了四种关键的分布式训练并行策略:数据并行、张量并行、流水线并行和专家并行。我们了解了它们如何解决内存、计算和通信的挑战,以及如何根据硬件特性和模型结构组合使用这些策略,以在数千个GPU上实现高效的大规模模型训练。

在本节课中,我们将学习如何通过后训练技术为大型语言模型(LLM)添加推理能力。我们将以Llama和Mistral模型为例,介绍从数据生成、监督微调到强化学习的完整流程,并了解NVIDIA在此领域的最新贡献。



上一节我们介绍了课程概述,本节中我们来看看什么是推理模型。
从架构角度看,具备推理能力的模型与不具备推理能力的模型完全相同,它们很可能都是基于Transformer架构的。两者的区别在于,推理模型能够利用所谓的“测试时间计算”在回答问题前进行“思考”。

例如,OpenAI的o1模型在解决数学难题等复杂任务时,如果给予更多“思考”时间,其准确率会显著提升。这就是推理模型的核心特征。

然而,这种能力也带来了挑战。在推理时,模型需要生成更多的中间“思考”令牌,这直接增加了推理时间和计算成本。
以下是推理开启与关闭时,模型生成令牌数量的对比示意图:
推理开启 (System 2): 生成大量“思考”令牌 + 最终答案令牌 推理关闭 (System 1): 直接生成最终答案令牌
上一节我们了解了推理模型的基本概念,本节中我们来看看它的具体应用和面临的挑战。

推理模型在智能体(Agent)AI的开发中大有可为。一个先进的AI智能体系统通常能够:接收任务、规划解决方案、调用工具(如计算器、搜索引擎)、执行行动,并在最终输出前对方案进行自我评估与修正。
我们认为,推理模型可以在多个方面助力智能体AI的发展:
- 整合刚性数据源:帮助模型理解和融合来自不同结构化数据源的信息。
- 答案验证:在输出前对生成的答案进行逻辑检查和验证。
- 处理模糊性:当用户指令不明确时,通过推理来澄清意图,这是最常见的应用之一。
- 动态适应:在执行任务循环中,当接收到新信息时,能够灵活调整计划。
在深入如何添加推理能力之前,我们需要先了解对大语言模型进行后训练的三种主要技术家族。
以下是三种核心的后训练算法:
- 持续预训练:在基础模型上,使用无监督数据继续以“预测下一个令牌”为目标进行训练。这种方法通常用于向模型中注入特定领域的知识。例如,NVIDIA的ChipNeMo项目就是对Llama模型进行持续预训练,以融入芯片设计知识。
- 监督微调:在预训练或持续预训练之后,使用带有输入-输出对的数据集对模型进行训练。这常用于为模型注入诸如遵循指令、理解对话、以及我们今天重点关注的推理能力等技能。
- 强化学习:使用奖励函数来调整模型,使其输出与人类偏好或其他特定目标对齐。PPO(近端策略优化)和GRPO(梯度奖励策略优化)是常用的算法。
上一节我们介绍了通用的后训练技术,本节中我们具体看看如何利用这些技术为模型添加推理能力。

目前,主要有两种思路为LLM(尤其是较小模型)添加推理能力:


方法一:从强推理模型进行知识蒸馏
利用GPT-4或Llama 3.1 405B等拥有强大推理能力且许可较宽松的模型,生成高质量的推理过程数据集(合成数据)。然后,使用这些数据以监督微调的方式训练较小的模型。
方法二:使用带虚拟奖励的强化学习
不依赖外部强模型,而是通过设计奖励函数,在强化学习框架下直接训练模型学会推理。



NVIDIA基于这些方法,研发并开源了Llama-NeMo模型家族。该家族包含三个尺寸的模型:
- Nano (8B):可部署在边缘设备或PC上。
- Super (40B):针对单颗H100 GPU推理进行优化。
- Ultra (405B):需要多颗GPU进行部署。
这些模型的关键特点是:同一个模型在推理时,可以按需开启或关闭推理模式。对于简单问题,可以关闭推理以提升速度;对于复杂问题,则开启推理以获得更准确的答案。
那么,像Llama-NeMo这样的模型是如何构建的呢?其流程主要分为三个阶段。
以下是构建Llama-NeMo模型的三个阶段:
- 蒸馏与剪枝:从更大的模型(如Llama 3.1 405B)出发,通过神经架构搜索等技术进行剪枝,得到一个参数更少(如40B)但能力相近的“瘦身”模型。随后进行持续预训练以恢复可能损失的能力。此时模型尚无推理能力。
- 大规模监督微调:使用合成数据集对模型进行监督微调。数据集涵盖数学、代码、科学、对话等多个领域,且每个领域都包含“推理开启”和“推理关闭”两种模式的数据。这一步为模型注入了核心的推理能力。
- 强化学习对齐:分两步进行。首先,使用强化学习提升模型遵循指令的能力。然后,使用特定的奖励函数来增强模型的对话安全性和有用性。最后,使用NVIDIA NIM微服务对模型进行生产环境优化。
整个流程中使用的代码、技术和数据均已开源。
理论需要实践来验证。最后,我们通过一个实际案例,看看如何使用NVIDIA NeMo框架为Mistral 7B模型添加推理能力。
我们基于DeepSeek-R1论文中的方法,将其适配到Mistral模型上。以下是核心步骤的代码片段概览:


首先,下载并准备Mistral 7B模型。
GPT plus 代充 只需 145# 示例:使用NeMo工具加载模型 from nemo.collections.nlp.models import GPTModel model = GPTModel.restore_from(‘mistral-7b.nemo’)
其次,准备用于微调的推理数据集。数据集中包含“思考开始”、“思考结束”、“答案开始”、“答案结束”等特殊标记来构建推理链。
# 数据格式示例 { “instruction”: “单词‘strawberry’中有几个‘r’?”, “reasoning”: “<|begin_of_thought|>我们需要数一数‘strawberry’中的字母‘r’。单词是 s-t-r-a-w-b-e-r-r-y。从前往后数:第3个字母是r,第8个字母是r,第9个字母也是r。等等,再确认一下:s,t,R,a,w,b,e,R,R,y。所以是第3、8、9位,总共3个r。<|end_of_thought|>”, “answer”: “<|begin_of_answer|>3<|end_of_answer|>” }
接着,使用NeMo框架对模型进行监督微调。
GPT plus 代充 只需 145# 启动微调任务 (简化示意) python finetune_mistral_reasoning.py --model-config mistral_7b.yaml --dataset reasoning_data.jsonl --output-dir ./mistral-7b-reasoning
最后,对微调前后的模型进行对比评估。例如,向原始模型提问“1.19和1.111哪个大?”,它可能直接错误地回答“1.111”。而经过推理训练的模型则会先进行逻辑思考:“比较小数时,先对齐位数:1.190 vs 1.111。从高位比起,十分位1=1,百分位9>1,所以1.19更大”,然后给出正确答案“1.19”。
本节课中我们一起学习了为大型语言模型添加推理能力的完整路径。
主要收获如下:
- 监督微调是关键:在高质量合成数据上进行监督微调,是向较小模型注入推理能力的一种有效且相对直接的方法。
- 强化学习用于突破:若想使模型的推理能力超越其“教师模型”,则需要借助强化学习技术。
- 多阶段训练策略:为了均衡提升模型在不同领域(如指令遵循、代码、数学)的推理能力,通常需要设计包含多个阶段(SFT、RL)的训练流程。
- 灵活部署:像Llama-NeMo这样的模型实现了“按需推理”,允许在应用层面根据查询复杂度动态切换模式,平衡性能与精度。

通过利用NVIDIA NeMo等开源框架和已公开的配方,开发者可以尝试为自己的模型赋予“思考”的能力。
在本节课中,我们将学习DeepSpeed库,这是一个用于实现高效、可扩展的分布式深度学习训练的开源库。我们将探讨其核心目标、解决的关键挑战(如GPU内存墙问题),并深入了解其最新的技术进展,包括通用检查点、通信优化、编译技术以及存储I/O优化。


上一节我们介绍了DeepSpeed的概况,本节中我们来看看其诞生的根本原因。DeepSpeed的创建基于一个核心观察:可扩展性是推动深度学习行业发展的关键驱动力。
可扩展性主要体现在两个维度:
- 模型规模:以数十亿参数为单位增长。
- 训练数据量:以数十亿乃至数万亿token为单位增长。
从早期的GPT-3(约3000亿参数,数千亿token)到如今的Llama 4(数千亿参数,数万亿token),模型规模和数据量的爆炸式增长对系统资源造成了巨大压力,主要体现在:
- 计算资源
- 内存资源
- 通信开销
- I/O与数据
因此,深度学习的进步高度依赖于在上述四个支柱上的创新。DeepSpeed自诞生起就致力于为这些挑战提供解决方案。
上一节我们了解了可扩展性带来的系统压力,本节我们聚焦DeepSpeed解决的第一个关键挑战:GPU内存墙。
问题在于,模型参数规模每年增长约100倍,而GPU的高带宽内存(HBM)容量每两年仅增长约2倍。这导致模型很快无法装入单个GPU。

DeepSpeed通过两大关键技术解决此问题:

以下是两种核心的解决方案:
- ZeRO(零冗余优化器):针对数据并行训练范式进行优化。传统数据并行会在所有GPU上复制完整的模型状态(参数、梯度、优化器状态)。ZeRO的核心思想是分区而非复制。它将模型状态分区存储在不同的GPU上,从而显著降低单个GPU的内存占用。
- ZeRO有三个主要阶段(ZeRO-1, ZeRO-2, ZeRO-3),分别对应优化器状态、梯度和参数的分区。
- 异构内存利用:除了GPU的HBM,服务器还拥有容量大得多的CPU内存(DRAM)和本地NVMe存储。DeepSpeed通过卸载(Offloading) 技术,将部分模型状态(如优化器状态、参数)临时存储到CPU内存或NVMe中,仅在需要时与GPU交换,从而突破GPU内存容量的限制。
结合ZeRO和3D并行(张量并行、流水线并行与数据并行),DeepSpeed使得训练超大模型成为可能。其系统能力的扩展速度甚至超过了模型规模的增长速度,早在2021年就能支持训练万亿参数模型。这些优化思想也启发了后续的框架,如PyTorch的FSDP。
前面我们介绍了DeepSpeed的基础和核心优化,接下来我们将了解其最新的四项技术进展。
动机:在分布式训练中,训练状态(检查点)与创建它时所用的硬件配置(GPU数量、并行策略)紧密耦合。这导致无法在不同配置下恢复训练,缺乏灵活性。
解决方案:将检查点与硬件并行策略解耦。DeepSpeed提供了一种机制,允许你在不同的并行策略(如不同的TP/PP配置)之间重塑(reshape) 模型状态。
优势:
- 容错性:节点故障后,可用剩余健康节点继续训练,无需等待替换。
- 弹性训练:当有额外资源可用时,可动态增加GPU以加速训练;资源被回收时,也能调整配置继续训练。
- 便携性:通过一种描述并行策略的语言,可以轻松地将检查点从一种配置转换到另一种。
效果:实验表明,重塑并行策略不会影响模型的收敛性。该技术已成功应用于BigScience等大型项目,使其在训练中途GPU数量减半时仍能继续训练。
动机:张量并行、流水线并行等策略在分区计算的同时,引入了GPU间的通信开销。随着跨节点训练,通信时间可能占据总时间的40%以上。
解决方案:Domino通过细粒度的计算与通信重叠来隐藏通信延迟。它可以在Transformer层内或跨层进行重叠调度。
原理:传统方式中,计算和通信是顺序执行的,存在GPU空闲间隙。Domino通过精细调度,使得通信操作与后续的计算操作同时进行,从而填满这些间隙。
效果:在H100 GPU上,Domino能够在单节点内完全隐藏张量并行的通信开销。与Megatron-LM相比,在多节点场景下实现了约16%的加速。目前正与Hugging Face、MegaTron等框架集成,目标是在MoE、推理和长序列训练等场景实现100%的通信隐藏。
目标:手动为不同模型和硬件配置分布式训练策略以获取峰值性能非常困难。Big Compile旨在通过编译器技术自动化这一过程。
核心思想:
- 自动应用分布式技术:编译器自动对计算图应用张量并行、流水线并行等优化。
- 基于性能分析的优化:让训练先运行一段时间,分析性能瓶颈,然后自动调整并行策略等参数,重新编译模型以获得**性能。

流程:
原始模型 -> PyTorch Compile(获取计算图)-> 应用并行/优化变换 -> 运行并性能分析 -> 调整策略并重新编译 -> 循环直至最优
示例:ZeRO-3优化
- 自动分片:编译器自动完成参数分片,无需用户手动编写。
- 预取优化:参数分片带来通信开销,通常用预取来隐藏。编译器通过分析训练时的内存使用模式,智能决定预取的时机和数量(例如,在前向传播初期内存充足时更激进地预取)。
效果:在Dance模型和稀疏混合专家模型上,实现了最高50%的加速。对于ZeRO-3卸载优化,相比基线有超过1.5倍的加速;对于ZeRO-1(仅优化器状态分片),也有超过30%的加速。
动机:随着深度学习规模扩大,I/O(尤其是与持久化存储的交互)成为关键瓶颈,体现在数据集加载、预处理、模型检查点保存以及张量卸载等场景。
核心思想:利用存储领域的最新硬件和软件创新(如高速NVMe SSD、Linux异步I/O栈、NVMe Direct等),在存储和GPU HBM之间构建高效的直接数据通路。
优化成果:
- 在最新的Azure VM上,可实现接近70 GB/s的读取速度和25 GB/s的写入速度,并且I/O性能随NVMe数量增加而线性扩展。
- 应用案例:
- 大模型单GPU推理:通过NVMe卸载,可以在单个GPU上运行原本因内存不足而无法加载的超大模型,适用于基于LoRA的微调后推理,速度提升显著。
- 快速模型检查点:相比PyTorch原生方法,模型检查点保存速度提升高达20倍。

本节课中,我们一起学习了DeepSpeed库如何通过解决GPU内存墙问题(ZeRO、异构内存),为大规模深度学习训练奠定基础。我们还深入探讨了其最新的四大技术方向:
- 通用检查点实现了训练状态与硬件配置的解耦,提升了训练的灵活性和弹性。
- Domino通信隐藏通过计算与通信的重叠,有效降低了分布式训练的通信开销。
- Big Compile编译技术利用自动化编译和性能分析,简化了分布式优化,并显著提升了训练速度。
- Deep NVMe存储优化充分利用高速存储硬件,大幅缓解了训练中的I/O瓶颈。

DeepSpeed是一个充满活力的社区项目,拥有超过400名贡献者,并已加入PyTorch基金会。它始终致力于通过技术创新,降低先进AI模型的使用门槛和成本,推动AI的民主化。我们鼓励大家加入社区,共同构建让最先进的AI技术惠及每个人的未来。
在本节课中,我们将学习 Mamba 模型的核心概念、其相对于传统 Transformer 的优势,以及 IBM 在 PyTorch 生态中为推进 Mamba 模型所做的具体工作。我们将涵盖长序列训练、无填充微调、核心算子支持、专家混合模型和推理优化等关键主题。


上一节我们介绍了课程概述,本节中我们来看看 Mamba 是什么。
Mamba 本质上是标准注意力层的一种替代方案。它具有两个重要特性:
- 训练过程具有高度的序列维度可并行性,类似于 Transformer。
- 推理过程效率更高,速度更快且内存占用更少。
Mamba 是一种现代循环层,可以看作是过去循环神经网络(RNN)的改进版本。它由 Albert Gu 和 Tri Dao 等人提出。其核心思想是:模型扫描并汇总输入序列,逐步构建一个固定大小的内部状态,并利用该状态进行预测。
了解了 Mamba 是什么之后,我们来看看为什么需要引入这种新架构。
在标准 Transformer 推理时,为了避免重复计算,需要构建一个键值(KV)缓存。对于一个 80 亿参数的模型,仅权重就可能占用 16GB 内存,而 KV 缓存可能更大。这个缓存会随着序列长度的增加而增长,这是一个不希望出现的特性。
相比之下,Mamba 在推理时虽然也有缓存,但其大小不随序列长度增长。同时,在推理时无需花费大量时间在 GPU 高带宽内存和芯片内存之间搬运缓存,从而获得了更好的算术强度和 GPU 利用率。
此外,在推理时生成下一个 token 是常数时间操作,只需参考最新生成的状态,无需像 Transformer 那样进行随时间增长的计算。
随着长上下文应用(如处理整个代码库、视频、音频、时间序列数据)变得越来越重要,以及推理模型生成长度不断增加,Mamba 的这些优势显得尤为突出。
在训练阶段,Mamba 也有类似优势。任何涉及生成的训练(如强化学习)都能从上述推理优势中获益。Mamba 在序列维度上可并行化,这是其主要技术创新,使其优于过去的 RNN。训练时的计算复杂度是序列长度的线性函数,不同于注意力的二次复杂度,这对长上下文训练非常有利。
基于以上原因,将 Mamba 层集成到模型中已成为一个非常流行的趋势。
以下是当前一些融合了 Mamba 层的混合模型案例,它们通常不会只使用 Mamba 层,而是与注意力层结合使用:
- BoomBa:这是 IBM 与合作者共同构建的协作模型。在推理时,它比同等规模的 Llama 3 模型快约 2.5 倍,延迟也改善了约 2 倍。理论上,通过完美的工程实现,吞吐量提升可达 5 倍。
- Mamba 2:这是 BoomBa 模型的进一步训练版本。根据某些指标,它在使用更少训练数据的情况下,性能优于 70 亿参数的 Llama 3。
Mamba 作为新技术,其生态系统支持不如传统注意力机制完善。接下来,我们将介绍 IBM 为扩展 Mamba 能力并为其提供高级支持所做的几项关键工作。
长序列处理能力至关重要,我们希望以可扩展的方式训练模型处理超长序列。
实现这一点的根本挑战在于激活内存。这些在反向传播中需要保存的张量会随序列长度增长。可扩展的解决方案是上下文并行。其方法是将长序列在序列维度上分割,分发给不同的 GPU 进行处理。
IBM 基于 Mamba 原始代码库,构建了高性能的上下文并行实现。实验表明,使用 128k 到 200 万长度的序列进行训练时,能够保持良好的吞吐量曲线,并且可以通过增加 GPU 和上下文分片来进一步扩展,没有严格的内存增长限制。
理论上,在完美工程实现下,Mamba 模型在更长上下文下的 tokens/秒/GPU 可以保持恒定。而对于使用全注意力的模型,由于其计算复杂度是二次的,性能会随着序列长度增加而下降。
在监督微调阶段,我们使用高质量数据教导模型遵循指令。我们希望尽可能高效地利用这些数据,避免不同样本之间相互影响。
传统方法是将不同序列批量处理,但这需要添加填充,造成计算和内存的浪费。更好的方法是使用无填充训练,即将样本直接拼接,并通过特殊标记记录边界,同时编写专门的内核以确保不同样本间不会相互关注。
IBM 的工作是将 Mamba 原始代码库中已有的无填充训练能力,集成到 Hugging Face 生态中,使其更易于使用。其改进效果取决于具体的训练设置和数据分布,通常可以看到约 2 倍的效率提升。
在 PyTorch 核心层面,有几项工作旨在为 Mamba 操作提供更好支持:
- 关联扫描算子:Mamba 的核心数学运算是关联扫描。目前其实现依赖于高度优化的 Triton 内核,虽然性能高,但不易修改和实验。一项工作是在 PyTorch 中引入一个原生的关联扫描算子,让开发者能够更容易地重新实现 Mamba、尝试新想法并进行实验。理想目标是拥有一个类似于
scaled_dot_product_attention的原语。 - DTensor API 支持:DTensor 是 PyTorch 原生的张量分片 API。为了让 Mamba 模型中的操作(如扫描和序列维度上的卷积)在分片张量上能获得一流支持,需要进行特殊的调度逻辑开发。IBM 正在为此贡献力量。
专家混合模型用多个 MLP“专家”层替代单一的 MLP 层。为了有效训练这些模型,一种方法是将不同专家放置在不同的 GPU 上,然后通过通信协调计算。
IBM 正在 Mamba 代码库中致力于为此类分片设置提供一流支持,使训练 MoE 模型变得更加容易。例如,IBM 最近发布了下一代 Granite 4.0 模型的预览版,这是一个融合了 Mamba 层、注意力层和 MoE 的混合模型。
推理优化是一个庞大的主题。IBM 正在 vLLM 等推理引擎中为 BoomBa 及 Mamba 模型提供一流支持。相关工作包括:
- 缓存系统:Mamba 的缓存机制与 Transformer 的 KV 缓存不同,团队正在开发一个灵活的通用解决方案来适配现在及未来的各种缓存需求。
- 分块预填充:这是一种提升 GPU 利用率、节省服务成本的技术。
- 更快的计算内核:持续优化内核,努力将吞吐量从当前的 2.5 倍提升接近理论上的 5 倍。
本节课我们一起学习了 Mamba 模型的基本原理及其在长序列处理和高效推理方面的优势。我们探讨了 IBM 在 PyTorch 生态中为推进 Mamba 模型所做的多项工作,包括实现长序列上下文并行、集成无填充监督微调以提升数据效率、贡献核心 PyTorch 算子以增强灵活性和支持、为专家混合模型提供训练框架,以及在 vLLM 等引擎中优化推理性能。这些努力旨在使 Mamba 这一有前景的架构更强大、更易用,并融入现代大语言模型的开发生态。

在本节课中,我们将学习 Lightning AI 的 CTO Luca Antiga 介绍的 Thunder 项目。这是一个旨在解决现代硬件(如多GPU系统、新型互连架构)上高效运行大型模型所面临挑战的“登月计划”。我们将了解为何传统的一键优化方法不再有效,以及 Thunder 如何通过一个可组合的编译器系统,让研究人员能够以开发者友好的方式,将复杂的性能优化“传递”到他们的模型中。



上一节我们介绍了课程概述,本节中我们来看看当前硬件演进带来的具体挑战。
计算机硬件正在快速演进。例如,一个 ML 72 系统由 144 个高度互连的 GPU 组成。硬件拓扑结构变得非常特定,这意味着为一种架构编写的代码可能无法在另一种上高效运行。为了榨取新硬件的全部性能,开发者需要了解许多底层细节。
以下是开发者必须考虑的几个关键方面:
- 互连拓扑:不同的互连方式(如 NVLink, InfiniBand)需要不同的数据交换策略。
- 内存层级:硬件暴露了多种内存池(如 HBM, SRAM)和访问路径的 API,需要合理利用。
- 新数据类型:硬件支持新的数据类型(如 FP8, INT4),量化模型可以运行得更快。
- 内核融合:将多个连续操作融合成一个内核执行,避免在计算核心和高速内存(HBM)之间频繁搬运数据。
最终,性能来自于你对所有这些层面的控制程度。从你的神经网络模块开始,你需要确保在模型中正确地应用内核融合、混合精度、定制内核以及各种分布式策略(如 3D 并行)。
上一节我们了解了硬件复杂性,本节中我们来看看这对研究者意味着什么,以及 Thunder 提出的解决方案。
作为研究者,你希望专注于模型本身,而不是底层优化。你可能会想:“我有一个模型,在单 GPU 上运行良好,现在只需要‘套上’一些优化就完成了。”这在2019或2020年或许可行,但如今却困难得多。
因为优化不再是简单的函数调用,它们需要深入到模型内部。并且,所需的优化是任务特定(训练/推理)、模型特定(是 Mamba 还是 Transformer?)和硬件特定(运行在 H100 还是 B200?拓扑如何?)的。
我们的答案是正在构建的 Thunder 项目。它是一个开源项目,你可以访问其代码库查看进展。它尚未完全就绪,但正在快速进步。
数据显示,在 H100 上使用 Thunder 可以获得可观的加速。更有趣的是,当硬件升级到 B200 时,未优化代码(Eager模式)本身会变快,但优化与未优化代码之间的性能差距反而会扩大。这证实了之前的观点:新一代硬件需要更精细的控制来释放全部性能,否则就无法物尽其用。
上一节我们介绍了Thunder项目的动机,本节中我们来具体定义Thunder是什么。
我们称 Thunder 为一个“编译器”,但这个术语很宽泛。更准确地说,Thunder 是一个 优化交付系统 。它的目标与 DeepSpeed 等框架类似:你有一个以研究风格编写的模型,Thunder 负责将各种性能优化“交付”到这个模型中。
这些优化包括:
- 替换高性能内核。
- 执行内核融合(
fusion):将多个顺序操作合并为一个内核,减少数据在计算核心和HBM间的搬运。 - 降低内存占用。
- 实现各种并行化策略。



在高层次上,使用 Thunder 类似于理想的“渴望模式”:你编译一个 PyTorch 的 nn.Module,然后可以组合使用一系列插件(即优化变换)。

上一节我们定义了Thunder,本节中我们通过对比工作流程来理解它的价值。
通常,开发者的工作流程(不使用 Thunder)是这样的:
- 模型源码:定义模型是什么(如 Mamba, Vision Model)。
- 手动优化:通过组合使用钩子(hooks)、猴子补丁(monkey-patching)、包装器(wrappers)等技术,使模型支持分布式、混合精度等。
- 执行:发送到执行后端(如 PyTorch Eager, Torch Compile),可能附带一些标志或编译选项。
这个过程需要你反复修改源码,然后测试性能提升。
Thunder 追求的理想工作流程是:
- 模型源码:同样的研究风格模型。
- 获取计算跟踪:Thunder 将模型转换为一个中间表示(IR),即计算跟踪。
- 应用变换:关键的一步。我们将变换(transforms)作为一等公民的 Python 代码。开发者可以编写或使用可组合的变换,对计算跟踪进行修改。
- 执行优化模型:最终得到一个与原始模型计算等价但深度优化过的版本,用于执行。
Thunder 专注于 “如何以开发者友好的方式获取并变换模型的内部表示”。
上一节我们对比了工作流程,本节中我们深入一点,看看Thunder内部是如何运作的。
假设我们有一个简单的模型(例如一个包含线性层、ReLU、线性层的序列)。我们使用 Thunder 编译它,过程与 torch.compile 类似(注:Thunder 并非与 torch.compile 竞争,事实上它在某些环节会使用 torch.compile)。
编译后,我们得到几个函数:一个前奏(prologue)函数将面向对象的模块转换为纯函数形式,一个纯粹的函数化计算跟踪,以及一个尾声(epilogue)函数转换回面向对象的形式。这个计算跟踪就是模型的等效计算图,其中参数形状、类型等信息已被“冻结”。
现在,如果你想添加一个优化,例如 DeepSpeed 的 ZeRO 阶段 0(一种数据并行策略),你需要做什么?你需要在多个环节介入:在将模型移动到设备之前,你需要对模型进行分片,确保每个 GPU 只持有其分片对应的参数,然后再移动到 GPU。这意味着模型的捕获和中间表示必须在“元设备”上完成(即参数的符号表示,而非实际设备)。
Thunder 的变换架构允许你在加载、保存、前向传播、后向传播等阶段注入可组合的变换。
上一节我们了解了变换如何介入,本节中我们看一个具体的例子:组合两种分布式策略。
假设我们想组合两种变换:FSDP(完全分片数据并行)和 DDP(纯数据并行)。为什么需要这样?例如,你的模型可能刚好能放入 2 块 GPU,但你有 4 块 GPU(或两个节点,每个节点 2 块 GPU)。你不想把模型分片到 4 块 GPU 上,因为那样可能浪费。相反,你可以在一个维度上使用 FSDP 分片(比如跨 2 块 GPU),在另一个维度上使用 DDP 仅同步梯度(跨另外 2 块 GPU)。
在 Thunder 中,你可以利用 PyTorch 新引入的 DeviceMesh 概念,将其表达为两个维度的组合。然后,你可以通过组合两个独立的变换(FSDP 变换和 DDP 变换)来实现这一点,它们彼此不知道对方,但知道如何不冲突。

以下是应用变换后计算跟踪可能的样子(简化示意):
GPT plus 代充 只需 145# 原始计算跟踪(部分) def forward(x, weight): a = linear(x, weight) b = relu(a) c = linear(b, weight2) return c # 应用FSDP和DDP变换后(概念性) def forward_sharded(x, weight_shard): # FSDP维度:收集全量参数 weight_full = all_gather(weight_shard, group=fsdp_group) a = linear(x, weight_full) b = relu(a) # DDP维度:同步梯度(在反向传播中体现) c = linear(b, weight2_shard) # weight2 可能在另一个FSDP分片中 return c
你会看到计算图中插入了 all_gather 等同步原语,权重大小等元数据也发生了变化。Thunder 的中间表示不仅是 IR,也是有效的 Python 函数,便于调试和分段执行。
上一节我们通过实例了解了Thunder的威力,本节中我们总结一下它的当前状态和未来方向。
Thunder 的目标是创建一个系统,让我们能够获取模型并对其进行程序变换推理,从而根据具体上下文(模型、硬件、任务)自动化地从非优化状态转换到优化状态。
目前的情况是:
- 模型覆盖:良好且正在改进,目前正专注于 Transformer 模型以确保其完美运行。
- 可组合变换:已有一些,并正在添加更多。项目已进入能够高效驱动变换开发的阶段。
- 执行后端支持:支持多种后端,如 cuDNN、TorchCompile、Transformer Engine 以及自定义内核。
- 尝试使用:如果你尝试使用,体验可能因人而异。如果遇到问题,欢迎提交 Issue,团队非常乐于反馈并正在积极完善。
本节课中我们一起学习了 Lightning AI 的 Thunder 项目。我们认识到,面对现代硬件的复杂性和多样性,传统的“一键优化”方法已不再足够。Thunder 作为一个优化交付系统,通过将变换提升为一等公民,并提供可组合、可调试的中间表示,旨在让研究人员能够以更灵活、更可控的方式,为他们的模型注入所需的性能优化,从而充分利用新一代硬件的强大算力。
在本教程中,我们将探讨为何以及如何通过微调来构建超越通用大模型(如GPT-4)的、专属于你特定任务的AI模型。我们将从动机、方法到实践平台,系统地介绍微调的核心概念。




上一节我们介绍了课程概述,本节中我们来看看微调的核心动机。
通用大模型并非万能。以识别服装图像为例,Fashion MNIST数据集包含鞋子、T恤等物品。




当使用具备多模态能力的GPT-4直接询问“这是什么图像”时,其准确率仅为81%。


然而,一个在机器学习入门课程第一天就能学到的树模型,准确率可达90%,显著优于GPT-4。更进一步,使用ResNet等2015年的先进模型,仅需极少的计算资源(甚至单CPU推理),就能达到95%的准确率,完全超越GPT-4。

这个例子有力地证明:针对特定领域、经过专门优化的模型,其性能可以远超通用大模型。
上一节我们看到了微调带来的性能提升,本节中我们来深入理解其背后的原因。
这种现象在RAG(检索增强生成)领域同样明显。以下是不同任务上嵌入模型的准确率对比:
- 移民法RAG任务:通用嵌入模型准确率约为 49%。
- Web文档检索任务:经过针对性训练的嵌入模型准确率高达 95%。


性能差异巨大的原因在于,后一个模型专门为查找Web文档进行了训练和数据“动员”。这引出了核心观点:你需要为自己的AI解决方案动员(mobilize)专有数据。
公司层面也印证了这一点。例如,Voyage AI公司因其构建微调嵌入模型的能力,被MongoDB以2.2亿美元收购。微调能带来多重收益:
以下是微调的主要优势:
- 领域特定知识:让模型精通你的业务领域。
- 任务特定成功:针对具体任务优化,效果更好。
- 速度与成本:可以做到更快、更便宜,这取决于你选择的微调技术和方案。
上一节我们讨论了微调的理论优势,本节中我们来看一个具体案例。

Databricks公司提供了一个绝佳范例。他们取了一个80亿参数的Llama模型,将其微调用于生成修复代码片段的指令(CodeFix)。
与GPT-4(修复成功率为100%)相比,这个微调后的模型:
- 修复错误的可能性高出 40%。
- 生成令牌的延迟比GPT-4快 2倍以上。
这个案例展示了微调的权衡艺术:你可以选择用更大的模型追求更好的性能,或者像Databricks那样,为了速度而选择较小的模型,同时仍能获得优于GPT-4的结果。这证明了微调是有效的,并且日益成为先进部署解决方案的基础。
上一节我们看到了成功的微调案例,本节中我们来构建更系统的认知。

机器学习始终是关于“用数据取胜”。类比广告系统:Meta(Facebook)绝不会直接用Google的广告平台,因为那样无法构建其核心竞争力。同样,依赖外部通用API无法构建你独特的竞争优势。
机器学习速度本质上等同于你的竞争速度。在微调中,你能让损失函数下降的速度,就是你建立优势的速度。
一个关键洞察是:所有你使用的大模型都经过某种形式的微调(或后训练)。例如,Llama 3.1在15万亿令牌上进行了预训练,但仅在约2500万合成生成的令牌上进行了后训练。这意味着,改变模型行为所需的努力量级(数据量)比从头预训练低了好几个数量级。

虽然2025年从头预训练模型是不明智的,但利用已有模型,仅需几百个标注样本(比预训练数据少1-2个数量级),就能产生针对你用例的新行为。
抽象来看,GPT-4“懂得太多”(写代码、诗歌等),而你通常只需要它精通一件事。你的领域知识和专有数据在这里具有巨大影响力。
上一节我们理解了微调的战略价值,本节中我们系统性地看看有哪些技术方法。
首先,数据来源可分为离线和在线两种,将用户反馈融入系统是传统产品与工程思维的延伸。例如,Character AI早期通过让用户选择低分辨率图片来收集数据;在代码修正中,可以将模型生成的补全与实际成功运行的代码进行对比,生成训练样本。
微调技术多种多样,从全参数微调到更高效的LoRA等方法。关键在于实验速度,你需要有能力尝试不同的技术和数据组合。
需要警惕的是,提示工程(Prompt Engineering)难以扩展。它对于早期探索有帮助,但本质是手动的、脆弱的,并且严重依赖于特定模型版本。它无法像真正的数据系统那样,自动、规模化地将反馈传播到模型中,也无法轻松迁移到下一代模型(如Llama 4)。
一个稳健的微调系统构建流程如下:
- 从现成模型开始。
- 构建鲁棒的评估体系(这是构建自学习系统的P0优先级任务)。
- 建立可重复的离线数据训练循环。
- 建立可重复的在线数据训练循环。
你的数据和系统是永久资产,而非某个模型检查点。这与所有机器学习系统(如推荐系统)一样。只要你在使用开源模型,并拥有评估体系,你就能利用专有数据持续迭代,始终领先于通用技术的最新进展。
上一节我们梳理了方法流程,本节中我们来看看实践中会遇到哪些独特挑战。

从技术上讲,微调本质上就是PyTorch训练。如果你能训练一个PyTorch模型,你就能为你的用例构建一个比GPT-4更好的大语言模型。
然而,大语言模型感觉起来与众不同,其程度类似于机器学习曾经感觉与传统软件不同。主要挑战在于:
- 模型规模:模型权重远大于其他深度学习模型。
- 数据规模:数据集和可训练令牌数量非常庞大。
- 缺乏本地迭代路径:无法像调整网站CSS那样在本地快速迭代训练大模型。传统的“本地开发 -> CI构建 -> 生产部署”的软件开发生命周期(SDLC)循环在此失效。
- 目标指标缺失:许多团队将“上线一个RAG应用或AI智能体”视为终点,而非瞄准某个具体的改进指标(如推荐系统的准确率提升)。没有目标指标,就难以衡量成功和持续优化。
上一节我们指出了大模型微调的特殊性,本节中我们聚焦最关键的瓶颈——实验速度。
主要成本并非金钱(微调一个130亿参数模型仅需几百美元),而在于基础设施和实验速度。
问题在于,许多团队缺乏合适的机器学习平台。虽然Hugging Face Trainer、Accelerate、Lightning等工具让编写训练代码变得简单,但如何进行实验?

- 笔记本(Notebook)开发:无法处理多GPU、多节点场景,且通常不可复现、不可组合、缺乏生产环境容错能力。
- 容器化部署开发:每次代码修改(即使是加一个
print语句)都需要重新构建Docker镜像,通过CI/CD管道部署到Kubernetes集群,耗时从30分钟到3小时不等。这严重拖慢了从数据预处理、分布式训练到推理部署的整个迭代循环。
这导致了实验逃逸速度(Experiment Escape Velocity)问题:由于感知到的启动实验的难度太高,团队根本不愿意尝试,即使他们相信微调能带来价值。
检验一个ML平台好坏的标准是:当你看到一个有趣的开源Repo(如Lightning Thunder),能否直接克隆、稍作修改并运行它,而无需担心底层平台限制?
上一节我们分析了实验速度的瓶颈,本节中我们探讨解决方案的方向。
理想的平台应该提供抽象,让开发者无需关心底层分布式计算的复杂性。这类似于Snowflake在数据领域的革命:无论查询10行还是10亿行数据,你只需写SELECT COUNT(*) FROM my_table,Snowflake会自动处理分布式计算。
我们需要为ML/AI构建类似的平台,实现交互式实验的快速迭代,以突破提示工程的瓶颈,真正释放数据的力量。无论你使用Runhouse的Cubetorch还是其他平台,关键在于找到一种方法,能让你在Kubernetes等生产级基础设施上快速进行交互式实验。
在本节课中,我们一起学习了为何以及如何通过微调构建超越通用大模型的专属AI。以下是核心要点与行动指南:
- 始终从评估开始:没有评估,就无法优化。建立鲁棒的评估体系是第一步。
- 动员数据是魔法:你的专有数据和反馈循环是构建持续竞争优势的核心。
- 你需要一个平台:选择一个能支持快速交互式实验的ML平台,这是突破实验速度瓶颈、实现从提示工程到真正微调跨越的关键。
具体的实践步骤可以包括:
- 继续预训练(Continued Pretraining)。
- 生成响应并蒸馏模型到更小尺寸。
- 创建数百个高质量标注样本的数据集。
- 使用大语言模型作为评判员(LLM-as-a-Judge)来引导数据获取过程。
- 深思熟虑地利用你的反馈响应。
最终,AI/ML平台的速度就等同于你业务迭代的速度。构建一个统一的、高效的平台来支持你的AI应用微调,是成功的关键。
在本课程中,我们将学习如何为多语言大模型(LLM)选择和运行评估基准,并了解创建新基准时的关键考量。这些实践对于所有语言都至关重要,尤其是在基准稀缺的低资源语言场景中,每个基准的选择都显得尤为重要。
上一节我们概述了课程目标,本节中我们来看看如何为你的目标语言或任务选择合适的评估基准。以下是选择基准时需要遵循的五个核心原则。
1. 选择难度合适的任务
许多覆盖多语言的现有基准对于当前强大的模型来说过于简单。例如,SIF 200(一个涵盖200种语言的主题分类任务)已无法有效区分最新的大型模型。另一个例子是 MultiLing,它评估模型为语法正确的句子分配更高概率的能力,其公式可表示为:P(grammatical) > P(ungrammatical)。然而,即使是像 Llama 3 8B 这样的模型在该基准上的表现也已接近饱和(例如,在高资源语言上达到95-97%的准确率),使其区分能力有限。
2. 避免使用机器翻译的基准
尤其是那些未经语言专家验证的机器翻译基准。机器翻译会引入噪声,干扰我们通过基准准确评估模型真实能力的最终目标。以 EU 21 基准为例,它将多项任务从英语机器翻译成21种欧洲语言。模型在右侧语言上的性能下降,不仅与各语言的训练数据量相关,也与用于翻译该语言的机器翻译系统本身的质量紧密耦合。这使得我们难以判断性能差异是源于模型能力,还是翻译系统的缺陷。
3. 避免使用与人类偏好不相关的自动评估指标
对于摘要生成等开放式任务,常使用 ROUGE、BERTScore 或 LLM 即评委 等方法进行评估。但这些自动指标和LLM评委需要在每种语言中进行广泛评估和校准。研究发现,在英语、中文和印尼语中,这些自动指标与人类偏好的相关性较差。例如,LLM评委可能能生成流畅的韩语文本,却无法识别文化表述不当的情况。
4. 基准应具有文化适应性并针对目标语言进行本地化
本地化的基准与人类判断有更高的相关性。这意味着不仅仅是翻译,还要进行文化适配。例如,法律类基准应适配特定国家的法律。优秀的例子包括针对中文和韩语的 CMMLU 和 KMMLU,以及 Cohere 发布的包含文化特异性子集的 Global MMLU。
5. 使用与人类判断相关的任务和指标
某些任务可能更能预测模型在“聊天机器人竞技场”等场景中的通用表现。一项研究发现,多语言小学数学 基准比 MMLU 更能预测人类偏好。在缺乏数据的情况下,选择与你的预期用例最匹配的基准是明智之举。多语言小学数学 基准较好地满足了上述多项原则,尽管其语言覆盖范围相对较窄。

目前不存在一个能覆盖大量语言且完全符合所有**实践的“完美”基准。因此,在实践中需要根据目标语言和具体任务,在这些原则之间进行权衡。
在选择了合适的基准后,如何运行评估以确保结果公平、可靠同样关键。本节我们将探讨评估执行阶段的**实践。
使用置信区间或标准误
评估设置中必须包含不确定性度量。下图展示了仅进行一次评估运行与进行超过10次运行并计算置信区间结果的对比。后者能提供更可靠的模型性能比较,可能影响你选择性价比更高的模型(如 GPT-4 Turbo)的决策。

确保使用一致且可复现的实现方式
我们发现,即使是提示词中空格的微小变化,也可能显著改变基准分数。好消息是,LM 评估工具 可以很好地解决这些问题。它支持众多基准,能自动计算标准误,并采用可复现的评估策略。你通常只需运行一行代码即可开始评估。
# 使用 LM 评估工具运行评估的示例 from lm_eval import evaluator results = evaluator.simple_evaluate( model="your_model", tasks=["your_benchmark"], num_fewshot=0 )

按语言拆解并报告结果
在多语言场景中,仅报告所有语言的平均准确率会掩盖重要信息。必须按语言拆解结果以了解性能分布。例如,两个模型集合(如 Llama 70B 和 Goldfish 模型)可能平均分相似,但 Llama 在某些语言上的分数明显偏低。查看全部分布有助于识别模型的薄弱环节。

最后,如果我们想要创建新的多语言评估基准,应该考虑哪些方面?
我们将牢记上述所有**实践:聚焦合适的任务难度、如需翻译则使用专家翻译并进行本地化、寻求社区偏好验证等。主要目标是改善语言代表性,特别是关注那些基准稀缺的“长尾”语言。我们计划通过大型国际协作来实现这一目标,汇聚来自不同语言社区和用例的专家。目前,Aluther 社区正在开发一个多语言、自然主义的开放式问答基准,并欢迎合作者加入。
本节课中我们一起学习了评估多语言大模型的全流程**实践:
- 选择基准时,需关注难度、避免机器翻译、确保文化适应性、选用相关性高的指标。
- 运行评估时,要使用置信区间、保证可复现性,并务必按语言拆解结果。
- 创建新基准时,应以改善语言覆盖为核心,并通过广泛合作确保质量。
所有讨论的建议都总结在这篇 博客文章 中。如果您对参与多语言基准开发感兴趣,欢迎通过此 Discord 链接 加入 Aluther 社区进行交流。
在本节课中,我们将学习Kyutai实验室在开源多模态大语言模型方面的实践。我们将了解他们发布的不同模型、面临的工程挑战,以及一个能显著提升推理性能的关键技巧。
Kyutai是一家位于巴黎的非营利研究实验室,成立约一年半。其目标是进行开放科学与开源研究。实验室初期重点围绕多模态大语言模型,但也对任何具有巨大下游应用潜力的核心机器学习研究感兴趣。团队从最初的6人发展到超过20人,包括研究员、工程师、博士后和博士生。实验室的使命之一是培养下一代科学家,并认为让他们尽早接触工业级的训练能力是最有效的方式。
我们认为开源主要有三个动机。
首先是科学层面。科学的一个支柱是可复现性。我们需要能够对现有方法进行公平比较,但如果只能信任在不一定完全了解的条件下获得的数字,这会很困难。通过开源模型,可以真正理解或复现达到特定性能的工作,测试其在新应用中的表现,从而衡量有意义的进展。我们开源的模型也可以作为研究项目的基础,无论是直接作为预训练模型、用于微调,还是仅仅作为灵感来源。当然,理想情况是完全开源数据和训练代码,但这在每个项目中都很难实现,且非常耗时。
第二个原因是为了所有AI从业者。我们希望成为开源社区的一部分,帮助其成长,并让人们能够构建很酷的东西。
最后,显然是为了初创公司和企业。作为非营利组织,我们理解训练基础模型极其昂贵,基本上只有资金最雄厚的初创公司才能负担得起训练基础模型,但它们无法覆盖所有可能的应用程序。因此,我们拥有的开源模型越多,就越有可能在可及性、教育、身心健康等领域出现更多优秀的下游应用。


上一节我们讨论了开源的价值,本节中我们来看看Kyutai实验室具体发布了哪些模型。
以下是目前已发布的主要模型:
- Moshi:这是一个全双工的70亿参数语音对话模型。“全双工”意味着模型和用户可以随时说话,没有明确的回合切换,这避免了传统语音交互中的许多问题(如因环境噪音导致的误中断),从而实现非常流畅的对话。目前,这类模型的智能程度可能不如纯文本模型,但这是未来改进的方向。该模型可以在云端L4 GPU上运行,也有量化版本可在最新的Mac Pro等设备上本地运行。开源后,甚至有日本名古屋大学的团队在没有官方微调指南的情况下,成功制作了日语版本。
- Moshi-V:该模型旨在为Moshi增加视觉感知能力,同时保持其实时、低延迟的核心特性。它不仅能描述图像,还能进行通用对话。为了实现轻量化,仅增加了2亿参数,并使用大量图文数据进行训练,其中仅约10%的数据合成了音频(约2万小时)。该模型同样提供在线演示和可在多种推理设置上运行的开源版本。
- ToBe:这是一个支持欧盟24种语言的大型语言模型。在评估方面,团队承认并未完全遵循所有**实践,但使用翻译数据进行了评估,未来会改进。一个有趣的发现是“模型汤”概念的应用:对同一预训练模型在不同数据子集上进行微调,然后平均权重,有时能获得比在所有数据上联合微调更好的模型,组合了不同领域的特定能力。

- DA TO:这是一个完整的从HTML到文本的数据处理管道,用于高质量数据筛选和整理。例如,可以从海量预训练数据中,快速识别出与高质量语料(如维基百科、技术书籍)最相似的数据,并将其组装成子集用于微调。
- EBK:这是一个实时语音翻译模型,支持说话人音色克隆。目前仅支持法语到英语的互译。该模型的一个关键目标是能够在iPhone上实时运行(需要较新型号)。得益于在推理效率上的优化,它也能在单张H100 GPU上实现超过300个批次的并行生成,这对于未来以有限成本在API上部署此类模型很有吸引力。
在介绍了各种模型之后,我们来看看在实现和部署这些模型时遇到的实际工程挑战。
对于我们的大多数模型,我们实际上至少维护着三个实现(有时更多)。第一个是训练实现,即训练代码库。这部分有很多遗留代码,修改时需要非常小心,以免破坏旧的检查点。这是正确的参考实现,通常也是最可靠的。
第二个是Kendle Rust实现。我们的CTO喜欢Rust,但这也确实有优势。在推理场景下,尤其是在本地运行、批大小为1时,Python调度内核的开销与GPU实际运行时间处于同一量级甚至更大,这会导致巨大的延迟。而Rust没有这个缺点,因此我们许多在Web上运行的演示,其后台实际上是通过Rust后端在GPU上运行的。

第三个是Core ML版本,这使我们能够在iPhone和Mac上运行。显然,对于iPhone,我们还需要一个Swift封装。我们当然也需要一个体面的PyTorch版本,因为这是最容易进行修改和实验的。通过一些技巧(稍后讨论),我们成功让PyTorch版本的性能非常接近Rust版本。
最后,对于某些模型,我们可能还会提供基于Hugging Face transformers库的实现,这能极大地扩大模型的受众面。然而,我们不能只依赖这个实现,因为我们需要一个自己能完全控制的实现来使用LoRA等技术,并且维护自己的实现也更方便。
这已经有好几个实现了,我们必须确保它们功能一致,并且都具备相同的特性(如是否支持量化、是否支持设备端、是否支持分块或流式输出、是否及时更新)。这非常困难。以量化为例,目前仍然非常混乱,有太多不兼容的格式和检查点表示方法。我们正在尽力让模型能在所有地方运行。
面对多后端的挑战,一个核心目标是提升推理效率。本节将介绍一个在推理代码中非常有效的技巧。
我最喜欢的两个推理技巧之一是CUDAGraph。正如之前所说,如果用Python调度内核,速度太慢。虽然可以使用torch.compile或其他工具,但torch.compile不一定能捕获所有内核,行为可能随版本变化,而且得到的追踪错误信息往往晦涩难懂。
相比之下,CUDAGraph的推理逻辑更简单,运行速度极快,并且基本上消除了所有调度开销。它不做的只是图捕获。需要注意的是,你必须小心处理任何已分配的张量。假设你有一个模型的前向传播函数,你对其使用CUDAGraph。任何在前向传播函数内部分配并会在函数结束时消失的张量都不需要担心。但如果你有任何外部状态(如键值缓存,甚至是模型的输入和输出张量),这些张量需要保持不变。
一旦遵守这个规则,操作就很简单了:你捕获图,它会按顺序运行你的代码并记录下来。它会保持你的输入张量处于已分配状态。下次你想运行模型时,你只需将新输入复制到之前分配的输入张量中,然后调度运行CUDAGraph,结果就会输出到之前分配的输出张量里。
以下是一个简化的示例代码,展示了如何使用CUDAGraph包装一个前向传播函数:
GPT plus 代充 只需 145import torch def make_cuda_graph_module(module, example_inputs): # 为输入和输出创建静态张量 static_inputs = [inp.clone().to(device='cuda') for inp in example_inputs] # 预热运行 with torch.no_grad(): _ = module(*static_inputs) torch.cuda.synchronize() # 捕获图 graph = torch.cuda.CUDAGraph() with torch.cuda.graph(graph): static_outputs = module(*static_inputs) # 定义包装函数 def run(*new_inputs): # 将新数据复制到静态输入张量中 for static_inp, new_inp in zip(static_inputs, new_inputs): static_inp.copy_(new_inp) graph.replay() # 重放图 return static_outputs return run # 使用示例 graph_module = make_cuda_graph_module(my_model, example_inputs) output = graph_module(*actual_inputs)
通过使用CUDAGraph,你可以看到GPU的利用率曲线变得非常干净,GPU能尽可能快地获得工作负载。我强烈推荐使用它,它总能带来巨大的性能提升。



本节课中,我们一起学习了Kyutai实验室在开源多模态模型方面的实践。我们了解了他们开源模型的动机(促进科学、赋能开发者、助力企业),回顾了包括Moshi语音模型、Moshi-V多模态模型、ToBe多语言模型等在内的主要成果。我们还探讨了维护多版本实现(训练、Rust推理、CoreML、PyTorch)所带来的工程挑战,并学习了一个能极大提升推理效率的关键优化技巧——使用CUDAGraph来消除Python调度开销,实现极低延迟的模型运行。Kyutai实验室表示将继续发布更多模型,并希望在未来能开源更多完整的训练代码库,以更好地回馈社区。

在本节课中,我们将跟随Hugging Face的Pablo Montalvo,回顾Transformers库如何从早期框架混战中脱颖而出,并了解其核心设计理念、近期重要特性以及未来的发展方向。我们将重点关注其如何通过模块化、可复现性和生态系统集成来支持现代机器学习模型的快速发展。


上一节我们介绍了课程背景,本节中我们来看看讲者Pablo Montalvo的个人经历。他最初是一名物理学家,大约在2015-2016年左右转向机器学习领域。

当时正处于机器学习框架的“蛮荒时代”,许多框架诞生又消亡。Pablo曾使用过Theano、Caffe等框架。许多开发者从其他框架转向了PyTorch。
上一节我们了解了背景,本节中我们来看看关键转折点。2017年出现了Attention is All You Need论文,2018年BERT模型发布。
当BERT出现后,业界意识到必须将其纳入技术栈,因为它能为推荐系统等产品带来巨大提升。但在当时,部署这些模型非常困难。

一个关键的改变因素是pytorch-pretrained-bert库的出现,这是Transformers库最初的名字。它基于PyTorch的动态计算图特性,并由许多优秀开发者设计,遵循了一些核心范式。
以下是其核心设计理念之一:
- 可 hack 性:开发者需要能够拆解模型,自定义组件,并以自己想要的方式重新定义和训练它。
动态计算图等特性使得开发团队的迭代周期大大缩短,从几小时缩短到几分钟,这并非夸张。但这只有在库的设计遵循特定范式时才可能实现。
上一节我们介绍了可 hack 性,本节中我们来看看另外两个关键范式。Transformers库基于许多范式,其中之一是“一个文件至关重要”。
- 统一文件:模型的所有组件、前向传播、参数加载方式都定义在一个地方,没有复杂的继承关系。这意味着当需要集成新模型时,评审者只需查看差异部分,决策速度更快。
第二个至关重要的范式是向后兼容性。为了确保结果在10年甚至20年后仍可复现,API一旦确定就几乎不允许更改。这是一个艰难的决定,但它允许模型和功能不断堆叠发展。
这使得Transformers库能够大规模增长,定义越来越多的模型。科学界和公司都能为其贡献代码。这也反过来推动了PyTorch生态系统的演进。
当然,强范式也带来挑战:维护压力大,代码重复度高,并且在一定程度上牺牲了库的“Pythonic”特性。
上一节我们提到了强范式的挑战,本节中我们来看看为应对这些挑战而引入的现代化升级。其中之一是模块化Transformers API。
它允许开发者定义一个不可调用的模块化配置文件。以下是一个真实示例(GLM模型):
# 这是一个概念性示例,展示模块化配置的思想 model_config = { “architecture”: “GLMForCausalLM”, “hidden_act”: “gelu”, # 与LLaMA不同 “attention”: “LlamaAttention”, # 但有细微改动 “mlp”: “GLUMLP”, # 使用GLU结构的MLP }
通过这种方式,模型架构被一次性定义。建模代码变得可运行且自动化。评审者只需关注与现有模型的差异。目前这主要用于重构模型,使其定义更清晰。研究社区也可以利用它快速定义新模型变体。
上一节我们介绍了模块化,本节中我们来看看提升开发效率的工具。由于一切依赖于nn.Module,我们可以追踪流经模型的每一个激活值。
这有助于确保复现性,避免在实现模型时错误地修改了激活函数。实现方式非常简单:
GPT plus 代充 只需 145# 伪代码,展示追踪思想 tracer = ActivationTracer(model) output, traced_activations = tracer(input) # 将 traced_activations 与参考值对比
这是一个简单的调试工具,但在集成复杂模型时非常有用。
上一节我们介绍了调试工具,本节中我们来看看性能优化特性。分布式张量(DistributedTensor)支持张量并行。
以前,为了跨设备进行线性投影等操作,需要修改建模代码。现在,只需在模型配置中通过正则表达式指定张量并行方案:
{ “tensor_parallelism”: {“pattern”: “layerwise”, “size”: 2} }
建模代码的架构骨架无需改变,改变的只是配置类型。系统会自动处理初始化和分发。例如,一个100B参数的模型可以分布在多个GPU上。
另一个改进是智能缓存分配器。在加载大模型时,它能最小化内存分配操作次数。例如,加载50B或100B参数的模型现在可以在约1分钟内完成,而之前可能需要8分钟。
上一节我们讨论了性能,本节中我们来看看底层生态。Transformers的成功部分得益于Python的低入门门槛、可读性和高级抽象能力。开发者可以先用Python实现想法,再依赖底层扩展(如C++内核)进行加速。
但Python速度相对较慢,且来自研究实验室的代码通常不是生产级别的。为了优化,Transformers库推出了 Kernel Community 计划。
其思想是,例如,一个激活函数可以从 kernels/activation 仓库获取,并通过装饰器应用到运行代码中。建模代码依然不变,但利用了优化后的内核。这允许内核开发者构建并上传优化内核到Hub,供整个社区使用。
上一节我们聚焦于文本模型,本节中我们来看看更广阔的应用。Transformers库不仅支持密集文本模型,也支持图像、视频、音频等多种模态。
其API对所有模态保持一致。越来越多的模型被集成进来,得益于PyTorch、TorchVision和TorchAudio等库,处理速度得到了大幅提升。例如,使用TorchVision后端处理单张图像比使用PIL更快。
以下是Transformers库中按模态统计的模型贡献趋势图(概念描述):文本模型(蓝色)占据主导但增长平稳,图像模型(红色)增长迅速,音频和视频模型也在稳步增加。目前已有超过300种架构得到支持,且每周都有新模型加入。
当一个新模型被集成到Transformers库后,游戏才刚刚开始。它使得该模型能够被生态系统中的其他成员轻松复用。
例如,vLLM 以其极快的推理速度闻名。开发者可以用Transformers库快速原型设计,然后通过指定后端为vLLM,轻松切换到生产级推理。理论上,所有在Transformers中可用的模型都能在vLLM中得到支持。

同样的情况也适用于其他推理库,如TGI(Text Generation Inference)。因此,Transformers库正在成为整个生态系统的后端模型定义中心。

本节课中,我们一起学习了Hugging Face Transformers库的发展历程。
我们回顾了它如何通过可 hack 性、统一文件和向后兼容性等核心范式,在早期框架竞争中胜出,并极大地缩短了模型开发迭代周期。
接着,我们探讨了其为适应现代模型爆炸式增长而引入的现代化特性:模块化Transformers API 提升了代码清晰度和复用性;激活追踪和分布式张量增强了调试能力和训练/推理效率;智能缓存分配器大幅优化了大模型加载速度。
我们还了解了其如何依托 Python生态 和 Kernel社区 来平衡易用性与性能。最后,我们看到了Transformers库对多模态模型的广泛支持,以及它如何作为后端模型定义中心,与vLLM、TGI等高性能推理库深度集成,推动整个开源机器学习生态系统的发展。
展望未来,Transformers库的目标是继续巩固其作为模型架构“唯一事实来源”的地位,确保新的模型研究能够以最快速度被整个社区应用和优化。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/249573.html