📚 模块8:训练监控和评估

8.1 使用Weights & Biases (wandb)进行监控

Wandb对于实验跟踪至关重要。它能够实时可视化:

  • 训练和验证损失。
  • GPU和内存使用情况。
  • 学习率。
  • 训练期间生成的示例。

配置:

import wandb

# 登录(需要免费API密钥)
wandb.login()

# 配置项目
wandb.init(project="fine-tuning-qwen-lora", name="experiment-1")

在训练期间,如果启用了report_to="wandb"SFTTrainer会自动将指标发送到wandb。

8.2 训练期间的评估

如果提供了eval_datasetSFTTrainer可以定期进行评估。准备一个单独的验证集。

# 假设我们有一个验证数据集
eval_dataset = ... # 类似于训练集,但在训练期间未见过

# 修改训练器
trainer = SFTTrainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,           # 添加评估数据集
    formatting_func=formatting_prompts_func,
    max_seq_length=512,
    tokenizer=tokenizer,
    packing=False,
)

评估每eval_steps(在TrainingArguments中定义)运行一次,并记录eval_loss。您可以通过compute_metrics定义自定义指标(例如,ROUGE、BLEU、准确率)。

8.3 训练后手动评估

训练完成后,用新提示测试模型。

def generate_response(instruction, input_text=""):
    prompt = f"### 指令:\n{instruction}\n\n### 输入:\n{input_text}\n\n### 响应:\n"
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    outputs = model.generate(**inputs, max_new_tokens=200, temperature=0.7, top_p=0.9)
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    # 仅提取响应(在"### 响应:"之后)
    response_text = response.split("### 响应:")[-1].strip()
    return response_text

# 测试
instruction = "为科技产品写一个简短的描述。"
input_text = "产品:带GPS和心率监测器的智能手表。价格:$199.99。"

print(generate_response(instruction, input_text))

Course Info

Course: AI-course3

Language: ZH

Lesson: Module8