重要

您正在查看 NeMo 2.0 文档。此版本引入了对 API 的重大更改和一个新库 NeMo Run。我们目前正在将所有功能从 NeMo 1.0 移植到 2.0。有关以前版本或 2.0 中尚未提供的功能的文档,请参阅 NeMo 24.07 文档

Gemma 2#

Gemma 2 提供了三个新的、强大且高效的模型,参数规模分别为 20 亿、90 亿和 270 亿,所有模型都具有内置安全增强功能。它采用了 Transformer 解码器框架,同时添加了多查询注意力、RoPE、GeGLU 激活函数等等。更多信息请参考 Google 的发布博客

注意

目前,Gemma 2 不支持 CuDNN 融合注意力。配方禁用了 CuDNN 注意力,并使用 Flash Attention 代替。

我们提供了预定义的配方,用于使用 NeMo 2.0 和 NeMo-Run 微调 Gemma 2 模型。这些配方配置了 run.Partial,用于 NeMo 2.0 中引入的 nemo.collections.llm API 函数之一。这些配方托管在 gemma_2_2bgemma_2_9bgemma_2_27b 中。

NeMo 2.0 微调配方#

注意

微调配方使用 SquadDataModule 作为 data 参数。您可以使用自定义数据集替换 SquadDataModule

要导入 HF 模型并转换为 NeMo 2.0 格式,请运行以下命令(这只需要执行一次)

from nemo.collections import llm
llm.import_ckpt(model=llm.Gemma2Model(llm.Gemma2Config2B()), source='hf://google/gemma-2-2b')

默认情况下,加载模型的非指令版本。要加载不同的模型,请设置 finetune.resume.restore_config.path=nemo://<hf model id>finetune.resume.restore_config.path=<本地 model path>

我们在下面提供了一个示例,说明如何调用默认配方并覆盖数据参数

from nemo.collections import llm

recipe = llm.gemma2_2b.finetune_recipe(
    name="gemma2_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.Configrun.Partial 配置对象完成的。请查看 NeMo-Run 文档,以了解有关其配置和执行系统的更多信息。

一旦您准备好最终配置,您可以在任何 NeMo-Run 支持的执行器上执行它。最简单的是本地执行器,它只是在单独的进程中本地运行预训练。您可以按如下方式使用它

import nemo_run as run

run.run(recipe, executor=run.LocalExecutor())

此外,您也可以在同一个 Python 进程中直接运行它,如下所示

run.run(recipe, direct=True)

配方

状态

Gemma 2 2B

Gemma 2 9B

Gemma 2 27B