Repositori ini menyediakan implementasi dan eksperimen resmi untuk Model Konsep Besar (KPK).
KPK beroperasi pada representasi semantik tingkat tinggi yang eksplisit, yang kami beri nama “konsep”. Konsep bersifat agnostik bahasa dan modalitas dan mewakili gagasan tingkat yang lebih tinggi. Dalam karya ini, sebuah konsep berhubungan dengan sebuah kalimat, dan kami menggunakan ruang penyematan SONAR, yang mendukung hingga 200 bahasa dalam teks dan 57 bahasa dalam ucapan. Lihat daftar bahasa yang didukung di sini.
KPK adalah model urutan-ke-urutan dalam ruang konsep yang dilatih untuk melakukan prediksi kalimat auto-regresif. Kami mengeksplorasi berbagai pendekatan:
- Regresi UMK (
base_lcm
dalam kode ini). - Varian generasi berbasis difusi (kami menyertakan
two_tower_diffusion_lcm
dalam rilis ini). - Model yang beroperasi di ruang SONAR terkuantisasi (segera hadir).
Eksplorasi ini dilakukan menggunakan model parameter 1,6 miliar dan data pelatihan dalam urutan token 1,3 ton. Kami menyertakan resep repositori ini untuk mereproduksi pelatihan dan penyempurnaan LCM MSE 1,6 miliar dan LCM difusi dua menara. Lihat instruksi di bawah.
Repositori LCM bergantung pada fairseq2. kalau sudah uv
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 menyediakan persyaratan untuk cpu
ketergantungan, jika Anda ingin menggunakan dukungan GPU, Anda harus memilih varian torch dan fairseq2 yang sesuai untuk sistem Anda. Misalnya untuk torch 2.5.1 dengan cuda 1.21, Anda akan melakukan sesuatu seperti:
uv pip install torch==2.5.1 --extra-index-url --upgrade
uv pip install fairseq2==v0.3.0rc1 --pre --extra-index-url --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 pastikan untuk menginstal fairseq2 secara manual terlebih dahulu. Misalnya saja untuk a cpu
memasang.
pip install --upgrade pip
pip install fairseq2==v0.3.0rc1 --pre --extra-index-url
pip install -e ".(data,eval)"
Jika fairseq2 tidak menyediakan build untuk mesin Anda, periksa readme proyek tersebut untuk membuatnya secara lokal.
Catatan
Jika menggunakan uv
awali semua perintah dengan uv run
untuk menggunakan lingkungan yang dibuat secara default di .venv
misalnya,
uv run torchrun --standalone
. Alternatifnya, Anda dapat mengaktifkan lingkungan untuk selamanya dengan source .venv/bin/activate
.
LCM dapat dilatih dan dievaluasi menggunakan data tekstual yang dipecah menjadi kalimat dan disematkan dengan SONAR. Kami menyediakan contoh pipeline pemrosesan 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
Pipeline ini menunjukkan cara mendapatkan kumpulan data dari huggingface dan memprosesnya dengan SONAR dan Duduk. Lihat file untuk detail lebih lanjut tentang pemrosesan data Anda sendiri. Meskipun skrip memberikan contoh pengambilan data dari huggingface, kami juga menyediakan API untuk memproses jsonl, parket, dan CSV.
Pelatih yang dijelaskan di bawah ini mengandalkan kartu data yang mengonfigurasi kumpulan data. Kartu data ini adalah file yaml dengan penunjuk ke file kumpulan data (secara lokal atau di s3) dan informasi tentang skemanya. Kami menyediakan beberapa contoh kartu data lcm/datacards/datacards.yaml
. Setelah Anda memproses beberapa data, Anda dapat memperbarui kartu data dengan jalur Anda.
Untuk menyesuaikan penormal ruang penyematan baru pada campuran kumpulan data tertimbang tertentu, 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 kumpulan data yang dideklarasikan dalam kartu data seperti yang ditunjukkan di atas dan (4, 1, 10)
bobot relatifnya masing-masing. Normalizer yang dihasilkan selanjutnya dapat dideklarasikan sebagai model seperti yang ditunjukkan pada lcm/cards/sonar_normalizer.yaml
dan direferensikan di semua konfigurasi pelatihan model.
Untuk melatih MSE LCM, kita akan menggunakan salah satu perintah berikut:
Pilihan 1. Pelatihan dengan SLURM menggunakan submitit melalui peluncur stopes:
python -m lcm.train
+pretrain=mse
++trainer.output_dir="checkpoints/mse_lcm"
++trainer.experiment_name=training_mse_lcm
Dengan perintah ini, kita 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: 10000
Anda dapat mengganti persyaratan pekerjaan seperti batas waktu habis 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
Pilihan 2. Pelatihan secara 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, hal ini tidak akan mereproduksi pengaturan eksperimental pada makalah ini.
Direktori pos pemeriksaan 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 pencatatan W&B dilewati kecuali wandb
tersedia. Anda dapat menginstal wandb
dengan uv pip install wandb
. Argumen W&B dapat diubah dengan mengganti nilai konfigurasi Hydra dalam resep:
++trainer.wandb_project=$project_name
++trainer.wandb_run_name=$run_name
Mirip dengan LCM MSE dasar, kami dapat mengirimkan tugas pelatihan mengikuti resep di ./recipes/train/pretrain/two_tower.yaml melalui:
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 menyempurnakan LCM difusi dua menara yang telah dilatih sebelumnya pada data yang diawasi, ikuti langkah-langkah berikut:
Langkah 1. Daftarkan pos pemeriksaan terlatih sebagai aset fairseq2.
Anda dapat menyempurnakan pos pemeriksaan terakhir dengan kartu tersebut 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_tower
Untuk mengetahui lebih lanjut tentang cara mengelola aset fairseq2, lihat dokumentasi.
Langkah 2. Luncurkan pekerjaan penyempurnaan yang menunjuk ke model yang akan disempurnakan, dalam contoh 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_tower
atau
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
Demikian pula, untuk menyempurnakan LCM MSE, ikuti instruksi yang sama untuk mendaftarkan pos pemeriksaan terlatih dan kirimkan pekerjaan penyesuaian 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_lcm
Langkah 0. Unduh data NLTK yang diperlukan untuk mengevaluasi ROUGE:
python -m nltk.downloader punkt_tab
Langkah 1.
Hasilkan dan nilai keluaran suatu model dengan menunjuk ke model tersebut model_card
file yaml atau setelah mendaftarkannya sebagai aset fairseq2 (dengan cara yang sama kita mendaftarkannya 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
dimana pada contoh kita mengevaluasi 100 sampel saja (--data_loading.max_samples 100
) dan membatasi panjang keluaran model menjadi 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 korpus.
Untuk mengevaluasi LCM UMK, kami menggunakan prediktor terkait (base_lcm
) dan evaluasi 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 KPK pada kumpulan data penyesuaian yang sama (pembagian validasi). Untuk mengevaluasi tugas hilir, dan membandingkan hasilnya dengan LLM, lihat dokumentasi Evaluasi.
Lihat file KONTRIBUSI untuk mengetahui cara membantu.
Jika Anda menggunakan basis kode ini, harap 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 = {
}
Kode ini dirilis di bawah lisensi MIT (lihat LISENSI).