其他
李白:你的模型权重很不错,可惜被我没收了
简单易用的分布式代码,单机代码和分布式代码基本一致 可以无缝使用PyTorch、HuggingFace的model权重,并且还可以在LiBai下进行多机多卡的分布式推理 开箱即用,所有的分布式并行配置(Grad Acc,AMP,Checkpointing,ZeRO,Auto Parallel)技术都只需要在config里面一键设置就可以生效,不需要在算法代码model.py中额外添加 支持模型一键转换 ONNX
我搁这儿就要介绍完的优势(看上去大家也有,很虚的帽子话),为了不让大家觉得过于虚,在介绍的同时也会插入相关的例子。
开源自助
# test_inference.py
from libai.inference.text_generation import TextGenerationPipeline
from libai.utils import distributed as dist
if __name__ == "__main__":
pipeline = TextGenerationPipeline(
"projects/MT5/configs/t5_inference.py",
data_parallel=1,
tensor_parallel=2,
pipeline_parallel=2,
pipeline_stage_id=[0] * 12 + [1] * 12,
pipeline_num_layers=12 * 2,
model_path="data_test/t5_inference_model",
mode="huggingface",
)
text = ["summarize: She is a student, She is tall, She loves study"]
dict1 = pipeline(text)
if dist.is_main_process():
print(dict1)
那么多机多卡的分布式推理脚本
NODE=2 NODE_RANK=0 ADDR=192.168.0.1 PORT=12345 bash tools/infer.sh test_inference.py 2
NODE=2 NODE_RANK=1 ADDR=192.168.0.1 PORT=12345 bash tools/infer.sh test_inference.py 2
细心的朋友已经发现了,LiBai下面可以通过设置pipeline_stage_id, 来让用户自己设置每个stage上group的层数是多少,方便在某些极端情况下(比如你的机器0很强,但是机器1很拉胯,或者你的encoder计算量巨大,但是decoder计算量较小)手动实现负载均衡。
大模型训练
众所周知,大家都喜欢做点"出格"的事情,比如在上班的时候摸鱼,在VScode上面炒股......
那么LiBai呢?你甚至可以拿它来训练模型!
在Projects(https://github.com/Oneflow-Inc/libai/tree/main/projects)下支持的模型:
分布式配置和算法逻辑解耦
# my_config.py
from libai.config import get_config
train = get_config("common/train.py").train
optim = get_config("common/optim.py").optim
graph = get_config("common/models/graph.py").graph
# set dist
train.dist.data_parallel_size = 2
train.dist.tensor_parallel_size = 2
train.dist.pipeline_parallel_size = 2
# set model layers for pipeline
train.dist.pipeline_num_layers = 24
# set pipeline_stage_id according to your own needs.
# if `None`, LiBai will use its own mode of distribution
train.dist.custom_pipeline_stage_id = [0]*14 + [1]*10
# set auto parallel in LiBai
graph.auto_parallel.enabled = True
# enable amp (fp16)
train.amp.enabled = True
# enable gradient clipping
optim.params.clip_grad_norm = 1.0
optim.params.clip_grad_norm_type = 2.0
# enable grad accumulation for 8 steps
train.num_accumulation_steps = 8
# enable activation checkpointing
train.activation_checkpoint.enabled = True
# enable zero for leval-2
train.zero_optimization.enabled = True
train.zero_optimization.stage = 2
单机和分布式代码几乎一致
下面给一个简单的2D并行(数据并行+模型并行)的MLP例子, 比如你的Linear层在16384这个维度上面比较大, 需要把它切分在不同的卡上才能装下, 那么在LiBai下面只需要如下所示就可以完成了,几乎跟单机代码没有区别。
from libai.layers.linear import Linear
from oneflow import nn
# write a Simple 2D Parallel MLP
class MLP_2D(nn.Module):
def __init__(self,):
super().__init__()
self.linear1 = Linear(in_features=1024, out_features=16384, parallel="col")
self.relu = nn.GELU()
self.linear2 = Linear(in_features=16384, out_features=1024, parallel="row")
self.dropout = nn.Dropout(p=0.5)
def forward(self, x):
x = self.linear1(x)
x = self.relu(x)
x = self.linear2(x)
x = self.dropout(x)
return x
支持一键转换ONNX
本人对一键转ONNX的执念可谓是相当之深了。同样以MT5为例子,LiBai支持了一键转换ONNX的功能,点击以下链接就可以体验:
更快的YOLOv5问世,附送全面中文解析教程 中文Stable Diffusion开源;PyTorch优化技巧 开源吞噬AI界?从Stable Diffusion的爆火说起 OneEmbedding:单卡训练TB级推荐模型不是梦 大模型训练难?效率超群、易用的“李白”模型库来了