[บล็อก] [กระดาษ]
ที่เก็บนี้ให้การใช้งานอย่างเป็นทางการและการทดลองสำหรับแบบจำลองแนวคิดขนาดใหญ่ ( LCM )
LCM ดำเนินการกับการเป็นตัวแทนความหมายระดับสูงกว่าอย่างชัดเจนซึ่งเราตั้งชื่อ "แนวคิด" แนวคิดคือภาษาและวิธีการที่ไม่เชื่อเรื่องพระเจ้าและเป็นตัวแทนของแนวคิดระดับที่สูงขึ้น ในงานนี้แนวคิดสอดคล้องกับประโยคและเราใช้พื้นที่ฝังโซนาร์ซึ่งรองรับได้มากถึง 200 ภาษาในข้อความและ 57 ภาษาในการพูด ดูรายการภาษาที่รองรับได้ที่นี่
LCM เป็นแบบจำลองลำดับต่อลำดับในพื้นที่แนวคิดที่ได้รับการฝึกฝนเพื่อทำการทำนายประโยคที่ไม่เร่งรัดอัตโนมัติ เราสำรวจหลายวิธี:
base_lcm ในรหัสนี้)two_tower_diffusion_lcm ในรุ่นนี้)การสำรวจเหล่านี้ดำเนินการโดยใช้แบบจำลองพารามิเตอร์ 1.6B และข้อมูลการฝึกอบรมตามลำดับโทเค็น 1.3T เรารวมไว้ในสูตรที่เก็บนี้เพื่อทำซ้ำการฝึกอบรมและ finetuning ของ 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 ไม่ได้จัดเตรียมบิลด์สำหรับเครื่องของคุณให้ตรวจสอบ 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 เรายังให้ APIs เพื่อประมวลผล JSONL, Parquet และ CSV
ผู้ฝึกสอนที่อธิบายไว้ด้านล่างอาศัยข้อมูลที่กำหนดค่าชุดข้อมูล ฐานข้อมูลเหล่านี้เป็นไฟล์ YAML ที่มีพอยน์เตอร์ไปยังไฟล์ชุดข้อมูล (ในเครื่องหรือบน S3) และข้อมูลบนสคีมา เราให้บริการข้อมูลตัวอย่างใน 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) น้ำหนักสัมพัทธ์ของพวกเขา Normalizer ที่ได้จะได้รับการประกาศต่อไปเป็นแบบจำลองดังที่แสดงใน lcm/cards/sonar_normalizer.yaml และอ้างอิงในการกำหนดค่าการฝึกอบรมทั้งหมด
ในการฝึกอบรม MSE LCM เราจะใช้หนึ่งในคำสั่งต่อไปนี้:
ตัวเลือก 1. การฝึกอบรมกับ Slurm โดยใช้ Submitit ผ่านตัวเรียกใช้งานของ Stopes:
python -m lcm.train
+pretrain=mse
++trainer.output_dir= " checkpoints/mse_lcm "
++trainer.experiment_name=training_mse_lcm ด้วยคำสั่งนี้เราจะส่งงาน slurm ชื่อ training_mse_lcm พร้อมข้อกำหนดของสูตรในกรณีนี้:
requirements :
nodes : 4
tasks_per_node : 8
gpus_per_node : 8
cpus_per_task : 32
mem_gb : 0
timeout_min : 10000คุณสามารถแทนที่ข้อกำหนดของงานเช่นขีด จำกัด การหมดเวลาและพาร์ติชัน Slurm ของ Launcher ด้วย:
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) ที่มีขนาดแบทช์ขนาดเล็ก (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 สำคัญ
เนื่องจากเรากำลังเปลี่ยนจำนวน GPU ที่ต้องการโดยสูตรสิ่งนี้จะไม่ทำซ้ำการตั้งค่าการทดลองของกระดาษ
จุดตรวจสอบจุด checkpoints/mse_lcm จะถูกจัดโครงสร้างเป็น:
.
├── checkpoints
│ ├── step_2000
│ ├── ...
│ └── step_250000
├── config_logs
├── executor_logs
├── model_card.yaml
├── tb # tensorboard logs
└── wandb # W&B logs
โปรดทราบว่าการตัดไม้ W & B ถูกข้ามเว้นแต่จะมี wandb คุณสามารถติดตั้ง wandb ด้วย uv pip install wandb อาร์กิวเมนต์ W&B สามารถเปลี่ยนแปลงได้โดยการเอาชนะค่าการกำหนดค่าไฮดราในสูตร:
++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 นี้
หากต้องการ finetune LCM การแพร่กระจายสองหอก่อนที่ได้รับการฝึกอบรมก่อนหน้านี้บนข้อมูลภายใต้การดูแลให้ทำตามขั้นตอนเหล่านี้:
ขั้นตอนที่ 1. ลงทะเบียนจุดตรวจสอบที่ผ่านการฝึกอบรมมาแล้วเป็นสินทรัพย์ FairSeq2
คุณสามารถกำหนดจุดตรวจสอบสุดท้ายด้วย checkpoints/two_tower_lcm/model_card.yaml หรือจุดตรวจใด ๆ หลังจากขั้นตอนการฝึกอบรมที่เฉพาะเจาะจงเช่น checkpoints/two_tower_lcm/checkpoints/step_2000/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. เปิดงาน finetuning ที่ชี้ไปที่โมเดลไปยัง 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 ให้ทำตามคำแนะนำเดียวกันสำหรับการลงทะเบียนจุดตรวจสอบที่ผ่านการฝึกอบรมมาก่อนและส่งงาน finetuning พร้อมสูตรที่เหมาะสม (./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 ที่จำเป็นสำหรับการประเมิน Rouge:
python - m nltk . downloader punkt_tab ขั้นตอนที่ 1. สร้างและคะแนนเอาต์พุตของโมเดลโดยชี้ไปที่ไฟล์ model_card yaml หรือหลังจากลงทะเบียนเป็นสินทรัพย์ 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 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 ในชุดข้อมูล finetuning เดียวกัน (แยกการตรวจสอบความถูกต้อง) ในการประเมินในงานดาวน์สตรีมและเปรียบเทียบผลลัพธ์กับ LLM โปรดดูเอกสารการประเมินผล
ดูไฟล์ที่มีส่วนร่วมสำหรับวิธีการช่วยเหลือ
หากคุณใช้ codebase นี้โปรดอ้างอิง:
@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 (ดูใบอนุญาต)