如何将字符串列表转为适配transformers Trainer的数据集以微调Llama 2
适配Transformers Trainer的Llama 2数据集转换方案
你的基础思路是对的,但需要根据Llama 2的微调场景调整数据格式,下面分两种常见情况给出具体实现:
1. 纯文本续写微调
如果你的目标是让模型学习文本风格、内容续写,直接将每个字符串包装为text字段即可,Transformers的Trainer会默认识别这个字段:
from datasets import Dataset # 假设你的原始字符串列表是text_list text_list = ["包含若干句子的文本1", "包含若干句子的文本2"] # 转换为Hugging Face Dataset格式 dataset = Dataset.from_dict({"text": text_list})
2. 指令格式微调(适配Llama 2官方规范)
如果是做指令微调,需要按照Llama 2的官方prompt格式包装数据,这样模型训练效果更贴合预训练时的习惯:
Llama 2官方prompt模板:
<s>[INST] 指令内容 [/INST] 回答内容 </s>
对应代码实现:
from datasets import Dataset text_list = ["包含若干句子的文本1", "包含若干句子的文本2"] # 按官方格式包装文本(示例为续写任务,可根据需求修改指令) formatted_texts = [f"<s>[INST] 请续写以下文本:{text} [/INST] {text}</s>" for text in text_list] dataset = Dataset.from_dict({"text": formatted_texts})
后续预处理(必须步骤)
不管哪种格式,都需要对数据集做tokenize处理才能传入Trainer:
from transformers import AutoTokenizer # 加载Llama 2的tokenizer tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf") # Llama默认没有pad token,需要指定为eos token tokenizer.pad_token = tokenizer.eos_token # 定义预处理函数 def preprocess_data(examples): return tokenizer( examples["text"], truncation=True, max_length=512, # 根据硬件配置调整最大长度 padding="max_length" ) # 批量处理数据集 tokenized_dataset = dataset.map(preprocess_data, batched=True)
之后就可以将tokenized_dataset传入Trainer:
trainer = transformers.Trainer( model=model, train_dataset=tokenized_dataset, # 补充其他参数如TrainingArguments等 )
内容的提问来源于stack exchange,提问作者klsmgföl
相关产品推荐
相关产品推荐

