【DeepSeek论文精读】3. DeepSeekMoE:迈向混合专家语言模型的终极专业化

欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html)原创作品
【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1
【DeepSeek论文精读】2. DeepSeek LLM:以长期主义扩展开源语言模型
【DeepSeek论文精读】3. DeepSeekMoE:迈向混合专家语言模型的终极专业化
【DeepSeek论文精读】4. DeepSeek-V2:强大、经济且高效的混合专家语言模型
【DeepSeek论文精读】5. DeepSeek-V3 技术报告
【DeepSeek论文精读】6. DeepSeek R1:通过强化学习激发大语言模型的推理能力

【DeepSeek论文精读】3. DeepSeekMoE:迈向混合专家语言模型的终极专业化

    • 0. 论文概况
      • 0.1 简介
      • 0.1 摘要
      • 0.2 结论
    • 1. 介绍
    • 2. 前置知识:Transformers 架构下的MoE
    • 3. DeepSeekMoE 架构
      • 3.1 细粒度专家分割
      • 3.2 共享专家隔离
      • 3.3 负载均衡考虑
    • 4. 实验验证
      • 4.1 实验设置
      • 4.2 评价
      • 4.3 DeepSeekMoE 与 MoE模型的上限紧密对齐
      • 4.4 消融研究
      • 4.5 专家专业化分析
    • 5. 放大到 DeepSeekMoE 16B
      • 5.1 实验设置
      • 5.2 评价
    • 6. DeepSeekMoE 16B 对齐
      • 6.1 实验设置
      • 6.2 评价
    • 7. DeepSeekMoE 145B
      • 7.1 实验设置
      • 7.2 评估结果
    • 8. 相关工作
    • 9. 结论


0. 论文概况

0.1 简介

2024 年 1 月,DeepSeek 发表论文「 DeepSeekMoE:迈向混合专家语言模型的终极专业化 」(DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models) 。

论文提出了MoE语言模型的DeepSeekMoE架构,目的是实现终极的专家专业化(expert specialization)。通过细粒度的专家分割和共享专家隔离,DeepSeekMoE相比主流的MoE架构实现了显著更高的专家专业化和性能。

  • 论文标题:DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models
  • 发布时间:2024 年 1 月
  • 论文地址:https://arxiv.org/pdf/2401.06066
  • Github地址:https://github.com/deepseek-ai/DeepSeek-MoE
  • 主要内容:
    • 提出细粒度专家分割(Fine-Grained Expert Segmentation)和共享专家隔离(Shared Expert Isolation)策略。
    • 通过更灵活的专家组合提升模型性能,同时保持计算成本不变。。
  • 数据集规模:16B。

在这里插入图片描述


0.1 摘要

在大型语言模型时代,混合专家(Mixture-of-Experts, MoE)架构是一种有前途的架构,用于在扩展模型参数时管理计算成本。然而,传统的MoE架构如GShard,激活前𝐾个专家中的𝑁个,面临着确保专家专业化的问题,即每个专家获得非重叠且专注的知识。

为此,我们提出了DeepSeekMoE架构,旨在实现最终的专家专业化。DeepSeekMoE 涉及两个主要策略:
(1)将专家精细划分为 m N mN mN 个,并从中激活 m K mK mK 个,从而实现更灵活的激活专家组合;
(2)隔离 K s Ks Ks 个专家作为共享专家,旨在捕捉共同知识并减少路由专家的冗余。

本文的贡献总结如下:

  • 架构创新。我们引入了DeepSeekMoE,这是一种旨在实现最终专家专业化的创新MoE架构,采用了细粒度专家分割和共享专家隔离两个主要策略。
  • 实证验证。我们进行了广泛的实验,以实证验证DeepSeekMoE架构的有效性。实验结果验证了DeepSeekMoE 2B中高水平专家专业化的有效性,并表明DeepSeekMoE 2B几乎接近MoE模型的性能上限。
  • 可扩展性。我们将DeepSeekMoE扩展到训练16B模型,并显示仅使用约40%的计算量,DeepSeekMoE 16B的性能与DeepSeek 7B和LLaMA2 7B相当。我们还进行了将DeepSeekMoE扩展到145B的初步努力,突显了其相对于GShard架构的持续优势,并显示其性能与DeepSeek 67B相当。
  • 对齐MoE。我们成功地对DeepSeekMoE 16B进行了有监督微调,创建了一个对齐的聊天模型,展示了DeepSeekMoE 16B的适应性和多功能性。
  • 公开发布。本着开放研究的精神,我们将DeepSeekMoE 16B的模型检查点公开发布。值得注意的是,该模型可以在单个40GB内存的GPU上部署,无需量化。

在这里插入图片描述

Figure 1 :DeepSeekMoE 16B与开源模型在Open LLM Leaderboard上的比较。红色虚线是从除DeepSeekMoE 16B之外的所有模型的数据点线性拟合得到的。DeepSeekMoE 16B始终以很大的优势胜过具有类似激活参数数量的模型,并在性能上与LLaMA2 7B相媲美,后者的激活参数数量大约是其2.5倍


0.2 结论

我们介绍了用于MoE语言模型的DeepSeekMoE架构,旨在实现最终的专家专业化。
通过细粒度专家分割和共享专家隔离,DeepSeekMoE在专家专业化和性能方面显著优于现有的MoE架构。
从较小的2B参数规模开始,论文验证了DeepSeekMoE的优势,展示了其接近MoE模型上限性能的能力。此外,论文证明DeepSeekMoE具有比GShard更高水平的专家特化。
扩展到16B总参数的更大规模,我们在2T token上训练DeepSeekMoE 16B,并展示了其与DeepSeek 7B和LLaMA2 7B相当的卓越性能,仅使用了约40%的计算量。
此外,我们进行了有监督微调以实现对齐,构建了基于DeepSeekMoE 16B的MoE聊天模型,进一步展示了其适应性和多功能性。
进一步,我们进行了将DeepSeekMoE扩展到145B参数的初步探索。我们发现DeepSeekMoE 145B仍然保持相对于GShard架构的显著优势,并展示了与DeepSeek 67B相当的性能,仅使用了28.5%(甚至可能18.2%)的计算量。
为了研究目的,我们将DeepSeekMoE 16B的模型检查点公开发布,该模型可以在单个40GB内存的GPU上部署。我们希望这项工作能为学术界和工业界提供有价值的见解,并促进大规模语言模型的加速发展。


