重要提示

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

CLIP#

对比语言-图像预训练 (CLIP) 论文 <https://arxiv.org/pdf/2103.00020.pdf>_ 提供了一种使用自然语言监督学习图像表示的有效方法。本质上,CLIP 从头开始训练图像编码器和文本编码器。目标是通过联合训练这些编码器来预测一批(图像,文本)训练示例的正确配对。

在预训练期间,该模型旨在通过最大化正确(图像,文本)对之间的相似性,同时最小化不正确对之间的相似性,来预测哪些图像和文本形成语义连贯的对。这种对比学习方法确保 CLIP 学习到视觉和文本数据有意义且上下文丰富的表示。

在预训练阶段完成后,CLIP 模型可以针对专门的下游任务进行微调,或直接用于零样本学习。这种方法促进了无缝的图像和文本表示学习,并在各种应用中展示了卓越的有效性。

要开始使用 CLIP,请按照以下步骤操作。

从 Hugging Face 导入到 NeMo 2.0#

以下脚本下载 CLIP 的检查点并将其转换为 NeMo 格式。转换后的检查点随后存储在位于 ~/.cache/nemo 的 NeMo 缓存文件夹中。例如,当与 NeMo 容器一起使用时,完整路径为 /root/.cache/nemo/models/openai/clip-vit-large-patch14。该检查点可用于初始化视觉语言模型 (VLM) 并为监督式微调 (SFT) 微调 CLIP 模型。 .. code-block:: python

from nemo.collections.llm import import_ckpt from nemo.collections import vlm from nemo.collections.vlm import ClipConfigL14

if __name__ == ‘__main__’

# 指定 Hugging Face 模型 ID hf_model_id = “hf://openai/clip-vit-large-patch14”

# 导入模型并转换为 NeMo 2.0 格式 import_ckpt(

model=vlm.CLIPModel(ClipConfigL14()), # 模型配置 source=f”{hf_model_id}”, # Hugging Face 模型源

)

NeMo 2.0 预训练配方#

我们提供了一些用于预训练 CLIP 的默认配方 clip_b32

from nemo.collections import vlm

pretrain = vlm.clip_b32.pretrain_recipe(
    name="clip_pretrain",
    dir=f"/path/to/checkpoints",
    num_nodes=1,
    num_gpus_per_node=8,
)

注意

配方中的配置是使用 NeMo-Run run.Configrun.Partial 配置对象完成的。请查看 NeMo-Run 文档 以了解有关其配置和执行系统的更多信息。

注意

配方使用 MockDataModule 作为 data 参数。您需要将 MockDataModule 替换为您自定义的数据集。

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

import nemo_run as run

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

此外,您也可以在与下面相同的 Python 进程中直接运行它

run.run(pretrain, direct=True)

使用 Energon Dataloader#

给定 WebDataset 格式的数据集,您可以使用 Energon 数据加载器来准备数据以与 CLIP 一起使用。您可以从 <data_root> 目录运行以下命令,将 WebDataset 格式转换为 Energon 格式

energon prepare .

使用 CrudeSample 作为您的样本类。

以下是如何为 CLIP 训练设置 Energon 数据模块的示例

from nemo.collections.multimodal.data.energon import EnergonMultiModalDataModule
from nemo.collections.vlm.clip.data.clip_data_module import ClipTaskEncoder

# Paths and configuration
data_path = "<path_to_dataset>"
text_seq_length = 80
mbs = 500
gbs = 4000
num_workers = 16

# Load the task encoder for train and validation
train_task_encoder = ClipTaskEncoder(max_length=text_seq_length)
valid_task_encoder = ClipTaskEncoder(max_length=text_seq_length, is_train=False)
data = EnergonMultiModalDataModule(
    data_path,
    seq_length=text_seq_length,
    image_processor=None,
    micro_batch_size=mbs,
    global_batch_size=gbs,
    num_workers=num_workers,
    task_encoder=train_task_encoder,
    tokenizer=train_task_encoder.tokenizer,
    validation_task_encoder=valid_task_encoder,
    image_decode="pil",
    ignore_decoder_errors=True,
)

将默认配方中的 MockDataModule 替换为上述数据。

from nemo.collections import vlm

# Define the finetuning recipe
pretrain = vlm.clip_b32.pretrain_recipe(
  name="clip_pretrain",
  dir=f"/path/to/checkpoints",
  num_nodes=1,
  num_gpus_per_node=8,
)

# Assign the above data module to the finetuning recipe
pretrain.data = data

我们还包括了其他示例脚本,以进一步自定义 CLIP 训练和推理

这些脚本允许为您的需求量身定制灵活且全面的训练工作流程。例如:- 如果您想进行 SFT,您可以使用 clip_pretrain.py 并传递 restore_path 作为从 HF 转换为 Nemo 2.0 后获得的检查点路径