You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于格鲁吉亚数据集微调的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:59:52