#LivePortrait

快手开源LivePortrait,GitHub 6.6K Star,实现表情姿态极速迁移

近日,快手可灵大模型团队开源了名为LivePortrait的可控人像视频生成框架,该框架能够准确、实时地将驱动视频的表情、姿态迁移到静态或动态人像视频上,生成极具表现力的视频结果。如下动图所示:

51c大模型~合集3_语言模型

 来自网友测试LivePortrait

51c大模型~合集3_数据集_02

来自网友测试LivePortrait

快手开源的LivePortrait对应的论文题目为:

《 LivePortrait: Efficient Portrait Animation with Stitching and Retargeting Control 》

51c大模型~合集3_数据集_03

LivePortrait论文首页

并且,LivePortrait发布即可用,秉承快手风格,论文、主页、代码一键三连。LivePortrait一经开源,就得到了HuggingFace首席执行官Clément Delangue的关注转发,首席战略官 Thomas Wolf还亲自体验了功能,厉害了!

51c大模型~合集3_重定向_04

并引起了全世界网友的大规模评测

视频剪辑素材均来自X

同时,LivePotrait获得了开源社区的广泛关注,短短一周多时间左右,在GitHub上总计收获了6.4K Stars,550 Forks,140 Issues&PRs,获得广泛好评,关注仍在持续增长中:

51c大模型~合集3_重定向_05

此外,HuggingFace Space、Papers with code趋势榜连续一周榜一,近日登顶HuggingFace所有主题排行榜榜一

更多资源信息,可以查看:

  • 代码地址:https://github.com/KwaiVGI/LivePortrait
  • 论文链接:https://arxiv.org/abs/2407.03168
  • 项目主页:https://liveportrait.github.io/
  • HuggingFace Space一键在线体验:https://huggingface.co/spaces/KwaiVGI/LivePortrait

LivePortrait到底用了什么样的技术,能够在全网快速"走红"呢?

方法介绍

和当前主流基于扩散模型的方法不同,LivePortrait探索并拓展了基于隐式关键点框架的潜力,从而平衡了模型计算效率和可控性。LivePortrait聚焦于更好的泛化性,可控性和实用的效率。为了提升生成能力和可控性,LivePortrait采用69M高质量训练帧,视频-图片混合训练策略,升级网络结构,并设计了更好的动作建模和优化方式。此外,LivePortrait将隐式关键点看成一种面部混合变形 (Blendshape) 的有效隐式表示,并基于此精心提出了贴合 (stitching) 和重定向 (retargeting) 模块。这两个模块为轻量MLP网络,因此在提升可控性的同时,计算成本可以忽略。即使是和一些已有的基于扩散模型的方法比较,LivePortrait依旧很能打。同时,在RTX4090 GPU上,LivePortrait的单帧生成速度能够达到12.8ms,若经过进一步优化,如TensorRT,预计能达10ms以内!

LivePortrait的模型训练分为两阶段。第一阶段为基础模型训练,第二阶段为贴合和重定向模块训练。

第一阶段基础模型训练

51c大模型~合集3_语言模型_06

第一阶段基础模型训练

在第一阶段模型训练中,LivePortrait对基于隐式点的框架,如Face Vid2vid[1],做了一系列改进,包括:

高质量训练数据收集:LivePortrait采用了公开视频数据集Voxceleb[2],MEAD[3],RAVDESS [4]和风格化图片数据集AAHQ[5]。此外,还使用了大规模4K分辨率的人像视频,包含不同的表情和姿态,200余小时的说话人像视频,一个私有的数据集LightStage[6],以及一些风格化的视频和图片。LivePortrait将长视频分割成少于30秒的片段,并确保每个片段只包含一个人。为了保证训练数据的质量,LivePortrait使用快手自研的KVQ[7](快手自研的视频质量评估方法,能够综合感知视频的质量、内容、场景、美学、编码、音频等特征,执行多维度评价)来过滤低质量的视频片段。总训练数据有69M视频,包含18.9K身份和60K静态风格化人像。

视频-图像混合训练:仅使用真人人像视频训练的模型对于真人人像表现良好,但对风格化人像(例如动漫)的泛化能力不足。风格化的人像视频是较为稀有的,LivePortrait从不到100个身份中收集了仅约1.3K视频片段。相比之下,高质量的风格化人像图片更为丰富,LivePortrait收集了大约60K身份互异的图片,提供多样身份信息。为了利用这两种数据类型,LivePortrait将每张图片视为一帧视频片段,并同时在视频和图片上训练模型。这种混合训练提升了模型的泛化能力。

升级的网络结构:LivePortrait将规范隐式关键点估计网络 (L),头部姿态估计网络 (H) 和表情变形估计网络 (Δ) 统一为了一个单一模型 (M),并采用ConvNeXt-V2-Tiny[8]为其结构,从而直接估计输入图片的规范隐式关键点,头部姿态和表情变形。此外,受到face vid2vid相关工作启发,LivePortrait采用效果更优的SPADE[9]的解码器作为生成器 (G)。隐式特征 (fs) 在变形后被细致地输入SPADE解码器,其中隐式特征的每个通道作为语义图来生成驱动后的图片。为了提升效率,LivePortrait还插入PixelShuffle[10]层作为 (G) 的最后一层,从而将分辨率由256提升为512。

更灵活的动作变换建模:原始隐式关键点的计算建模方式忽视了缩放系数,导致该缩放容易被学到表情系数里,使得训练难度变大。为了解决这个问题,LivePortrait在建模中引入了缩放因子。LivePortrait发现缩放正则投影会导致过于灵活的可学习表情系数,造成跨身份驱动时的纹理粘连。因此LivePortrait采用的变换是一种灵活性和驱动性之间的折衷。

关键点引导的隐式关键点优化:原始的隐式点框架似乎缺少生动驱动面部表情的能力,例如眨眼和眼球运动。具体来说,驱动结果中人像的眼球方向和头部朝向往往保持平行。LivePortrait将这些限制归因于无监督学习细微面部表情的困难。为了解决这个问题,LivePortrait引入了2D关键点来捕捉微表情,用关键点引导的损失 (Lguide)作为隐式关键点优化的引导。

