LLaMA-Factory 多机多卡训练配置
2025-08-01
深度学习
00

指定好 --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 参数的作用:

  1. 防止梯度爆炸:在深度学习训练过程中,梯度可能会变得非常大,导致参数更新过大,使训练不稳定甚至发散。
  2. 梯度裁剪机制:当计算得到的梯度范数超过 max_grad_norm 设定的阈值时,会将梯度按比例缩放,使其范数等于阈值。
  3. 稳定训练:通过限制梯度的最大范数,确保每次参数更新的步长在合理范围内,提高训练稳定性。常用值:通常设置为1.0或0.5,这是经验上比较好的默认值。
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'
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!