1. 介绍

最近的研究和实践经验表明,在有足够的训练数据的情况下,用增加的参数和计算预算来缩放语言模型可以产生非常强大的模型(Brown等人,2020;Hoffmann等人,2022;OpenAI,2023;Touvron等人,2023a)。然而,必须承认,将模型扩展到超大规模的努力也与极高的计算成本有关。考虑到巨大的成本,混合专家(MoE)架构(Jacobs等人,1991;Jordan和Jacobs,1994;Shazeer等人,2017)已成为一种流行的解决方案。它可以实现参数缩放,同时将计算成本保持在适度的水平。最近,MoE架构在Transformers中的应用(Vaswani等人,2017)成功地将语言模型扩展到了相当大的规模(Du等人,2022;Fedus等人,2021;Lepikhin等人,2021,Zoph,2022),并取得了显著的性能。这些成就突显了MoE语言模型的巨大潜力和前景。

尽管MoE架构具有巨大的潜力,但现有的MoE架构可能存在知识混合(knowledge hybridity )和知识冗余(knowledge redundancy)的问题,这限制了专家的专业化,即每个专家都获得了不重叠和集中的知识。传统的MoE架构用MoE层代替 Transformer 中的前馈网络(FFN)。每个MoE层由多个专家组成,每个专家的结构都与标准FFN相同,每个令牌(token)都分配给一个(Fedus等人,2021)或两个(Lepikhin等人,2021年)专家。这种架构体现了两个潜在的问题:
(1)知识混合:现有的 MoE 实践通常雇佣有限数量的专家(例如8或16名),分配给特定专家的标记可能会涵盖不同的知识。因此,指定的专家将打算在其参数中收集截然不同类型的知识,这些知识很难同时使用。
(2) 知识冗余:分配给不同专家的令牌可能需要共同知识。因此,多个专家在获取各自参数的共享知识时可能会趋同,从而导致专家参数中的冗余。这些问题共同阻碍了现有 MoE 实践中的专家专业化,使其无法达到 MoE 模型的理论上限性能。

针对上述问题,我们介绍了DeepSeekMoE,这是一种专门为最终专家专业化而设计的创新MoE架构。我们的架构涉及两个主要策略:

  1. 细粒度专家分割:
    在保持参数数量不变的同时,我们通过分割FFN中间隐藏维度将专家分割成更细粒度。相应地,在保持恒定计算成本的情况下,我们还激活了更细粒度的专家,以实现更灵活、适应性更强的激活专家组合。细粒度的专家细分允许将不同的知识更精细地分解,并更精确地学习到不同的专家中,每个专家都将保持更高的专业水平。此外,组合活跃专家的灵活性增加也有助于更准确、更有针对性地获取知识。
  2. 共享专家隔离:
    我们隔离某些专家,作为始终处于活动状态的共享专家,旨在在不同的环境中捕获和巩固共同知识。通过将共同知识压缩到这些共享专家中,将减少其他路由专家之间的冗余。这可以提高参数效率,并确保每个路由专家通过专注于独特的方面来保持专业性。DeepSeekMoE中的这些架构创新为训练一个参数高效的MoE语言模型提供了机会,在这个模型中,每个专家都是高度专业化的。

从2B参数的适度规模开始,我们验证了DeepSeek MoE架构的优势。我们对跨越不同任务的12个零样本或少样本基准进行评估。实证结果表明,DeepSeekMoE 2B远远超过了GShard 2B(Lepikhin等人,2021),甚至与GShard 2.9B相匹配,后者是一个具有1.5×专家参数和计算的更大MoE模型。值得注意的是,我们发现DeepSeekMoE 2B在参数数量相等的情况下几乎接近其密集对应物的性能,这设定了MoE语言模型的严格上限。为了寻求更深入的见解,我们对DeepSeekMoE的专家专业进行了详细的消融研究和分析。这些研究验证了细粒度专家分割和共享专家隔离的有效性,并提供了实证证据支持DeepSeekMoE可以实现高水平的专家专业化。

利用我们的架构,我们随后将模型参数扩展到16B,并在具有2T令牌的大规模语料库上训练DeepSeekMoE 16B。评估结果显示,DeepSeekMoE 16B的计算量仅为40%左右,其性能与DeepSeek 7B(DeepSeek AI,2024)相当,DeepSeek是一个在相同2T语料库上训练的密集模型。我们还将DeepSeekMoE与开源模型进行了比较,评估结果表明,DeepSeekMoE 16B在激活参数数量相似的情况下始终表现出色,并与LLaMA2 7B(Touvron等人,2023b)达到了相当的性能,后者大约是激活参数的2.5倍。图1显示了Open LLM排行榜上的评估结果1。此外,我们进行监督微调(SFT)以进行对齐,将模型转换为聊天模型。评估结果显示,DeepSeekMoE Chat 16B在聊天设置中也实现了与DeepSeek Chat7B和LLaMA2 SFT 7B相当的性能。受到这些结果的鼓舞,我们进一步开展了将De epSeekMoE规模扩大到145B的初步努力。实验结果仍然一致地证明了其相对于GShard架构的实质性优势。此外,它的性能与DeepSeek 67B相当,只使用了28.5%(甚至18.2%)的计算。

我们的贡献总结如下:

  • 架构创新。我们介绍了DeepSeekMoE,这是一种旨在实现最终专家专业化的创新MoE架构,它采用了细粒度专家分割和共享专家隔离两种主要策略。
  • 实验验证。我们进行了广泛的实验,以实证验证DeepSeekMoE架构的有效性。实验结果验证了DeepSeekMoE 2B的高水平专家专业化,并表明DeepSeekMoE 2B几乎可以接近MoE模型的上限性能。
  • 可扩展性。我们扩大了DeepSeekMoE的规模来训练16B模型,并表明仅需约40%的计算,DeepSeekMoE 16B的性能与DeepSeek 7B和LLaMA2 7B相当。我们还初步尝试将DeepSeekMoE扩展到145B,突出其相对于GShard架构的持续优势,并显示出与DeepSeek 67B相当的性能。
  • MOE 的校准。我们成功地对 DeepSeekMoE 16B进行了监督微调,创建了一个对齐的聊天模型,展示了DeepSeekMoE 16B的适应性和多功能性。
  • 公开发布。本着开放研究的精神,我们向公众发布了DeepSeekMoE 16B的模型检查点。值得注意的是,该模型可以部署在具有40GB内存的单个GPU上,而不需要量化。

