如果是真大规模炼丹,那没什么好说的,直接3D并行。
Megatron-Deepspeed拥有多个成功案例,炼LLaMA可以参考LydiaXiaohongLi大佬的实现。(实在太强)
https://github.com/microsoft/Megatron-DeepSpeed/pull/139
炼BLOOM可以直接找到Bigscience的git仓库。
然而,转checkpoint还是挺费劲的。
小门小户一共就几台机器几张卡的话,3D并行有点屠龙术了。
张量并行只有在nvlink环境下才会起正向作用,但提升也不会太明显。
可以分2种情况:
https://github.com/RapidAI/Open-Llama
https://github.com/HuangLK/transpeeder
如果资源特别少,显存怎么也不够,可以上LoRA。
https://github.com/shibing624/MedicalGPT
4. 增量预训练 训练流程 是怎么样?
参考LLaMA的预训练长度,也把数据处理成2048长度(如果不够,做补全)
这里要吐槽,tencentpretrain数据处理脚本的默认长度竟然是128。
有很多工作加LLaMA中文词表,但是考虑到没有定论说加中文词表会更好,先用原版的吧,500k的
tokenizer.model。
https://github.com/ymcui/Chinese-LLaMA-Alpaca
可以使用一个中文增量预训练后的版本,当然这里坑挺大的,各家框架的模型层名不太一样。
为了快速跑通,用脚本快速转一下,能成功加载就行。
如果显存不够,可以zero3+offload。其他参数暂时默认吧。(事实上没有想象中慢)
多机的话可以配一下deepspeed的hostfile。
这一点可能是最重要的,跑通只是第一步,根据训练情况反复调整比较重要。
可以使用wandb,记录loss,flops,吞吐速度,已消耗的token数,和测试ppl。
不同框架的checkpoint格式不同,还会根据并行度分成很多个文件。
以ZeRO为例,我的转换流程(很挫)是:
转为标准huggingface格式后可以用各种支持llama的前端加载,比如text-generation-webui。
1. 少量节点训练
• 单节点或者多节点(节点间通信快):直接deepspeed ZeRO吧。(笔者用了linly的增量预训练代码,但有
能力的最好用其他代码)比如,Open-Llama的fork版本。
• 多节点(但节点间通信慢):考虑用流水线并行,参考另一个大佬的实现。
1. 少量卡训练
1. 数据预处理
1. 分词器
1. 原始模型
1. 训练参数
1. 观测训练进展
1. 模型转换
• zero to f32
• f32 to fp16
• fp16 to huggingface格式
1. 模型测试
评论