Repositori ini menyediakan kode untuk makalah kami yang berjudul Instruksi Tuning dengan kehilangan instruksi , membuat integrasi kontribusi kode kami ke dalam proyek lain lebih mudah diakses.

Studi kami lebih lanjut mengidentifikasi faktor -faktor kunci yang mempengaruhi efektivitas pemodelan instruksi: (1) rasio antara panjang instruksi dan panjang output. (Gambar kiri). (2) Jumlah contoh pelatihan. (Gambar kanan).
Anda dapat mereproduksi eksperimen penyetelan instruksi kertas kami dengan kehilangan instruksi.
Tuning instruksi abstrak memainkan peran penting dalam membentuk output model bahasa (LMS) dengan gaya yang diinginkan. Dalam karya ini, kami mengusulkan metode yang sederhana namun efektif, pemodelan instruksi (IM), yang melatih LMS dengan menerapkan fungsi kerugian pada instruksi dan bagian yang cepat daripada semata -mata ke bagian output. Melalui eksperimen di 21 tolok ukur yang beragam, kami menunjukkan bahwa, dalam banyak skenario, IM dapat secara efektif meningkatkan kinerja LM pada kedua tugas NLP (misalnya, MMLU, jujur, dan tolok ukur generasi terbuka). Hebatnya, dalam kasus yang paling menguntungkan, IM meningkatkan kinerja model pada alpacaeval 1.0 lebih dari 100%. Kami mengidentifikasi dua faktor kunci yang mempengaruhi efektivitas IM: (1) rasio antara panjang instruksi dan panjang output dalam data pelatihan; dan (2) jumlah contoh pelatihan. Kami mengamati bahwa IM sangat bermanfaat ketika dilatih pada set data dengan instruksi panjang yang dipasangkan dengan output singkat, atau di bawah hipotesis perataan superfisial (SAH) di mana sejumlah kecil contoh pelatihan digunakan untuk penyetelan instruksi. Analisis lebih lanjut mendukung hipotesis kami bahwa perbaikan dapat dikaitkan dengan pengurangan overfitting ke set data penyetelan instruksi. Pekerjaan kami memberikan panduan praktis untuk pengajaran LMS Tuning, terutama dalam skenario sumber daya rendah.
Untuk memasang paket yang diperlukan untuk pendekatan dasar kami (pendekatan semi-diawasi), Anda dapat menjalankan perintah berikut.
conda create -n sft python=3.10
conda activate sft
pip install -r requirements.txt Untuk data pelatihan, kami telah memberikan data yang diproses di direktori data untuk 7 set data penyetelan instruksi. Anda dapat mengunduh data lain dari tautan berikut:
sh prepare_train_data.shSelain itu, kami mengunduh data yang lebih sedikit dari Data Kurang Princeton NLP.
Untuk mengunduh data untuk dataset Alpagasus, Anda dapat menjalankan perintah berikut.
sh prepare_alpagasus_data.shDi sini kami memberikan instruksi untuk melatih model untuk penyetelan instruksi standar, pemodelan instruksi (kami), dan model dasar.
Untuk melatih model penyetelan instruksi, Anda dapat menjalankan perintah berikut.
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 ;
doneUntuk melatih model pemodelan instruksi, Anda dapat menjalankan perintah berikut. Ini adalah metode yang kami usulkan.
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 ;
doneUntuk melatih model baseline (Neftune), Anda dapat menjalankan perintah berikut.
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 Di sini kami memberikan instruksi untuk mengevaluasi model untuk penyetelan instruksi standar, pemodelan instruksi (kami), dan model dasar. Kami melakukan evaluasi menggunakan fastchat repositori open-source, llm-evaluasi-harness, alpacaeval. Silakan merujuk ke repositori masing -masing untuk detail lebih lanjut. Harap instal paket yang diperlukan untuk evaluasi.
Untuk mengevaluasi model pada tugas NLP tradisional, Anda dapat menjalankan perintah berikut.
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
)Untuk mengevaluasi model pada dataset MT-Bench, Anda dapat menjalankan perintah berikut.
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 ../../../Untuk mengevaluasi model pada dataset alpacaeval, Anda dapat menjalankan perintah berikut.
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 Di sini Anda dapat mengatur IS_ALPACA_EVAL_2 untuk True untuk mengevaluasi model pada dataset alpacaeval-2. Jika Anda hanya ingin melakukan generasi tanpa melakukan evaluasi, Anda dapat menggunakan argumen --no_evaluate_with_llm .
Untuk mereproduksi analisis makalah ini, Anda dapat menjalankan perintah berikut.
Untuk menghitung kereta atau uji hilang dari model, Anda dapat menjalankan perintah berikut.
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 Jika Anda memiliki pertanyaan tentang kode atau kertas, jangan ragu untuk menjangkau penulis di [email protected] . Jika Anda mengalami kesulitan saat menggunakan kode atau perlu melaporkan bug, jangan ragu untuk membuka masalah. Kami dengan senang hati meminta Anda memberikan informasi terperinci tentang masalah untuk membantu kami memberikan dukungan yang efektif.
@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},
}
Kami ingin mengucapkan terima kasih kepada penulis dari repositori berikut untuk menyediakan basis kode: