[Блог] [Paper]
Этот репозиторий предоставляет официальные реализации и эксперименты для крупных концептуальных моделей ( LCM ).
LCM работает на явном семантическом представлении более высокого уровня, которое мы называем «концепцией». Концепции являются языковыми и модальными агентами и представляют собой идею более высокого уровня. В этой работе концепция соответствует предложению, и мы используем пространство встраивания сонар, которое поддерживает до 200 языков в тексте и 57 языков в речи. Смотрите список поддерживаемых языков здесь.
LCM представляет собой модель последовательности к последовательности в пространстве концепций, обученных для выполнения автоматического регрессивного прогноза предложений. Мы исследуем несколько подходов:
base_lcm в этом коде).two_tower_diffusion_lcm ).Эти исследования выполняются с использованием моделей параметров 1,6B и учебных данных в порядке 1,3T токенов. Мы включаем в эти рецепты рецептов, чтобы воспроизвести обучение и создание 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 Prefix All команд с помощью 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, мы также предоставляем API для обработки JSONL, Parquet и CSV.
Описанный ниже тренер полагается на DataCards, настраивающие наборы данных. Эти данные DataCards являются файлами YAML с указателями на файлы набора данных (локально или на S3) и информацию о ее схеме. Мы предоставляем несколько образцов данных DATACARD в lcm/datacards/datacards.yaml . После того, как вы обработали некоторые данные, вы можете обновить DataCards своими путями.
Чтобы соответствовать новому нормализатору пространства встроенного пространства на данной взвешенной смеси наборов данных, можно использовать следующую команду:
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 - это имена наборов данных, объявленных на данных DataCards, как показано выше, и (4, 1, 10) их соответствующие относительные веса. Полученный нормализатор может быть затем объявлен в качестве модели, как показано в lcm/cards/sonar_normalizer.yaml и ссылается во всех конфигурациях обучения модели.
Чтобы тренировать MSE LCM, мы будем использовать одну из следующих команд:
Вариант 1. Обучение с Slurm с использованием отправки через запуск Stopes:
python -m lcm.train
+pretrain=mse
++trainer.output_dir= " checkpoints/mse_lcm "
++trainer.experiment_name=training_mse_lcm С помощью этой команды мы отправим трудную работу с именем training_mse_lcm с требованиями рецепта, в данном случае:
requirements :
nodes : 4
tasks_per_node : 8
gpus_per_node : 8
cpus_per_task : 32
mem_gb : 0
timeout_min : 10000Вы можете переопределить требования работы, например, ограничение тайм -аута и раздел пусковой установки с:
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 графических процессоров) с меньшим размером партии (переоценка ++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 Важный
Поскольку мы меняем количество графических процессоров, требуемых рецептом, это не воспроизводит экспериментальную настройку бумаги.
Контрольные точки каталога 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 могут быть изменены, переопределив значения конфигурации 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.
Чтобы определить ранее предварительно обученную диффузию с двумя башнями на контролируемых данных, выполните следующие действия:
Шаг 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. Запустите задание по созданию Manetuning, указывающую на модель в 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Аналогичным образом, чтобы Finetune A MSE LCM, следуйте тем же инструкциям для регистрации предварительно обученной контрольной точки и отправить задание по созданию соответствующего рецепта (./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 будут структурированы как:
.
├── 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 в одном и том же наборе данных о создании (разделение валидации). Чтобы оценить в нижней задаче и сравнить результаты с 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 (см. Лицензию).