2. 前置知识:Transformers 架构下的MoE

首先,我们介绍一种在Transformer语言模型中常用的通用MoE(Mixture of Experts,混合专家)架构。一个标准的 Transformer语言模型是通过堆叠 L L L 层标准的Transformer块构建的,每个块可以表示如下:

在这里插入图片描述

其中, T T T 表示序列长度,Self-Att(·) 表示自注意力模块,FFN(·) 表示前馈神经网络 (Feed-Forward Network)。 u 1 : T l ∈ R T ∗ d u^l_{1:T} \in R^{T*d} u1:TlRTd 表示经过 第 l l l 层注意力模块后的所有token的隐藏状态,而 h t l ∈ R d h^l_t \in R^d htlRd 则是第 l l l 层Transformer块中第 t t t
个token的输出隐藏状态。为简洁起见,我们在上述公式中省略了层归一化。

一种构建MoE语言模型的典型方法,是在Transformer中按照指定的间隔,用MoE层替换 FFN 层。一个 MoE 层由多个专家组成,每个专家的结构与标准的 FFN 层相同。然后,每个token将被分配到一个或两个专家。若将第 l l l 层的FFN替换为MoE层,则其输出隐藏状态的计算表示如下:

在这里插入图片描述

其中, N N N 表示专家的总数, F F N i ( ⋅ ) FFNi(·) FFNi() 是第 i i i 个专家的 FFN, g i , t g_{i,t} gi,t 表示第 i i i 个专家的门控值, s i , t s_{i,t} si,t 表示token到专家的亲和度, T o p k ( ⋅ , K ) Topk(·,K) Topk(⋅,K) 表示在第 t t t 个token和所有 N N N 个专家中计算出的前 K K K 个最高亲和度分数的集合, e i l e^l_i eil 是第 l l l 层中第 i i i 个专家的质心。
注意, g i , t g_{i,t} gi,t 是稀疏的,这意味着只有 N N N 个门控值中的 K K K 个非零。此稀疏特性确保了在MoE层内的计算效率,即每个token仅分配到 K K K 个专家中进行计算。同样,我们在上述公式中为简洁起见省略了层归一化操作。


3. DeepSeekMoE 架构

在第2节概述的通用MoE架构基础上,我们引入了DeepSeekMoE,该架构专门设计用于充分利用专家专业化的潜力。如图2所示,我们的架构包含两个主要策略:细粒度专家分割和共享专家隔离。这两种策略旨在提升专家专业化的水平。

在这里插入图片描述
图2:DeepSeekMoE的插图。子图(a)展示了采用传统前2路由策略的MoE层。子图(b)说明了细粒度专家细分策略。随后,子图(c)展示了共享专家隔离策略的集成,构成了完整的DeepSeekMoE架构。值得注意的是,在这三种架构中,专家参数的数量和计算成本保持不变。


3.1 细粒度专家分割

在专家数量有限的情况下,被分配到某个特定专家的 tokens 更可能覆盖多样化的知识类型。因此,指定的专家会倾向于在其参数中学习大量不同类型的知识,而这些知识难以同时被有效利用。然而,如果每个 token 可以被路由到更多的专家,那么多样化的知识将有可能在不同的专家中被分别分解和学习。在这种情况下,每个专家仍然可以保持较高水平的专业化,从而实现更为集中的知识分布。

为了实现这一目标,同时保持专家参数和计算成本的一致性,我们对专家进行了更细粒度的分割。这种细粒度的专家分割使得激活专家的组合更具灵活性和适应性。具体来说,在典型的MoE架构的基础上(如图2(a)所示),我们将每个专家FFN分割成 m m m 个更小的专家,通过将 FFN 的中间隐藏维度减少到其原始大小的 1 m \frac{1}{m} m1 。由于每个专家变小,因此我们也相应地将激活专家的数量增加 m m m 倍,以保持相同的计算成本,如图2(b)所示。

通过这种细粒度的专家分割,MoE 层的输出可以表示为:

在这里插入图片描述

其中,专家参数的总数等于标准FFN中的参数数目乘以 N N N,而 m N m N mN 表示细粒度专家的总数。通过细粒度专家分割策略,非零门控的数量也增加到 m K mK mK

从组合学的角度来看,细粒度的专家分割策略显著增强了激活专家的组合灵活性。举一个例子,考虑 N = 16 N = 16 N=16 的情况。典型的top-2 路由策略可以生成 ( 16 2 ) = 120 \binom{16}{2} = 120 (216)=120 种可能的组合。相比之下,如果每个专家分割成 4个更小的专家,则细粒度路由策略可以生成 ( 64 8 ) = 4 , 426 , 165 , 368 \binom{64}{8} = 4,426,165,368 (864)=4,426,165,368 种潜在的组合。组合灵活性的增加提升了获得更精确和有针对性知识获取的潜力。


3.2 共享专家隔离

在传统的路由策略中,被分配到不同专家的 tokens 可能需要一些公共的知识或信息。因此,多个专家可能会在各自的参数中学习共享知识,从而导致参数的冗余。然而,如果有专门的共享专家来捕获和整合不同上下文中的公共知识,其他路由专家之间的参数冗余将得到缓解。这种冗余的减少将有助于实现一个更高效的模型,使专家更具专业性。

为实现这一目标,除了细粒度专家分割策略外,我们还进一步隔离了 K s K_s Ks 个专家以充当共享专家。无论路由模块如何,每个token 都会被确定性地分配给这些共享专家。为了保持恒定的计算成本,其他路由专家中激活的专家数量将减少 K s K_s Ks,如图2c所示。结合共享专家隔离策略,完整的DeepSeekMoE架构中的MoE层公式如下:

在这里插入图片描述

最终,在DeepSeekMoE中,共享专家的数量为 K s K_s Ks,路由专家的总数为 m N − K s mN - K_s mNKs ,而非零门控的数量为 m K − K s mK - K_s mKKs

