在 Hugging Face 上微调 Gemma 模型

Hugging Face 推出了一个使用参数高效微调(PEFT)对 Google DeepMind 的 Gemma 模型进行微调的详细工作流。该方法使开发者能够将 20 亿和 70 亿参数的 Gemma 模型适配到特定数据集上,所需的内存和计算资源远低于全权重训练。

Gemma 的低秩适配(LoRA)

低秩适配(LoRA)是针对 Gemma 模型强调的主要 PEFT 技术。LoRA 不会更新所有模型参数,而是冻结原始权重,仅训练由低秩矩阵组成的一小部分适配层。这大幅降低了微调的计算开销。

要在 Gemma 上实现 LoRA,Hugging Face 的 PEFT 库允许用户针对特定的线性层进行适配。在示例中,以下模块被选为适配目标:

  • q_proj
  • o_proj
  • k_proj
  • v_proj
  • gate_proj
  • up_proj
  • down_proj

通过 QLoRA 进行内存优化

为了进一步降低内存占用,Hugging Face 推荐使用 QLoRA。该方法使用 bitsandbytes 库将基础模型量化为 4 位精度。通过向 from_pretrained 方法传入 BitsAndBytesConfig,用户可以以内存高效的格式加载 Gemma(例如使用 nf4 量化类型和 bfloat16 计算 dtype),从而使微调能够在消费级 GPU 或 Google Colab 等免费平台上进行。

实现工作流:学习生成引用

使用 trl 库中的 SFTTrainer,Hugging Face 演示了一个实际应用,即将 Gemma-2b 微调为以特定格式(引用后跟作者)生成语录。

该过程包括:

  1. 模型加载: 通过 BitsAndBytesConfig 使用 4 位量化加载模型。
  2. 数据集准备: 使用 Abirate/english_quotes 数据集并对其进行模型分词。
  3. 配置: 使用秩为 8(r=8)的 LoraConfig
  4. 训练: 使用学习率 2e-4paged_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)

Sources