欢迎使用BMInf!
BMInf (Big Model Inference) 是一个用于大规模预训练语言模型(pretrained language models, PLM)推理阶段的低资源工具包。
简介
BMInf (Big Model Inference) 是一个用于大规模预训练语言模型(pretrained language models, PLM)推理阶段的低资源工具包。
硬件友好 BMInf最低支持在NVIDIA GTX 1060单卡运行百亿大模型。在此基础上,使用更好的gpu运行会有更好的性能。在显存支持进行大模型推理的情况下(如V100或A100显卡),BMInf的实现较现有PyTorch版本仍有较大性能提升。
开源共享 模型参数开源共享,用户在本地即可部署运行,无需访问或申请API。
能力全面 支持生成模型CPM1 [1]、通用模型CPM2 [2]、对话模型EVA [3],模型能力覆盖文本补全、文本生成与对话场景。
模型升级 基于持续学习推出百亿模型新升级CPM2.1 [2],文本生成能力大幅提高。
应用便捷 基于工具包可以快速开发大模型相关下游应用。
支持模型
BMInf目前支持下列模型:
CPM2.1. CPM2.1是CPM2 [1] 的升级版本。CPM2是一个拥有110亿参数的通用中文预训练语言模型。基于CPM2,CPM2.1新增了一个生成式的预训练任务并基于持续学习范式进行训练。实验结果证明CPM2.1比CPM2具有更好的生成能力。
CPM1. CPM1 [2] 是一个拥有26亿参数的生成式中文预训练语言模型。CPM1的模型架构与GPT [4] 类似,它能够被应用于广泛的自然语言处理任务,如对话、文章生成、完形填空和语言理解。
EVA. EVA [3] 是一个有着28亿参数的中文预训练对话模型。EVA在很多对话任务上表现优异,尤其是在多轮人机交互对话任务上。
除了这些模型,我们目前致力于导入更多的预训练语言模型,尤其是大规模预训练语言模型。我们欢迎每一位贡献者通过提交issue来添加他们的模型。
运行性能
下表汇报了我们在不同平台上运行CPM2编码器和解码器的速度。用户可以在本机运行benchmark/cpm2/encoder.py
和benchmark/cpm2/decoder.py
来测试本机运行速度。
实现 | GPU | 编码速度 (tokens/s) | 解码速度 (tokens/s) |
---|---|---|---|
BMInf | NVIDIA GeForce GTX 1060 | 718 | 4.4 |
BMInf | NVIDIA GeForce GTX 1080Ti | 1200 | 12 |
BMInf | NVIDIA GeForce GTX 2080Ti | 2275 | 19 |
BMInf | NVIDIA Tesla V100 | 2966 | 20 |
BMInf | NVIDIA Tesla A100 | 4365 | 26 |
PyTorch | NVIDIA Tesla V100 | - | 3 |
PyTorch | NVIDIA Tesla A100 | - | 7 |
参与贡献
我们提供了微信的开源社区二维码并且欢迎贡献者参照我们的贡献指南贡献相关代码。
开源许可
该工具包使用Apache 2.0开源许可证。
参考文献
CPM-2: Large-scale Cost-efficient Pre-trained Language Models. Zhengyan Zhang, Yuxian Gu, Xu Han, Shengqi Chen, Chaojun Xiao, Zhenbo Sun, Yuan Yao, Fanchao Qi, Jian Guan, Pei Ke, Yanzheng Cai, Guoyang Zeng, Zhixing Tan, Zhiyuan Liu, Minlie Huang, Wentao Han, Yang Liu, Xiaoyan Zhu, Maosong Sun.
CPM: A Large-scale Generative Chinese Pre-trained Language Model. Zhengyan Zhang, Xu Han, Hao Zhou, Pei Ke, Yuxian Gu, Deming Ye, Yujia Qin, Yusheng Su, Haozhe Ji, Jian Guan, Fanchao Qi, Xiaozhi Wang, Yanan Zheng, Guoyang Zeng, Huanqi Cao, Shengqi Chen, Daixuan Li, Zhenbo Sun, Zhiyuan Liu, Minlie Huang, Wentao Han, Jie Tang, Juanzi Li, Xiaoyan Zhu, Maosong Sun.
EVA: An Open-Domain Chinese Dialogue System with Large-Scale Generative Pre-Training. Hao Zhou, Pei Ke, Zheng Zhang, Yuxian Gu, Yinhe Zheng, Chujie Zheng, Yida Wang, Chen Henry Wu, Hao Sun, Xiaocong Yang, Bosi Wen, Xiaoyan Zhu, Minlie Huang, Jie Tang.
Language Models are Unsupervised Multitask Learners. Alec Radford, Jeffrey Wu, Rewon Child, David Luan, Dario Amodei, and Ilya Sutskever.
安装
用pip安装 (推荐)
pip install bminf
从源代码安装
git clone https://github.com/OpenBMB/BMInf.git
cd BMInf
python setup.py install
从Docker安装
docker run -it --gpus 1 -v $HOME/.cache/bigmodels:/root/.cache/bigmodels --rm openbmb/bminf python3 examples/fill_blank.py
安装完成后, 你可以运行examples
文件夹中的样例来检查是否安装正确。
python examples/fill_blank.py
硬件要求
在下表中我们列出了运行BMInf的最低配置与推荐配置:
最低配置 | 推荐配置 | |
---|---|---|
内存 | 16GB | 24GB |
GPU | NVIDIA GeForce GTX 1060 6GB | NVIDIA Tesla V100 16GB |
PCI-E | PCI-E 3.0 x16 | PCI-E 3.0 x16 |
BMInf支持计算能力6.1或更高的GPU,查看对照表来明确你的GPU是否被支持。
软件要求
BMInf需要安装CUDA 10.1及以上版本,所有的依赖包都会在安装过程中自动被安装。
python >= 3.6
requests
tqdm
jieba
numpy
cpm_kernels >= 1.0.9
如果你想使用基于PyTorch的反向传播功能,确保在使用前安装了torch
。
Demo介绍
BMInf-Demos是根据BMInf中的模型设计的应用示例。它们分别是:
文本填空 它是根据CPM2.1模型设计的用例,它可以支持文本段落的任意输入,并根据上下文语义生成相应的空白内容。
故事生成 它是根据CPM1模型设计的例子,用户只需要写一段开头,它就可以为你创造一篇精彩的文章。
智能对话 这是我们基于EVA模型创建的一个示例。在这里,你可以和AI进行无障碍对话。
演示
文本填空演示

