1. llama 3 微调基础
1.1 llama 3 简介
官方blog
llama 3 目前有两个版本:8B版和70B版。8B版本拥有8.03B参数,其尺寸较小,可以在消费者硬件上本地运行。
- meta-llama/Meta-Llama-3-8B
- meta-llama/Meta-Llama-3-70B
- 超过400B个参数的第三个版本目前仍在训练中……
Llama 3与Llama 2具有相同的架构,但词汇表要大得多,包含128k entries,而Llama 2只有32k
entries,根据Meta的说法,词汇表的扩展显著提高了模型表现。Llama 3的预训练数据包含5%的高质量非英语数据。注意:Meta在model
card中仍然提到Llama 3更适合用于英语任务。
另一方面,词汇表的扩展意味着token embeddings需要更多的数据才能被训练的更准确。Meta在15T tokens上训练Llama
3。相比之下,Llama 2只在2T tokens上训练,Google Gemma在6T tokens训练,这在当时似乎已经很多了。
模型的性能表现如下图所示:
1.2 llama 3 8b Fully Fine-tuning内存占用分析
Fully Fine-tuning an LLM需要更新其所有参数,这种微调需要大量的内存。
- 模型需要被完全加载到 GPU 内存中
- 此外,通常用于微调 LLMs 的优化器 AdamW 会为模型中的每个参数创建并存储 2 个参数在 GPU 内存中
- 并且我们还需要存储在微调过程中创建的张量,即激活值,以便在反向传播过程中用于更新模型参数的梯度。
对Llama 3 8B进行微调,例如,批量大小为8,序列长度为512,将消耗128.87GB的显存
。注意:这个内存消耗是一个估计值,没有考虑任何的优化,比如梯度检查点和张量并行。
model | loading the model | optimizer states | activations | total |
---|---|---|---|---|
llama 3 8b | 14.96GB | 59.83GB | 54.08GB | 128.87GB |
幸运的是,我们可以很容易地减少这三种参数的内存消耗:
- Optimizer states :默认情况下,AdamW 的参数为 float32,每项占用 4 字节。AdamW-8bit 是另一种不错的选择,它将参数量化为 8 位,即减少了内存消耗从 59.8 GB 到 15 GB。如果使用的框架不复制模型参数,内存消耗会大大减少。
- Model :我们可以将模型量化为4位。它将内存消耗分成近4份,即从15 GB到4 GB。在实践中,为了保持其性能,并不是