MoE 是什么
MoE means Mixture of Experts,它是一种神经网络架构,可以把一个大模型拆分成多个小型的 expert,再用一个门控网络来决定每个输入该路由到哪些专家处理。
上一篇文章我们学的是 DP 和 DDP,它们的思路是 用显存冗余换吞吐量。每张 GPU都有完整模型,但是只处理不同的数据,它的本质是复制模型 → 并行处理数据 → 最后通过 AllReduce 同步梯度,代价是模型被复制 N 份,占用 N 倍显存。张量并行 Tensor Parallel 的思路正好相反是 用通信换显存。现在的大模型参数量巨大一张卡很可能放不下,所以把模型拆到多卡,每张 GPU 只有部分模型,但是处理完整的数据,最后进行合并。
今天看了一下源码和官方文档,梳理过后会发现其实也不是很复杂,简单理解就两条:
ModelOutput(transformers.utils.ModelOutput)是所有模型输出的基类。简单理解它就是一个字典,在模型的 forward函数里把原本的输出做了一下封装而已,方便用户能直观地知道输出是什么。例如CausalLMOutput顾名思义就是用于像 GPT 这样自回归模型的输出。PreTrainedModel (transformers.modeling_utils.PretrainedModel) 是所有模型的基类。所以你如果看到一个模型取名为LlamaForCausalLM,那你就可以知道这个模型的输出格式大概率就是自回归输出,即前面提到的CausalLMOutput。为什么说大概率呢,因为自回归输出还有蛮多种的,赶时间的朋友看到这就可以切换到其他文章了,至此你应该也能了解 transformers 最核心的模块了。感兴趣的可以继续往下看,下面做一个简单的总结和介绍。前面已经介绍过了,ModelOutput是所有模型输出的基类。下面是其源码核心部分,一些具体实现代码删除了,不过不影响理解。