[博客] [纸]
该存储库提供了大型概念模型( LCM )的官方实现和实验。
LCM以明确的高级语义表示形式运行,我们将其命名为“概念”。概念是语言和模态不可思议的,代表了更高层次的思想。在这项工作中,一个概念对应于一个句子,我们使用声纳嵌入空间,该空间在文本中最多支持200种语言和语音中的57种语言。请参阅此处的支持语言列表。
LCM是训练以执行自动回归句子预测的概念空间中的序列到序列模型。我们探索多种方法:
base_lcm )。two_tower_diffusion_lcm )。这些探索是使用1.6B参数模型和培训数据以1.3T令牌进行的。我们在此存储库配方中包括了1.6B MSE LCM和两位较高扩散LCM的训练和填充。请参阅下面的说明。
LCM存储库依赖FairSeq2。如果您在系统上安装了uv ,则可以通过运行以下命令来安装所有必要软件包的虚拟环境:
uv sync --extra cpu --extra eval --extra data您也可以使用uv run将演示命令运行正确的环境。
请注意,我们仅提供cpu依赖性的要求,如果您想使用GPU支持,则必须选择适合您系统的Torch和Fairseq2的变体。例如,对于TORCH 2.5.1,带有CUDA 1.21,您会做类似的事情:
uv pip install torch==2.5.1 --extra-index-url https://download.pytorch.org/whl/cu121 --upgrade
uv pip install fairseq2==v0.3.0rc1 --pre --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/rc/pt2.5.1/cu121 --upgrade
检查FairSeq2变体中可能的变体。请注意,LCM当前依靠FairSeq2 0.3.0 RC1的发行候选者。
要使用PIP安装,这些命令非常相似,但是您必须管理自己的环境,并确保先安装FairSeq2。例如,用于cpu安装。
pip install --upgrade pip
pip install fairseq2==v0.3.0rc1 --pre --extra-index-url https://fair.pkg.atmeta.com/fairseq2/whl/rc/pt2.5.1/cpu
pip install -e " .[data,eval] "如果FairSeq2没有为您的计算机提供构建,请检查该项目的回教徒以在本地构建它。
笔记
如果.venv uv前缀所有命令与uv run torchrun --standalone uv run一起使用。另外,您可以用source .venv/bin/activate一劳永逸地激活环境。
可以使用句子中的文本数据拆分并与声纳嵌入,可以对LCM进行训练和评估。我们提供了可用于准备此类培训数据的示例处理管道,您可以将其运行:
uv run --extra data scripts/prepare_wikipedia.py /output/dir/for/the/data
该管道显示了如何从拥抱面中获取数据集并使用声纳和SAT进行处理。查看文件以获取有关处理您自己的数据的更多详细信息。虽然脚本提供了一个示例从HuggingFace提取数据,但我们还提供了API来处理JSONL,Parquet和CSV。
下面描述的培训师依赖于配置数据集的数据标志。这些数据标志是带有指示数据集文件(本地或S3上)的指针的YAML文件及其架构的信息。我们在lcm/datacards/datacards.yaml中提供一些示例数据。处理一些数据后,您可以使用路径更新数据标志。
为了在给定的加权混合物的数据集混合物中拟合新的嵌入式空间标准器,可以使用以下命令:
python scripts/fit_embedding_normalizer.py --ds dataset1:4 dataset2:1 dataset3:10 --save_path " path/to/new/normalizer.pt " --max_nb_samples 1000000在这里, dataset1 , dataset2 , dataset3是在数据标志中声明的数据集的名称,如上所示, (4, 1, 10)各自的相对权重。可以接下来将结果标准化器声明为模型,如lcm/cards/sonar_normalizer.yaml所示,并在所有模型培训配置中引用。
要培训MSE LCM,我们将使用以下命令之一:
选项1。使用STOTES的启动器使用subtit使用subtit进行培训:
python -m lcm.train
+pretrain=mse
++trainer.output_dir= " checkpoints/mse_lcm "
++trainer.experiment_name=training_mse_lcm 使用此命令,我们将提交一个名为training_mse_lcm的slurm作业,并具有食谱的要求,在这种情况下:
requirements :
nodes : 4
tasks_per_node : 8
gpus_per_node : 8
cpus_per_task : 32
mem_gb : 0
timeout_min : 10000您可以使用以下方式覆盖作业的要求和启动器的slurm分区。
python -m lcm.train
+pretrain=mse
++trainer.output_dir= " checkpoints/mse_lcm "
++trainer.experiment_name=training_mse_lcm
++trainer.requirements.timeout_min=100
++trainer.requirements.cpus_per_task=8
++launcher.partition= $partition_name选项2。使用torchrun本地培训(例如仅使用2 GPU),其批量较小(覆盖++trainer.data_loading_config.max_tokens=1000 ):
CUDA_VISIBLE_DEVICES=0,1 torchrun --standalone --nnodes=1 --nproc-per-node=2
-m lcm.train launcher=standalone
+pretrain=mse
++trainer.data_loading_config.max_tokens=1000
++trainer.output_dir= " checkpoints/mse_lcm "
+trainer.use_submitit=false 重要的
由于我们正在更改配方所需的GPU数量,因此不会重现论文的实验设置。
检查点目录checkpoints/mse_lcm将结构为:
.
├── checkpoints
│ ├── step_2000
│ ├── ...
│ └── step_250000
├── config_logs
├── executor_logs
├── model_card.yaml
├── tb # tensorboard logs
└── wandb # W&B logs
请注意,除非有wandb可用,否则会跳过W&B记录。您可以使用uv pip install wandb Install wandb安装WandB。可以通过在食谱中覆盖Hydra配置值来更改W&B参数:
++trainer.wandb_project= $project_name
++trainer.wandb_run_name= $run_name 与基本MSE LCM相似
python -m lcm.train
+pretrain=two_tower
++trainer.output_dir= " checkpoints/two_tower_lcm "
++trainer.experiment_name=training_two_tower_lcm 提示
要了解培训食谱的不同成分,请检查此读数。
要在监督数据上验证先前预先训练的两磅扩散LCM LCM,请按照以下步骤进行操作:
步骤1。注册预先培训的检查点为FairSeq2资产。
您可以使用卡checkpoints/two_tower_lcm/model_card.yaml或任何检查点在特定数量的培训步骤(例如,EG, checkpoints/two_tower_lcm/checkpoints/step_2000/model_card.yaml )之后,使用卡检查点/two_tower_lcm/model_card.yaml验证最终检查点。要注册选定的检查点,请将自动创建的YAML文件复制到./lcm/cards/mycards.yaml并重命名模型以替换默认的on_the_fly_lcm 。 ./lcm/cards/mycards.yaml看起来像:
__source__ : inproc
checkpoint : file://path_to/large_concept_model/checkpoints/two_tower_lcm/checkpoints/step_2000/model.pt
model_arch : two_tower_diffusion_lcm_1_6B
model_family : two_tower_diffusion_lcm
name : my_pretrained_two_tower有关如何管理FairSeq2资产的更多信息,请参见文档。
步骤2。启动指向finetune模型的登录作业,在这种情况下, my_pretrained_two_tower :
CUDA_VISIBLE_DEVICES=0,1 torchrun --standalone --nnodes=1 --nproc-per-node=2
-m lcm.train launcher=standalone
+finetune=two_tower
++trainer.output_dir= " checkpoints/finetune_two_tower_lcm "
++trainer.data_loading_config.max_tokens=1000
+trainer.use_submitit=false
++trainer.model_config_or_name=my_pretrained_two_tower或者
python -m lcm.train
+finetune=two_tower
++trainer.output_dir= " checkpoints/finetune_two_tower_lcm "
++trainer.experiment_name=finetune_two_tower_lcm
++trainer.model_config_or_name=my_pretrained_two_tower同样,要获得MSE LCM,请按照相同的说明进行注册预培训检查点,并使用适当的配方(./recipes/train/finetune/mse.yaml)提交填充作业,从:
python -m lcm.train
+finetune=mse
++trainer.output_dir= " checkpoints/finetune_mse_lcm "
++trainer.experiment_name=finetune_mse_lcm
++trainer.model_config_or_name=my_pretrained_mse_lcm笔记
对于高级评估(对不同的任务进行基准测试,将结果与LLMS进行比较等),请检查评估文档。
步骤0。下载评估胭脂所需的NLTK数据:
python - m nltk . downloader punkt_tab步骤1。通过指向其model_card YAML文件或将其注册为FairSeq2 Asset(就像我们注册my_pretrained_two_tower相同的方式)来生成和分数输出:
model_card=./checkpoints/finetune_two_tower_lcm/checkpoints/step_1000/model_card.yaml
OUTPUT_DIR=evaluation_outputs/two_tower
torchrun --standalone --nnodes=1 --nproc-per-node=1 -m lcm.evaluation
--predictor two_tower_diffusion_lcm
--show_progress true
--data_loading.max_samples 100
--model_card ${model_card}
--launcher standalone
--dataset.source_suffix_text ' [MODEL]: '
--tasks finetuning_data_lcm.validation
--task_args ' {"max_gen_len": 10, "eos_config": {"text": "End of text."}} '
--data_loading.batch_size 4 --generator_batch_size 4
--dump_dir ${OUTPUT_DIR}
--inference_timesteps 40
--initial_noise_scale 0.6
--guidance_scale 3
--guidance_rescale 0.7在示例中,我们仅评估100个样本( --data_loading.max_samples 100 ),然后将模型输出长度限制为10个句子( --task_args '{"max_gen_len": 10}' )。
输出输出./evaluation_outputs/two_tower
.
├── metadata.jsonl
├── metrics.eval.jsonl
├── raw_results
├── results
└── tb
其中的metrics.eval.jsonl包含语料库级别的分数。
为了评估MSE LCM,我们使用关联的预测指标( base_lcm )并评估:
model_card=./checkpoints/finetune_mse_lcm/checkpoints/step_1000/model_card.yaml
OUTPUT_DIR=evaluation_outputs/mse_lcm
torchrun --standalone --nnodes=1 --nproc-per-node=1 -m lcm.evaluation
--predictor base_lcm --sample_latent_variable False
--show_progress true
--data_loading.max_samples 100
--model_card ${model_card}
--launcher standalone
--dataset.source_suffix_text ' [MODEL]: '
--tasks finetuning_data_lcm.validation
--task_args ' {"max_gen_len": 10, "eos_config": {"text": "End of text."}} '
--data_loading.batch_size 4 --generator_batch_size 4
--dump_dir ${OUTPUT_DIR} 请注意,在此示例中,我们仅显示如何在同一列出数据集(验证拆分)上评估LCM。要在下游任务中进行评估,并将结果与LLM进行比较,请参阅评估文档。
有关如何提供帮助,请参见贡献文件。
如果您使用此代码库,请引用:
@article{lcm2024,
author = {{LCM team}, Lo"{i}c Barrault, Paul-Ambroise Duquenne, Maha Elbayad, Artyom Kozhevnikov, Belen Alastruey, Pierre Andrews, Mariano Coria, Guillaume Couairon, Marta R. Costa-juss`{a}, David Dale, Hady Elsahar, Kevin Heffernan, Jo~{a}o Maria Janeiro, Tuan Tran, Christophe Ropers, Eduardo Sánchez, Robin San Roman, Alexandre Mourachko, Safiyyah Saleem, Holger Schwenk},
title = {{Large Concept Models}: Language Modeling in a Sentence Representation Space},
publisher = {arXiv},
year = {2024},
url = {https://arxiv.org/abs/2412.08821},
}
此代码是根据MIT许可证发布的(请参阅许可证)。