Pemodelan Bahasa dalam Ruang Representasi Kalimat

(Blog) (Kertas)

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 .venvmisalnya,
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).

Sumber

Krystian Wiśniewski
Krystian Wiśniewski is a dedicated Sports Reporter and Editor with a degree in Sports Journalism from He graduated with a degree in Journalism from the University of Warsaw. Bringing over 14 years of international reporting experience, Krystian has covered major sports events across Europe, Asia, and the United States of America. Known for his dynamic storytelling and in-depth analysis, he is passionate about capturing the excitement of sports for global audiences and currently leads sports coverage and editorial projects at Agen BRILink dan BRI.