更新时间:2024-04-30 GMT+08:00
分享

LoRA微调权重合并及转换

由于LoRA微调训练时产出的权重文件(TP和PP文件)个数比较多,推理前需要把多个权重文件合并为一个文件,并转换为HuggingFace格式。Llama2-13B一般使用单卡推理。

Step1 合并LoRA微调训练生成的权重文件

此步骤的目的是将LoRA微调训练时生成的SAVE_CKPT_PATH和MODEL_PATH权重文件合并在一起,形成完整的权重文件。SAVE_CKPT_PATH和MODEL_PATH的具体值参考LoRA微调超参配置
  1. 编辑LoRA权重合并脚本文件merge_lora_llama2_ptd_13B.sh,并修改配置。该脚本存放在“${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/scripts/tools/lora”目录下。
    把26-31行设置TP、PP、ORIGIN_CHECKPOINT_PATH、LORA_CHECKPOINT_PATH、VOCAB_FILE、MERGED_MODEL_SAVE_PATH移动至else外,同时设置:
    • ORIGIN_CHECKPOINT_PATH=${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf:设置为LoRA微调超参配置章节中的MODEL_PATH值。
    • LORA_CHECKPOINT_PATH=${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ckpt/ckpt-llama2-13b-lora:设置为LoRA微调任务章节中的SAVE_CKPT_PATH值。
    • VOCAB_FILE=${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf:tokenizer文件路径。
    • MERGED_MODEL_SAVE_PATH=${MA_JOB_DIR}/6.3.902-Ascend/weight/llama2_13b_lora_merge/:输出合并后的权重路径。
    • TP=8:张量并行数,要与LORA微调时设置相同的参数。
    • PP=1:流水线并行数,要与LORA微调时设置相同的参数,单机建议值为1,双机建议为2。
  2. 设置执行命令。
    sh scripts/tools/lora/merge_lora_llama2_ptd_13B.sh

    并提交做作业。

Step2 将多个权重文件合并为一个文件并转换格式

此步骤的目的是将Step1 合并LoRA微调训练生成的权重文件中生成的多个权重文件进行合并,生成一个权重文件,并转换权重文件的格式为HuggingFace格式。

脚本convert_weights_to_huggingface.py包含了权重文件合并和转换操作,具体的脚本内容和参数解释如下。

该脚本的执行需要在${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/代码目录下进行。

python ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/scripts/tools/ckpt_convert/llama/convert_weights_to_huggingface.py \
        --input-model-dir ${ASCNEDSPEED_CKPT_PATH} \
        --output-model-dir ${MERGE_CKPT_PATH} \
        --src-tensor-model-parallel-size ${TENSOR-MODEL-PARALLEL-SIZE} \
        --src-pipeline-model-parallel-size ${PIPELINE-MODEL-PARALLEL-SIZE} \
        --type ${TYPE} \
        --org-huggingface-dir ${HUGGINFGFACE_DIR} \
        --merge-mlp

参数说明:

  • ${ASCNEDSPEED_CKPT_PATH}:训练生成的AscendSpeed格式权重目录,多机多卡场景下需要把多个节点上的权重文件都放到任意一个节点的这个目录下,需要指定到含有mp_rank_xxxxxxx的目录,一般为iter_xxxxx或release。
  • ${MERGE_CKPT_PATH}:合并后的权重路径。
  • ${TENSOR-MODEL-PARALLEL-SIZE}:原始模型的TP配置大小,取值来自训练中的配置,此处需要手动输入。
  • ${PIPELINE-MODEL-PARALLEL-SIZE}:原始模型的PP配置大小,取值来自训练中的配置,此处需要手动输入。
  • ${TYPE}:原始模型参数大小,支持参数配置: 7B、13B、70B,按实际模型要求设置。
  • ${HUGGINFGFACE_DIR}:可选,开源HuggingFace权重目录,用于将开源权重内的配置文件,复制到转换后权重的输出目录中。

下面提供一个convert_weights_to_huggingface.py脚本的实际样例,供参考。

python ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/scripts/tools/ckpt_convert/llama/convert_weights_to_huggingface.py \
        --input-model-dir ${MA_JOB_DIR}/6.3.902-Ascend/llm_train/AscendSpeed/ckpt/ckpt-llama2-13b-lora/iter_xxxxxxx \
        --output-model-dir ${MA_JOB_DIR}/6.3.902-Ascend/weight/ckpt-llama2-13b-lora-hf \
        --src-tensor-model-parallel-size 8 \
        --src-pipeline-model-parallel-size 1 \
        --type 13B \
        --org-huggingface-dir ${MA_JOB_DIR}/6.3.902-Ascend/tokenizers/llama2-13b-hf \
        --merge-mlp

日志中出现下列提示即表示合并转换完成。

Merging tp pp weight from path: {as_dir} ......
Merging weight complete!!!
Converting weight to huggingface......
Converting weight to huggingface complete!!!
Saving weight to path: {hf_dir}
huggingface weight saved to: {hf_dir}/pytorch_model.bin
Generating model index config......
model index config saved in: {hf_dir}/pytorch_model.bin.index.json
Generating weight config file from: {org_hf_dir}
config file copy from "{org_hf_dir}" complete!!!

转换完成后目录中的release文件夹内至少包含一个bin文件和一个bin.index.json文件,bin文件大小应和huggingface原始权重大小相似:

{hf_dir}
├── pytorch_model.bin
└── pytorch_model.bin.index.json

以下config文件需要指定org_huggingface_dir参数才会生成。

├── config.json
├── generation_config.json
├── gitattributes.txt
├── LICENSE.txt
├── README.md
├── special_tokens_map.json
├── tokenizer_config.json
├── tokenizer.json
├── tokenizer.model
├── USE_POLICY.md
分享:

    相关文档

    相关产品