需要说明的是,共享专家隔离的原型可以归功于Rajbhandari等人(2022)。关键的区别在于,他们是从工程角度推导出了这一策略,而我们则是从算法的角度来进行处理。


3.3 负载均衡考虑

自动学习的路由策略可能会遇到负载不平衡的问题,这表现出两个明显的缺陷。首先,存在路由崩溃的风险(Shazeer等人,2017),即模型总是只选择少数专家,导致其他专家无法得到充分的培训。其次,如果专家分布在多个设备上,负载不平衡会加剧计算瓶颈。

  1. 专家级别的均衡损失
    为了降低路由崩溃的风险,我们引入了专家级别的均衡损失。均衡损失的计算如下:

在这里插入图片描述

其中, α 1 \alpha_1 α1 是超参数,称为专家级别的均衡因子, N ′ N' N 等于 ( m N − K s ) (mN - K_s) (mNKs) K ′ K' K 等于 ( m K − K s ) (mK - K_s) (mKKs) 1 ( ⋅ ) 1(⋅) 1() 表示指示函数。

  1. 设备级别的均衡损失
    除了专家级别的均衡损失外,我们还引入了设备级别的均衡损失。在缓解计算瓶颈时,没有必要在专家级别施加严格的均衡约束,因为对负载均衡的过度约束会影响模型性能。相反,我们的主要目标是确保设备之间的计算均衡。如果我们将所有路由专家划分为 D D D { E 1 , E 2 , . . . , E D } \{ \mathcal{E}_1, \mathcal{E}_2, ..., \mathcal{E}_D \} {E1,E2,...,ED},并在每个设备上部署一组专家,则设备级别的均衡损失计算如下:

在这里插入图片描述

​其中,KaTeX parse error: Undefined control sequence: \alfa at position 1: \̲a̲l̲f̲a̲ ̲_2 是超参数,称为设备级别的均衡因子。在实际应用中,我们设置了一个较小的专家级平衡因子来降低路由崩溃的风险,同时设置了较大的设备级平衡因子以促进跨设备的平衡计算。


4. 实验验证

4.1 实验设置

4.1.1 训练数据和标记化

我们的训练数据是从DeepSeek AI创建的大规模多语言语料库中采样的。该语料库主要关注英语和汉语,但也包括其他语言。它来自不同的来源,包括网络文本、数学材料、编码脚本、已发表的文献和各种其他文本材料。为了进行验证实验,我们从语料库中抽取了一个包含100B个标记的子集来训练我们的模型。对于标记化,我们利用HuggingFace Tokenizer2工具在训练语料库的较小子集上训练字节对编码(BPE)(Sennrich等人,2016)标记器。在验证实验中,我们准备了一个词汇量为8K的标记器,当训练更大的模型时,词汇量会扩大。

4.1.2 基础设施

我们基于HAI-LLM(High Flyer,2023)进行实验,这是一种高效且轻量级的训练框架,集成了多种并行策略,包括张量并行性(Korthikanti等人,2023;Narayanan等人,2021;Shoeybi等人,2019)、ZeRO数据并行性(Rajbhandari等人,2020)、PipeDream流水线并行性(Harlap等人,2018),更具体地说,是通过结合数据和张量并行性来实现专家并行性(Lepikhin等人,2021)。为了优化性能,我们使用CUDA和Triton(Tillet等人,2019)开发了GPU内核,用于不同专家的门控算法和跨线性层的融合计算。所有实验均在配备NVIDIA A100或H800 GPU的集群上进行。A100集群中的每个节点都包含8个通过NVLink网桥成对连接的GPU。H800集群每个节点还具有8个GPU,在节点内使用NVLink和NVSwitch互连。对于A100和H800集群,InfiniBand互连用于促进节点之间的通信。

4.1.3 超参数

  1. 模型设置。
    在验证实验中,我们将Transformer层数设置为9,隐藏维度设置为1280。我们采用多头注意力机制,共有10个注意力头,每个头的尺寸为128。对于初始化,所有可学习参数都以0.006的标准偏差随机初始化。我们用MoE层替换所有FFN,并确保专家参数的总数等于标准FFN的16倍。此外,我们将激活的专家参数(包括共享专家参数和激活的路由专家参数)保持为标准FFN的2倍。在这种配置下,每个MoE模型的总参数约为2B,激活的参数数量约为0.3B。

  2. 训练设置。
    我们使用 AdamW优化器(Loshchilov和Hutter,2019),将超参数设置为 β 1 = 0.9 \beta_1=0.9 β1=0.9 β 2 = 0.95 \beta_2=0.95 β2=0.95,weight_decay=0.1。使用预热和逐步衰减策略来安排学习率。最初,在前2K个步骤中,学习率从0线性增加到最大值。随后,在80%的训练步骤中将学习率乘以0.316,在90%的训练步骤中再次乘以0.316。验证实验的最大学习率设置为1.08×10−3,梯度裁剪范数设置为1.0。批大小设置为2K,最大序列长度为2K,每个训练批包含4M个令牌。相应地,训练步骤的总数被设置为25000,以实现100B个训练令牌。由于训练数据丰富,我们在训练过程中不使用dropout。鉴于模型尺寸相对较小,所有参数(包括专家参数)都部署在单个GPU设备上,以避免计算不平衡。相应地,我们在训练过程中不会丢弃任何令牌,也不会使用设备级余额损失。为了防止路由崩溃,我们将专家级平衡因子设置为0.01。
    为了可读性,我们还在附录A中提供了DeepSeekMoE不同尺寸的超参数概览表。

4.1.4 评估基准

我们对涵盖各种类型任务的广泛基准进行评估。我们列出了以下基准。

  • 语言建模。对于语言建模,我们在Pile的测试集上评估模型(Gao等人,2020),评估指标是交叉熵损失。
  • 语言理解和推理。对于语言理解和推理,我们考虑了HellaSwag(Zellers等人,2019)、PIQA(Bisk等人,2020)、ARC挑战和AREasy(Clark等人,2018)。这些任务的评估指标是准确性。
  • 阅读理解。对于阅读理解,我们使用RACE high和RACE middleLai等人(2017),评估指标是准确性。
  • 代码生成。对于代码生成,我们评估了HumanEval(Chen等人,2021)和MBPP(Austin等人,2021年)上的模型。评估指标为Pass@1,其表示仅一代尝试的通过率。
  • 封闭式问答。对于封闭式问答,我们考虑TriviaQA(Joshi等人,2017)和NaturalQuestions(Kwiatkowski等人,2019)。评估指标是精确匹配(EM)率。

