在 Hugging Face 上微调 Gemma 模型
Hugging Face 推出了一个使用参数高效微调(PEFT)对 Google DeepMind 的 Gemma 模型进行微调的详细工作流。该方法使开发者能够将 20 亿和 70 亿参数的 Gemma 模型适配到特定数据集上,所需的内存和计算资源远低于全权重训练。
Gemma 的低秩适配(LoRA)
低秩适配(LoRA)是针对 Gemma 模型强调的主要 PEFT 技术。LoRA 不会更新所有模型参数,而是冻结原始权重,仅训练由低秩矩阵组成的一小部分适配层。这大幅降低了微调的计算开销。
要在 Gemma 上实现 LoRA,Hugging Face 的 PEFT 库允许用户针对特定的线性层进行适配。在示例中,以下模块被选为适配目标:
q_projo_projk_projv_projgate_projup_projdown_proj
通过 QLoRA 进行内存优化
为了进一步降低内存占用,Hugging Face 推荐使用 QLoRA。该方法使用 bitsandbytes 库将基础模型量化为 4 位精度。通过向 from_pretrained 方法传入 BitsAndBytesConfig,用户可以以内存高效的格式加载 Gemma(例如使用 nf4 量化类型和 bfloat16 计算 dtype),从而使微调能够在消费级 GPU 或 Google Colab 等免费平台上进行。
实现工作流:学习生成引用
使用 trl 库中的 SFTTrainer,Hugging Face 演示了一个实际应用,即将 Gemma-2b 微调为以特定格式(引用后跟作者)生成语录。
该过程包括:
- 模型加载: 通过
BitsAndBytesConfig使用 4 位量化加载模型。 - 数据集准备: 使用
Abirate/english_quotes数据集并对其进行模型分词。 - 配置: 使用秩为 8(
r=8)的LoraConfig。 - 训练: 使用学习率
2e-4和paged_adamw_8bit优化器运行训练器。
硬件加速:PyTorch/XLA 与 TPU 上的 FSDP
Hugging Face transformers 库中的 Gemma 模型已针对 PyTorch 和 PyTorch/XLA 进行优化,支持在 GPU 和 Cloud TPU 上部署。
对于 TPU 用户,Hugging Face 通过 SPMD(单程序多数据)改进了 Fully Sharded Data Parallel(FSDP)的使用体验。通过在 transformers.Trainer 中添加 fsdp_config,用户可以包装 GemmaDecoderLayer 并启用 xla_fsdp_v2。此集成显著提升了 TPU 硬件上的微调速度。
TPU 配置概览
| 特性 | 设置 |
|---|---|
| 要包装的层 | GemmaDecoderLayer |
| FSDP 模式 | full_shard |
| XLA FSDP v2 | Enabled (True) |
| XLA FSDP 梯度检查点 | Enabled (True) |