指定好 --model_name_or_path,模型存储路径。
指定 --save_only_model false ,不光保存模型,还保存优化器状态等参数。
指定 --overwrite_output_dir false ,可以接续恢复训练。接续恢复训练千万别改参数,不然会引起异常(训练看起来正常其实不正常)。要改参数最好是导出之前模型,然后重新指定 --model_name_or_path 重新训练。
缓存的这三个兄弟,如果是共享存储,一定搭配好:
bash展开代码# 环境变量
-e HF_DATASETS_CACHE=${CACHE_DIR}/HF_DATASETS_CACHE \
-e HUGGINGFACE_HUB_CACHE=${CACHE_DIR}/HUGGINGFACE_HUB_CACHE \
-e TRANSFORMERS_CACHE=${CACHE_DIR}/TRANSFORMERS_CACHE \
# 训练参数
--cache_dir ${CACHE_DIR}/cache_dir \
--tokenized_path ${CACHE_DIR}/tokenized_cache \
--overwrite_cache false \
# 指定共享存储
--data_shared_file_system true \
指定--overwrite_cache false ,下次直接用缓存的预处理好的数据进行训练,如果里面有数据,那么--dataset
失效,也就是略过数据处理,直接用 --cache_dir 里的数据。
不要使用 --resume_from_checkpoint (只能跟路径),没有意义。先导出后重新训更好。--overwrite_output_dir false 本身就可以接续恢复训练。
--streaming 流式处理数据,不要用,太慢。多机多卡通信似乎还存在问题。
显存够就不要指定 --deepspeed /app/examples/deepspeed/ds_z2_config.json ,省显存=训练慢。
指定 --save_steps 的数量看总的steps,存模型耽误训练速度,也浪费硬盘资源。
指定 --gradient_accumulation_steps 梯度累计,减少多机多卡通信次数,增加显存负担。
bash展开代码--per_device_train_batch_size 12 \ --gradient_accumulation_steps 2 \
指定这三兄弟,开始可以只开freeze_language_model进行训练。分阶段才好训练,一下全开,容易走歪。配合小一点的学习率5e-6全开。
bash展开代码--freeze_vision_tower false \
--freeze_multi_modal_projector false \
--freeze_language_model false \
数据处理速度的三兄弟,前两个是预处理,最后一个是训练时候的加载器。
bash展开代码--preprocessing_num_workers 84 \ --preprocessing_batch_size 1000 \ --dataloader_num_workers 84 \
不指定 --max_grad_norm 参数, --max_grad_norm 参数的作用:
bash展开代码#!/bin/bash
# 配置 llamafactory 的 oss 地址、密钥
AWS_ENDPOINT_URL=xx # llamafactory 的 oss 地址
AWS_ACCESS_KEY_ID=xx # llamafactory 的 oss 密钥
AWS_SECRET_ACCESS_KEY=xx # llamafactory 的 oss 密钥
export SWANLAB_API_KEY=xx # 设置在线跟踪模式API,这里我随便填的
export SWANLAB_LOG_DIR=/swanlab_log # 设置本地日志存储路径
export SWANLAB_MODE=cloud # 包含四种模式:cloud云端跟踪模式(默认)、cloud-only仅云端跟踪本地不保存文件、local本地跟踪模式、disabled完全不记录用于debug
# 挂载 jfs 存储,一般存储
MOUNT_PATH="juicefs+s3://oss.i.xx.com/xx"
MOUNT_PATH4="juicefs+s3://oss.i.xx.com/xx"
MOUNT_PATH5="juicefs+s3://oss.i.xx.com/xx"
# 默认镜像,一般不需要修改
IMAGE="xx:v12"
# 重要参数自定义
# 多机训练参数
NUM_NODES=7 # 机器总数,根据需要修改
CACHE_DIR=/mnt/jfs/cache5/ # 缓存目录,一般不需要修改
JOB_NAME="qwen2vl-m31-2" # k8s job 名称
GROUP_NAME="aos" # 资源组名称
MODEL_NAME_OR_PATH="/mnt/jfs/model_ok/checkpoint-1350-haikeyi" # 训练前模型路径
OUTPUT_DIR="/mnt/jfs/output/${JOB_NAME}" # 训练后模型保存路径
SWANLAB_NAME=$JOB_NAME # swanlab 项目名称
# 多机训练 rjob submit 命令
rjob submit \
--name=$JOB_NAME \
--charged-group=$GROUP_NAME \
--private-machine=group \
--delete \
--image=$IMAGE \
--host-network=true \
--preemptible=no \
--gang-start=true \
--replicas=$NUM_NODES \
--auto-restart=true \
--gpu 8 --cpu 96 --memory 720000 \
--positive-tags a800,h100,h800,a100,H100,H800 \
--custom-resources mellanox.com/mlnx_rdma=1 \
--custom-resources rdma/mlnx_shared=8 \
-e DISTRIBUTED_JOB=true \
-e NCCL_NVLS_ENABLE=1 \
-e STEPRPC_MONITOR_ENABLE=1 \
-e NCCL_DEBUG=WARN \
-e NCCL_ALGO=^Ring \
-e NCCL_PXN_DISABLE=1 \
-e AWS_ENDPOINT_URL=$AWS_ENDPOINT_URL \
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
-e HF_DATASETS_CACHE=${CACHE_DIR}/HF_DATASETS_CACHE \
-e HUGGINGFACE_HUB_CACHE=${CACHE_DIR}/HUGGINGFACE_HUB_CACHE \
-e TRANSFORMERS_CACHE=${CACHE_DIR}/TRANSFORMERS_CACHE \
-e CACHE_DIR=${CACHE_DIR} \
-e SWANLAB_API_KEY=$SWANLAB_API_KEY \
-e SWANLAB_NAME=$SWANLAB_NAME \
-e SWANLAB_MODE=$SWANLAB_MODE \
-e SWANLAB_LOG_DIR=$SWANLAB_LOG_DIR \
-e MODEL_NAME_OR_PATH=$MODEL_NAME_OR_PATH \
-e OUTPUT_DIR=$OUTPUT_DIR \
-e JOB_NAME=$JOB_NAME \
-e GROUP_NAME=$GROUP_NAME \
-e IMAGE=$IMAGE \
--mount=$MOUNT_PATH:/mnt/jfs \
--mount=$MOUNT_PATH4:/mnt/jfs4 \
--mount=$MOUNT_PATH5:/mnt/jfs5 \
-- \
bash -c 'cd /app && \
FORCE_TORCHRUN=1 \
NNODES=$NODE_COUNT \
NODE_RANK=$NODE_RANK \
MASTER_ADDR=$MASTER_ADDR \
MASTER_PORT=${MASTER_PORT:-5678} \
CACHE_DIR=${CACHE_DIR} \
MODEL_NAME_OR_PATH=$MODEL_NAME_OR_PATH \
OUTPUT_DIR=$OUTPUT_DIR \
SWANLAB_NAME=$SWANLAB_NAME \
llamafactory-cli train \
--model_name_or_path $MODEL_NAME_OR_PATH \
--dataset_dir /mnt/jfs5/llamafactory_train_data_style \
--cache_dir ${CACHE_DIR}/cache_dir \
--tokenized_path ${CACHE_DIR}/tokenized_cache \
--overwrite_cache false \
--dataset project-10427,project-10499,project-10540,project-10541,project-10542,project-10543,function_page-0725 \
--template qwen2_vl \
--output_dir $OUTPUT_DIR \
--per_device_train_batch_size 12 \
--gradient_accumulation_steps 2 \
--image_max_pixels 1048576 \
--video_max_pixels 16384 \
--trust_remote_code true \
--stage sft \
--do_train true \
--finetuning_type full \
--freeze_vision_tower false \
--freeze_multi_modal_projector false \
--freeze_language_model false \
--cutoff_len 16384 \
--preprocessing_num_workers 84 \
--preprocessing_batch_size 1000 \
--dataloader_num_workers 84 \
--logging_steps 10 \
--plot_loss True \
--overwrite_output_dir false \
--save_only_model false \
--learning_rate 6.0e-6 \
--num_train_epochs 2.0 \
--save_steps 400 \
--lr_scheduler_type cosine \
--bf16 True \
--flash_attn auto \
--report_to none \
--use_swanlab True \
--swanlab_project $SWANLAB_NAME \
--swanlab_mode cloud \
--save_strategy steps \
--data_shared_file_system true \
--ddp_timeout 180000000'
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!