이 저장소는 지침에 대한 손실로 지시 조정 이라는 논문의 코드를 제공하여 코드 기여를 다른 프로젝트에 통합 할 수 있도록합니다.

우리의 연구는 교육 모델링의 효과에 영향을 미치는 주요 요인을 추가로 식별합니다. (1) 명령 길이와 출력 길이 사이의 비율. (왼쪽 그림). (2) 훈련 사례의 수. (오른쪽 그림).
지침에 대한 손실로 종이 지시 조정 실험을 재현 할 수 있습니다.
추상 지침 튜닝은 언어 모델 (LMS)의 출력을 원하는 스타일로 형성하는 데 중요한 역할을합니다. 이 작업에서는 간단하면서도 효과적인 방법 인 IM (Instruction Modeling)을 제안합니다.이 방법은 LMS를 훈련하여 명령어에 손실 함수를 적용하고 출력 부품이 아닌 프롬프트 부분을 적용합니다. 우리는 21 개의 다양한 벤치 마크에 걸친 실험을 통해 많은 시나리오에서 IM이 NLP 작업 (예 : MMLU, PruthfulQA 및 HumaneVal)과 개방형 세대 벤치 마크 (예 : MT-Bench 및 Alpacaeval)에서 LM 성능을 효과적으로 향상시킬 수 있음을 보여줍니다. 놀랍게도, 가장 유리한 경우, IM은 Alpacaeval 1.0의 모델 성능을 100%이상 향상시킵니다. 우리는 IM의 효과에 영향을 미치는 두 가지 주요 요소를 식별합니다. (1) 훈련 데이터의 명령 길이와 출력 길이 사이의 비율; 및 (2) 훈련 사례의 수. 우리는 간단한 출력과 짝을 이루는 긴 명령을 가진 데이터 세트에서 훈련을받을 때 또는 소량의 훈련 예가 명령 튜닝에 사용되는 표면 정렬 가설 (SAH) 아래에서 특히 유익하다는 것을 관찰합니다. 추가 분석은 개선이 명령어 튜닝 데이터 세트에 대한 과적으로 감소 된 것에 기인한다는 가설을 입증합니다. 우리의 작업은 특히 저주적 자원 시나리오에서 LMS 교육 조정에 대한 실질적인 지침을 제공합니다.
기준선 접근 방식 (반 감독 접근 방식)에 필요한 패키지를 설치하려면 다음 명령을 실행할 수 있습니다.
conda create -n sft python=3.10
conda activate sft
pip install -r requirements.txt 교육 데이터의 경우 7 개의 명령 튜닝 데이터 세트에 대한 data 디렉토리에 처리 된 데이터를 제공했습니다. 다음 링크에서 다른 데이터를 다운로드 할 수 있습니다.
sh prepare_train_data.sh또한 Princeton NLP가 적은 데이터에서 적은 데이터를 다운로드합니다.
Alpagasus 데이터 세트의 데이터를 다운로드하려면 다음 명령을 실행할 수 있습니다.
sh prepare_alpagasus_data.sh여기서 우리는 표준 명령 튜닝, 명령 모델링 (우리) 및 기준 모델에 대한 모델을 훈련하기위한 지침을 제공합니다.
명령어 튜닝 모델을 훈련 시키려면 다음 명령을 실행할 수 있습니다.
export CUDA_VISIBLE_DEVICES=0,1
MODEL_SIZE=7b
NUM_GPUS=2
BATCH_SIZE_PER_GPU=1
TOTAL_BATCH_SIZE=128
EPOCH=2
MAX_LENGTH=2048
GRADIENT_ACC_STEPS= $(( $TOTAL_BATCH_SIZE / $NUM_GPUS / $BATCH_SIZE_PER_GPU ))
echo " Training llama model ${MODEL_SIZE} using $NUM_GPUS GPUs, $BATCH_SIZE_PER_GPU batch size per GPU, $GRADIENT_ACC_STEPS gradient accumulation steps "
DATA_NAME_LIST=(
lima_data
alpagasus_3k_dolly
alpagasus_9k_dolly
alpagasus_claude_t45_alpaca
tydiqa
mmlu_chat
bbh_icl
)
DATASET_PATH_LIST=(
lima_data
alpagasus_3k_dolly
alpagasus_9k_dolly
alpagasus_claude_t45_alpaca
tydiqa_adam_sim_trainp0.05_seed3_p0.05
mmlu-chat_adam_sim_trainp0.05_seed3_p0.05
bbh-icl_adam_sim_trainp0.05_seed3_p0.05
)
for i in " ${ ! DATA_NAME_LIST[@]} " ; do
DATA_NAME= ${DATA_NAME_LIST[i]}
DATASET_PATH= ${DATASET_PATH_LIST[i]}
for LR in 2e-5 ; do
DATA_PATH=data/ ${DATASET_PATH} .jsonl
OUTPUT_DIR=model/ ${DATA_NAME} _llama2_ ${MODEL_SIZE} _bs ${TOTAL_BATCH_SIZE} _lr ${LR} _ml ${MAX_LENGTH} _ep ${EPOCH} _bf16
printf ' %qn%qn%qn%qn ' " $DATA_NAME " " $DATASET_PATH " " $DATA_PATH " " $OUTPUT_DIR "
accelerate launch
--mixed_precision bf16
--num_machines 1
--num_processes $NUM_GPUS
--use_deepspeed
--main_process_port 29521
--deepspeed_config_file ds_configs/stage3_no_offloading_accelerate.conf
src/finetune.py
--model_name_or_path meta-llama/Llama-2- ${MODEL_SIZE} -hf
--use_flash_attn
--tokenizer_name meta-llama/Llama-2- ${MODEL_SIZE} -hf
--use_slow_tokenizer
--train_file ${DATA_PATH}
--max_seq_length ${MAX_LENGTH}
--preprocessing_num_workers 16
--per_device_train_batch_size $BATCH_SIZE_PER_GPU
--gradient_accumulation_steps $GRADIENT_ACC_STEPS
--learning_rate ${LR}
--lr_scheduler_type linear
--warmup_ratio 0.03
--weight_decay 0.
--checkpointing_steps epoch
--num_train_epochs ${EPOCH}
--output_dir ${OUTPUT_DIR}
--with_tracking
--report_to tensorboard
--logging_steps 1 ;
done ;
done명령 모델링 모델을 훈련 시키려면 다음 명령을 실행할 수 있습니다. 이것이 우리의 제안 된 방법입니다.
for i in " ${ ! DATA_NAME_LIST[@]} " ; do
DATA_NAME= ${DATA_NAME_LIST[i]}
DATASET_PATH= ${DATASET_PATH_LIST[i]}
for LR in 2e-5 ; do
DATA_PATH=data/ ${DATASET_PATH} .jsonl
OUTPUT_DIR=model/ ${DATA_NAME} _llama2_ ${MODEL_SIZE} _bs ${TOTAL_BATCH_SIZE} _lr ${LR} _ml ${MAX_LENGTH} _ep ${EPOCH} _bf16_im
printf ' %qn%qn%qn%qn ' " $DATA_NAME " " $DATASET_PATH " " $DATA_PATH " " $OUTPUT_DIR "
accelerate launch
--mixed_precision bf16
--num_machines 1
--num_processes $NUM_GPUS
--use_deepspeed
--deepspeed_config_file ds_configs/stage3_no_offloading_accelerate.conf
src/finetune.py
--model_name_or_path meta-llama/Llama-2- ${MODEL_SIZE} -hf
--use_flash_attn
--tokenizer_name meta-llama/Llama-2- ${MODEL_SIZE} -hf
--use_slow_tokenizer
--train_file ${DATA_PATH}
--max_seq_length ${MAX_LENGTH}
--preprocessing_num_workers 16
--per_device_train_batch_size $BATCH_SIZE_PER_GPU
--gradient_accumulation_steps $GRADIENT_ACC_STEPS
--learning_rate ${LR}
--lr_scheduler_type linear
--warmup_ratio 0.03
--weight_decay 0.
--checkpointing_steps epoch
--num_train_epochs ${EPOCH}
--output_dir ${OUTPUT_DIR}
--with_tracking
--report_to tensorboard
--logging_steps 1
--use_lm_loss ;
done ;
done기준선 모델 (Neftune)을 훈련 시키려면 다음 명령을 실행할 수 있습니다.
NEFTUNE_ALPHA=5
for i in " ${ ! DATA_NAME_LIST[@]} " ; do
DATA_NAME= ${DATA_NAME_LIST[i]}
DATASET_PATH= ${DATASET_PATH_LIST[i]}
for LR in 2e-5 ; do
DATA_PATH=data/ ${DATASET_PATH} .jsonl
OUTPUT_DIR=model/ ${DATA_NAME} _llama2_ ${MODEL_SIZE} _bs ${TOTAL_BATCH_SIZE} _lr ${LR} _ml ${MAX_LENGTH} _ep ${EPOCH} _bf16_alpha ${NEFTUNE_ALPHA}
printf ' %qn%qn%qn%qn ' " $DATA_NAME " " $DATASET_PATH " " $DATA_PATH " " $OUTPUT_DIR "
accelerate launch
--mixed_precision bf16
--num_machines 1
--num_processes $NUM_GPUS
--use_deepspeed
--deepspeed_config_file ds_configs/stage3_no_offloading_accelerate.conf
src/finetune.py
--model_name_or_path meta-llama/Llama-2- ${MODEL_SIZE} -hf
--use_flash_attn
--tokenizer_name meta-llama/Llama-2- ${MODEL_SIZE} -hf
--use_slow_tokenizer
--train_file ${DATA_PATH}
--max_seq_length ${MAX_LENGTH}
--preprocessing_num_workers 16
--per_device_train_batch_size $BATCH_SIZE_PER_GPU
--gradient_accumulation_steps $GRADIENT_ACC_STEPS
--learning_rate ${LR}
--lr_scheduler_type linear
--warmup_ratio 0.03
--weight_decay 0.
--checkpointing_steps epoch
--num_train_epochs ${EPOCH}
--output_dir ${OUTPUT_DIR}
--with_tracking
--report_to tensorboard
--logging_steps 1
--neftune_alpha ${NEFTUNE_ALPHA} ;
done ;
done 여기서 우리는 표준 명령 튜닝, 명령 모델링 (우리) 및 기준 모델을 평가하기위한 지침을 제공합니다. Open-Source Repository Fastchat, LLM-Evaluation-Harness, Alpacaeval을 사용하여 평가를 수행합니다. 자세한 내용은 해당 저장소를 참조하십시오. 평가에 필요한 패키지를 설치하십시오.
기존 NLP 작업의 모델을 평가하려면 다음 명령을 실행할 수 있습니다.
CUDA_VISIBLE_DEVICES=0,1
MODELS_0=(
mmlu_chat_llama2_13b_bs128_lr2e-5_ml1024_ep2_bf16_im
)
(
for model in ${MODELS_0} ; do
echo " Evaluating $model "
MODEL_PATH= ${BASE_PATH} /model/ ${model}
echo ${MODEL_PATH}
accelerate launch --mixed_precision bf16 --multi_gpu -m lm_eval --model hf
--model_args pretrained= ${MODEL_PATH} ,max_length= ${MAX_LENGTH}
--tasks sft_eval
--batch_size auto
--write_out
--show_config
--output_path output/ ${model}
--log_samples
# CODEX: Evaluating using temperature 0.1 to get the pass@1 score
python -m eval.codex_humaneval.run_eval
--data_file ${BASE_PATH} /data/eval/codex_humaneval/HumanEval.jsonl.gz
--eval_pass_at_ks 1
--unbiased_sampling_size_n 20
--temperature 0.1
--save_dir results_humaneval/ ${model} _t01
--model ${MODEL_PATH}
--tokenizer ${MODEL_PATH}
--use_vllm
# CODEX: Evaluating using temperature 0.8 to get the pass@10 score
python -m eval.codex_humaneval.run_eval
--data_file ${BASE_PATH} /data/eval/codex_humaneval/HumanEval.jsonl.gz
--eval_pass_at_ks 1
--unbiased_sampling_size_n 20
--temperature 0.7
--save_dir results_humaneval/ ${model} _t07
--model ${MODEL_PATH}
--tokenizer ${MODEL_PATH}
--use_vllm ;
done
)MT-Bench 데이터 세트의 모델을 평가하려면 다음 명령을 실행할 수 있습니다.
MODELS=mmlu_chat_llama2_13b_bs128_lr2e-5_ml1024_ep2_bf16_im
cd FastChat/fastchat/llm_judge
for model in $MODELS ; do
echo " Evaluating $model "
echo " Firstly, Generate model answers to MT-bench questions "
python gen_model_answer.py --model-path ${MODEL_PATH} / ${model} --model-id ${model}
echo " ≈, Evaluate model answers using OpenAI API "
python gen_judgment.py --model-list ${model} --parallel 2 ;
done
# To show the results
cd FastChat/fastchat/llm_judge
python show_result.py
python show_result.py --model-list model_name1 model_name2 # to show the results of the specified models
cd ../../../Alpacaeval 데이터 세트의 모델을 평가하려면 다음 명령을 실행할 수 있습니다.
MODELS=mmlu_chat_llama2_13b_bs128_lr2e-5_ml1024_ep2_bf16_im
export IS_ALPACA_EVAL_2=False
for model in $MODELS ; do
CUDA_VISIBLE_DEVICES=0 python -m eval.alpaca_farm.run_eval
--model_name_or_path ${BASE_PATH} / ${model}
--save_dir results_alpaca_eval/ ${model}
--eval_batch_size 20
--use_vllm
--use_chat_format
--chat_formatting_function eval.templates.create_prompt_with_tulu_chat_format ;
done 여기서는 alpacaeval-2 데이터 세트의 모델을 평가하기 위해 IS_ALPACA_EVAL_2 를 True 로 설정할 수 있습니다. 평가를 수행하지 않고 생성을 수행하려면 인수 --no_evaluate_with_llm 를 사용할 수 있습니다.
논문의 분석을 재현하려면 다음 명령을 실행할 수 있습니다.
모델의 열차 또는 테스트 손실을 계산하려면 다음 명령을 실행할 수 있습니다.
MODEL_NMAES= " lima_data_llama2_7b_bs128_lr2e-5_ml2048_ep2_bf16 "
DATA_NAME_LIST=(
lima_data
tulu_dataset_01
)
DATASET_PATH_LIST=(
lima_data
tulu_dataset_01
)
for i in " ${ ! DATA_NAME_LIST[@]} " ; do
DATA_NAME= ${DATA_NAME_LIST[i]}
DATASET_PATH= ${DATASET_PATH_LIST[i]}
DATA_PATH=data/ ${DATASET_PATH} .jsonl
for model in $MODEL_NMAES ; do
accelerate launch
--main_process_port 29399
--mixed_precision bf16
--num_machines 1
--num_processes $NUM_GPUS
--use_deepspeed
--deepspeed_config_file ds_configs/stage3_no_offloading_accelerate.conf
open_instruct/compute_loss.py
--model_name_or_path ${BASE_PATH} / ${model}
--use_flash_attn
--tokenizer_name ${BASE_PATH} / ${model}
--use_slow_tokenizer
--eval_file ${DATA_PATH}
--max_seq_length ${MAX_LENGTH}
--preprocessing_num_workers 16
--per_device_eval_batch_size $BATCH_SIZE_PER_GPU
--output_dir output_loss/ ${model} _ ${DATA_NAME} ;
done ;
done 코드 나 논문에 관한 궁금한 점이 있으면 [email protected] 의 저자에게 자유롭게 연락하십시오. 코드를 사용하는 동안 어려움을 겪거나 버그를보고 해야하는 경우 자유롭게 문제를여십시오. 우리는 효과적인 지원을 제공하는 데 도움이되는 문제에 대한 자세한 정보를 제공하도록 친절하게 요청합니다.
@article{shi2024instruction,
title={Instruction Tuning With Loss Over Instructions},
author={Zhengyan Shi and Adam X. Yang and Bin Wu and Laurence Aitchison and Emine Yilmaz and Aldo Lipani},
booktitle={ArXiv},
year={2024},
url={https://arxiv.org/abs/2405.14394},
}
코드베이스 제공에 대해 다음 저장소의 저자에게 감사의 말씀을 전합니다.