4.2 评价

  1. 基线。
    包括DeepSeekMoE在内,我们比较了五个模型进行验证实验。Dense表示总参数为0.2B的标准密集Transformer语言模型。哈希层(Roller等人,2021)是一种基于前1哈希路由的MoE架构,总参数为2.0B,激活参数为0.2B,与密集基线对齐。Switch Transformer(Fedus等人,2021)是另一种基于top-1可学习路由的著名MoE架构,其总参数和激活参数与哈希层相同。GShard(Lepikhin等人,2021)采用了前2名可学习路由策略,与前1名路由方法相比,总共有2.0B个参数和0.3B个激活参数,因为多了一个专家被激活。DeepSeekMoE有1个共享专家和63个路由专家,每个专家的大小是标准FFN的0.25倍。包括DeepSeekMoE在内,所有比较模型共享相同的训练语料库和训练超参数。所有比较的MoE模型具有相同数量的总参数,GShard具有与DeepSeekMoE相同数量的激活参数。

  2. 结果。
    我们将评估结果列于表1中。对于所有演示的模型,我们报告了在100B令牌上训练后的最终评估结果。从表中,我们得出以下观察结果:(1)在稀疏架构和更多总参数的情况下,哈希层和开关变换器的性能明显强于具有相同激活参数数量的密集基线。(2) 与哈希层和开关变换器相比,GShard具有更多的激活参数,性能略优于开关变换器。(3) 在总参数和激活参数数量相同的情况下,DeepSeekMoE比GShard具有压倒性的优势。这些结果展示了我们的DeepSeekMoE架构在现有MoE架构中的优势

在这里插入图片描述


4.3 DeepSeekMoE 与 MoE模型的上限紧密对齐

我们已经证明,DeepSeekMoE的性能优于密集基线和其他MoE架构。

为了更精确地了解DeepSeekMoE的性能,我们将其与具有更多总参数或激活参数的较大基线进行了比较。这些比较使我们能够估计GShard或密集基线所需的模型大小,以实现与DeepSeekMoE相当的性能。

与 GShard×1.5 的比较。

表2显示了DeepSeekMoE和一个更大的GShard模型之间的比较,GShard的专家规模是其1.5倍,这导致专家参数和专家计算都是1.5倍。总体而言,我们观察到DeepSeekMoE的性能与GShard×1.5相当,突显了DeepSeekMoE架构固有的显著优势。除了与GShard×1.5的比较外,我们还在附录B中展示了与GShards×1.2的比较。

此外,我们将DeepSeekMoE的总参数数量增加到13.3B,并将其分别与GShard×1.2和GShard x 1.5的15.9B和19.8B的总参数进行比较。我们发现,在更大的尺度上,DeepSeekMoE甚至可以明显优于GShard×1.5。这些结果也在附录B中提供。

在这里插入图片描述

与 Dense×16 的比较。
表2还显示了DeepSeekMoE和更大密度模型之间的比较。为了进行公平的比较,我们没有使用注意力和FFN参数之间广泛使用的比率(1:2)。相反,我们配置了16个共享专家,其中每个专家的参数数量与标准FFN相同。该架构模拟了一个具有16倍标准FFN参数的密集模型。从表中可以看出,DeepSeekMoE的性能几乎接近Dense×16,这为MoE模型的模型容量设定了严格的上限。这些结果表明,至少在约2B参数和100B训练令牌的尺度上,DeepSeekMoE的性能与MoE模型的理论上限非常接近。此外,我们在附录B中提供了与Dense×4的额外比较。


4.4 消融研究

为了证实细粒度专家分割和共享专家隔离策略的有效性,我们对DeepSeekMoE进行了消融研究,结果如图3所示。为了进行公平的比较,我们确保比较中包含的所有模型具有相同数量的总参数和激活参数。

在这里插入图片描述

共享专家隔离。
为了评估共享专家隔离策略的影响,我们基于GShard将一名专家隔离为共享专家。从图3中,我们观察到,与GShard相比,有意隔离共享专家在大多数基准测试中都能提高性能。这些结果支持了共享专家隔离策略有助于提高模型性能的命题。

细粒度专家细分。
为了评估细粒度专家分割策略的有效性,我们通过将专家进一步分割成更细粒度来进行更详细的比较。具体来说,我们将每位专家分成2或4名较小的专家,总共有32名(1名共享+31名路由)或64名(1位共享+63名路由)专家。图3显示了一个一致的趋势,即专家分割粒度的不断细化对应于整体模型性能的不断提高。这些发现为细粒度专家分割策略的有效性提供了实证支持。

共享和路由专家之间的比率。
此外,我们还研究了共享专家和路由专家的最佳比例。基于64位专家的最精细粒度,并保持专家总数和激活专家的数量不变,我们试图将1、2和4位专家分离为共享专家。我们发现,共享专家和路由专家的不同比例对性能没有显著影响,1、2和4个共享专家的桩损失分别为1.808、1.806和1.811。考虑到1:3的比例会产生略好的桩损失,在扩大DeepSeekMoE时,我们将共享专家和激活的路由专家之间的比例保持为1:3。


4.5 专家专业化分析

在本节中,我们对DeepSeekMoE 2B的专家专业化进行了实证分析。本节中的DeepSeekMoE 2B是指表1中报告的模型,即包括2.0B的总参数,其中1个共享专家和63个路由专家中的7个被激活。

DeepSeekMoE在路由专家中表现出较低的冗余度。
为了评估路由专家之间的冗余,我们禁用了不同比例的顶级路由专家,并评估了桩损失。具体来说,对于每个令牌,我们屏蔽一定比例的具有最高路由概率的专家,然后从剩余的路由专家中选择前K名专家。为了公平起见,我们将DeepSeekMoE与GShard×1.5进行了比较,因为当没有专家被禁用时,它们具有相同的桩损失。如图4所示,与GShard×1.5相比,DeepSeekMoE对顶级路由专家的禁用更敏感。这种敏感性表明DeepSeekMoE中的参数冗余程度较低,因为每个路由专家都是不可替代的。相比之下,GShard×1.5在其专家参数中表现出更大的冗余,因此当顶级路由专家被禁用时,它可以缓冲性能下降。

