SFT微调数据处理
SFT微调(Supervised Fine-Tuning)前需要对数据集进行预处理,转化为.bin和.idx格式文件,以满足训练要求。
这里以Qwen-14B为例,对于Qwen-7B和Qwen-72B,操作过程与Qwen-14B相同,只需修改对应参数即可。
下载数据
SFT微调涉及的数据下载地址:https://github.com/Instruction-Tuning-with-GPT-4/GPT-4-LLM/blob/main/data/alpaca_gpt4_data.json
如果在准备数据章节已下载数据集,此处无需重复操作。
SFT微调和LoRA微调训练使用的是同一个数据集,数据处理一次即可,训练时可以共用。
数据预处理说明
使用数据预处理脚本preprocess_data.py脚本重新生成.bin和.idx格式的SFT全参微调数据。preprocess_data.py存放在llm_train/AscendSpeed/ModelLink/tools目录中,脚本具体内容如下。
#进入ModelLink目录 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #执行以下命令 python ./tools/preprocess_data.py \ --input /home/ma-user/ws/training_data/finetune/alpaca_gpt4_data.json \ --tokenizer-name-or-path $TOKENIZER_PATH \ --output-prefix $DATASET_PATH\ --tokenizer-type PretrainedFromHF \ --seq-length 4096 \ --workers 8 \ --handler-name GeneralInstructionHandler \ --make-vocab-size-divisible-by 128 \ --log-interval 1000
参数说明:
- input:SFT微调数据的存放路径。
- output-prefix:处理后的数据集保存路径+数据集名称前缀(例如:alpaca_ft)。
- tokenizer-type:tokenizer的类型,可选项有['BertWordPieceLowerCase', 'BertWordPieceCase','GPT2BPETokenizer', 'PretrainedFromHF'],设置为PretrainedFromHF。
- tokenizer-name-or-path:tokenizer的存放路径。
- handler-name:生成数据集的用途,这里是生成的指令数据集,用于微调。
- seq-length:是一个用于计算序列长度的函数。它接收一个序列作为输入,并返回序列的长度,需和训练时参数保持一致。
- workers:数据处理线程数。
--make-vocab-size-divisible-by:填充词汇大小,使模型中padded-vocab-size的值可被该值整除。这是出于计算效率的原因而添加的。
- log-interval:输出处理日志刷新间隔。
输出结果
alpaca_ft_packed_attention_mask_document.bin
alpaca_ft_packed_attention_mask_document.idx
alpaca_ft_packed_input_ids_document.bin
alpaca_ft_packed_input_ids_document.idx
alpaca_ft_packed_labels_document.bin
alpaca_ft_packed_labels_document.idx
数据处理具体操作
SFT全参微调数据处理具体操作步骤如下。
- 创建处理后的数据存放目录/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/
cd /home/ma-user/ws/ #进入容器工作目录 mkdir -p processed_for_ma_input/Qwen-14B/data/finetune
- 进入代码目录“/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink/”,在代码目录中执行preprocess_data.py脚本处理数据。
此处提供一段实际的数据处理代码示例如下。
#加载ascendspeed及megatron模型 export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/AscendSpeed export PYTHONPATH=$PYTHONPATH:/home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink #进入到ModelLink目录下 cd /home/ma-user/ws/xxx-Ascend/llm_train/AscendSpeed/ModelLink/ #执行以下命令 python ./tools/preprocess_data.py \ --input /home/ma-user/ws/training_data/finetune/alpaca_gpt4_data.json \ --tokenizer-name-or-path /home/ma-user/ws/tokenizers/Qwen-14B \ --output-prefix /home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/alpaca_ft \ --workers 8 \ --log-interval 1000 \ --tokenizer-type PretrainedFromHF \ --handler-name GeneralInstructionHandler \ --make-vocab-size-divisible-by 128 \ --seq-length 4096 \
数据处理完后,在/home/ma-user/ws/processed_for_ma_input/Qwen-14B/data/finetune/目录下生成转换后的数据文件。