重要提示
您正在查看 NeMo 2.0 文档。此版本引入了 API 的重大更改和一个新的库 NeMo Run。我们目前正在将 NeMo 1.0 的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档。
Gemma#
谷歌的 Gemma 于 2024 年 2 月发布,是一个基于为创建谷歌 Gemini 模型系列所做的工作(Gemini v1.5 报告)的开放模型。它采用了 Transformer 解码器框架,同时添加了多查询注意力、RoPE、GeGLU 激活等。Gemma 提供 2B 和 7B 版本,以合理的尺寸提供强大的模型。更多信息请参见 Google 的发布博客。
随后于 2024 年 4 月发布的 CodeGemma 加入了 Gemma 系列,专注于代码理解和生成。
注意
目前,Gemma 不支持 CuDNN 融合注意力。这些配方禁用了 CuDNN 注意力,并改用 Flash Attention。
我们为使用 NeMo 2.0 和 NeMo-Run 微调 Gemma 模型提供了预定义的配方。支持的模型包括 Gemma 1 (2B, 7B) 和 Gemma 2 (9B, 27B)。这些配方为 NeMo 2.0 中引入的 nemo.collections.llm api 函数之一配置了 run.Partial
。这些配方托管在 gemma_2b gemma_7b
NeMo 2.0 微调配方#
注意
微调配方使用 SquadDataModule
作为 data
参数。您可以将 SquadDataModule
替换为您自定义的数据集。
要导入 HF 模型并转换为 NeMo 2.0 格式,请运行以下命令(这只需执行一次)
from nemo.collections import llm
llm.import_ckpt(model=llm.GemmaModel(llm.GemmaConfig2B()), source='hf://google/gemma-2b')
默认情况下,加载模型的非指令版本。要加载不同的模型,请设置 finetune.resume.restore_config.path=nemo://<hf model id>
或 finetune.resume.restore_config.path=<local model path>
我们在下面提供了一个示例,说明如何调用默认配方并覆盖数据参数
from nemo.collections import llm
recipe = llm.gemma_2b.finetune_recipe(
name="gemma_2b_finetuning",
dir=f"/path/to/checkpoints",
num_nodes=1,
num_gpus_per_node=8,
peft_scheme='lora', # 'lora', 'none'
packed_sequence=False,
)
# # To override the data argument
# dataloader = a_function_that_configures_your_custom_dataset(
# gbs=gbs,
# mbs=mbs,
# seq_length=recipe.model.config.seq_length,
# )
# recipe.data = dataloader
默认情况下,微调配方将运行 LoRA 微调,LoRA 应用于语言模型中的所有线性层。要微调整个模型而不使用 LoRA,请在配方参数中设置 peft_scheme='none'
。
要使用序列打包进行微调以获得更高的吞吐量,请设置 packed_sequence=True
。请注意,您可能需要调整全局批大小才能实现类似的收敛。
注意
配方中的配置是使用 NeMo-Run run.Config
和 run.Partial
配置对象完成的。请查看 NeMo-Run 文档,以了解有关其配置和执行系统的更多信息。
一旦您准备好最终配置,就可以在任何 NeMo-Run 支持的执行器上执行它。最简单的是本地执行器,它只是在单独的进程中本地运行预训练。您可以按如下方式使用它
import nemo_run as run
run.run(recipe, executor=run.LocalExecutor())
此外,您还可以直接在同一个 Python 进程中运行它,如下所示
run.run(recipe, direct=True)
配方 |
状态 |
---|---|
Gemma 2B |
是 |
Gemma 7B |
是 |