级联损失函数:LivePortrait采用了face vid2vid的隐式关键点不变损失 (LE),关键点先验损失 (LL),头部姿态损失 (LH) 和变形先验损失 (LΔ)。为了进一步提升纹理质量,LivePortrait采用了感知和GAN损失,不仅对输入图的全局领域,面部和嘴部的局部领域也施加了这些损失,记为级联感知损失 (LP,cascade) 和级联GAN损失 (LG,cascade) 。面部和嘴部区域由2D语义关键点定义。LivePortrait也采用了人脸身份损失 (Lfaceid) 来保留参考图片的身份。

第一阶段的所有模块为从头训练,总的训练优化函数 (Lbase) 为以上损失项的加权和。

第二阶段贴合和重定向模块训练

LivePortrait将隐式关键点可以看成一种隐式混合变形,并发现这种组合只需借助一个轻量的MLP便可被较好地学习,计算消耗可忽略。考虑到实际需求,LivePortrait设计了一个贴合模块、眼部重定向模块和嘴部重定向模块。当参考人像被裁切时,驱动后的人像会从裁图空间被反贴回原始图像空间,贴合模块的加入是为了避免反贴过程中出现像素错位,比如肩膀区域。由此,LivePortrait能对更大的图片尺寸或多人合照进行动作驱动。眼部重定向模块旨在解决跨身份驱动时眼睛闭合不完全的问题,尤其是当眼睛小的人像驱动眼睛大的人像时。嘴部重定向模块的设计思想类似于眼部重定向模块,它通过将参考图片的嘴部驱动为闭合状态来规范输入,从而更好地进行驱动。

51c大模型~合集3_重定向_07

第二阶段模型训练:贴合和重定向模块训练

贴合模块:在训练过程中,贴合模块 (S) 的输入为参考图的隐式关键点 (xs) 和另一身份驱动帧的隐式关键点 (xd),并估计驱动隐式关键点 (xd) 的表情变化量  (Δst)。可以看到,和第一阶段不同,LivePortrait采用跨身份的动作替代同身份的动作来增加训练难度,旨在使贴合模块具有更好的泛化性。接着,驱动隐式关键点 (xd) 被更新,对应的驱动输出为 (Ip,st) 。LivePortrait在这一阶段也同时输出自重建图片 (Ip,recon)。最后,贴合模块的损失函数 (Lst) 计算两者肩膀区域的像素一致损失以及贴合变化量的正则损失。

眼部和嘴部重定向模块:眼部重定向模块 (Reyes) 的输入为参考图隐式关键点 (xs),参考图眼部张开条件元组和一个随机的驱动眼部张开系数,由此估计驱动关键点的变形变化量 (Δeyes)。眼部张开条件元组表示眼部张开比例,越大表示眼部张开程度越大。类似的,嘴部重定向模块 (Rlip) 的输入为参考图隐式关键点 (xs),参考图嘴部张开条件系数和一个随机的驱动嘴部张开系数,并由此估计驱动关键点的变化量  (Δlip)。接着,驱动关键点 (xd) 分别被眼部和嘴部对应的变形变化量更新,对应的驱动输出为 (Ip,eyes) 和 (Ip,lip) 。最后,眼部和嘴部重定向模块的目标函数分别为 (Leyes) 和  (Llip),分别计算眼部和嘴部区域的像素一致性损失,眼部和嘴部变化量的正则损失,以及随机驱动系数与驱动输出的张开条件系数之间的损失。眼部和嘴部的变化量 (Δeyes) 和 (Δlip) 是相互独立的,因此在推理阶段,它们可以被线性相加并更新驱动隐式关键点。

实验对比

51c大模型~合集3_重定向_08

51c大模型~合集3_数据集_09

同身份驱动:由如上同身份驱动对比结果可见,与已有的非扩散模型方法和基于扩散模型的方法相比,LivePortrait具有较好的生成质量和驱动精确度,可以捕捉驱动帧的眼部和嘴部细微表情,同时保有参考图片的纹理和身份。即使在较大的头部姿态下,LivePortrait也有较稳定的表现。

51c大模型~合集3_语言模型_10

51c大模型~合集3_重定向_11

跨身份驱动:由如上跨身份驱动对比结果可见,与已有的方法相比,LivePortrait可以准确地继承驱动视频中细微的眼部和嘴部动作,同时在姿态较大时也比较稳定。LivePortrait在生成质量上略弱于基于扩散模型的方法AniPortrait[11],但与后者相比,LivePortrait具有极快的推理效率且需要较少的FLOPs。

拓展

多人驱动:得益于LivePortrait的贴合模块,对于多人合照,LivePortrait可以用指定驱动视频对指定人脸进行驱动,从而实现多人合照驱动,拓宽了LivePortrait的实际应用。

动物驱动:LivePortrait不仅对人像具有良好的泛化性,当在动物数据集上微调后,对动物肖像也可进行精准驱动。 

人像视频编辑:除了人像照片,给定一段人像视频,比如舞蹈视频,LivePortrait可以用驱动视频对头部区域进行动作编辑。得益于贴合模块,LivePortrait可以精准地编辑头部区域的动作,如表情、姿态等,而不影响非头部区域的画面。

0:1落地与展望

LivePortrait的相关技术点,已在快手的诸多业务完成落地,包括快手魔表、快手私信、快影的AI表情玩法、快手直播、以及快手孵化的面向年轻人的噗叽APP等,并将探索新的落地方式,持续为用户创造价值。此外,LivePortrait会基于可灵基础模型,进一步探索多模态驱动的人像视频生成,追求更高品质的效果。



#Mistral AI两连发

7B数学推理专用、Mamba2架构代码大模型


网友很好奇,Mathstral能不能搞定「9.11和9.9谁大」这一问题。

昨天,AI圈竟然被「9.11和9.9谁大」这样简单的问题攻陷了,包括OpenAI GPT-4o、Google Gemini等在内的大语言模型都翻了车。

这让我们看到,大语言模型在处理一些数字问题时并不能像人类那样理解并给出正确的答案。

对于数字以及复杂的数学问题,专用模型更术业有专攻。

