llamafactory 大模型微调 可以同时训练多个数据集

根据您的训练配置和问题,可以同时训练多个数据集,但需要根据您的具体需求选择合适的方法。以下是几种常见方案及具体操作步骤。

🎯 首先明确:您指的"同时训练"是哪种场景?

场景 描述 适用情况 难度
1. 混合数据集训练 将多个数据集合并成一个训练集,同一个模型一起训练 您有多个相关数据集,想提升模型泛化能力 ★☆☆ 简单
2. 多任务学习 同时训练多个任务,共享部分模型权重,每个任务用自己的数据集 想让模型同时学会多种能力(如翻译+摘要) ★★★ 复杂
3. 多进程并行训练 开多个训练进程,每个进程训练不同的模型/数据集 您有多个独立实验,想同时跑节省时间 ★★☆ 中等
从您提供的配置看,您目前使用的是单个数据集binding_sft_real_paired_512),很可能是混合数据集训练的场景。下面重点介绍这种方法。

✅ 方案一:混合数据集训练(推荐)

步骤1:准备数据集

假设您有以下数据集:

  • dataset_part1/workspace/data-new/binding_sft_real_paired_512/
  • dataset_part2/workspace/data-new/binding_sft_real_paired_512_2/
  • dataset_part3/workspace/data-new/binding_sft_real_paired_512_3/

步骤2:修改配置文件

在您的YAML配置中,修改dataset_dirdataset参数:

yaml 复制代码
# ============================================
# 数据集配置(混合多个数据集)
# ============================================
dataset_dir: /workspace/data-new/  # 父目录
dataset: binding_sft_real_paired_512, binding_sft_real_paired_512_2, binding_sft_real_paired_512_3  # 逗号分隔多个数据集名
cutoff_len: 512
# 或者使用通配符(如果数据集命名有规律)
# dataset: binding_sft_real_paired_*  # 自动匹配所有符合条件的数据集

步骤3:确保数据集格式正确

每个数据集目录下需要有dataset_info.json文件,格式如下:

json 复制代码
// binding_sft_real_paired_512/dataset_info.json
{
  "binding_sft_real_paired_512": {
    "file_name": "train.json",
    "formatting": "alpaca",
    "columns": {
      "prompt": "instruction",
      "query": "input",
      "response": "output"
    }
  }
}

LLaMA Factory会自动读取这些数据集并混合在一起。

⚙️ 方案二:多任务学习(进阶)

如果您想同时训练多个不同的任务(例如:同时训练药物分子生成和药物描述生成),可以使用多任务学习。

步骤1:配置多任务数据集

修改YAML配置:

yaml 复制代码
# ============================================
# 多任务学习配置
# ============================================
dataset_dir: /workspace/data-new/
dataset: task1_dataset, task2_dataset  # 两个任务的数据集
# 多任务参数
multitask: true
multitask_config:
  task1_dataset:
    weight: 1.0  # 任务权重
  task2_dataset:
    weight: 0.8  # 权重可不同

步骤2:调整训练参数

yaml 复制代码
# 学习率可能需要调整
learning_rate: 0.00003  # 多任务学习通常需要更低的学习率
# 批次大小可能需要调整
per_device_train_batch_size: 2  # 每个任务各取2个样本
gradient_accumulation_steps: 8  # 总批次大小 = 2 * 8 = 16

⚠️ 注意:多任务学习会显著增加训练复杂度,建议先从混合数据集训练开始。


🚀 方案三:多进程并行训练(节省时间)

如果您有多个独立实验想同时跑,可以使用多进程。

步骤1:准备多个配置文件

假设您有:

  • binding_part_000.yaml:训练数据集0
  • binding_part_001.yaml:训练数据集1
  • binding_part_002.yaml:训练数据集2

步骤2:编写并行训练脚本

bash 复制代码
#!/bin/bash
# parallel_train.sh
# 清理环境
pkill -9 python
pkill -9 torchrun
pkill -9 llamafactory-cli
# 设置环境变量(您已有的ROCm配置)
export HIP_VISIBLE_DEVICES=0,1,2,3
export HSA_OVERRIDE_GFX_VERSION=9.0.6
export PYTORCH_HIP_ALLOC_CONF="garbage_collection_threshold:0.6,max_split_size_mb:128"
# NCCL配置(如果多卡训练)
export NCCL_IB_DISABLE=1
export NCCL_SOCKET_IFNAME=lo
# 启动多个训练进程
nohup llamafactory-cli train binding_part_000.yaml > train_000.log 2>&1 &
nohup llamafactory-cli train binding_part_001.yaml > train_001.log 2>&1 &
nohup llamafactory-cli train binding_part_002.yaml > train_002.log 2>&1 &
# 查看进程状态
ps aux | grep llamafactory

步骤3:监控训练进度

bash 复制代码
# 查看GPU使用情况
watch -n 1 rocm-smi
# 查看各训练日志
tail -f train_000.log
tail -f train_001.log
tail -f train_002.log

📊 针对您当前环境的建议

根据您提供的配置,您有以下几种选择:

选项1:继续分片训练,但优化流程

您目前似乎是分片训练(binding_part_000到009)。如果这些分片是同一数据集的不同部分,建议:

  1. 合并数据集:将所有分片合并成一个大数据集

  2. 调整训练参数

    yaml 复制代码
    num_train_epochs: 3  # 3个epoch
    per_device_train_batch_size: 1  # 保持显存安全
    gradient_accumulation_steps: 16
    max_samples: 209776  # 总样本数

选项2:混合多个数据集

如果您有多个不同的数据集(如不同药物类型),可以:

yaml 复制代码
dataset_dir: /workspace/data-new/
dataset: binding_sft_real_paired_512, binding_sft_short_tokens, binding_sft_long_tokens

选项3:多进程训练(如果显存允许)

您的W7900D有48GB显存,如果每个模型训练占用约24GB,可以:

bash 复制代码
# 进程1:训练模型A(使用GPU 0-1)
CUDA_VISIBLE_DEVICES=0,1 HIP_VISIBLE_DEVICES=0,1 llamafactory-cli train model_a.yaml &
# 进程2:训练模型B(使用GPU 2-3)
CUDA_VISIBLE_DEVICES=2,3 HIP_VISIBLE_DEVICES=2,3 llamafactory-cli train model_b.yaml &

🔧 AMD ROCm 特殊注意事项

  1. 显存管理
    • 多个训练进程共享GPU显存,需要仔细规划
    • 使用rocm-smi --showmeminfo监控显存使用
  2. 通信配置
    • 多进程训练时,确保每个进程使用不同的GPU
    • 避免NCCL通信冲突
  3. 数据加载
    • 多个训练进程可能同时读取数据,确保磁盘IO足够
    • 考虑使用streaming: true减少内存压力

📝 总结建议

对于您的情况,推荐先尝试方案一(混合数据集训练)

  1. 合并数据集:将您当前的分片数据集合并成一个
  2. 调整训练参数 :根据合并后的总样本数调整max_samples
  3. 监控训练 :使用rocm-smi和TensorBoard监控
    如果您想同时跑多个独立实验,再考虑方案三(多进程并行训练)

💡 小贴士:在超算环境中,建议先在小数据集上测试配置,确认无误后再用全量数据训练。