MLNLP 
机器学习算法与自然语言处理 
)社区是国内外知名自然语言处理社区,受众覆盖国内外NLP硕博生、高校老师以及企业研究人员。

社区的愿景 是促进国内外自然语言处理,机器学习学术界、产业界和广大爱好者之间的交流,特别是初学者同学们的进步。

本文转载自 | 知乎
作者 | FlagAI飞智
来源 | https://zhuanlan.zhihu.com/p/533381273

1
『简介』
Meta AI 开源 OPT系列模型,其中最大模型1750 亿参数(需申请访问权限)媲美 GPT-3。OPT系列模型包括了多组不同参数规模的模型权重,如图:
OPT开源了一系列大模型,但是实际调用这些模型有很高的技术门槛。为了推广大模型的技术,FlagAI一键加载OPT不同版本的模型,后面也会持续完善。本篇文章主要简要科普OPT模型的结构,列举复现OPT模型的过程中遇到的困难,并给出使用FlagAI快速加载OPT模型示例代码。关于FlagAI更详细的介绍可以查阅大模型一键调用方案来了!北京智源人工智能研究院推出NLP大模型训练框架FlagAI
FlagAI仓库地址:https://github.com/BAAI-Open/FlagAI
OPT模型论文地址: https://arxiv.org/pdf/2205.01068.pdf
Github仓库地址: https://github.com/facebookresearch/metaseq
175B模型申请访问权限地址: https://forms.gle/dag8g7nKiR4o4VZq5
2
『背景』
OPT全称Open Pre-trained Transformer Language Models,即“开放的预训练Transformer语言模型”。我们都知道GPT-3有着非常惊艳的效果,网上也有很多有意思的demo展示,但是其模型权重并没有开源,我们无法查看到其内部具体的原理;而这次Meta AI 直接开源千亿参数的OPT模型,对标GPT3,模型性能方面,在多个任务,不管是zero-shot还是multi-shot中都取得了与GPT-3可比的成绩(左图为zero-shot,右图为multi-shot):
值得注意的是,在模型结构方面,OPT与GPT系列模型均采用了Transformer-Decoder结构,使用了下三角的Mask,因此在解码时自左向右进行自回归的预测。
3
『使用FlagAI快速下载并使用OPT系列模型』
目前FlagAI已经集成opt125m、opt350m、opt1.3b、opt2.7b、opt6.7b、opt13b、opt30b模型,更大参数量的模型正在陆续支持,只需要两行代码便可以直接进行加载:

如果已经安装了FlagAI (pip install -U flagai),便可以通过上述代码直接进行下载、使用。

opt-13b模型下载过程如图所示:
生成结果为:
输入:

How about the book The Old Man and the Sea?

Thanks for your question, let me share my thoughts:

输出:

I think that "The Old Man and the Sea" is a great read.

It has many themes which are very interesting but also relatable in some cases (not only for readers).

In conclusion, I would definitely recommend this book to everybody.
100亿以上模型的加载和推理
模型参数在10b以上的时候,单卡可能就会遇到OOM的问题。为此,可以采用cpu加载/多GPU加载的方式。
CPU加载方式
from flagai.model.predictor.predictor import Predictor

from flagai.auto_model.auto_loader import AutoLoader


loader = AutoLoader(task_name="lm",

model_name="opt-30b-en")


model = loader.get_model()

tokenizer = loader.get_tokenizer()

model.eval()


text = "The trophy doesn’t fit in the suitcase because "

predictor = Predictor(model, tokenizer)

out = predictor.predict_generate_randomsample(text,

input_max_length=100,

out_max_length=300,

top_k=30,

top_p=0.9,

repetition_penalty=3.0)


print(f"input is {text} \n out is {out}")
CPU测试结果&资源占用
30b的模型有63G,使用了36个cpu 和120G内存的情况下,运行了18分钟(不包括模型下载的时间),得到如下输出。
4
『多GPU加载方式』
63G的模型,在不开fp16的情况下,需要至少3张32GV100 才能加载。通过模型并行的方式,将模型权重加载到不同的显卡上。FlagAI采用Megatron-LM的算子切分方式,通过设置参数model_parallel_size就能将模型自动切分成到多个显卡上。这里为了展示效果,我们设置model_parallel_size=4,详情参考下方文件链接:
FlagAI/opt_30b_en_mutigpu.py at master · BAAI-Open/FlagAI (github.com)

多GPU测试结果&资源占用

主要的耗时在模型的切分(18分钟),之后模型的加载和推理耗时22分钟(注:我们测试的机器多人共用,导致模型加载耗时更长,不能代表真实水平)

OPT与GPT-2模型差异细节

OPT模型与GPT2模型同样都使用了Transformer-Decoder结构, 为了尽量多的复用代码,有以下几个方面需要统一:
  1. config配置文件需要统一:OPT模型与GPT-2模型配置文件字段各不相同,为了共用代码,需要将配置文件字段进行统一;
  2. 模型结构需要统一:虽然两者都是Transformer-Decoder结构,但还是有一些细节上的不同,例如OPT模型的位置编码比较特殊(利用attention mask计算得到);GPT-2模型为可学习的绝对位置编码;OPT模型可以通过配置文件字段修改layernorm层的位置(放在Attention与MLP层之前或者是之后);OPT模型的字嵌入层维度与隐藏维度有时候是不同的,而GPT-2模型相同。
  3. 自定义预训练权重转换函数,由于两个模型的预训练权重结构相差很大,因此需要自定义权重的转换函数,用于同时加载OPT与GPT系列模型的预训练权重。
只需要对以上几点进行统一,便可以实现OPT与GPT模型的统一调用。如果对这块更详细的技术细节感兴趣,可以留言,我们将会分享更多的细节介绍。

OPT125m可能存在乱码问题

经过实验发现,不管是使用huggingface还是使用FlagAI加载OPT125m模型,在解码的时候总会出现一些乱码的情况,如图:
目前相关的问题已经提交issue到transformers的仓库中:
https://github.com/huggingface/transformers/issues/17735
其他参数量大小的模型目前没有发现问题。
后记:这块确实是有问题的,原因是漏掉了一个final_layer_norm层,目前huggingface已经修正。
https://github.com/huggingface/transformers/pull/17785
5
『总结』
Meta AI 开源最大175B参数量、媲美GPT-3的OPT系列模型,是业界首次开源如此大参数规模的预训练模型,可以让我们更好了解大模型内部运作原理、验证模型并行等加速技术。
FlagAI将持续更新对NLP/CV领域大模型的支持,简化下载和使用的流程。欢迎大家下载使用,在使用的过程中如有任何问题也欢迎交流。
技术交流群邀请函
△长按添加小助手
扫描二维码添加小助手微信
请备注:姓名-学校/公司-研究方向
(如:小张-哈工大-对话系统)
即可申请加入自然语言处理/Pytorch等技术交流群

关于我们

MLNLP社区  机器学习算法与自然语言处理 ) 是由国内外自然语言处理学者联合构建的民间学术社区,目前已经发展为国内外知名自然语言处理社区,旗下包括  万人顶会交流群、AI臻选汇、AI英才汇  以及  AI学术汇  等知名品牌,旨在促进机器学习,自然语言处理学术界、产业界和广大爱好者之间的进步。
社区可以为相关从业者的深造、就业及研究等方面提供开放交流平台。欢迎大家关注和加入我们。
继续阅读
阅读原文