在这里插入图片描述

共享专家不可被路由专家所取代。
为了调查共享专家在DeepSeekMoE中的作用,我们禁用它并激活另一个路由专家。对桩的评估显示,桩损失显著增加,从1.808上升到2.414,尽管我们保持了相同的计算成本。这一结果突出了共享专家的关键作用,并表明共享专家捕获了与路由专家不共享的基础和基本知识,使其成为路由专家不可替代的知识。

DeepSeekMoE更准确地获取知识。
为了验证我们的说法,即结合激活专家的更高灵活性有助于更准确、更有针对性地获取知识,我们研究了DeepSeekMoE是否可以用更少的激活专家获取必要的知识。具体来说,我们将激活的路由专家的数量从3人增加到7人,并评估由此产生的桩损失。如图5所示,即使只有4名路由专家被激活,DeepSeekMoE的桩损失也与GShard相当。这一观察结果支持了DeepSeekMoE可以更准确、更有效地获取必要知识的观点。

受到这些发现的鼓舞,为了更严格地验证DeepSeekMoE的专家专业化和准确的知识获取,我们从头开始训练了一个新模型。该模型包括1个共享专家和63个路由专家,其中只有3个路由专家被激活。图6所示的评估结果表明,即使使用相同的总专家参数和只有一半的激活专家参数,DeepSeekMoE仍然优于GShard。这突显了DeepSeekMoE更有效地利用专家参数的能力,即激活专家中有效参数的比例远高于GShard。

在这里插入图片描述

在这里插入图片描述


5. 放大到 DeepSeekMoE 16B

通过DeepSeekMoE架构,我们将MoE模型扩展到更大的规模,总参数为16B,并在2T令牌上进行训练。我们的结果表明,与LLaMA2 7B相比,DeepSeekMoE 16B仅需约40%的计算即可实现卓越的性能。


5.1 实验设置

5.1.1 训练数据和标记化

我们从第4.1.1节所述的同一语料库中采样训练数据。与验证实验不同,我们使用2T令牌对大量数据进行采样,与LLaMA2 7B的训练令牌数量一致。我们还使用HuggingFace Tokenizer工具来训练BPE标记器,但DeepSeekMoE 16B的词汇量设置为100K。

5.1.2 超参数

模型设置
训练设置

5.1.3 评估基准

除了验证实验中使用的基准外,我们还纳入了其他基准,以进行更全面的评估。我们介绍了与验证实验中使用的基准的区别如下。


5.2 评价

5.2.1 与DeepSeek 7B的内部比较

我们首先对DeepSeekMoE 16B和DeepSeek 7B(DeepSeek AI,2024)进行了内部比较,DeepSeek是一个具有6.9B参数的密集语言模型。为了确保公平性,这两个模型都是在同一个语料库上用2T令牌训练的。这使得我们能够准确评估MoE架构的有效性,而不受训练数据的影响。

5.2.2 与开源模型的比较

与LLaMA2 7B的内部比较
OpenAI LLM 排行榜评价


6. DeepSeekMoE 16B 对齐

先前的研究表明,MoE模型通常不会从微调中获得显著收益(Artetxe等人,2022;Fedus等人,2021)。然而,Shen等人(2023)的研究结果表明,MoE模型确实可以从指令调优中受益。为了评估DeepSeekMoE 16B是否可以从微调中受益,我们进行了监督微调,以构建基于DeepSeekMoE 16B的聊天模型。实验结果表明,DeepSeekMoE Chat 16B的性能也与LLaMA2 SFT 7B和DeepSeek Chat 7B相当。


6.1 实验设置

  1. 训练数据
    为了训练聊天模型,我们对内部策划的数据进行监督微调(SFT),包括140万个训练示例。该数据集涵盖了广泛的类别,包括数学、代码、写作、问答、推理、总结等。我们的大多数SFT训练数据都是英文和中文的,这使得聊天模型功能多样,适用于双语场景。

  2. 超参数
    在监督微调过程中,我们将批大小设置为1024个示例,并使用AdamW优化器进行8个迭代的训练(Loshchilov和Hutter,2019)。我们采用4K的最大序列长度,并尽可能密集地打包训练示例,直到达到序列长度限制。我们不使用dropout进行监督微调,只需将学习率设置为10-5,而不采用任何学习率调度策略。

  3. 评估基准
    为了评估聊天模型,我们采用了类似于第5.1.3节中使用的基准,但有以下调整:(1)我们排除了Pile(Gao等人,2020),因为聊天模型很少用于纯语言建模。(2) 我们排除了CHID(Zheng等人,2019),因为观察到的结果不稳定,阻碍了可靠结论的推导。(3) 我们还包括BBH(Suzgun等人,2022),以对聊天模型的推理能力进行更全面的评估。


6.2 评价

评估结果如表5所示。我们的主要观察结果包括:

  1. DeepSeekMoE Chat 16B虽然消耗了近40%的计算量,但在语言理解和推理(PIQA、ARC、BBH)、机器阅读理解(RACE)、数学(GSM8K、MATH)和知识密集型任务(TriviaQA、NaturalQuestions)方面,其性能与7B密集型模型相当。
  2. 在代码生成任务上,DeepSeekMoE Chat 16B的表现明显优于LLaMA2 SFT 7B,表明在HumanEval和MBPP上有了显著改进。此外,它还超越了DeepSeek Chat 7B。
  3. 在包括MMLU、CEval和CMMLU在内的多项选择题回答基准测试中,DeepSeekMoE Chat 16B仍然落后于DeepSeek Chat 7B,这与基础模型的观察结果一致(第5.2.1节)。然而,值得注意的是,经过监督微调后,DeepSeekMoE 16B和DeepSeek 7B之间的性能差距缩小了。
  4. 得益于双语语料库的预训练,DeepSeekMoE Chat 16B在所有中文基准测试中都明显优于LLaMA2 SFT 7B。这些结果证明了DeepSeekMoE 16B在中英文中的平衡能力,增强了其在各种场景中的通用性和适用性。

