模型之友2攻略
1、源码解读系列将和大家一起来读的部分代码。在源码解读第一篇中,我们讲解了如何做「分布式环境初始化」,即按照//对进程进行分组,并为每个进程指定。在这一章中,我们将一起读「模型并行部分」:如何切分模型,并搬入分布式环境定义好的//组中。
2、「如何利用本文提高源码阅读效率:」。「阅读本文前置知识:」。二、模型切割在做一件什么事。七、:分布式的一般套路。
3、九、筋疲力尽的总结。十、参考,本文相关源码与论文,前文说过,用做分布式训练的开源大模型有很多,我们选用的是开源的,代码生成式大模型。
4、选用它的原因是“完全开源”与“清晰的模型架构和预训练配置图”,能帮助我们高效阅读源码。我们再来回顾下这两张图。
5、由图可知,在预训练中采用的是8头,同一个内的8张卡做,8张卡组成一个完整的模型,192头,192个间做,一共1536块进行训练。「【阅读提醒】:如果你对模型比较熟悉,则不需要花时间细看架构图也能无障碍阅读本文。架构图只是在涉及模型细节时,可以对照着看回顾一下,在初始化分布式环境中,我们根据//组设置并划分了进程,确定了模型的切割方法,如下图:,注意:这并不是的划分框架,而是一个更广义的例子,细节可阅读上篇讲解,接下来,我们就可以根据这个框架来切割模型了。
模型之友2攻略
1、默认将模型,定义在上,因此,我们在上定义并初始化模型,然后将其搬运到当前进程所对应的上,整个过程如下图:首先,我们是面向进程编程的,也就是整份脚本处理的是发生在1个进程上的事情。这样做的好处是,我们只需要维护1份脚本,然后将其发去不同机器的各张卡上执行,就能实现全局的并行。
2、但是,1个进程处理的是模型的不同部分,比如模型,它的层涉及到计算,层涉及到和的计算,这样每个进程上处理的模型是不一样的,这时怎么办呢。别忘了,我们能够取到进程,全局或//组内的,这样我们就能通过进程,写来解决模型差异化问题了。明确了这个思想,现在我们可以开始写代码了,我们有两种方式对模型进行切割:。这两者的核心差别,在于的设定。
3、在分布式训练中,「随机种子是非常重要的,它关系到模型是否能够复现」。例如我们采取的技术来节省显存时,在过程中我们需要重算得到,这时候就需要我们完整复现之前的过程,各类参数的初始化结果也要和之前完全一致。我们来看几个例子:。
4、1和2间需要采用不同的随机种子。因为若采用相同的随机种子,则1和2的结果完全一样,这不等价于先随机初始化,再将它进行切割。左侧方框中的2个,在初始化时需要用不同的随机种子。因为这样才等价于对完整的做初始化,然后再切割。
5、右侧方框中的,需要用相同的随机种子,虽然右边只画了1个,但其实是2个,每块上各一个,因为此时两块上的输出已经,是完全一致的。做完后,两块继续独立计算,因此实际上有两个,从例子中,我们可以得出一个结论:「一般在/组内,设定不同的随机种子。