如何针对机器翻译任务微调Mistral-7B模型?
针对机器翻译任务微调Mistral-7B的方法
1. 数据预处理
机器翻译数据集通常拆分出源文本(如sentence_eng_Latn)和目标文本(如sentence_deu_Latn)字段,需要将其转换为Mistral模型适配的指令调优格式。
Mistral的标准提示范式为:
<s>[INST] 翻译指令:将以下英文文本翻译成德语:{源文本内容} [/INST] {目标文本内容} </s>
代码实现
from datasets import load_dataset # 加载英德翻译数据集 dataset = load_dataset("facebook/flores", "eng_Latn-deu_Latn", split="train") valid_dataset = load_dataset("facebook/flores", "eng_Latn-deu_Latn", split="dev") # 定义数据格式化函数 def format_translation_example(example): instruction = f"将以下英文文本翻译成德语:{example['sentence_eng_Latn']}" formatted_text = f"<s>[INST] {instruction} [/INST] {example['sentence_deu_Latn']} </s>" return {"text": formatted_text} # 应用格式化函数 formatted_dataset = dataset.map(format_translation_example) formatted_valid_dataset = valid_dataset.map(format_translation_example)
2. 加载模型与Tokenizer
Mistral-7B默认未设置pad token,需指定eos_token作为pad token以适配批量训练:
from transformers import AutoTokenizer, AutoModelForCausalLM model_name = "mistralai/Mistral-7B-v0.1" tokenizer = AutoTokenizer.from_pretrained(model_name) tokenizer.pad_token = tokenizer.eos_token # 设置pad token tokenizer.padding_side = "right" # 确保padding在右侧 model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
3. 配置高效微调(LoRA)
由于Mistral-7B参数量较大,推荐使用LoRA(Low-Rank Adaptation)降低资源消耗:
from peft import LoraConfig, get_peft_model lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters() # 查看可训练参数占比
4. 设置训练参数
使用TrainingArguments配置训练核心参数:
from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./mistral-translation-finetuned", per_device_train_batch_size=4, per_device_eval_batch_size=4, learning_rate=2e-5, num_train_epochs=3, logging_steps=10, evaluation_strategy="epoch", save_strategy="epoch", fp16=True, # 启用混合精度训练 report_to="none" )
5. 启动训练
用Trainer封装模型、数据集与参数,开始微调:
trainer = Trainer( model=model, args=training_args, train_dataset=formatted_dataset, eval_dataset=formatted_valid_dataset, tokenizer=tokenizer ) trainer.train() # 保存微调后的LoRA权重 model.save_pretrained("./mistral-lora-translation")
6. 推理测试
微调完成后,测试翻译效果:
from peft import PeftModel # 加载基础模型与LoRA权重 base_model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto") finetuned_model = PeftModel.from_pretrained(base_model, "./mistral-lora-translation") # 构造测试输入 test_input = "将以下英文文本翻译成德语:The quick brown fox jumps over the lazy dog." prompt = f"<s>[INST] {test_input} [/INST]" # 生成翻译结果 inputs = tokenizer(prompt, return_tensors="pt").to("cuda") outputs = finetuned_model.generate(**inputs, max_new_tokens=100, temperature=0.1) print(tokenizer.decode(outputs[0], skip_special_tokens=True))
内容的提问来源于stack exchange,提问作者alvas
相关产品推荐
相关产品推荐

