更新时间:2024-10-22 GMT+08:00
分享

LoRA微调训练

步骤一 上传训练权重文件和数据集

如果在准备代码和数据阶段已经上传权重文件和数据集到容器中,可以忽略此步骤。

如果未上传训练权重文件和数据集到容器中,具体参考上传代码和权重文件到工作环境上传数据到指定目录章节完成。训练脚本中会自动执行训练前的权重转换操作和数据处理操作。

如果想详细了解脚本执行训练权重转换操作和数据集预处理操作说明请分别参见训练中的权重转换说明训练的数据集预处理说明

步骤二 修改训练超参配置

Llama2-70b和Llama2-13b的LoRA微调为例,执行脚本为0_pl_lora_70b.sh0_pl_lora_13b.sh

修改模型训练脚本中的超参配置,必须修改的参数如表1所示。其他超参均有默认值,可以参考表1按照实际需求修改。

表1 训练超参配置说明

参数

示例值

参数说明

ORIGINAL_TRAIN_DATA_PATH

/home/ma-user/ws/llm_train/AscendSpeed/training_data/alpaca_gpt4_data.json

必须修改。训练时指定的输入数据路径。请根据实际规划修改。

ORIGINAL_HF_WEIGHT

/home/ma-user/ws/llm_train/AscendSpeed/models/llama2-13B

必须修改。加载Hugging Face权重(可与tokenizer相同文件夹)时,对应的存放地址。请根据实际规划修改。

TOKENIZER_PATH

/home/ma-user/ws/llm_train/AscendSpeed/tokenizers/llama2-13B

该参数为tokenizer文件的存放地址。默认与ORIGINAL_HF_WEIGHT路径相同。若用户需要将Hugging Face权重与tokenizer文件分开存放时,则需要修改参数。

INPUT_PROCESSED_DIR

/home/ma-user/ws/llm_train/AscendSpeed/processed_for_input/llama2-13b

该路径下保存“数据转换”和“权重转换”的结果。示例中,默认生成在“processed_for_input”文件夹下。若用户需要修改,可添加并自定义该变量。

OUTPUT_SAVE_DIR

/home/ma-user/ws/llm_train/AscendSpeed/saved_dir_for_output/

该路径下统一保存生成的 CKPT、PLOG、LOG 文件。示例中,默认统一保存在“saved_dir_for_output”文件夹下。若用户需要修改,可添加并自定义该变量。

CKPT_SAVE_PATH

/home/ma-user/ws/llm_train/AscendSpeed/saved_dir_for_output/saved_models/llama2-13b

保存训练生成的模型 CKPT 文件。示例中,默认保存在“saved_dir_for_output/saved_models”文件夹下。若用户需要修改,可添加并自定义该变量。

LOG_SAVE_PATH

/home/ma-user/ws/llm_train/AscendSpeed/saved_dir_for_output/saved_models/llama2-13b/log

保存训练过程记录的日志 LOG 文件。示例中,默认保存在“saved_models/llama2-13b/log”文件夹下。若用户需要修改,可添加并自定义该变量。

ASCEND_PROCESS_LOG_PATH

/home/ma-user/ws/llm_train/AscendSpeed/saved_dir_for_output/plog

保存训练过程中记录的程序堆栈信息日志 PLOG 文件。示例中,默认保存在“saved_dir_for_output/plog”文件夹下。若用户需要修改,可添加并自定义该变量。

对于Yi系列模型、ChatGLMv3-6B和Qwen系列模型,还需要手动修改训练参数和tokenizer文件,具体请参见训练tokenizer文件说明

步骤三 启动训练脚本

请根据表1修改超参值后,修改config.yaml中的${command},替换为容器中执行训练的命令。Llama2-70B建议为4机32卡训练。

多机启动

Llama2-70B 为例,修改多机config.yaml模板中的${command}命令如下。多机启动需要在每个节点上执行。MASTER_ADDR为当前ssh远程主机的IP地址(私网IP)。

多机执行命令为:sh scripts/llama2/0_pl_lora_70b.sh <MASTER_ADDR=xx.xx.xx.xx> <NNODES=4> <NODE_RANK=0>
# 仅需要修改预训练中的多机训练执行命令即可
  - name: main
          args:
          - cd /mnt/sfs_turbo/llm_train/AscendSpeed;
            sh scripts/llama2/0_pl_lora_70b.sh xx.xx.xx.xx 4 0; # 多机训练执行命令
  - name: work1
          args:
          - cd /mnt/sfs_turbo/llm_train/AscendSpeed;
            sh scripts/llama2/0_pl_lora_70b.sh xx.xx.xx.xx 4 1; # 多机训练执行命令
  - name: work2
          args:
          - cd /mnt/sfs_turbo/llm_train/AscendSpeed;
            sh scripts/llama2/0_pl_lora_70b.sh xx.xx.xx.xx 4 2; # 多机训练执行命令
  - name: work3
          args:
          - cd /mnt/sfs_turbo/llm_train/AscendSpeed;
            sh scripts/llama2/0_pl_lora_70b.sh xx.xx.xx.xx 4 3; # 多机训练执行命令

以上命令多台机器执行时,只有${NODE_RANK}的节点ID值不同,其他参数都保持一致。其中MASTER_ADDR、NNODES、NODE_RANK为必填项。

单机启动

对于Llama2-7B和Llama2-13B,操作过程与Llama2-70B相同,需要修改单机config.yaml模板中的${command}命令,可以选用单机启动,以 Llama2-13B 为例。

# 单机执行命令为:sh scripts/llama2/0_pl_lora_13b.sh <MASTER_ADDR=localhost> <NNODES=1> <NODE_RANK=0>
# 仅需要修改预训练中的单机训练执行命令即可
  - name: main
          args:
          - cd /mnt/sfs_turbo/llm_train/AscendSpeed;
            sh scripts/llama2/0_pl_lora_13b.sh localhost 1 0; # 单机训练执行命令

步骤四 根据config.yaml启动作业

启动作业命令如下。首先会根据config.yaml创建pod,继而在pod容器内自动启动训练作业。

kubectl apply -f config.yaml

启动后,可通过以下命令获取所有已创建的pod信息。若pod已全部启动,则状态为:Running。

kubectl get pod -A -o wide

若查看启动作业日志信息,可通过以下命令打印正在启动的日志信息。其中${pod_name}为上述pod信息中的NAME,例如vcjob-main-0。

kubectl logs -f ${pod_name}

等待模型载入

执行训练启动命令后,等待模型载入,当出现“training”关键字时,表示开始训练。训练过程中,训练日志会在最后的Rank节点打印。

图1 等待模型载入

训练完成后,生成的权重文件保存路径为:/mnt/sfs_turbo/llm_train/saved_dir_for_output/llama2-13b/saved_models/

最后,请参考查看日志和性能章节查看lora微调的日志和性能。

步骤五 删除config.yaml创建出的所有工作负载Pod

若要删除config.yaml创建出的所有工作负载Pod,需要先找到config.yaml所在路径,并执行以下命令。

kubectl delete -f config.yaml

相关文档