重要提示

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

LLaVA-Next#

LLaVA-Next 是 LLaVA 模型的扩展,旨在通过平铺高效处理高分辨率图像。这使用户能够处理更大的图像尺寸,从而提高各种 VL 任务的准确性。有关 LLaVA-Next 的更多详细信息,请参阅 LLaVA-Next 博客

我们扩展了 NeVA 模型以支持 LLaVA-Next。用户可以轻松切换到 LLaVA-Next,以获得高分辨率图像平铺支持,且只需进行最少的配置更改。要从 NeVA (LLaVA) 切换到 LLaVA-Next,请将任务编码器替换为 LlavaNextTaskEncoder。它旨在处理图像平铺,支持 LLaVA-Next 架构。

要开始使用 LLaVA-Next,请按照以下步骤操作,这些步骤与 NeVA 类似,但略有修改。

从 Hugging Face 导入到 NeMo 2.0#

以下脚本下载 LLM (vicuna - 7b) 的检查点并将其转换为 NeMo 格式。转换后的检查点存储在 NeMo 缓存文件夹中,路径为:~/.cache/nemo。例如,当与 NeMo 容器一起使用时,完整路径为 /root/.cache/nemo/models/lmsys/vicuna-7b-v1.5/。该检查点可用于初始化 LlaVa-Next 预训练的 LLM。 .. code-block:: python

from nemo.collections.llm import import_ckpt from nemo.collections.llm import Llama2Config7B, LlamaModel

if __name__ == “__main__”

# 指定 Hugging Face 模型 ID hf_model_id = “lmsys/vicuna-7b-v1.5”

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

model=LlamaModel(Llama2Config7B()), source=f”hf://{hf_model_id}”,

)

此步骤是可选的,旨在供希望从 Hugging Face 的预训练检查点开始微调 LLaVA-Next 模型的用户使用。

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

if __name__ == '__main__':
    # Specify the Hugging Face model ID
    hf_model_id = "llava-hf/llava-v1.6-vicuna-7b-hf"

    # Import the model and convert to NeMo 2.0 format
    import_ckpt(
        model=vlm.LlavaNextModel(vlm.Llava16Config7B()),  # Model configuration
        source=f"hf://{hf_model_id}",  # Hugging Face model source
    )

NeMo 2.0 预训练配方#

与 NeVA 模型类似,我们为 LLaVA-NEXT 预训练提供了一些默认配方 llava_next_7b

from nemo.collections import vlm

finetune = vlm.llava_next_7b.pretrain_recipe(
    name="llava_next_7b_pretrain",
    dir=f"/path/to/checkpoints",
    num_nodes=1,
    num_gpus_per_node=8,
    language_model_from_pretrained='/root/.cache/nemo/models/lmsys/vicuna-7b-v1.5/',
    # Can be None or change based on local checkpoint path
)

NeMo 2.0 微调配方#

我们还提供了一个微调配方 - llava_next_7b,您可以使用它。

from nemo.collections import vlm

finetune = vlm.llava_next_7b.finetune_recipe(
    name="llava_next_7b_finetune",
    dir=f"/path/to/checkpoints",
    num_nodes=1,
    num_gpus_per_node=8,
    peft_scheme='none',  # 'lora', 'none'
)

注意

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

注意

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

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

import nemo_run as run

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

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

run.run(finetune, direct=True)

使用 Energon Dataloader#

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

from nemo.collections.multimodal.data.energon.config import MultiModalSampleConfig
from nemo.collections.vlm import LlavaNextTaskEncoder
from nemo.collections.multimodal.data.energon import EnergonMultiModalDataModule
from transformers import AutoProcessor

# Load the processor from the pretrained LLaVA-Next model
processor = AutoProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")

# Paths and configuration
data_path = "<path_to_dataset>"
image_processor = processor.image_processor
tokenizer = processor.tokenizer

# Define multimodal sample configuration
multimodal_sample_config = MultiModalSampleConfig()

# Initialize the LLaVA-Next task encoder
task_encoder = LlavaNextTaskEncoder(
    tokenizer=tokenizer,
    image_processor=image_processor,
    multimodal_sample_config=multimodal_sample_config,
)

# Create the data module
data = EnergonMultiModalDataModule(
    path=data_path,
    tokenizer=tokenizer,
    image_processor=image_processor,
    num_workers=8,
    micro_batch_size=4,
    global_batch_size=32,
    multimodal_sample_config=multimodal_sample_config,
    task_encoder=task_encoder,
)

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

from nemo.collections import vlm

# Define the fine-tuning recipe
finetune = vlm.llava_next_7b.finetune_recipe(
  name="llava_next_7b_finetune",
  dir=f"/path/to/checkpoints",
  num_nodes=1,
  num_gpus_per_node=8,
  peft_scheme='none',  # 'lora', 'none'
)

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

我们还包含其他示例脚本,以进一步自定义 LLaVA-NeXT 训练

这些脚本允许根据您的需求进行灵活而全面的训练工作流程。