基于格鲁吉亚数据集微调的Mistral 7B模型文本生成异常求助
问题:Mistral 7B微调后仅回显输入,无法生成新文本
我用约10万篇格鲁吉亚语文章的数据集微调了Mistral 7B模型,同时微调了自定义tokenizer,整个过程耗时约9小时。但测试时无论输入什么prompt,模型只回显输入内容,完全不生成新文本。
微调代码
import time import json import torch from datasets import Dataset from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments # Load dataset, preprocess, and fine-tuning details... training_args = TrainingArguments( output_dir="mistral_georgian_news_finetuning", max_steps=3125, per_device_train_batch_size=32, learning_rate=3e-4, # Other arguments... ) # Fine-tuning setup... # Start fine-tuning trainer.train()
测试代码
import torch from transformers import AutoTokenizer, AutoModelForCausalLM model_path = "/path/to/fine-tuned-model" tokenizer_path = "/path/to/tokenizer" tokenizer = AutoTokenizer.from_pretrained(tokenizer_path) model = AutoModelForCausalLM.from_pretrained(model_path) def generate_text(prompt_text, max_length=500): input_ids = tokenizer(prompt_text, return_tensors="pt").input_ids output = model.generate(input_ids, max_length=max_length) return tokenizer.decode(output[0], skip_special_tokens=True) prompt = "რამდენიმე დღეში შესრულდება ..." generated_text = generate_text(prompt) print(generated_text)
测试运行日志
config.json: 0%| | 0.00/571 [00:00<?, ?B/s] model.safetensors.index.json: 0%| | 0.00/25.1k [00:00<?, ?B/s] Downloading shards: 0%| | 0/2 [00:00<?, ?it/s] model-00001-of-00002.safetensors: 0%| | 0.00/9.94G [00:00<?, ?B/s] model-00002-of-00002.safetensors: 0%| | 0.00/4.54G [00:00<?, ?B/s] Loading checkpoint shards: 0%| | 0/2 [00:00<?, ?it/s] generation_config.json: 0%| | 0.00/116 [00:00<?, ?B/s] Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
排查方案
一、微调过程问题排查
- 数据集预处理验证
因果语言模型需要学习连贯的文本续写逻辑,需确认:- 数据集样本是否为完整的连贯文本(或
prompt+续写内容的结构),若拆分过细或未构建上下文关联,模型只会学习重复输入。 - 是否正确添加了模型要求的特殊token(如Mistral默认的
<s>作为文本开头,</s>作为结尾),缺失会导致模型无法识别文本边界。
- 数据集样本是否为完整的连贯文本(或
- 训练参数合理性检查
max_steps=3125:假设总样本10万,若为单卡训练(总batch_size=32),总epoch数仅为(3125*32)/100000=1,若多卡训练则epoch数更低,可能训练不充分。可适当增加步数或直接设置num_train_epochs确保模型遍历足够多数据。learning_rate=3e-4:Mistral 7B这类大模型微调的合理学习率通常在1e-5~1e-4区间,过高的学习率可能导致模型震荡,无法学到正确生成逻辑,建议下调至1e-4及以下。- 检查
gradient_accumulation_steps:若单卡显存不足以支撑batch_size=32,实际训练时可能自动降低batch_size,导致有效训练步数不足,需查看训练日志确认实际batch_size。
- 自定义tokenizer兼容性
- 微调tokenizer后,需确保模型的embedding层已同步扩展至新的vocab size,否则模型无法识别新token,导致生成异常。
- 确认tokenizer的
eos_token、bos_token、pad_token与模型设置一致(Mistral默认eos_token_id=2、bos_token_id=1),训练和推理阶段需保持统一。
二、推理环节问题排查
- 生成参数优化
当前model.generate()仅设置max_length,默认贪心搜索模式易导致重复输入,需补充关键参数:def generate_text(prompt_text, max_length=500): input_ids = tokenizer(prompt_text, return_tensors="pt").input_ids output = model.generate( input_ids, max_length=max_length, do_sample=True, # 开启采样模式,避免贪心搜索的重复问题 temperature=0.7, # 调整生成随机性,0.5~1.0为宜 top_p=0.9, # 核采样,提升生成质量 pad_token_id=tokenizer.eos_token_id # 确保pad token与eos token一致 ) return tokenizer.decode(output[0], skip_special_tokens=True) - 模型与tokenizer加载验证
- 确认
model_path指向微调后的checkpoint目录(如mistral_georgian_news_finetuning/checkpoint-3125),而非原始Mistral 7B模型。 - 确认
tokenizer_path是微调后的tokenizer目录,与训练时使用的tokenizer完全一致。
- 确认
- prompt格式匹配
若微调时的样本带有特定前缀(如“格鲁吉亚新闻:”),测试prompt需保持相同格式,否则模型无法识别任务场景,导致仅回显输入。
三、辅助验证步骤
- 查看训练日志中的损失曲线:若损失值未持续下降,说明模型未有效学习,需排查数据集或参数问题。
- 用训练集样本测试:截取某条训练文本的前半部分作为prompt,若模型仍无法续写,说明微调过程存在问题。
- 测试原始模型:用相同prompt测试未微调的Mistral 7B,若原始模型可正常生成,问题出在微调环节;若原始模型也无法生成,需检查prompt格式或生成参数。
内容的提问来源于stack exchange,提问作者SabaKhupenia
相关产品推荐
相关产品推荐

