[博客] [紙]
該存儲庫提供了大型概念模型( 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許可證發布的(請參閱許可證)。