今天,法国大模型独角兽 Mistral AI 发布了一个专注于数学推理和科学发现的7B大模型「Mathstral」,来解决需要复杂、多步骤逻辑推理的高级数学问题。

该模型基于 Mistral 7B 构建,支持的上下文窗口长度为32k,遵循的开源协议为Apache 2.0 license。

Mathstral在构建时追求出色的性能与速度权衡,这是 Mistral AI积极推广的一种开发理念,尤其是微调功能。

同时,Mathstral是一个指令型模型,可以使用它或者对它进行微调。模型权重已经放在了HuggingFace上。

  • 模型权重:https://huggingface.co/mistralai/mathstral-7B-v0.1

下图为 Mathstral 7B和Mistral 7B之间的MMLU性能差异(按学科划分)。

Mathstral在各种行业标准基准上都达到其规模范围内的 SOTA 推理性能。尤其是在MATH数据集上,它取得了 56.6%的通过率,在MMLU上取得了63.47%的通过率。

51c大模型~合集3_语言模型_12

同时,Mathstral在MATH上的通过率(56.6%)比 Minerva 540B 高出 20% 以上。此外,Mathstral 在MATH 上以多数投票@64的成绩得分为68.4%,使用奖励模型的成绩为 74.6%。

51c大模型~合集3_语言模型_13

这一成绩也让网友好奇,Mathstral能不能搞定「9.11和9.9谁大」这一问题。

代码大模型:Codestral Mamba

  • 模型权重:https://huggingface.co/mistralai/mamba-codestral-7B-v0.1

与Mathstral 7B一同发布的,还有一款专门用于代码生成的Codestral Mamba模型,使用的是Mamba2架构,同样遵循Apache 2.0 license开源协议。这是一个指导模型,有70多亿参数,研究者可以免费使用、修改和分发。

值得一提的是,Codestral Mamba是在Mamba作者Albert Gu、Tri Dao帮助下设计完成的。

一直以来,Transformer 架构撑起了AI领域的半壁江山,然而,与 Transformer 不同的是,Mamba 模型具有线性时间推理优势,并且理论上能够对无限长度的序列进行建模。该架构允许用户广泛地与模型互动,并且响应迅速,而不受输入长度的限制。这种效率对于代码生成尤其重要 。

在基准测试中,Codestral Mamba 在 HumanEval 测试中的表现优于竞争对手开源模型 CodeLlama 7B、CodeGemma-1.17B 和 DeepSeek。 

51c大模型~合集3_重定向_14

Mistral 测试了该模型,该模型可以在 Mistral 的 la Plateforme API 上免费使用,可处理多达 256,000 个token的输入——是 OpenAI 的 GPT-4o 的两倍。

随着Codestral Mamba发布,就有网友在 VSCode中用起来了,很是丝滑。

参考链接:

https://mistral.ai/news/mathstral/

https://mistral.ai/news/codestral-mamba/



#EAGLE-2

无损加速最高5x,EAGLE-2让RTX 3060的生成速度超过A100

自回归解码已经成为了大语言模型(LLMs)的事实标准,大语言模型每次前向计算需要访问它全部的参数,但只能得到一个token,导致其生成昂贵且缓慢。

今日,一篇题为《EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees》的论文提出了动态草稿树投机采样,依据草稿模型的置信度动态调整草稿树的结构,最高可以将大语言模型的推理速度提高5倍,同时不改变大语言模型的输出分布,确保无损。

EAGLE-2在多轮对话数据集MT-bench上的加速效果(上图为贪婪生成,下图为采样生成):

51c大模型~合集3_语言模型_15

51c大模型~合集3_语言模型_16

使用EAGLE-2,2张RTX 3060($300)的推理速度可以超过A100($10000)。

背景

投机采样使用一个小的模型快速生成草稿,原始的大语言模型可以通过一次前向计算验证草稿的正确性,将正确的草稿作为输出,从而一次生成多个token,并确保无损。EAGLE是投机采样的一种改进。它在更有规律的特征层面而不是token层面进行自回归,同时输入采样结果(超前一个时间步的token)消除了不确定性,明显提升了草稿模型的准确率。

