Этот репозиторий предоставляет код для нашей статьи под названием «Настройка инструкций» с потерей инструкций , что делает интеграцию наших взносов кода в другие проекты более доступной.

Наше исследование дополнительно определяет ключевые факторы, влияющие на эффективность моделирования инструкций: (1) отношение между длиной инструкции и длиной выхода. (Левый рисунок). (2) Количество примеров обучения. (Правая фигура).
Вы можете воспроизвести эксперименты нашей настройки бумаги с потерей по сравнению с инструкциями.
Абстрактная настройка инструкций играет решающую роль в формировании результатов языковых моделей (LMS) в желаемые стили. В этой работе мы предлагаем простой, но эффективный метод, моделирование инструкций (IM), который обучает LMS, применяя функцию потери к инструкции и приглашной части, а не исключительно к выходной части. Благодаря экспериментам по 21 разнообразным показателям мы показываем, что во многих сценариях IM может эффективно улучшить производительность LM как по задачам NLP (например, MMLU, правдиворка и гуманеваль), так и с открытым ориентиром (например, MT-Bench и Alpacaeval). Примечательно, что в наиболее выгодном случае IM повышает производительность модели на Alpacaeval 1.0 на 100%. Мы выявляем два ключевых фактора, влияющих на эффективность IM: (1) соотношение между длиной инструкции и длиной выходного сигнала в учебных данных; и (2) количество примеров обучения. Мы наблюдаем, что IM особенно полезен при обучении на наборе данных с длинными инструкциями в сочетании с краткими выходами или под поверхностной гипотезой выравнивания (SAH), где для настройки инструкций используется небольшое количество тренировочных примеров. Дальнейший анализ подтверждает нашу гипотезу о том, что улучшение можно объяснить снижением переосмысления наборов данных настройки инструкций. Наша работа обеспечивает практическое руководство по настройке инструкций LMS, особенно в сценариях с низким ресурсом.
Чтобы установить необходимые пакеты для наших базовых подходов (полупрофильные подходы), вы можете запустить следующую команду.
conda create -n sft python=3.10
conda activate sft
pip install -r requirements.txt Для учебных данных мы предоставили обработанные данные в каталоге data для 7 наборов данных настройки инструкций. Вы можете скачать другие данные по следующим ссылкам:
sh prepare_train_data.shКроме того, мы загружаем меньше данных из NLP Princeton Mess.
Чтобы загрузить данные для набора данных 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 Здесь мы предоставляем инструкции по оценке моделей для стандартной настройки инструкций, моделирования инструкций (наше) и базовых моделей. Мы выполняем оценку, используя репозиторий с открытым исходным кодом 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 Здесь вы можете установить IS_ALPACA_EVAL_2 в True , чтобы оценить модель на наборе данных Alpacaeval-2. Если вы просто хотите выполнить поколение, не выполняя оценку, вы можете использовать аргумент --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},
}
Мы хотели бы поблагодарить авторов следующих репозиториев за предоставление кодовой базы: