| |
| """ |
| VLM预训练主脚本 |
| 支持多模型和多任务学习 |
| """ |
|
|
| import os |
| import sys |
| import torch |
| import random |
| import numpy as np |
| import argparse |
| from torch.utils.data import DataLoader |
|
|
| |
| sys.path.insert(0, 'PROJECT_ROOT/data/dataset/pretrain') |
| from pretrain_dataset import PretrainDataset, collate_fn |
|
|
| from config import QWEN25_VL_3B_CONFIG, QWEN25_VL_7B_CONFIG |
| from trainer import MultiTaskTrainer |
|
|
|
|
| def set_seed(seed: int): |
| """设置随机种子""" |
| random.seed(seed) |
| np.random.seed(seed) |
| torch.manual_seed(seed) |
| torch.cuda.manual_seed_all(seed) |
|
|
|
|
| def create_dataloaders(config): |
| """创建数据加载器""" |
| print("=" * 60) |
| print("准备数据...") |
| |
| train_dataset = PretrainDataset( |
| data_file=config.data.data_file, |
| split="train", |
| task="all" |
| ) |
| |
| train_loader = DataLoader( |
| train_dataset, |
| batch_size=config.training.batch_size, |
| shuffle=True, |
| num_workers=4, |
| collate_fn=collate_fn, |
| pin_memory=True |
| ) |
| |
| val_dataset = PretrainDataset( |
| data_file=config.data.data_file, |
| split="val", |
| task="all" |
| ) |
| |
| val_loader = DataLoader( |
| val_dataset, |
| batch_size=config.training.batch_size, |
| shuffle=False, |
| num_workers=4, |
| collate_fn=collate_fn, |
| pin_memory=True |
| ) |
| |
| print(f"✓ 训练集: {len(train_dataset)} 样本") |
| print(f"✓ 验证集: {len(val_dataset)} 样本") |
| print("=" * 60) |
| |
| return train_loader, val_loader |
|
|
|
|
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--model", type=str, required=True, |
| choices=["qwen2.5-vl-3b", "qwen2.5-vl-7b"], |
| help="选择模型") |
| parser.add_argument("--epochs", type=int, default=5) |
| parser.add_argument("--batch_size", type=int, default=None) |
| parser.add_argument("--lr", type=float, default=None) |
| |
| args = parser.parse_args() |
| |
| |
| if args.model == "qwen2.5-vl-3b": |
| config = QWEN25_VL_3B_CONFIG |
| elif args.model == "qwen2.5-vl-7b": |
| config = QWEN25_VL_7B_CONFIG |
| |
| |
| if args.epochs: |
| config.training.num_epochs = args.epochs |
| if args.batch_size: |
| config.training.batch_size = args.batch_size |
| if args.lr: |
| config.training.learning_rate = args.lr |
| |
| |
| set_seed(config.training.seed) |
| |
| |
| print("=" * 60) |
| print("配置信息") |
| print("=" * 60) |
| print(f"模型: {config.model.model_name}") |
| print(f"输出: {config.training.output_dir}") |
| print(f"Epochs: {config.training.num_epochs}") |
| print(f"Batch: {config.training.batch_size}") |
| print(f"LR: {config.training.learning_rate}") |
| print("=" * 60) |
| |
| |
| train_loader, val_loader = create_dataloaders(config) |
| |
| |
| trainer = MultiTaskTrainer(config, train_loader, val_loader) |
| |
| |
| trainer.train() |
| |
| print(f"\n✅ 完成!模型保存在: {config.training.output_dir}") |
|
|
|
|
| if __name__ == "__main__": |
| main() |