このリポジトリは、命令チューニングというタイトルのペーパーのコードを指示に及ぼし、他のプロジェクトへのコード貢献の統合をよりアクセスしやすくします。

私たちの研究では、命令モデリングの有効性に影響を与える重要な要因がさらに特定されています。(1)指導の長さと出力の長さの比率。 (左図)。 (2)トレーニングの例の数。 (右図)。
私たちの紙の指示の実験を、指示を損なうことで再現することができます。
抽象命令チューニングは、言語モデル(LMS)の出力を望ましいスタイルに形作る上で重要な役割を果たします。この作業では、シンプルでありながら効果的な方法である命令モデリング(IM)を提案します。これは、出力部品のみではなく、命令とプロンプトパーツに損失関数を適用することでLMSを訓練します。 21の多様なベンチマークにわたる実験を通じて、多くのシナリオで、IMは両方のNLPタスク(MMLU、Truthfulqa、およびHumanvalなど)とオープンエンドジェネレーションベンチマーク(例えば、MTベンチおよびアルパカエバル)の両方のLMパフォーマンスを効果的に改善できることを示しています。驚くべきことに、最も有利なケースでは、IMはAlpacaeval 1.0のモデルパフォーマンスを100%超えています。 IMの有効性に影響を与える2つの重要な要因を特定します。(1)トレーニングデータの命令長と出力長の比率。 (2)トレーニングの例の数。短い出力と組み合わせた長い指示を持つデータセットで訓練された場合、または指示の調整に少量のトレーニング例が使用される表面的なアライメント仮説(SAH)の下で、IMは特に有益であることがわかります。さらなる分析では、改善が命令チューニングデータセットへの過剰適合の減少に起因するという仮説を実証します。私たちの仕事は、特に低リソースのシナリオで、LMSを調整するための指導のための実用的なガイダンスを提供します。
ベースラインアプローチに必要なパッケージをインストールするには、次のコマンドを実行できます。
conda create -n sft python=3.10
conda activate sft
pip install -r requirements.txtトレーニングデータについては、7つの命令チューニングデータセットのdataディレクトリに処理されたデータを提供しました。次のリンクから他のデータをダウンロードできます。
sh prepare_train_data.shさらに、プリンストン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 ここでは、標準の指導チューニング、命令モデリング(私たちの)、およびベースラインモデルのモデルを評価するための指示を提供します。オープンソースリポジトリ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ベンチデータセットのモデルを評価するには、次のコマンドを実行できます。
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 ../../../アルパカエバルデータセットのモデルを評価するには、次のコマンドを実行できます。
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] ucl.ac.ukの著者にお気軽にお問い合わせください。コードを使用しているときに問題が発生したり、バグを報告する必要がある場合は、お気軽に問題を開いてください。問題に関する詳細な情報を提供して、効果的なサポートを提供するようお願いします。
@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},
}
コードベースを提供してくれた次のリポジトリの著者に感謝します。