yuanzhoulvpi2017 / zero_nlp

中文nlp解决方案(大模型、数据、模型、训练、推理)
MIT License
2.85k stars 355 forks source link

多卡并行训练并没有提升速度反而变慢了些,这是为什么 #96

Closed heheyzc closed 1 year ago

heheyzc commented 1 year ago

我使用了4张3060显示进行微调,原来单张3060训练时间是2个小时30分钟,现在4卡并行训练时间反而接近3小时了,是什么原因呢 image image image

cywjava commented 1 year ago

卡之间的通信耗时导致的。

heheyzc commented 1 year ago

卡之间的通信耗时导致的。

谢谢,但是这样4卡不如一卡不是很合理,这样并行训练没有啥意义了不如单卡训练,有什么办法可以优化吗

yuanzhoulvpi2017 commented 1 year ago
  1. 3060 之间没有nvlink,卡之间的带宽不够,导致通讯有损耗,本来nvidia就是对他阉割的了。
  2. 不理解你说的4卡不如1卡是什么意思,4个3060显存加起来有12x4 = 48G了。显存完全串联起来了:
    • 2.1. 让你的文本长度可以更长,一个卡做不到;
    • 2.2. 单卡只能使用int4或者int8或者fp16,但是多卡可以让你直接使用f32;
    • 2.3. 单卡只能让你使用lora、ptuning,但是多卡,你可以直接微调全量参数;

考虑问题,就从成本出发。鱼和熊掌不能兼得

heheyzc commented 1 year ago
  1. 3060 之间没有nvlink,卡之间的带宽不够,导致通讯有损耗,本来nvidia就是对他阉割的了。
  2. 不理解你说的4卡不如1卡是什么意思,4个3060显存加起来有12x4 = 48G了。显存完全串联起来了:
  • 2.1. 让你的文本长度可以更长,一个卡做不到;
  • 2.2. 单卡只能使用int4或者int8或者fp16,但是多卡可以让你直接使用f32;
  • 2.3. 单卡只能让你使用lora、ptuning,但是多卡,你可以直接微调全量参数;

考虑问题,就从成本出发。鱼和熊掌不能兼得

是的,原来单卡我跑的是int8,现在多卡我用上了32。目前是想提升微调的效率,这么讲3060多卡(3060 之间没有nvlink,卡之间的带宽不够,导致通讯有损耗)并不能提升微调的效率,很感谢你的解答

yuanzhoulvpi2017 commented 1 year ago
  1. 3060 之间没有nvlink,卡之间的带宽不够,导致通讯有损耗,本来nvidia就是对他阉割的了。
  2. 不理解你说的4卡不如1卡是什么意思,4个3060显存加起来有12x4 = 48G了。显存完全串联起来了:
  • 2.1. 让你的文本长度可以更长,一个卡做不到;
  • 2.2. 单卡只能使用int4或者int8或者fp16,但是多卡可以让你直接使用f32;
  • 2.3. 单卡只能让你使用lora、ptuning,但是多卡,你可以直接微调全量参数;

考虑问题,就从成本出发。鱼和熊掌不能兼得

是的,原来单卡我跑的是int8,现在多卡我用上了32。目前是想提升微调的效率,这么讲3060多卡(3060 之间没有nvlink,卡之间的带宽不够,导致通讯有损耗)并不能提升微调的效率,很感谢你的解答

你想想,都3060了,还要啥自行车😂

cywjava commented 1 year ago

我这里一台GPU装了 8张P40,另外一台装了 5张3090,那我可以搞全量参数?训练数据从哪里搞呢

yuanzhoulvpi2017 commented 1 year ago

我这里一台GPU装了 8张P40,另外一台装了 5张3090,那我可以搞全量参数?训练数据从哪里搞呢

网上不是一大堆数据嘛,随便搞点就行了

cywjava commented 1 year ago

今 天我又搞了一个NVLINK,用在5卡3090上。 image 发现我的batch_size 可以开到18了。。。

image

cywjava commented 1 year ago
  • 可以直接微调全量参数;

你说的2.3 可以直接微调全量参数;意思是不用lora ptuning了? 怎么个直接调法?