[블로그] [종이]
이 저장소는 LCM (Large Concept Model)에 대한 공식 구현 및 실험을 제공합니다.
LCM은 명백한 상위 수준의 의미 론적 표현에서 작동하며, 이는 "개념"이라고합니다. 개념은 언어 및 양식에 비해, 더 높은 수준의 아이디어를 나타냅니다. 이 작품에서 개념은 문장에 해당하며, 우리는 텍스트의 최대 200 개 언어와 57 개의 언어를 지원하는 소나 임베딩 공간을 사용합니다. 여기에서 지원되는 언어 목록을 참조하십시오.
LCM은 자동 요정 문장 예측을 수행하도록 훈련 된 개념 공간의 시퀀스-시퀀스 모델입니다. 우리는 여러 접근법을 탐색합니다.
base_lcm ).two_tower_diffusion_lcm 포함합니다).이러한 탐색은 1.6B 매개 변수 모델과 1.3T 토큰 순서로 훈련 데이터를 사용하여 수행됩니다. 우리는이 저장소 레시피에 1.6B MSE LCM 및 2 타워 확산 LCM의 훈련 및 미세 조정을 재현하기 위해 포함합니다. 아래 지침을 참조하십시오.
LCM 저장소는 FairSeQ2에 의존합니다. 시스템에 uv 설치 한 경우 다음 명령을 실행하여 필요한 모든 패키지로 가상 환경을 설치할 수 있습니다.
uv sync --extra cpu --extra eval --extra data uv run 사용하여 올바른 환경으로 데모 명령을 실행할 수도 있습니다.
cpu 종속성에 대한 요구 사항 만 제공합니다. GPU 지원을 사용하려면 시스템에 적합한 Torch 및 FairSeQ2의 변형을 선택해야합니다. 예를 들어 Cuda 1.21의 Torch 2.5.1의 경우 다음과 같은 작업을 수행 할 수 있습니다.
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
이 파이프 라인은 데이터 세트를 껴안는 방법을 보여주고 Sonar 및 Sat로 처리하는 방법을 보여줍니다. 자체 데이터 처리에 대한 자세한 내용은 파일을 확인하십시오. 스크립트는 HuggingFace에서 데이터를 가져 오는 예제를 제공하지만 JSONL, Parquet 및 CSV를 처리하기위한 API도 제공합니다.
아래에 설명 된 트레이너는 데이터 세트를 구성하는 데이터 카드에 의존합니다. 이 데이터 카드는 데이터 세트 파일 (로컬 또는 S3)에 대한 포인터와 스키마에 대한 정보가있는 YAML 파일입니다. 우리는 lcm/datacards/datacards.yaml 의 샘플 데이터 카드를 제공합니다. 일부 데이터를 처리 한 후에는 경로로 데이터 카드를 업데이트 할 수 있습니다.
데이터 세트의 주어진 가중치 혼합물에 새로운 임베딩 스페이스 정상화에 맞추려면 다음 명령을 사용할 수 있습니다.
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. STOPES의 런처를 통한 제출을 사용한 Slurm을 사용한 교육 :
python -m lcm.train
+pretrain=mse
++trainer.output_dir= " checkpoints/mse_lcm "
++trainer.experiment_name=training_mse_lcm 이 명령을 사용하면 레시피의 요구 사항과 함께 training_mse_lcm 이라는 Slurm 작업을 제출합니다.
requirements :
nodes : 4
tasks_per_node : 8
gpus_per_node : 8
cpus_per_task : 32
mem_gb : 0
timeout_min : 10000타임 아웃 한도 및 런처의 Slurm 파티션과 같은 작업의 요구 사항을 다음과 같이 재정의 할 수 있습니다.
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 만 사용)으로 로컬로 훈련 ( ++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 사용할 수 없다면 건너 뜁니다. uv pip install wandb 사용하여 wandb 를 설치할 수 있습니다. 레시피에서 Hydra 구성 값을 재정의하여 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 팁
훈련 레시피의 다양한 성분을 이해하려면이 읽기를 확인하십시오.
감독 된 데이터에 대한 이전에 미리 훈련 된 2 타워 확산 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_towerFairSeQ2 자산을 관리하는 방법에 대한 자세한 내용은 문서를 참조하십시오.
2 단계. 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을 정합하려면 미리 훈련 된 체크 포인트를 등록하기위한 동일한 지침을 따르고 적절한 레시피 (./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. Rouge 평가에 필요한 NLTK 데이터 다운로드 :
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 라이센스에 따라 릴리스됩니다 (라이센스 참조).