重要提示
您正在查看 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.Config
和 run.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 训练和推理
使用 HF 和 Nemo 进行推理: clip_infer.py
预训练: clip_pretrain.py
这些脚本允许为您的需求量身定制灵活且全面的训练工作流程。例如:- 如果您想进行 SFT,您可以使用 clip_pretrain.py 并传递 restore_path 作为从 HF 转换为 Nemo 2.0 后获得的检查点路径