故事生成演示

智能对话演示

安装
安装
nvidia-docker2
后运行下面的命令:
$ docker run -it --gpus 1 -v $HOME/.cache/bigmodels:/root/.cache/bigmodels -p 0.0.0.0:8000:8000 --rm openbmb/bminf-demos
打开浏览器访问 http://localhost:8000/ 即可使用。
低资源推理技术
这篇文章将简单的介绍大模型推理工具包的运行机制,并展示我们如何在GTX 1060 GPU上运行CPM2-11B模型。我们目前使用的这些技术是基于CUDA以及相关数学库实现的,所以目前只支持NVIDIA的GPU。在之后的更新中,我们将会考虑加入对ROCm的支持,让我们的工具包也可以运行在AMD的GPU上。
背景介绍
CPM2-11B(悟道·文源)模型发布于2021年6月,你可以在 TsinghuaAI中获取更多和它相关的信息,包括模型预训练和微调的代码。CPM2-11B是一个巨大的预训练语言模型,它包含了11B(110亿)个参数,在公开发布的模型文件中每个参数使用了16-bit(2 byte)的浮点数来存储,总共的模型文件大小也达到了22GB。对于一块普通的机械硬盘来说,光是读取这样大小的模型就已经会花费数分钟的时间,更不用说将这样庞大的数据放进内存和GPU中进行后继的运算。
在这个工具包的设计过程中,我们预设了GTX 1060 6GB显存和16GB内存这样的最低配置要求,根据这样的配置要求,我们使用了一系列的技术让一个大规模的预训练语言模型可以运行在一台普通的电脑上,并进行相关的推理运算。
相关技术
模型压缩
对于一个22GB的模型来说,要使用它并进行推理就需要一块显存大小至少为22GB的GPU。满足这样条件的GPU通常是很昂贵的(例如 V100 32GB, A100, RTX 3090),为了能让模型能在更小显存的GPU上运行,最直接的想法就是对模型进行压缩。在保留模型原有的结构的基础下,我们将模型中占比最大的线性层参数,从16bit浮点数转换为了int8格式,使用这种方法几乎可以让模型的大小缩小50%,但是与此同时带来的后果则是模型具体的效果会有所下降。
CPM2-11B 参数占比
为了让压缩后的模型更贴近于原来的效果,我们在将参数转换为int8格式以后还进行了几千次迭代的微调,来让模型适应新的参数精度。在经过几千次迭代更新后,压缩后的模型基本上已经达到了和原始模型相近的能力。在具体的PPL指标中,压缩后的模型相比于压缩前只相差了5~10左右。
显存调度
在使用了模型压缩技术后,我们成功将原本大小22GB的模型压缩到了11GB,但这还远远不够。虽然对于NVIDIA旗舰级别GPU来说(例如:GTX 1080Ti, RTX 2080Ti),11GB显存已经是一个可以摸到的门槛了,但是考虑到在推理过程中我们还需要使用一些额外的空间来存储运算的中间变量,这样的显存容量依旧不太够用。另外,能够拥有这样旗舰级别显卡的用户数量也是很少的,因为它的价格太过于昂贵,对于大多数人来说,像GTX 1060这样甜点级的GPU才更受青睐。
要让一个11GB大小的模型运行在显存容量只有6GB的GPU上,我们需要对显存的使用进行精细的管理,将需要用于进行运算的模型参数提前准备好,放置在显存中,而对于暂时不需要用到的部分,则放置在CPU内存中。这样的技术其实早在CUDA 8中就已经被引入了,叫做Unified Memory,它是一种类似于CPU虚拟内存的机制,将CPU内存作为GPU显存的二级存储来使用。不过由于一些原因,我们没有直接使用这样的技术,而是手动实现了一个它的类似版本,以模型层为最小的粒度来调度GPU显存资源。
bminf 显存调度
在具体的实现过程中,我们使用了两个独立的内存池,交替的用于计算和加载参数。并通过将计算的时间和参数加载的时间重叠来提升整体的推理效率。通过调整每次加载和运算的层数,可以将大模型适配到不同显存容量的GPU。根据我们的一些实验表明,将更多的模型层驻留在GPU中通常可以带来更好的效率,在整个模型推理的过程中,瓶颈往往在于内存和显存的拷贝,这也是工具包之后会优化的一个方面。
总结
通过模型压缩和内存调度技术,我们成功的让CPM2-11B模型运行在了GTX 1060 6GB的GPU上,并且达到了类似于打字机一样的运行效率(1字/秒)。当然,除了CPM2-11B这样的大模型以外,我们的工具包也提供了一些更小规模的模型,它们也是用了同样的技术,不过相比于CPM2会运行得更快一些。