总之,对聊天模型的评估突出了DeepSeekMoE 16B从对齐中受益的潜力,并验证了其在仅使用约40%的计算量的情况下,在实现与密集模型相当的性能方面的一致优势。

在这里插入图片描述


7. DeepSeekMoE 145B

在DeepSeekMoE 16B出色表现的鼓舞下,我们进一步努力将DeepSeekMoE规模扩大到145B。在这项初步研究中,DeepSeekMoE 145B使用245B令牌进行训练,但它已经证明了优于GShard架构的持续优势,并有望达到或超过DeepSeek 67B(密集型)的性能。此外,在DeepSeekMoE 145B的最终版本和全面培训完成后,我们还计划将其公之于众。


7.1 实验设置

7.1.1 训练数据和标记化

对于DeepSeekMoE 145B,我们使用了与DeepSeekMoE 16B完全相同的训练语料库和标记器,唯一的区别是DeepSeek MoE 145B在初始研究中使用了245B标记进行训练。
模型设置。对于DeepSeekMoE 145B,我们将Transformer层数设置为62,隐藏维度设置为4096。我们采用多头注意力机制,共有32个注意力头,每个头的尺寸为128。至于初始化,所有可学习的参数都是随机初始化的,标准偏差为0.006。与DeepSeekMoE 16B一样,我们也用MoE层替换除第一层之外的所有FFN。每个MoE层由4个共享专家和128个路由专家组成,其中每个专家的大小是标准FFN的0.125倍。每个令牌将被路由到这4个共享专家和128个路由专家中的12个。在这种配置下,DeepSeekMoE 145的总参数约为144.6B,激活的参数数量约为22.2B。

7.1.2 超参数

我们使用AdamW优化器(Loshchilov和Hutter,2019),将超参数设置为𝛽1=0.9,𝛽2=0.95,并且weight_decay=0.1。为了对DeepSeekMoE 145B进行初步研究,我们采用了一种预热和恒定学习率调度器。最初,在前2K个步骤中,学习率从0线性增加到最大值。
随后,在剩余的训练过程中,学习率保持不变。DeepSeekMoE 145B的最大学习率设置为3.0×10−4,梯度裁剪范数设置为1.0。批大小设置为4.5K,最大序列长度为4K,每个训练批包含18M个令牌。我们对DeepSeekMoE 145B进行了13000步的训练,获得了245B的训练令牌。此外,我们在训练期间不使用dropout。我们利用流水线并行性将模型的不同层部署在不同的设备上,对于每一层,所有路由的专家将统一部署在4个设备上(即专家并行性与数据并行性相结合)。由于我们为DeepSeekMoE 145B采用了专家并行性,因此应考虑设备级负载平衡以减少计算瓶颈。作为回应,我们将设备级平衡因子设置为0.05,以鼓励跨设备的平衡计算。此外,我们仍然设置了0.003的小专家级平衡因子来防止路由崩溃。

7.1.3 评估基准

评估基准。我们在与DeepSeekMoE 16B完全相同的内部基准上评估DeepSeekMoE 145B(见第5.1.3节)。


7.2 评估结果

从表6中的评估结果来看,我们有以下观察结果:

  1. DeepSeekMoE架构的优势。
  2. 总体而言,DeepSeekMoE 145B的计算量仅为28.5%,其性能与DeepSeek 67B(密集型)相当。与DeepSeekMoE 16B的研究结果一致,DeepSeekMoE 145B在语言建模和知识密集型任务中表现出显著的优势,但在多项选择任务中存在局限性。
  3. 在更大的范围内,DeepSeekMoE 142B(半激活)的性能与DeepSeekMoE 145B并没有太大差距。此外,尽管只有一半的激活专家参数,DeepSeekMoE 142B(半激活)的性能仍然与DeepSeek 67B(密集)相匹配,计算量仅为18.2%。它也优于GShard 137B,这与第4.5节的结论一致。

在这里插入图片描述


8. 相关工作

Jacobs等人(1991)首次提出了专家混合(MoE)技术;Jordan和Jacobs(1994)用独立专家模块处理不同的样本。Shazeer等人(2017)将MoE引入语言模型训练,并构建了一个基于LSTM的大规模MoE模型(Hochreiter和Schmidhuber,1997)。随着Transformer成为NLP中最流行的架构,任何将Transformer中的FFN扩展为MoE层以构建MoE语言模型的尝试。GShard(Lepikhin等人,2021)和Switch Transformer(Fedus等人,2021年)是采用可学习的top-2或top-1路由策略将MoE语言模型大规模扩展的先驱。哈希层(Roller等人,2021)和StableMoE(Dai等人,2022b)使用固定路由策略进行更稳定的路由和训练。Zhou等人(2022)提出了一种专家选择路由策略,其中每个令牌可以分配给不同数量的专家。

Zoph(2022)重点研究了MoE模型中训练不稳定和微调困难的问题,并提出了ST MoE来克服这些挑战。除了对MoE架构和训练策略的研究外,近年来还出现了许多基于现有MoE架构的大规模语言或多模态模型(Du等人,2022;Lin等人,2021;Ren等人,2023;Xue等人,2023)。总的来说,之前的大多数MoE模型都是基于传统的前1或前2路由策略,为提高专家专业化留下了很大的空间。作为回应,我们的DeepSeekMoE架构旨在最大限度地提高专家专业化水平。

在这里插入图片描述


9. 结论

本文介绍了用于MoE语言模型的DeepSeekMoE架构,旨在实现最终的专家专业化。
通过细粒度的专家分割和共享专家隔离,DeepSeekMoE与主流的MoE架构相比,实现了更高的专家专业化和性能。
从2B参数的适度规模开始,我们验证了DeepSeekMoE的优势,证明了其接近MoE模型上限性能的能力。此外,我们提供的实证证据表明,DeepSeekMoE的专家专业化水平高于GShard。扩展到16B总参数的更大范围,我们在2T令牌上训练DeepSeekMoE 16B,并展示了其与DeepSeek 7B和LLaMA2 7B相当的出色性能,仅需约40%的计算。此外,还对对齐进行了监督微调,以构建基于DeepSeekMoE 16B的MoE聊天模型,进一步展示了其适应性和通用性。此外,我们进行了初步探索,将DeepSeek MoE扩展到145B参数。我们发现,DeepSeekMoE 145B仍然比GShard架构具有实质性的优势,并且与DeepSeek 67B的性能相当,只使用了28.5%(甚至18.2%)的计算量。

