专栏名称: 腾讯科技
只供应最有营养的科技大餐!
目录
相关文章推荐
51好读  ›  专栏  ›  腾讯科技

省钱也是技术活:解密DeepSeek的极致压榨术

腾讯科技  · 公众号  · 科技媒体  · 2024-12-31 21:45

正文

请到「今天看啥」查看全文


而在训练模型的过程中,内存占比最高的就是向量数据。
DeepSeek-V3这次一次用了两种方法去压缩向量数据,一是MLA多层注意力架构,另一个就是FP8混合精度训练。
多层注意力MLA
多层注意力(Multi-Layer Attention, MLA)架构设计的核心在于在Transformer架构中引入动态层聚合机制。传统Transformer中每一层都需要完整的计算和存储,其中的Key和Value矩阵往往占用大量内存空间。而MLA通过动态合并相邻层的特征来减少计算量。
MLA通过压缩和复用前序层的K、V来减少内存占用和计算量。具体来说,将连续几层的K、V进行合并压缩成一组共享表示。
打个比方,如果把注意力机制比作图书检索系统,传统方法相当于为每本书都建立完整的索引卡片(Key)和内容摘要(Value),而DeepSeek的方法则像是建立了一个智能的分类系统,不记具体信息,而是记一个简单的"标签"(压缩的Key/Value),需要时再从标签还原出详细信息。就像把"计算机技术,三楼右侧第二排"简化成"C2-3"这样的编码。
在这个过程中,DeepSeek使用了低秩压缩技术(可以理解为将高维矩阵压缩为若干个低维矩阵的乘积),将KV压缩到512维度,远小于原始维度。通过Key/Value的低秩压缩使得的训练内存占用减少了20-30%。
在Query端的优化对训练效率也非常有意义。Query可以理解为用户的检索请求,传统方法会为每个请求都分配大量计算资源。DeepSeek通过对Query的低秩压缩,减少了计算过程中的激活内存占用。虽然这种优化对推理阶段的影响相对较小,但在训练过程中发挥了重要作用,显著提升了训练效率。这就像是优化了图书检索系统的查询处理机制,使得系统能够更快速地处理大量并发的检索请求。
而DeepSeek-V3巧妙的找到了一些平衡,让这些压缩技术几乎没有影响模型的性能。
FP8 混合精度训练框架
MLA方法是从DeepSeek V2开始就采用的方法,本次只是进行了优化调整。而在DeepSeek-V3里引入了一种 FP8 混合精度训练框架,并首次在超大规模模型上验证了其有效性。
FP8就是用8个二进制位来表示数字的格式,相比传统的32位(FP32)和16位(FP16)格式,精度低了很多,但是占用空间小,计算快。
就像用"约350人"代替"准确的358人",牺牲一些精度来换取效率。虽然不够精确,但在很多场景下已经够用了,而且能大大提升运算速度和节省内存。
DeepSeek在采用FP8格式时,采用了"混合精度"的方案。在训练时,它的大部分核心计算内核均采用 FP8 精度实现。 包括前向传播、激活反向传播和 权重反向传播都用了 FP8 作为输入,并输出 BF16 或 FP32 格式的结果。 这一设计理论上使计算速度相较于原始的 BF16 方法提升了一倍。 此外,DeepSeek中的向量激活值以 FP8 格式存储,供反向传播使用,从而显著降低了内存消耗。
针对某些对低精度计算敏感算子和一些低成本算子,比如嵌入模块、输出头、MoE 门控模块、归一化算子以及注意力算子保留了FP16乃至FP32的精度。这样能保证数据的精确性。同时为了保证数值稳定性,DeepSeek还将主权重、权重梯度和优化器状态以更高精度存储。
就像一个精打细算的主厨:日常备菜用普通的厨具就够了,但到了关键的烹饪步骤,就会换上最好的刀具。
在模型训练中,大部分的前向运算都使用FP8来处理,这样可以大大节省显存和计算资源,让整个训练过程跑得更快。但他们也很清楚哪些地方不能省:比如最后的调味、摆盘(对应嵌入模块、输出头等),就一定要用精密的工具(FP16或FP32精度)。
过去使用FP8模式的时候,最大的困难出现误差累计。就像普通计算器(Tensor Cores的FP8)只能显示到小数点后两位,而科学计算器(CUDA核心的FP32)能显示到小数点后六位。当你需要加很多个小数时,用普通计算器会逐渐累积误差,最后结果可能差异很大。
(DeepSeek 提出的误差积累解决方法)
DeepSeek发现了一个巧妙的解决方案:不等到最后再算总和,而是每加128个数就把当前结果转移到科学计算器上继续计算。为了让这个过程不影响速度,他们利用了H800 GPU的特点:就像有两个收银员,当一个在结算购物篮的时候,另一个可以继续扫描新商品。这样在提高精度的同时,基本不影响处理速度。
这一策略使得模型训练速度大幅提升,毕竟核心计算能提升100%的速度,而显存使用减少也非常明显。并且模型最终的效果精度损失能做到小于0.25%,几乎无损。
并行:对硬件的极限使用
要实现更快的训练速度,最有效的方法就是增加并行计算的规模,让更多的计算单元同时处理不同的数据或任务。而在并行中,需要解决的问题就是尽可能的有效利用计算资源,让它们都高负载的工作。
在系统架构层面,DeepSeek就使用了专家并行训练技术,通过将不同的专家模块分配到不同的计算设备上同时进行训练,提升了训练过程中的计算效率。
但这种简单的并行还远不够。 DeepSeek这次对算力做的是极限压榨:如果把训练过程当成一个工厂的话,他们主要做的就是不让流水线上没有闲人,再加上尽可能优化工序,让工件(数据)进入流水线时直接就可以被操作(计算)。
DualPipe跨节点通信
优化流水线流程的主要模式是DeepSeek创新的 DualPipe方法。
在计算和通信重叠方面,DualPipe采用了类似于"多任务并行处理"的思路。
就像现代计算机能够在下载文件的同时处理文档一样,DualPipe让模型在进行计算的同时,后台已经开始准备下一步需要的数据传输。这种设计确保了通信开销被很大程度地隐藏在计算过程中,极大提升了整体效率。
传统的训练信息流水线并行就像一条产品装配线,每个工位按顺序处理任务。当数据包从一个阶段传递到下一个阶段时,往往会产生等待时间,这就是所谓的"流水线气泡"。这些气泡会导致计算资源的浪费,就像流水线上的工人不得不等待上游工序完成才能开始工作。此外,不同节点之间的数据传输时间也会成为性能瓶颈,就像工位之间传递零件的时间过长会影响整体生产效率。
而DualPipe引入了双重流水线的概念,就像在同一条生产线上同时处理两批产品。当一个计算阶段在等待数据传输时,可以立即切换到处理另一批数据,这样就能充分利用原本的空闲时间。
(DualPipe示意图,在图中由共享黑色边框包围的两个单元格具有相互重叠的计算和通信。)
这是让流水线上没有“闲人”。






请到「今天看啥」查看全文