Wandb对于实验跟踪至关重要。它能够实时可视化:
import wandb
# 登录(需要免费API密钥)
wandb.login()
# 配置项目
wandb.init(project="fine-tuning-qwen-lora", name="experiment-1")
在训练期间,如果启用了report_to="wandb",SFTTrainer会自动将指标发送到wandb。
如果提供了eval_dataset,SFTTrainer可以定期进行评估。准备一个单独的验证集。
# 假设我们有一个验证数据集
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、准确率)。
训练完成后,用新提示测试模型。
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))