根据您的训练配置和问题,可以同时训练多个数据集,但需要根据您的具体需求选择合适的方法。以下是几种常见方案及具体操作步骤。
🎯 首先明确:您指的"同时训练"是哪种场景?
| 场景 | 描述 | 适用情况 | 难度 |
|---|---|---|---|
| 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_dir和dataset参数:
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:训练数据集0binding_part_001.yaml:训练数据集1binding_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)。如果这些分片是同一数据集的不同部分,建议:
-
合并数据集:将所有分片合并成一个大数据集
-
调整训练参数 :
yamlnum_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 特殊注意事项
- 显存管理 :
- 多个训练进程共享GPU显存,需要仔细规划
- 使用
rocm-smi --showmeminfo监控显存使用
- 通信配置 :
- 多进程训练时,确保每个进程使用不同的GPU
- 避免NCCL通信冲突
- 数据加载 :
- 多个训练进程可能同时读取数据,确保磁盘IO足够
- 考虑使用
streaming: true减少内存压力
📝 总结建议
对于您的情况,推荐先尝试方案一(混合数据集训练):
- 合并数据集:将您当前的分片数据集合并成一个
- 调整训练参数 :根据合并后的总样本数调整
max_samples - 监控训练 :使用
rocm-smi和TensorBoard监控
如果您想同时跑多个独立实验,再考虑方案三(多进程并行训练)。
💡 小贴士:在超算环境中,建议先在小数据集上测试配置,确认无误后再用全量数据训练。