[ブログ] [紙]
このリポジトリは、大規模な概念モデル( LCM )の公式実装と実験を提供します。
LCMは、明示的な高レベルのセマンティック表現で動作し、「コンセプト」と名付けます。概念は言語とモダリティに依存しており、より高いレベルのアイデアを表しています。この作業では、概念は文に対応し、ソナー埋め込みスペースを使用します。ソナー埋め込みスペースは、テキストで最大200の言語と音声で57の言語をサポートします。ここでサポートされている言語のリストを参照してください。
LCMは、自動回帰文の予測を実行するように訓練された概念スペースのシーケンスからシーケンスモデルです。複数のアプローチを探ります。
base_lcm )。two_tower_diffusion_lcmを含めます)。これらの探索は、1.6Bパラメーターモデルと1.3Tトークンの順序でトレーニングデータを使用して実行されます。このリポジトリレシピには、1.6b MSE LCMと2塔拡散LCMのトレーニングと微調整を再現するためのレシピを含めます。以下の手順を参照してください。
LCMリポジトリはFairSeq2に依存しています。システムにuvがインストールされている場合は、次のコマンドを実行して、必要なすべてのパッケージを備えた仮想環境をインストールできます。
uv sync --extra cpu --extra eval --extra data uv runを使用して、正しい環境でデモコマンドを実行することもできます。
cpu依存関係の要件のみを提供することに注意してください。GPUサポートを使用する場合は、システムに機能するTorchとFairSeq2のバリエーションを選択する必要があります。たとえば、Cuda 1.21を使用したTorch 2.5.1の場合、次のようなことをします。
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がマシンにビルドを提供していない場合は、そのプロジェクトのReadmeをチェックしてローカルに構築してください。
注記
uvプレフィックスを使用して、 uv runですべてのコマンドを使用して、デフォルトで作成された環境を.venv 、例えばuv run torchrun --standaloneで使用します。または、 source .venv/bin/activateを使用して、環境を一度もアクティブにすることもできます。
LCMは、文で分割され、ソナーで埋め込まれたテキストデータを使用してトレーニングおよび評価できます。このようなトレーニングデータを準備するために使用できるサンプル処理パイプラインを提供します。
uv run --extra data scripts/prepare_wikipedia.py /output/dir/for/the/data
このパイプラインは、Huggingfaceからデータセットを取得し、SonarとSATで処理する方法を示しています。独自のデータの処理の詳細については、ファイルをご覧ください。スクリプトはHuggingfaceからのデータを引用する例を提供しますが、JSONL、Parquet、CSVを処理するためのAPIも提供します。
以下に説明するトレーナーは、データセットの構成データ装置に依存しています。これらのデータ装置は、データセットファイルへのポインター(ローカルまたはS3)とそのスキーマに関する情報を備えたYAMLファイルです。 lcm/datacards/datacards.yamlにいくつかのサンプルデータ装置を提供します。いくつかのデータを処理したら、パスでデータ型を更新できます。
データセットの特定の加重混合物に新しい埋め込みスペースNormalizerを適合させるには、次のコマンドを使用できます。
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。Stopesの発射装置経由で提出したSlurmを使用したトレーニング:
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でwandbをインストールできます。 W&Bの引数は、レシピのHydra構成値をオーバーライドすることで変更できます。
++trainer.wandb_project= $project_name
++trainer.wandb_run_name= $run_name ベースMSE LCMと同様に、Recipes/train/pretrain/two_tower.yamlのレシピに続いてトレーニングジョブを送信できます。
python -m lcm.train
+pretrain=two_tower
++trainer.output_dir= " checkpoints/two_tower_lcm "
++trainer.experiment_name=training_two_tower_lcm ヒント
トレーニングレシピのさまざまな材料を理解するには、このREADMEを確認してください。
以前に事前に訓練された2塔拡散LCMを監視されたデータで微調整するには、次の手順に従ってください。
ステップ1。事前に訓練されたチェックポイントをFairSeq2アセットとして登録します。
特定の数のトレーニング手順の後、カードcheckpoints/two_tower_lcm/model_card.yamlまたは任意のチェックポイントで、カードcheckpoints/two_tower_lcm/checkpoints/step_2000/model_card.yamlで最終チェックポイントをFintuneできます。選択したチェックポイントを登録するには、自動化された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_towerFairSeq2アセットの管理方法の詳細については、ドキュメントを参照してください。
ステップ2。この場合、 my_pretrained_two_tower :この場合、Finetuneにモデルを指すFinetuningジョブを起動します。
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をFintuneするには、事前に訓練されたチェックポイントを登録するための同じ指示に従って、適切なレシピ(./Recipes/Train/Finetune/MSE.YAML)でFinetUningジョブを提出します。
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ファイルを指すか、FairSeq2アセットとして登録した後、モデルの出力を生成およびスコアスコアします( 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} この例では、同じFinetuningデータセット(検証分割)で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ライセンスの下でリリースされます(ライセンスを参照)。