Train:  97%|█████████▋| 140/144 [06:50<00:10,  2.56s/it]
Train:  97%|█████████▋| 140/144 [06:50<00:10,  2.56s/it]
Train:  98%|█████████▊| 141/144 [06:53<00:08,  2.94s/it]
Train:  99%|█████████▊| 142/144 [06:57<00:06,  3.10s/it]
Train:  99%|█████████▉| 143/144 [06:59<00:02,  2.90s/it]

在训练进度条中显示的“144”代表模型微调过程中的总训练步数(global steps)​,其形成与数据集的规模、训练配置(如批量大小、梯度累积步数、训练轮数等)直接相关。以下是具体分析:


⚙️ ​总步数(144)的形成原理

总训练步数由以下公式决定:

总步数 = 训练样本总数 ÷ (每设备批量大小 × 梯度累积步数 × 设备数量) × 训练轮数

结合用户提供的训练脚本参数6

  • 每设备批量大小(per_device_train_batch_size)​: 2
  • 梯度累积步数(gradient_accumulation_steps)​: 2
  • 设备数量(NPROC_PER_NODE)​: 1(单卡训练)
  • 训练轮数(num_train_epochs)​: 1

假设训练集样本数为 N,则:

总步数 = $ N \div (2 \times 2 \times 1) \times 1 = N \div 4 $

因此,​144步意味着训练集样本数 N = 144 \times 4 = 576
(实际中可能因数据对齐有微小调整,但逻辑一致)


🔗 ​与数据集的直接关联

  1. 数据集来源
    用户使用的数据集是 /root/paper/data/swift_formatted_pretrain_data.jsonl,来源于 ​arXiv论文分类数据集​(smartflow-arxiv-dataset),包含论文标题、作者、摘要及对应的科学分类标签6

    • 该数据集已预处理为 jsonl 格式,每条样本对应一个训练样本。
    • 样本数 576 符合实际任务需求(例如论文分类通常需数百至数千样本)。
  2. 数据分块与加载

    • 批量计算逻辑​:
      每步(step)处理一个批量(batch),每个批量包含 batch_size × gradient_accumulation_steps = 4 个样本。
      例如:
      • 第140步:已处理样本数 = 140 \times 4 = 560
      • 第144步:累计处理 144 \times 4 = 576 个样本(完整覆盖数据集)6

⚡️ ​训练进度条的意义

进度条 140/144 表示:

  • 分子(140)​​:当前已完成的训练步数。
  • 分母(144)​​:总训练步数(由数据集规模与配置决定)。
  • 时间标注(如 06:50<00:10)​​:
    • 06:50:当前步骤已耗时6分50秒
    • <00:10:预计剩余10秒完成训练
      (实际每步耗时约2.5~3.1秒,符合日志中的平均速度 2.77s/it6

💎 ​总结

  1. 144的由来​:由训练集样本数(576)与训练配置(批量大小2 + 梯度累积步数2 + 单卡)共同决定,公式为:
    总步数 = 样本数 ÷ (批量大小 × 梯度累积步数) × 训练轮数
  2. 与数据的关系​:
    • 数据集规模直接决定总步数(样本越多,步数越多)。
    • 配置参数(如增大批量大小或梯度累积步数)可减少总步数,但需权衡显存限制与收敛效果6

若需调整训练效率,可修改以下参数:

# 示例:增大批量大小至4(总步数降至72)
--per_device_train_batch_size 4
# 或减少梯度累积步数至1(总步数降至144)
--gradient_accumulation_steps 1

下面为训练完成的设置

#!/bin/bash

# 创建日志目录
LOG_DIR="logs"
mkdir -p $LOG_DIR  # 确保日志目录存在,如果不存在则创建

# 获取当前时间戳,用于生成唯一的日志文件名
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="$LOG_DIR/internlm3-8b_lora_sft_${TIMESTAMP}.log"  # 设置日志文件路径

# 设置CUDA环境变量
export NPROC_PER_NODE=1  # 设置每个节点使用的进程数为1
export OMP_NUM_THREADS=1  # 限制OpenMP线程数为1,避免过多线程竞争
export CUDA_VISIBLE_DEVICES=0  # 指定使用的GPU编号为0

# 使用nohup命令在后台运行训练任务,即使终端关闭也能继续运行
nohup swift sft \
    --model /root/share/new_models/internlm3/internlm3-8b-instruct \  # 指定基础模型路径
    --train_type lora \  # 使用LoRA训练方法
    --dataset '/root/paper/data/swift_formatted_pretrain_data.jsonl' \  # 指定训练数据集
    --torch_dtype bfloat16 \  # 使用bfloat16精度以节省显存
    --num_train_epochs 1 \  # 设置训练轮数为2
    --per_device_train_batch_size 2 \  # 每个设备的训练批次大小为4
    --learning_rate 5e-5 \  # 学习率设置为5e-5
    --warmup_ratio 0.1 \  # 预热阶段占总训练步数的10%
    --split_dataset_ratio 0 \  # 不拆分数据集
    --report_to wandb \  # 将训练日志报告到Weights & Biases平台
    --lora_rank 8 \  # LoRA的秩设置为8
    --lora_alpha 32 \  # LoRA的alpha参数设置为32
    --use_chat_template false \  # 不使用聊天模板
    --target_modules all-linear \  # 对所有线性层应用LoRA
    --gradient_accumulation_steps 2 \  # 梯度累积步数为2,用于增大有效批次大小
    --save_steps 2000 \  # 每2000步保存一次模型
    --save_total_limit 5 \  # 最多保存5个检查点
    --gradient_checkpointing_kwargs '{"use_reentrant": false}' \  # 梯度检查点设置,禁用重入
    --logging_steps 5 \  # 每5步记录一次日志
    --max_length 2048 \  # 最大序列长度设为2048
    --output_dir ./swift_output/InternLM3-8B-Lora \  # 输出目录
    --dataloader_num_workers 256 \  # 数据加载器使用256个工作线程
    --model_author JimmyMa99 \  # 模型作者信息
    --model_name InternLM3-8B-Lora \  # 模型名称
    > "$LOG_FILE" 2>&1 &  # 将标准输出和错误输出重定向到日志文件,并在后台运行

# 打印进程ID和日志文件位置,便于用户跟踪
echo "Training started with PID $!"  # 显示后台进程的PID
echo "Log file: $LOG_FILE"  # 显示日志文件位置

# 提示用户如何实时查看日志
echo "To view logs in real-time, use:"
echo "tail -f $LOG_FILE"

 注意:不要有空格

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