Fenrier Lab

LLM 指令微调方法

介绍 经过无监督预训练的模型已经具备基本的语言理解能力,也就是说,给它输入一段不完整的文本,它能够比较准确的预测下一个词是什么,但也仅此而已。此时的模型遵循指令的能力还很弱,也基本没有什么对话能力,在早期的 GPT3 时代,让模型完成一些任务的方法是构造一个相对特殊的 prompt,比如让它写一个新闻 Title: United Methodists Agree to Historic Split Subtitle: Those who oppose gay marriage will form their own denomination Article: 这里的 Article: 表明了这是一个还没有完成的文本,如果模型理解了前面的内容,那么就该知道接下来应该生成什么。 ...
点我阅读更多...

如何解释 top_p 和 temperature 参数对 LLM 生成多样性的影响

总所周知,在调用 LLM 的时候,如果想让模型的生成结果更加多样化,可以通过调高 top_p 或者 temperature 来实现,反之,如果调低这两个参数,则生成的结果会更加倾向同质化,总之,两种方式的应用场景不同。这篇文章我们通过示例从原理上来解释为何这两个参数能够控制 LLM 生成结果的多样性。 首先需要知道,LLM 的输出结果只是下一个 token 的概率分布,具体生成框架(比如 transformers 的 generate 函数)负责生成过程。如果采用贪心策略,每次都选择概率最大的 token,那么就不存在所谓的调整空间,也就是说当设置 do_sample=False 时,top_p 和 temperature 参数是不起作用的。而当设置 do_sample=True 时...
点我阅读更多...

TensorRT 使用指南(5):FP16 精度溢出的解决方案

TensorRT 在 fp16 精度下可以获得相对于 fp32 大概 2 倍的速度提升,一般情况下,精度损失较小。但如果模型结构比较特殊,比如连续多个卷积层之间没有 Normalize 操作,则有很大概率使得激活值超出 fp16 的表示范围(也就是绝对值大于 65504),这时模型会输出 NaN。解决这个问题的方式很简单,直接将溢出层的精度提升到 fp32 即可。下面我们来详细说明。 首先,我们需要找到哪些层溢出了,也就是激活张量超过了 fp16 的表示范围,为了保险起见,可以将最大绝对值设置成 10000,也就是说如果激活值的绝对值超过 10000,我们就认为这个层溢出了。为此我们需要 TensorRT 提供的 Polygraphy 工具将 ONNX 模型转换一下,将每一层的输出都...
点我阅读更多...

LLM 推理加速技术原理 —— GPTQ 量化技术演进

GPTQ 是目前(2023-2024)在大模型量化领域应用得比较成熟的技术之一,本文将详细分析这种算法的演化过程,以便能够更好地理解其原理。 最优脑损伤(OBD) OBD 的基本思想是以模型训练损失为目标函数,迭代地选择剪枝参数使目标函数最小化。具体来说,设模型的权重为 \(W\),损失函数为 \(f\),则在当前权重下,模型的训练损失为 \(L = L(W)\)。 模型剪枝实际上就是将 \(W\) 的某个值调整为 0,对损失函数进行泰勒展开可以估计权重调整造成的影响,对 \(L(W)\) 进行泰勒展开,得到 \[\begin{aligned} &L(W + \delta W) = L(W) + \left(\frac{\partial L}{\partial...
点我阅读更多...

LLM 推理加速技术 -- Flash Attention 的算子融合方法

本文来自于对 FlashAttention 论文的理解,对原论文省略的一部分数学过程做了展开讲解。 简单来说,Flash Attention 的核心思想是利用分块方法融合 softmax 和 matmul 来降低 HBM 访存次数从而提高效率。 标准 Attention 的访存复杂度分析 Attention 的计算公式如下: \[O = softmax \left(\frac{QK^\top}{\sqrt{d}}\right)V\] 其中 \(Q, K, V\in \mathbb{R}^{N\times d}\) 分别是 query, key, value, N 是输入序列的长度,d 是 head dimension,O 是 attention 的输出。 如果严格按...
点我阅读更多...