我们向公众发布了DeepSeekMoE 16B的模型检查点,该检查点可以部署在具有40GB内存的单个GPU上。我们希望这项工作能为学术界和工业界提供有价值的见解,并为大规模语言模型的加速发展做出贡献。


版权声明:
本文由 youcans@xidian 对论文 DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models 进行摘编和翻译。该论文版权属于原文作者,本译文只供研究学习使用。

youcans@xidian 作品,转载必须标注原文链接:
【DeepSeek论文精读】3. DeepSeekMoE:迈向混合专家语言模型的终极专业化
Copyright 2024 youcans, XIDIAN
Crated:2025-02

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14168.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取 其实对做自媒体的人而言,整理素材其实是一件非常耗时的事情,今天我们来看一下如何使用Cursor来帮我们解决这些问题,首先我们要建一个单独的项目,因为这个项目不涉及任何代码操作,只是文字相关的事情,还有就是这个项目需…

【Android开发AI实战】基于CNN混合YOLOV实现多车牌颜色区分且针对车牌进行矫正识别(含源码)

文章目录 引言单层卷积神经网络(Single-layer CNN)📌 单层 CNN 的基本结构📌 单层 CNN 计算流程图像 透视变换矫正车牌c实现🪄关键代码实现:🪄crnn结构图 使用jni实现高级Android开发&#x1f3…

LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)

代码下载:LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab) LSSVM最小二乘支持向量机多变量多步光伏功率预测 一、引言 1.1、研究背景与意义 随着全球能源危机和环境问题的日益严重,可再生能源的开发利用成为了世界各国…

设计模式Python版 代理模式

文章目录 前言一、代理模式二、代理模式示例三、远程代理四、虚拟代理五、虚拟代理示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型…

自动化测试(selenium篇)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是自动化测试 自动化测试通俗一些来讲,就是相当于将人工测试手段进行转换,让代码去自动执行。 自动化测试主要分为:单元…

【大模型】DeepSeek与chatGPT的区别以及自身的优势

目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…

RK3568平台开发系列讲解(ConfigFS篇)ConfigFS核心数据结构

🚀返回专栏总目录 文章目录 一、数据结构二、结构体关系三、案例3.1、configfs_subsystem 实例3.2、config_group 实例化四、属性和方法五、config_item实例化沉淀、分享、成长,让自己和他人都能有所收获!😄 理解 ConfigFS 的核心数据结构对于深入使用和定制 ConfigFS 非…

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块,它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南,涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …

网络工程师 (22)网络协议

前言 网络协议是计算机网络中进行数据交换而建立的规则、标准或约定的集合,它规定了通信时信息必须采用的格式和这些格式的意义。 一、基本要素 语法:规定信息格式,包括数据及控制信息的格式、编码及信号电平等。这是协议的基础,确…

【AI】在Ubuntu中使用docker对DeepSeek的部署与使用

这篇文章前言是我基于部署好的deepseek-r1:8b模型跑出来的 关于部署DeepSeek的前言与介绍 在当今快速发展的技术环境中,有效地利用机器学习工具来解决问题变得越来越重要。今天,我将引入一个名为DeepSeek 的工具,它作为一种强大的搜索引擎&a…

【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信

Kubernetes中Pod间的通信 本系列文章共3篇: 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信(本文介绍)【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信…

Excel 融合 deepseek

效果展示 代码实现 Function QhBaiDuYunAIReq(question, _Optional Authorization "Bearer ", _Optional Qhurl "https://qianfan.baidubce.com/v2/chat/completions")Dim XMLHTTP As ObjectDim url As Stringurl Qhurl 这里替换为你实际的URLDim postD…

MacOS 安装NVM

MacOS 安装NVM 方法一:使用Homebrew安装nvm 打开终端(Terminal),输入以下命令安装Homebrew: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装nvm…

采用idea中的HTTP Client插件测试

1.安装插件 采用idea中的HTTP Client插件进行接口测试,好处是不用打开post/swagger等多个软件,并且可以保存测试时的参数,方便后续继续使用. 高版本(2020版本以上)的idea一般都自带这个插件,如果没有也可以单独安装. 2.使用 插件安装完成(或者如果idea自带插件),会在每个Con…

LabVIEW铅酸蓄电池测试系统

本文介绍了基于LabVIEW的通用飞机铅酸蓄电池测试系统的设计与实现。系统通过模块化设计,利用多点传感器采集与高效的数据处理技术,显著提高了蓄电池测试的准确性和效率。 ​ 项目背景 随着通用航空的快速发展,对飞机铅酸蓄电池的测试需求也…

Python----Python高级(并发编程:协程Coroutines,事件循环,Task对象,协程间通信,协程同步,将协程分布到线程池/进程池中)

一、协程 1.1、协程 协程,Coroutines,也叫作纤程(Fiber) 协程,全称是“协同程序”,用来实现任务协作。是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理。 当出现IO阻塞时,…

go语言中的反射

为什么会引入反射 有时我们需要写一个函数,这个函数有能力统一处理各种值类型,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在,这个时候我们就可以用到反射。 空接口可…

Mac电脑上好用的压缩软件

在Mac电脑上,有许多优秀的压缩软件可供选择,这些软件不仅支持多种压缩格式,还提供了便捷的操作体验和强大的功能。以下是几款被广泛推荐的压缩软件: BetterZip 功能特点:BetterZip 是一款功能强大的压缩和解压缩工具&a…

大学资产管理系统中的下载功能设计与实现

大学资产管理系统是高校信息化建设的重要组成部分,它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展,下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…

UnityShader学习笔记——动态效果

——内容源自唐老狮的shader课程 目录 1.原理 2.Shader中内置的时间变量 3.Shader中经常会改变的数据 4.纹理动画 4.1.背景滚动 4.1.1.补充知识 4.1.2.基本原理 4.2.帧动画 4.2.1.基本原理 5.流动的2D河流 5.1.基本原理 5.2.关键步骤 5.3.补充知识 6.广告牌效果 …