Toadied's picture
2312
8b383ad verified
Raw
History Blame Contribute Delete
5.42 kB
"""RL训练工具函数"""
import os
from typing import Optional, Dict, Any
from dataclasses import dataclass, field
from pathlib import Path
@dataclass
class TrainingConfig:
"""训练配置类"""
# 模型配置
model_name: str = "Qwen/Qwen3-0.6B"
model_revision: Optional[str] = None
# 训练配置
output_dir: str = "./output"
num_train_epochs: int = 3
per_device_train_batch_size: int = 4
gradient_accumulation_steps: int = 4
learning_rate: float = 5e-5
warmup_steps: int = 100
logging_steps: int = 10
save_steps: int = 500
eval_steps: int = 500
# RL特定配置
max_new_tokens: int = 512
temperature: float = 0.7
top_p: float = 0.9
# 硬件配置
use_fp16: bool = True
use_bf16: bool = False
gradient_checkpointing: bool = True
# LoRA配置
use_lora: bool = True
lora_r: int = 16
lora_alpha: int = 32
lora_dropout: float = 0.05
lora_target_modules: list = field(default_factory=lambda: ["q_proj", "v_proj"])
# 监控配置
use_wandb: bool = False
wandb_project: Optional[str] = None
use_tensorboard: bool = True
# 其他配置
seed: int = 42
max_length: int = 2048
def to_dict(self) -> Dict[str, Any]:
"""转换为字典"""
return {
k: v for k, v in self.__dict__.items()
if not k.startswith('_')
}
def setup_training_environment(config: TrainingConfig) -> None:
"""
设置训练环境
Args:
config: 训练配置
"""
# 创建输出目录
os.makedirs(config.output_dir, exist_ok=True)
# 设置随机种子
import random
import numpy as np
try:
import torch
torch.manual_seed(config.seed)
if torch.cuda.is_available():
torch.cuda.manual_seed_all(config.seed)
except ImportError:
pass
random.seed(config.seed)
np.random.seed(config.seed)
# 设置环境变量
os.environ["TOKENIZERS_PARALLELISM"] = "false"
# 设置wandb配置
if config.use_wandb:
if config.wandb_project:
os.environ["WANDB_PROJECT"] = config.wandb_project
os.environ["WANDB_LOG_MODEL"] = "false" # 不上传模型文件
print(f"✅ 训练环境设置完成")
print(f" - 输出目录: {config.output_dir}")
print(f" - 随机种子: {config.seed}")
print(f" - 模型: {config.model_name}")
def check_trl_installation() -> bool:
"""
检查TRL是否已安装
Returns:
是否已安装TRL
"""
try:
import trl
return True
except ImportError:
return False
def get_installation_guide() -> str:
"""
获取TRL安装指南
Returns:
安装指南文本
"""
return """
TRL (Transformer Reinforcement Learning) 未安装。
请使用以下命令安装:
方式1:安装HelloAgents的RL功能(推荐)
pip install hello-agents[rl]
方式2:单独安装TRL
pip install trl
方式3:从源码安装最新版本
pip install git+https://github.com/huggingface/trl.git
安装完成后,您可以使用以下功能:
- SFT训练(监督微调)
- GRPO训练(群体相对策略优化)
- PPO训练(近端策略优化)
- DPO训练(直接偏好优化)
- Reward Model训练
更多信息请访问:https://huggingface.co/docs/trl
"""
def format_training_time(seconds: float) -> str:
"""
格式化训练时间
Args:
seconds: 秒数
Returns:
格式化的时间字符串
"""
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
secs = int(seconds % 60)
if hours > 0:
return f"{hours}h {minutes}m {secs}s"
elif minutes > 0:
return f"{minutes}m {secs}s"
else:
return f"{secs}s"
def get_device_info() -> Dict[str, Any]:
"""
获取设备信息
Returns:
设备信息字典
"""
info = {
"cuda_available": False,
"cuda_device_count": 0,
"cuda_device_name": None,
}
try:
import torch
info["cuda_available"] = torch.cuda.is_available()
if info["cuda_available"]:
info["cuda_device_count"] = torch.cuda.device_count()
info["cuda_device_name"] = torch.cuda.get_device_name(0)
except ImportError:
pass
return info
def print_training_summary(
algorithm: str,
model_name: str,
dataset_name: str,
num_epochs: int,
output_dir: str
) -> None:
"""
打印训练摘要
Args:
algorithm: 算法名称
model_name: 模型名称
dataset_name: 数据集名称
num_epochs: 训练轮数
output_dir: 输出目录
"""
device_info = get_device_info()
print("\n" + "="*60)
print(f"🚀 开始 {algorithm} 训练")
print("="*60)
print(f"📦 模型: {model_name}")
print(f"📊 数据集: {dataset_name}")
print(f"🔄 训练轮数: {num_epochs}")
print(f"💾 输出目录: {output_dir}")
print(f"🖥️ 设备: {'GPU' if device_info['cuda_available'] else 'CPU'}")
if device_info['cuda_available']:
print(f" - GPU数量: {device_info['cuda_device_count']}")
print(f" - GPU型号: {device_info['cuda_device_name']}")
print("="*60 + "\n")