大模型入门指南
手册 · 覆盖 运营,约 16 分钟。
什么是大模型
通俗来讲,大模型就是输入大量语料,来让计算机获得类似人类的“思考”能力,使之能够理解自然语言,能够进行『文本生成』、『推理问答』、『对话』、『文档摘要』等工作。
既然是学习,那我们就可以用『上学参加工作』这件事来类比大模型的训练、使用过程:
- 找学校 :: 训练 LLM 需要大量的计算,因此 GPU 更合适,因此只有购买得起大量 GPU 的贵族学校才有资本训练自己的大模型
- 确定教材 :: 大模型顾名思义就是大,需要的数据量特别多,几千亿序列(Token)的输入基本是标配
- 找老师 :: 即用什么样的算法讲述“书本”中的内容,让大模型能够更好理解 Token 之间的关系
- 就业指导 :: 学完书本中的知识后,为了让大模型能够更好胜任某一行业,需要进行微调(fine tuning)指导
- 搬砖 :: 就业指导完成后,下面就要正式干活了,比如进行一次翻译、问答等,在大模型里称之为推导(infer)
在 LLM 中,Token([2]) 被视为模型处理和生成的文本单位。它们可以代表单个字符、单词、子单词,甚至更大的语言单位,具体取决于所使用的分词方法(Tokenization)。 Token 是原始文本数据与 LLM 可以使用的数字表示之间的桥梁。在将输入进行分词时,会对其进行数字化,形成一个词汇表(Vocabulary),比如:The cat sat on the mat,会被分割成 “The”、“cat”、“sat” 等的同时,会生成下面的词汇表:
数字化的好处是便于计算机处理。但为了让计算机理解 Token 之间的联系,还需要把 Token 表示成稠密矩阵向量,这个过程称之为 embedding([3]),常见的算法有:
- 基于统计
- Word2Vec,通过上下文统计信息学习词向量
- GloVe,基于词共现统计信息学习词向量
- 基于深度网络
- CNN,使用卷积网络获得图像或文本向量
- RNN/LSTM,利用序列模型获得文本向量
- 基于神经网络
- BERT,基于 Transformer 和掩码语言建模(Masked LM)进行词向量预训练
- Doc2Vec,使用神经网络获得文本序列的向量
以 Transform 为代表的大模型采用自注意力(Self-attention)机制来学习不同 token 之间的依赖关系,生成高质量 embedding。
大模型的“大”,指的是用于表达 token 之间关系的参数多,主要是指模型中的权重(weight)与偏置(bias),例如 GPT-3 拥有 1750 亿参数,其中权重数量达到了这一量级,而词汇表 token 数只有 5 万左右。参考:
发展历程
这一切的起源是 2017 年发布的 Attention Is All You Need([4]) 论文,之后基于大量语料的预训练模型百花齐放,比如:
BERT(Bidirectional Encoder Representations from Transformers): Google 在 2018 年提出,创新性的双向预训练并行获取上下文语义信息,以及掩码语言建模(MLM)让模型更好地推断语义信息。它开创了预训练语言表示范式,对自然语言处理产生了深远影响。参数规模:110M 到 340M
GPT(Generative Pre-trained Transformer): OpenAI 在 2018 年提出,开创了仅使用自回归语言建模作为预训练目标而无需额外监督信号。它展示了通过无监督大规模预训练获得的语言生成能力,对研究与应用都带来重大影响。参数规模:1750 亿
Large LAnguage Model Approach(LLAMA): Meta 在 2021 年提出,首个开源模型。为构建更大规模、更通用的语言模型提供了系统化的方法与工具。参数规模:十亿到千亿
模型部署
在 LLM 中,Token 是输入的基本单元 由于在大模型的参数非常多,比如在 GPT-2 中,有 1.5B 参数,每个参数用 float32 表示,那么需要的内存大小为 4 bytes * 1,500,000,000 = 6GB ,更先进的模型如 LLAMA 有 65B 参数,那么需要的内存就需要 260G,这还是在不考虑词汇表的情况下。因此在进行模型实际部署时,会进行模型的压缩。
而且,在训练 LLM 中,CPU 与内存之间的传输速度往往是系统的瓶颈,核心数反而不是大问题,因此减小内存使用是首要优化点。使用内存占用更小的数据类型是一种直接的方式,比如 16 位的浮点数就可以直接将内存使用减倍。目前有几种相互竞争的 16 位标准,但英伟达在其最新一代硬件中引入了对 bfloat16 的支持,
量化 Quantization
将 16 位降至 8 位或 4 位是可能的,但不能使用硬件加速浮点运算。如果我们想对更小的类型进行硬件加速,就需要使用小整数和矢量化指令集。
这就是量化的过程。量化技术可以应用到现有的 32 位浮点运算模型中,通过将权值转换为较小的整数,这些整数的运算可以使用硬件加速指令集,如英特尔的 AVX。
量化模型的简单方法是,首先找出权重的最大值和最小值,然后将数值范围划分为整数类型中可用的桶数,8 位为 256 桶,4 位为 16 桶。这就是所谓的训练后量化(post-training quantization),也是量化模型的最简单方法。现在市面上主要有两类量化方法:
GPTQ([5]) (Accurate Post-Training Quantization for Generative Pre-trained Transformers): 主要针对英伟达的 GPU
GGML (Large Language Models for Everyone): 侧重于 CPU 优化的量化方法,主要针对苹果 M1 和 M2 芯片做优化
社区用户 TheBloke([6]) 把 Huggingface Transformers 库中的大多数 LLM 应用这些量化方法,这无疑极大方便了用户的使用。