[Blog] [kertas]
Repositori ini memberikan implementasi dan eksperimen resmi untuk model konsep besar ( LCM ).
LCM beroperasi pada representasi semantik tingkat tinggi yang eksplisit, yang kami beri nama "konsep". Konsep adalah bahasa dan modalitas-agnostik dan mewakili ide tingkat yang lebih tinggi. Dalam karya ini, sebuah konsep sesuai dengan kalimat, dan kami menggunakan ruang embedding sonar, yang mendukung hingga 200 bahasa dalam teks dan 57 bahasa dalam pidato. Lihat daftar bahasa yang didukung di sini.
LCM adalah model urutan-ke-urutan dalam ruang konsep yang dilatih untuk melakukan prediksi kalimat regresif auto-regresif. Kami mengeksplorasi beberapa pendekatan:
base_lcm dalam kode ini).two_tower_diffusion_lcm dalam rilis ini).Eksplorasi ini dilakukan dengan menggunakan model parameter 1.6B dan data pelatihan dalam urutan token 1.3T. Kami memasukkan dalam resep repositori ini untuk mereproduksi pelatihan dan finetuning 1,6b MSE LCM dan dua menara difusi LCM. Lihat instruksi di bawah ini.
Repositori LCM bergantung pada fairseq2. Jika Anda memiliki uv yang diinstal pada sistem Anda, Anda dapat menginstal lingkungan virtual dengan semua paket yang diperlukan dengan menjalankan perintah berikut:
uv sync --extra cpu --extra eval --extra data Anda juga dapat menggunakan uv run untuk menjalankan perintah demo dengan lingkungan yang benar.
Perhatikan bahwa kami hanya memberikan persyaratan untuk dependensi cpu , jika Anda ingin menggunakan dukungan GPU, Anda harus memilih varian obor dan fairseq2 yang bekerja untuk sistem Anda. Misalnya untuk obor 2.5.1 dengan CUDA 1.21, Anda akan melakukan sesuatu seperti:
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
Periksa varian fairseq2 untuk kemungkinan varian. Perhatikan bahwa LCM saat ini bergantung pada kandidat rilis untuk FairSeQ2 0.3.0 RC1.
Untuk menginstal dengan PIP, perintahnya sangat mirip, tetapi Anda harus mengelola lingkungan Anda sendiri dan memastikan untuk menginstal Fairseq2 secara manual terlebih dahulu. Misalnya, untuk instalasi 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] "Jika fairseq2 tidak menyediakan build untuk mesin Anda, periksa readme proyek itu untuk membangunnya secara lokal.
Catatan
Jika menggunakan uv Prefix semua perintah dengan uv run untuk menggunakan lingkungan yang dibuat secara default di .venv , misalnya, uv run torchrun --standalone . Atau, Anda dapat mengaktifkan lingkungan sekali dan untuk semua dengan source .venv/bin/activate .
LCM dapat dilatih dan dievaluasi menggunakan data tekstual yang dibagi dalam kalimat dan tertanam dengan sonar. Kami menyediakan pipa pemrosesan sampel yang dapat digunakan untuk menyiapkan data pelatihan tersebut, Anda dapat menjalankannya dengan:
uv run --extra data scripts/prepare_wikipedia.py /output/dir/for/the/data
Pipa ini menunjukkan cara mendapatkan dataset dari permukaan pelukan dan memprosesnya dengan sonar dan SAT. Lihat file untuk detail lebih lanjut tentang pemrosesan data Anda sendiri. Sementara skrip memberikan contoh menarik data dari Huggingface, kami juga menyediakan API untuk memproses JSONL, Parket dan CSV.
Pelatih yang dijelaskan di bawah ini bergantung pada datacard yang mengkonfigurasi set data. Datacard ini adalah file YAML dengan pointer ke file dataset (secara lokal atau di S3) dan informasi tentang skemanya. Kami menyediakan beberapa sampel data di lcm/datacards/datacards.yaml . Setelah Anda memproses beberapa data, Anda dapat memperbarui kartu data dengan jalur Anda.
Agar sesuai dengan ruang embedding yang baru pada campuran dataset yang tertimbang, seseorang dapat menggunakan perintah berikut:
python scripts/fit_embedding_normalizer.py --ds dataset1:4 dataset2:1 dataset3:10 --save_path " path/to/new/normalizer.pt " --max_nb_samples 1000000 Di sini, dataset1 , dataset2 , dataset3 adalah nama dataset yang dinyatakan dalam datacard seperti yang ditunjukkan di atas dan (4, 1, 10) bobot relatif masing -masing. Normalizer yang dihasilkan dapat dinyatakan selanjutnya sebagai model seperti yang ditunjukkan pada lcm/cards/sonar_normalizer.yaml dan dirujuk dalam semua konfigurasi pelatihan model.
Untuk melatih LCM MSE, kami akan menggunakan salah satu perintah berikut:
Opsi 1. Pelatihan dengan Slurm Menggunakan Submitit Via Stopes's Launcher:
python -m lcm.train
+pretrain=mse
++trainer.output_dir= " checkpoints/mse_lcm "
++trainer.experiment_name=training_mse_lcm Dengan perintah ini, kami akan mengirimkan pekerjaan slurm bernama training_mse_lcm dengan persyaratan resep, dalam hal ini:
requirements :
nodes : 4
tasks_per_node : 8
gpus_per_node : 8
cpus_per_task : 32
mem_gb : 0
timeout_min : 10000Anda dapat mengesampingkan persyaratan pekerjaan seperti batas waktu tunggu dan partisi slurm peluncur dengan:
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 Opsi 2. Pelatihan lokal dengan torchrun (misalnya hanya menggunakan 2 GPU) dengan ukuran batch yang lebih kecil (overriding ++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 Penting
Karena kami mengubah jumlah GPU yang dibutuhkan oleh resep, ini tidak akan mereproduksi pengaturan eksperimental kertas.
checkpoints/mse_lcm akan disusun sebagai:
.
├── checkpoints
│ ├── step_2000
│ ├── ...
│ └── step_250000
├── config_logs
├── executor_logs
├── model_card.yaml
├── tb # tensorboard logs
└── wandb # W&B logs
Perhatikan bahwa penebangan W&B dilewati kecuali wandb tersedia. Anda dapat menginstal wandb dengan uv pip install wandb . Argumen W&B dapat diubah dengan menimpa nilai konfigurasi Hydra dalam resep:
++trainer.wandb_project= $project_name
++trainer.wandb_run_name= $run_name Mirip dengan MSE LCM dasar kami dapat mengirimkan pekerjaan pelatihan mengikuti resep di ./recipes/train/pretrain/two_tower.yaml via:
python -m lcm.train
+pretrain=two_tower
++trainer.output_dir= " checkpoints/two_tower_lcm "
++trainer.experiment_name=training_two_tower_lcm Tip
Untuk memahami berbagai bahan resep pelatihan, periksa readme ini.
Untuk memperbaiki LCM difusi dua menara yang sebelumnya terlatih sebelumnya tentang data yang diawasi, ikuti langkah-langkah ini:
Langkah 1. Daftarkan pos pemeriksaan pra-terlatih sebagai aset Fairseq2.
Anda dapat melakukan pos pemeriksaan akhir dengan checkpoints/two_tower_lcm/model_card.yaml atau pos pemeriksaan apa pun setelah sejumlah langkah pelatihan tertentu, misalnya, checkpoints/two_tower_lcm/checkpoints/step_2000/model_card.yaml . Untuk mendaftarkan pos pemeriksaan yang dipilih, salin file YAML yang dibuat secara otomatis ke ./lcm/cards/mycards.yaml dan ganti nama model untuk menggantikan default on_the_fly_lcm . ./lcm/cards/mycards.yaml akan terlihat seperti:
__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_towerUntuk lebih lanjut tentang cara mengelola aset FairSeq2, lihat dokumentasi.
Langkah 2. Luncurkan pekerjaan finetuning yang menunjuk pada model ke finetune, dalam hal ini 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_toweratau
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_towerDemikian pula, untuk Finetune MSE LCM, ikuti instruksi yang sama untuk mendaftarkan pos pemeriksaan pra-terlatih dan mengirimkan pekerjaan finetuning dengan resep yang sesuai (./recipes/train/finetune/mse.yaml) melalui:
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_lcmCatatan
Untuk evaluasi lanjutan (tolok ukur tugas yang berbeda, membandingkan hasil dengan LLM, dll.), Periksa dokumentasi evaluasi.
Langkah 0. Unduh data NLTK yang diperlukan untuk mengevaluasi Rouge:
python - m nltk . downloader punkt_tab Langkah 1. Hasilkan dan skor output dari suatu model baik dengan menunjuk ke file model_card YAML atau setelah mendaftarkannya sebagai aset fairseq2 (cara yang sama kami mendaftar 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 Di mana dalam contoh kami hanya mengevaluasi 100 sampel ( --data_loading.max_samples 100 ) dan membatasi panjang output model hingga 10 kalimat ( --task_args '{"max_gen_len": 10}' ).
Output dibuang ke dalam ./evaluation_outputs/two_tower akan disusun sebagai:
.
├── metadata.jsonl
├── metrics.eval.jsonl
├── raw_results
├── results
└── tb
di mana metrics.eval.jsonl berisi skor tingkat corpus.
Untuk mengevaluasi LCM MSE, kami menggunakan prediktor terkait ( base_lcm ) dan mengevaluasi dengan:
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} Perhatikan bahwa dalam contoh ini, kami hanya menunjukkan cara mengevaluasi LCM pada dataset finetuning yang sama (validasi split). Untuk mengevaluasi dalam tugas hilir, dan membandingkan hasil dengan LLM, lihat dokumentasi evaluasi.
Lihat file yang berkontribusi untuk cara membantu.
Jika Anda menggunakan basis kode ini, silakan kutip:
@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},
}
Kode ini dirilis di bawah lisensi MIT (lihat lisensi).