到目前为止,EAGLE在第三方测试Spec-Bench(https://github.com/hemingkx/Spec-Bench/blob/main/Leaderboard.md)中排名第一。

思路

EAGLE和Medusa等方法使用静态的草稿树,隐式地假设草稿token的接受率和上下文无关,下面是一个简单的例子

51c大模型~合集3_数据集_17

上文是“10+2”时,下一个token难以预测,EAGLE在这个位置添加两个候选token以增加草稿命中率,“10+2=”和“10+2+”有一个正确即可。当上文是“10+2=”时,下一个token明显是“1”,但是EAGLE使用静态的草稿结构,仍然添加两个候选“1”和“3”,“10+2=3”不可能通过大语言模型的检查,存在浪费。EAGLE-2旨在解决这一问题,如下图所示,当上文是“10+2=”时,EAGLE-2只增加一个候选token“1”,将节约出的token用于让草稿树更深,这样“10+2=12”通过大语言模型的检查,EAGLE-2可以一次生成更多的token。

51c大模型~合集3_重定向_18

EAGLE-2的作者们在Alpaca数据集上进行了简单的测试,下图显示了不同位置的草稿token的接受率,左图中的P1-P6代表位置,与右图的横轴坐标对应。实验结果显示,在相同的位置上的草稿token的接受率也有较大的差异,这说明了使用动态草稿树可能取得比静态草稿树更好的效果。


51c大模型~合集3_数据集_19

上述例子中,EAGLE-2根据预测草稿token的难易程度决定草稿树的结构,精确计算难易程度(接受率)需要原始大语言模型的计算结果,这违背了投机采样减少对原始大语言模型访问的初衷。幸运的是,EAGLE的草稿模型的置信度与接受率(难易程度)高度正相关。下图显示了草稿模型不同置信度区间的草稿token的平均接受率,红色虚线连接(0,0)和(1,1)。由此可见,草稿模型的置信度可以作为接受率的有效近似。


51c大模型~合集3_语言模型_20

方法

EAGLE-2包括两个阶段,扩展和重排,扩展阶段加深加大草稿树,重排阶段修剪草稿树,丢弃部分节点(token)。

为了保证无损,一个草稿token被接受的前提是它的祖先节点都被接受,所以EAGLE-2将一个节点的价值定义为它和它祖先的接受率的乘积,用置信度的乘积来近似。

在扩展阶段,EAGLE-2选择草稿树最后一层价值最高的m个节点(token)进行扩展。这些token被送入草稿模型,然后将草稿模型的输出作为子节点连接到输入节点,加深加大草稿树。在重排阶段,EAGLE-2按照价值对整棵草稿树进行重排序,保留前n个节点(token)。草稿token的置信度在0-1之间,两个节点价值相同时优先保留浅层节点,因此重排后保留的草稿树一定是连通的,保证了语义上的连贯性。重排后草稿树变小,降低了原始大语言模型验证的计算量。为了保证计算结果的正确性,还需要调整attention mask,确保每一个token只能看到它的祖先节点,不受其他分支的影响。下面是一个简单的例子。

51c大模型~合集3_数据集_21


扩展(Expand)阶段的黄色框表示被选中进行扩展的节点,绿色框为以这些节点为输入时草稿模型的预测。重排(Rerank)阶段的蓝色框表示被保留的节点,之后它们被展平成一维作为原始大语言模型的输入。EAGLE-2根据树的结构调整attention mask,比如,”a”只能看到它的祖先“It”和“is”,看不到另一个分支的“has”。EAGLE-2也同时调整位置编码,确保和标准自回归解码的一致性。

实验

EAGLE-2在多轮对话、代码、数学推理、指令遵循、问答、总结六项任务上分别使用MT-bench、Humaneval、GSM8K、Alpaca、CNN/DM、Natural Questions数据集进行了实验,与6种先进的投机采样方法(SpS、PLD、Medusa、Lookahead、Hydra、EAGLE)进行了比较。

51c大模型~合集3_重定向_22

51c大模型~合集3_数据集_23

表格中的Speedup为加速比,τ 为平均接受长度,也就是原始大语言模型每次前向计算能生成的token数。EAGLE-2每次前向计算能生成大约4-5个token,而自回归解码每次生成1个token,因此EAGLE-2明显加速了大语言模型的生成,加速比为2.5x-5x。加速比和接受长度在代码生成任务(Humaneval数据集)上最高,这是因为代码中存在大量确定性的模板,草稿更容易命中。在所有任务和大语言模型上,EAGLE-2的加速比和平均接受长度都是最高的,明显优于其他方法。

应用

EAGLE-2也在工业界得到应用,集成至Intel/intel-extension-for-transformers等。



#大模型Infra

本文讨论了大模型训练推理系统软件(俗称大模型Infra)的发展历程,并分享了作者从2019年至2023年对大模型Infra演进的观察和体会。

越来越多人开始关注大模型,很多做工程开发的同学问我怎么入门大模型训练推理系统软件(俗称大模型Infra)。

作为一名曾经后台开发岗位同学,大家的心情我感同身受。近年来国内互联网业务整体低迷,而大模型却在逆势崛起,每天新闻可谓繁花似锦,烈火烹油,和其他子领域形成了鲜明对比。环球同此凉热,2023年硅谷裁了几十万软件工程师,但美国各大厂都在疯狂买GPU高价招人做大模型,这半年的美股靠这波AI的预期再创新高。冷热对比,高下立判,作为计算机从业者肯定都不想错失上车的机会。

但需要提醒大家的是大模型Infra正在从从黄金时代进入白银时代。我21年开始写大模型训练系统,算是周期完整的亲历者,谈谈我这些年观察到大模型Infra经历的几个阶段:

2019-2021,黑铁时代

17年那篇著名的《Attention is All you Need》论文发表,以Transformers为基础零件的不同模型结构接踵而至,Decoder-only的GPT-1(2018)、Encoder-only的Bert(2018),Encoder-Decoder的T5(2019)相继出现,开始在NLP领域大杀四方。互联网企业中的翻译、对话、推荐等应用场景相继被Transformers占领。

顺应潮流,有人开始研究变大Transformers模型。把模型变大在CNN时代是反直觉的,彼时大家正在通过NAS和AutoML等手段千方百计把模型变小,放到汽车、摄像头、手机里。Scaling Law的信徒主要是OpenAI和Google。在18年有用LSTM预测下一token的语言模型ELMo,OpenAI就用Transformers替换LSTM做了GPT-1,在Dota AI积累的哲学开始Scaling,随后就出了GPT-2和GPT-3。Google作为Transformers的策源地,17年就有提出了MoE架构的Transformers,20年已经能搞出用2K TPU训练的600B的大模型GShard,为此开发了基于TensorFlow的分布式训练框架MeshTensor。但和OpenAI不同,Google没有押宝Decoder-only的结构,而是大力发展Encoder-Decoder结构(也是Transformers最早被提出的结构)。DeepMind作为一个隶属Google但相对独立的英国研究机构,此时也有和GPT类似的Decoder结构模型Gopher和Chinchilla。

尽管,20年175B参数GPT-3的few-shot learining能力给业界带来了一些震撼,但国内对大模型技术路线持怀疑态度居多,拥趸寥寥,大部分算法同学对大模型并不感冒。我观察原因来源于两方面。一方面,大多数人没有预训练的sense,当时NLP算法开发范式是搞私有数据+微调Bert,根据小模型时代的经验,应该专注在数据质量,而不是一个更大底座模型,哪怕先把模型变大两倍,也申请很多预算去训模型,ROI存疑。另一方面,Infra没有准备好。训练一个大模型可不是一般人可以玩得起的,现在训模型是算法+工程同学相互配合,那时候没有这种兵种搭配概念,业务团队里只有算法工程师,搞GPU对他们是头疼事情,尤其是上线一个需要两张GPU才能运行的模型,简直是灾难。而隶属于中台部门的Infra团队,又不了解大模型的风向,跨部门的信息是有壁的。

国内最有动力去Scale模型是做算法刷榜的团队,但大多刷榜的模型大多无法逃脱PR(宣传)后束之高阁的命运,不过这个过程锻炼了很多队伍,他们也成为后来ChatGPT爆火之后参与训练国内大模型的主力。

Courtesy to:Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond

彼之砒霜,我之蜜糖。模型变大反而对AI Infra人是新机会。那个时代AI Infra的主旋律应用还是推荐系统,NVIDIA在押宝元宇宙作为新增长点,大模型对Infra同学也是新鲜事物。有OpenAI和Google前面开路,美国有些机构开始了将模型变大的探索性工作,主要是沿着把Encoder结构的Bert变大,不过对于训练来说Encoder和Decoder的差别不大。也正是借着这波机会,大模型训练框架Megatron-LM和DeepSpeed开始有了原型。20年微软搞了17B大Bert的Turing-NLG,其训练代码成为了DeepSpeed的原型。19年,NVIDIA搞了8.3B的Megatron-LM,没错Megatron-LM是一个大Bert的名字,Megatron-LM仓库里也是放训练模型的代码脚本,这些脚本实现了张量并行,后面逐渐发展成了最流行的训练框架。

这一时期,美国大厂训模型主要目的是试试水和秀肌肉,因而DeepSpeed和Megatron-LM最开始就是开源的,这也是一件好事。试想如果大模型出场就是核武器,大家都像22年之后OpenAI那样藏着掖着,Infra技术扩散必然没这么快了。

用大规模GPU训模型,小模型时代的数据并行无法胜任了。一些训练优化的基本概念开始定型,比如ZeRO,张量并行,流水并行,Offloading,混合并行等。这些技术之前也都有前身,比如18年工作混合并行的FlexFlow,流水并行来自给NAS出来的AmoebaNet训练的GPipe,ZeRO是一种Parameter Server特殊形式,等等。只不过这些技术在Transformers架构和高带宽互联网络中被更针对性地优化和适配了。

那个时候国内对大模型这种新鲜事物了解有限。袁老师的Oneflow是非常早就做大模型分布式训练的尝试的,SBP方式做自动化的模型并行理念还是非常超前的,可惜当时国内没有业务需求来支撑他们做PMF。华为的MindSpore也很早做自动并行的尝试。行动比较早团队的还有阿里的M6,智源的GLM和华为的Pangu-alpha。

除了少数大模型Believer,国内大厂对大模型不感冒,各大厂的云/中台团队刚刚完成一轮X minutes训练ImageNet的军备竞赛,还在思索用那么大规模的GPU去训练一个模型有什么商业价值。有一些NLP技术创业公司,技术路线还是是给不同的业务做定制的微调Bert。一些机构的投资人会打电话咨询技术人员,大模型是否是骗局。总体来说,22年之前,大模型对国内来说还是太超前,以至于共识非常薄弱,因此我称之为大模型Infra黑铁时代。

本人在黑铁时代的尾声21年初开始研究大模型训练系统的。在腾讯的WeChat AI,研究氛围比较宽松自由,而且很幸运我的+1和+2Leader都非常的技术远见,在没有落地前景的前提下支持我做这件事情。做大模型训练最大的障碍是计算资源,我当时能访问的GPU硬件主要是单机8卡V100,因此找的切入的方向是设计一个更好CPU-Offloading策略来让低端机器跑大模型,也就是PatrickStar。当时公司内有几个团队尝试联合起来申请几百张卡训模型,因为ROI不明确没有批下来。

2022-2023,黄金年代

经历了黑铁年代储备期之后,以Meta开源OPT-175B模型为标志,22年开始大模型Infra开始迎来黄金年代。

一方面,伴随NVIDIA芯片的计划迭代,一台DGX SuperPOD(2021)已经可以很轻松搞定百亿参数的大模型训练了,NVIDIA为了推这种超级计算机,也把大模型列为一种杀手应用来宣传。除了大模型还真不知道什么应用能把它填满,21年11月腾讯弄了一台SuperPod样机,拉全公司各种Infra团队一起测试两个月,本来列了一个密集测试排期表,最后发现只有我们调PatrickStar的在用机器,后面我们直接独占了全机。

另一方面,有人开始看到大模型的威力了,硅谷春江水暖鸭先知。22年5月份,Meta把OPT-175B的权重开源出来,它是为复现GPT3训练的,用的是PyTorch FairScale,虽然模型效果不敢恭维,但是真的是造福了广大大模型科研人员,做AI Infra的人也终于有一个真实模型可以做实验了。22年6月,HuggingFace也组织三十多个国家机构多国部队,开源出来Bloom-176B模型,用的DeepSpeed框架。

硅谷创业公司中,Character.ai和Anthropic.ai这时已经成立一段时间了,22年伊始,在全国同心抗击口罩之计,国外已经好几路人马在紧锣密鼓训练GPT-3级别的模型。印象比较深的是22年4月份,Transformers论文有两个作者离开Google成立了一个叫Adept.ai的大模型公司(如今刚刚卖身Amazon),用大模型帮人完成复杂任务,他们twitter的demo展示大模型能根据输入文字让Python画出一个柱状图表,我看到之后非常不可思议,那应该是我的ChatGPT时刻,现在再看类似东西已是见怪不怪了。

直到2022年11月,ChatGPT强势出圈,引爆了大模型。这一事件,显著加速了模型变大有价值共识的形成。大模型团队快速聚集了大量人力、物力、财力。大模型Infra也迎来了跨越式发展。

大模发展,训练先行。在训练系统领域,Megatron-LM和DeepSpeed在黄金年代快速迭代。不过说实话,前ChatGPT时代这两个软件质量堪忧,我感觉是处于无架构师状态,疯狂缝合各种research idea,系统bug很多,而且用户接口很不友好。但是,大模型训练框架,先发优势很重要。大家选型时不是考虑好不好用,而是看这个框架之前训出过什么模型。毕竟训练一次,小则几十万,大则几千万美金的投资,稳妥最重要。后ChatGPT时代,由NVIDIA品牌和技术背书的Megatron-LM的优势开始滚雪球般变大,到现在基本被其商业版本Nemo一统江湖。

在技术创新上,也是遍地是黄金。并行策略和算子优化等方面很多机会,比如Sequence Parallelism、Flash Attention之类simple but effective的作品都获得巨大影响力。预训练之后,还有 SFT,RLHF的需求,也训推混合调度和S-LoRA之类工作的诞生。

大模型Infra也深刻影响了上层算法的发展轨迹。比如,很长时间大家不敢增大context length,因为Attention计算中间QK^T矩阵的内存是序列的平方项开销,导致有一段时间Linear Attention,Approximate Attention用精度换长度的研究之风盛行。Memory Efficient Attention工程优化出现之后,最著名的是Flash Attention,直接把内存平方项干没了,大家又回到了老老实实用标准Attention的正轨。

在推理系统领域,大发展的出现比训练晚很多,主要发生在2023年之后。一方面,模型没训练出来,也就没有推理需求。另一方面,Decoder结构没有定于一尊之前,推理加速也没研究到正点上。之前大家都在关注怎么优化Encoder Transformers的推理。怎么做算子融合,怎么消除变长输入的Padding,比较出彩的有字节的Effective Transformers。在Bert时代,用的最多是FasterTransformers(FT),笔者19年的一个项目TurboTransformers正是对标FT。开发FT的是NVIDIA中国团队,(made in China),我是亲眼见证了它从NVIDIA DeepLearning Example一个小角落,逐渐发展壮大,独立成一个单独产品线的。

Bert时代系统优化可以复用到GPT 的 Prefill 阶段,但是还缺少Decoding 阶段关键问题的解决方案。Encoder到Decoder的范式迁移,对训练变化很小,但对推理影响很大。从计算密集问题变成Prefill阶段计算密集,Decoding阶段访存密集的超级复杂的问题。在Bert时代的各种优化都没法用到Decoding阶段里。由于Decoding输出长度是不确定的,导致两个难以解决的关键问题,一、如何动态打Batching,在输出token长度不确定时减少无效的padding计算,二、如何动态分配GPU显存给KVCache且没有内存碎片被浪费。

推理虽然起步晚,但是发展速度要比训练快很多倍。因为,推理资源需求小,门槛低,大家都能参与进来,集思广益,汇聚广大人民群众的智慧,很多问题都会立刻暴露,然后立刻解决。2022年,OSDI论文ORCA提出了Continous Batching,解决了问题一。而就在距离今天exactly一年前的2023年6月,国内绝大多数大模型从业这都不知道Continous Batching。2023年的,SOSP论文Paged Attention解决了问题二。

开源社区发展迅猛,排除Accelerate,DeepSpeed-Inference这些只做计算不做调度的Library,开源领域最早的推理框架是huggingface的TGI(text-generation-inference),最初是给huggingface页面上面host的模型做推理。不过先发优势在推理框架领域失效,一部分原因是此框架用Rust写了调度部分,让大部分人没法参与其中,曲高和寡了。这时候国内其实已经出现了一些不错的开源推理框架,比如上海 AI Lab 的LMDelopyer。

真正的Game Changer是伯克利的vLLM,2023年6月开源出来,以其独创的Paged Attention技术一战成名。这时候刚好各种大模型也都训出了第一个版本,vLLM一下子满足了这波集中上线部署的需求。2023年9月份,NVIDIA推出了TensorRT-LLM,先是定向开源给企业内测,后面又对外开源,也分走了推理一大块蛋糕。2023年初NVIDIA才正式组织力量去发展Decoder模型推理框架,TensorRT-LLM缝合了TensorRT,Triton-server和FT三大王牌产品,足以见得推理需求的收敛其实也是最近一年才形成的。2023年下半年,还有小而美的国产推理框架LightLLM出现,它是纯python的,用triton实现cuda kernel,硅谷一些最新的paper也基于它开发。

有了推理框架,很多实验性工作可以摊开。GPTQ,AWQ等量化方法。投机采样,Medusa等增加Decoding阶段计算访存比,FastGen、ChunkPrefill等Batching调度策略,DistServe、Splitewise等分离式调度策略,更多NPU支持。

训练推理的需求一下子就起来了,吸引很多人才加入大模型Infra领域,大模型Infra领域迎来了一波繁荣,普通人只要学习能力强,就有机会上车,因此我称之为黄金时代。

2024-,白银时代

2024年,尽管大模型百花齐放,但是生产资料向头部集中,从业者阶级固化加剧,大模型Infra进入白银时代。

在经历2023年的FOMO带来疯狂之后,大家开始冷静下来,一些人开始退场,一些人开始扩张。

在预训练领域,GPU资源开始向头部集中。创业公司剩下那么六七家,部分和云厂商抱团。大厂内部也只有一个钦定的团队收走全部GPU做预训练。这个是和小模型时代显著不同的,之前每个业务团队都可以训练自己的模型,都能自己管理一些GPU算力。就好比,原来每个省都自己有一支部队,现在国家只有中央军了。因此,对人才的需求比传统AI业务要少,但是想入行的人极具增多,用人门槛有极具升高。如果不是加入国内那十几个预训练团队,大部分人可能和预训练无缘了。

在微调和推理领域,机会也在收缩。分开源和闭源模型两个方面来看收缩原因。对闭源模型,微调和推理都是还是被预训练团队垄断的,因为几个亿烧出来的模型权重不能外流,只能客户拿数据进驻和被私有化部署。对开源模型,之前大家可能会认为,有了开源模型人人都可以做预训练下游的微调+部署流程。一个反直觉现象,尽管开源大模型数量在增多,能力在增强,但是微调和训练需求在减少。第一,微调的难度其实非常高,没有训模型经验是调不出自己预期的效果的,所以RAG方式大行其道,这只需要调用大模型MaaS API即可。第二,推理也非常卷,集成量化、调度、投机采样每一项技术的最佳实践难度不低。而且现在一些潮流分离式,混部等技术,对工程要求越来越高。一个小团队去搞推理部署反而干不过一些免费的开源MaaS的API,那个后面都有专业人士优化。

综上,大模型是和业务非常解耦的一项技术,更像是云厂商或者芯片。传统后台在线、离线系统,因为很多东西和业务有关,并不是标准件,因此没有做到最佳实践也有存在价值。对于大模型Infra,有开源框架作为一个水位线,the best or nothing,如果做不到最好就没有存在价值。因此,也可以参考芯片产业,资源会集中在少数巨头手中,大部分只能参与更下游的配套,比如RAG,Agent之类的。

综合看来,在白银时代,大模型Infra总体需求在增加,但是有马太效应,“凡有的,还要加给他,叫他有余;凡没有的,连他所有的也要夺去”。胜地不长,盛筵难再,已经上车的可以感受到刺激的推背感,但是没上车的只能干瞪眼。

但白银时代,毕竟也是一种贵金属,还是有很多机会。大模型Infra的盘子还在增大,更多的芯片,更多的新算法创新也在路上,这时候入行,体格强壮的挤一挤还是能上车的。

白银时代一些建议

大家常说七年一个周期,2016年Alpha-Go用深度学习开启了一个周期,到2022年ChatGPT用大模型开启了一个新周期。

很多人现在抱着有超额回报期望来入行大模型Infra,在白银时代这个预期需要降低。能过踩中周期的注定是少数人,因为有分歧才有风险,有风险才有超额收益。现在大模型的共识早就凝聚了,这个领域也注定会供需平衡,变成用市场规律说话。就好比你看买菜大妈就开始买某股票时候,这支股票已经挣不到钱了。

大模型注定会深刻改变我们的世界,但资源和信息向头部集中的趋势非常可怕。一方面,大模型核心技术被一小撮人掌握,比如OpenAI。另一方面,面对巨大信息差和算力差,普通人无法参与到大模型的开发体系中。就像萝卜快跑正在代替网约车司机,AI总有一天会也代替程序员。如何在生产力进步后的世界里找到自己的位置,不要沦为AGI世界的二等公民,是我们每个人焦虑的根源。

让社会不恐惧AI,让社会理性规划和AI融洽相处的未来,一方面要有对巨头有监管,另一方面,让更多人有平等了解大模型技术的机会。这个世界还是很有人在为后者努力,通过代码开源和公开论文,扩散大模型的技术。作为想入行的同学,可以借助开源力量,来让自己和也业界保持同步。这里也有大量还没有解决的技术挑战等待你来解决。另外,像Agent等,多模态,具身智能等技术方向方兴未艾,也可以提前布局下一个时代潮流。

作为大模型Infra从业者,白银时代需要的是苦练基本功。在2023年,有很多人是在用信息差体现自己价值,某件事我知你不知,你试还得花时间,很多人在极度激烈竞争中也原意为信息差知识付费。今年这种机会会大幅减少,大家比拼的就是真本领了,是否能快速follow新技术,是否能独立搞定一个复杂大系统,是否有更大的技术视野和其他合作方对话的能力,这要求不仅了解Infra还解一些算法、云计算的知识,总体来说传统工程师素养变得尤为重要。

本人也一直希望能为民主化AI贡献薄力,我的github签名就是Democratizing LLM。我过去一年在知乎的分享是解读大模型Infra前沿论文为主。进入白银时代,我深切感觉到低垂的果实已经几乎被摘光,现在论文的也不如前两年精彩。之前的论文经常有定义一些LLM关键问题之洞见,比如ZeRO,ORCA和PagedAttention这些,现在的论文则很少有这种眼前一亮的内容的。我计划在未来系统性地分享大模型Infra领域的基础知识,旨在揭示其背后的普适原理,力求让没有没有AI背景的后台开发经验的同学或本科生也能轻松理解。这个想法还不成熟,也欢迎大家给一些建议。



#所有LLM致命缺点曝光

13.8和13.11哪个大?这个问题不光难倒了部分人类,还让一票大模型折戟。AI如今都能做AI奥数题了,但简单的常识问题对它们依然难如登天。其实,无论是比大小,还是卷心菜难题,都揭示了LLM在token预测上的一个重大缺陷。

13.8和13.11哪个大?

这个问题,居然难倒了一票人类。

前两天,某知名综艺再次喜提热搜。

只不过,这次是因为有一堆网友提出质疑,认为13.11%应该比13.8%大。

是只有人类这么蠢吗?

AI2的研究员林禹臣发现这个现象后,用大模型试了一把,结果出人意料——

AI居然也不行?

GPT-4o斩钉截铁地表示:13.11比13.8大。理由如下:

虽然13.8看起来更大,因为它小数点后的数字更少,但13.11实际上更大。这是因为13.8相当于13.80,而13.80小于13.11。

对此,林禹臣po文表示,AI模型在处理复杂问题方面变得越来越强大(比如越来越会做数学奥赛题),但一些常识性问题对于它们来说仍然非常困难。

正如Yejin Choi此前所提出的,AI聪明得令人难以置信,但同时也会蠢得令人震惊。

AI之所以在这个算术题上犯蠢,是因为上下文不清楚的原因吗?答案是否定的。

根据网友karthik的测试,即使要求GPT-4o给两个数做减法,它依然得出了9.11 - 9.9=0.21这样逆天的减法公式。

如果指示GPT-4o用python,它会先给出一个正确答案,然后又改回了之前错误的那个😮。

Python中用9.11减去9.9的结果是-0.79。这一偏差是由于Python中处理浮点运算的方式造成的,这种方式可能导致小的精度误差。实际的预期结果应该是0.21。

有趣的是,根据最新的实测,OpenAI似乎已经连夜教会了GPT-4比大小。

LLM全军覆没

昨天,林禹臣发现的这个问题,立马引起了AI社区的热烈讨论。

Scale AI的提示词工程师Riley Goodside在看到帖子后,也好奇地试了一把。

果然,在以特定方式提问的前提下,各大LLM在这个问题上全军覆没。

「9.11和9.9 - 哪个大?」,GPT-4o直接翻车。

即使在提问中加上「实数」两个字,GPT-4o依然认为9.11比9.9大。

Gemini也是如此。

Claude 3.5 Sonnet也犯了同样的错误。

有趣的是,它先是给出了一波正确解释:在十进制记数法中,小数点后面的数字代表十分位,而第二个数字代表百分位。所以——

9.11=9+1/10+1/100=9.11

9.9=9+9/10=9.90

然而下一步,Sonnet就突然滑坡了😂——

我们可以看到,9.11比9.90大0.01(百分之一)。

如果换成「9.11减去9.9等于几」,则会得出另一个神奇的答案——0.02。

莫非在Claude的眼里,9.90=9.09?🤔

prompt的影响,真的很大

在更进一步的实践中,大家发现:显然,如何让LLM给出正确的答案,prompt很重要。

首先,Riley Goodside全程都在使用的「-」,似乎很容易让LLM陷入混乱。

在类似的问题中,只需换成「:」即可解决。

再比如,把prompt改成「9.11或9.9,两者之间谁的数值最高/最大?」

GPT-4o就给出了逻辑上完全正确的解释:「虽然9.11因小数点后第二位而显得较大,但9.9实际上更接近10,因此是较大的数值。」

同样,人设大法也很好用:比如「你是一个数学家」。

网友Rico Pagliuca则发现,如果把数字放在问题后面,模型就大概率会做对了。

根据自己的测试,Riley Goodside表示十分赞同:提问LLM时,需要首先提问「哪个更大」,再给出具体数字。

而相比之下,标点符号、连词、比较词、说明实数,这些招数统统都没有用。

对于如此大规模的LLM集体犯蠢现象,有网友分析表示,可能是因为在软件版号的迭代中,9.11是在9.9之后的。

主持人、畅销书作家Andrew Mayne也指出,在许多文件系统和参考书中,9.11节都会出现在9.9之后,在日期上,9.11也比9.9大。

所以我们需要在prompt中明确,此处的9.11和9.9都是双精度浮点数,这时GPT-4o就会回答正确了。

随后Andrew Mayne总结道:词序是一个非常有趣的观察结果,很有可能揭示了LLM在训练中遇到这种情况的频率,同时也是一个很好地泛化指标。

总的来说,LLM犯的错误可能源于训练数据中类似表达的频率,以及模型在处理数值时的某些局限性。

这个现象也反映了LLM和人类认知的巨大差异:LLM是基于统计模型和模式识别的,而不是像人类那样基于逻辑推理和概念理解。

到了这里,似乎就破案了。

为什么会这样?剖开LLM大脑

不过,我们还可以更进一步剖开LLM的大脑,分析它们为什么会这么想。

要知道,文本在发送到LLM之前,模型会通过token查看输入。

token在LLM的tokenizer发生器的词汇表中会被分配一个id,不过token的数字分块往往是不一致的。

比如数值「380」在GPT中,会被标记为单个「380」token,但「381」会被表示为两个token「38,1」。

因此,基于GPT的模型往往不擅长数学计算。

在评论区,威斯康星大学教授Dimitris Papailiopoulos指出,这种现象有一个很好的解释。

「9.11>9.9」问题,跟「你需要三趟才能带山羊过河」问题、「2+1=2, 3+2=4, 3+5=8」问题都如出一辙。

这是一种预训练偏差和早期上升的现象。

如果这样提问:「9.11 ??? 9.9,只用大或小回答???是什么就行,无需给出原因」,这时GPT-4o会首先给出一个错误答案——「大」。

这时,我们再给它一些例子(注意,这些例子并非完全正确),经过prompt后的GPT-4o,反而会正确说出???代表着小。

对此,Claude自己的解释是:LLM将文本作为token进行处理,导致数字更像文本字符串而不是数值;训练数据导致的偏差;上下文误解;过度概括,等等。

同样,在「狼-山羊-卷心菜」问题中,所有LLM也都失败了。

他先给出了一个农民带2只鸡过河,一只船只能容纳一个人和2个动物,那么农夫带着两只鸡渡河所需的最少渡河次数是多少?

对此,GPT-4o和Claude都回答失败了。

对此有网友解释说:LLM本身就是个「哑巴」,所以需要很好的提示。上面的提示方式提供了太多不必要的信息,使得token预测变得更加困难。

如果给出更清晰的提示,LLM就能提供更清晰的解决方案。

事实果然如此。

而且如果用「动物」代替「鸡」,那么Claude 3.5 Sonnet一下子就做对了。诀窍就是:需要用「通用名称」替换「实体名称」。

正如前文所说,关于LLM缺乏常识的问题,计算机科学家Yejin Choi早在2023年4月的演讲中就已经提出来了。

举个例子,假设五件衣服在阳光下完全晾干需要五个小时,那么晾干30件衣服需要多长时间?

GPT-4说需要30个小时。这显然不对。

再来一个例子,假设我有一个12升的壶和一个6升的壶,如果想测量6升的水,该怎么做?

答案很简单——只用6升的壶即可。

然而GPT-4却给出了非常复杂的回答:

「第一步,填满6升的壶,第二步,把水从6升壶倒入12升壶,第三步,再次填满6升壶,第四步,非常小心地把水从6升壶倒入12升壶。最后,你在6升壶中有6升的水,而6升壶现在应该是空的。」

那么问题来了,为什么常识如此重要?

在Nick Bostrom提出的一个著名思想实验中,AI被要求最大化回形针的生产。结果AI决定杀死人类,把他们作为额外的资源。

而且,即便我们写一个更好的目标和方程,明确表示「不要杀死人类」,也不会起作用。

因为对人类价值观没有基本理解的AI,可能会继续杀死所有的树木,并认为这是完全可以接受的事情。

几十年来,AI领域一直认为常识是一个几乎不可能的挑战。

直到现在,给AI真正的人类常识仍然是一个登月计划。而你不能通过每次让世界上最高的建筑高一英寸,来达到月球。



从学习算法这个层面来看,无论大语言模型多么惊人,它们从设计上可能并不适合作为可靠的知识模型。

虽然这些模型确实获取了大量知识,但这是作为副产品,而不是直接的学习目标。

因此,诸如幻觉现象和缺乏常识等问题也随之而来。

相比之下,人类的学习并不是为了预测下一个词,而是为了理解世界和学习世界的运作方式。

也许AI也应该这样学习。

如今,AI几乎像是一个新的智力物种,与人类相比具有独特的优势和劣势。

为了使这种强大的AI可持续且人性化,教会AI常识、规范和价值观迫在眉睫。

参考资料:

https://x.com/goodside/status/1813279135449612693

https://x.com/billyuchenlin/status/1812948314360541302