指导数据集¶
指令调优涉及训练一个LLM以执行特定任务。这通常以用户命令或提示和助手的响应的形式出现,以及一个可选的系统提示,描述当前任务。这比模型通常预训练的自由形式文本关联更有结构,在预训练中,模型学习专门预测下一个标记,而不是完成任务。
在torchtune中使用指令数据集进行微调的主要入口点是instruct_dataset()构建器。这允许您直接从配置中指定遵循指令数据格式的本地或Hugging Face数据集,并在其上训练您的LLM。
示例指令数据集¶
这是一个用于微调语法校正任务的指令数据集示例。
head data/my_data.csv
# incorrect,correct
# This are a cat,This is a cat.
from torchtune.models.gemma import gemma_tokenizer
from torchtune.datasets import instruct_dataset
g_tokenizer = gemma_tokenizer(
path="/tmp/gemma-7b/tokenizer.model",
prompt_template="torchtune.data.GrammarErrorCorrectionTemplate",
max_seq_len=8192,
)
ds = instruct_dataset(
tokenizer=g_tokenizer,
source="csv",
data_files="data/my_data.csv",
split="train",
# By default, user prompt is ignored in loss. Set to True to include it
train_on_input=True,
# Prepend a system message to every sample
new_system_prompt="You are an AI assistant. ",
# Use columns in our dataset instead of default
column_map={"input": "incorrect", "output": "correct"},
)
tokenized_dict = ds[0]
tokens, labels = tokenized_dict["tokens"], tokenized_dict["labels"]
print(g_tokenizer.decode(tokens))
# You are an AI assistant. Correct this to standard English:This are a cat---\nCorrected:This is a cat.
print(labels) # System message is masked out, but not user message
# [-100, -100, -100, -100, -100, -100, 27957, 736, 577, ...]
# In config
tokenizer:
_component_: torchtune.models.gemma.gemma_tokenizer
path: /tmp/gemma-7b/tokenizer.model
prompt_template: torchtune.data.GrammarErrorCorrectionTemplate
max_seq_len: 8192
dataset:
source: csv
data_files: data/my_data.csv
split: train
train_on_input: True
new_system_prompt: You are an AI assistant.
column_map:
input: incorrect
output: correct
指导数据集格式¶
指导数据集应遵循输入输出格式,其中用户提示在一列中,助手提示在另一列中。
| input | output |
|-----------------|------------------|
| "user prompt" | "model response" |
例如,你可以看到C4 200M数据集的模式。
从Hugging Face加载指令数据集¶
您只需将数据集仓库名称传递给source,然后将其传递给Hugging Face的load_dataset。
对于大多数数据集,您还需要指定split。
# In code
from torchtune.models.gemma import gemma_tokenizer
from torchtune.datasets import instruct_dataset
g_tokenizer = gemma_tokenizer("/tmp/gemma-7b/tokenizer.model")
ds = instruct_dataset(
tokenizer=g_tokenizer,
source="liweili/c4_200m",
split="train"
)
# In config
tokenizer:
_component_: torchtune.models.gemma.gemma_tokenizer
path: /tmp/gemma-7b/tokenizer.model
# Tokenizer is passed into the dataset in the recipe
dataset:
_component_: torchtune.datasets.instruct_dataset
source: liweili/c4_200m
split: train
这将使用默认的列名“input”和“output”。要更改列名,请使用column_map参数(参见重命名列)。
加载本地和远程指令数据集¶
要通过https加载遵循instruct格式的本地或远程数据集,您需要指定source、data_files和split参数。有关加载本地或远程文件的更多详细信息,请参阅Hugging Face的load_dataset 文档。
# In code
from torchtune.models.gemma import gemma_tokenizer
from torchtune.datasets import instruct_dataset
g_tokenizer = gemma_tokenizer("/tmp/gemma-7b/tokenizer.model")
ds = instruct_dataset(
tokenizer=g_tokenizer,
source="json",
data_files="data/my_data.json",
split="train",
)
# In config
tokenizer:
_component_: torchtune.models.gemma.gemma_tokenizer
path: /tmp/gemma-7b/tokenizer.model
# Tokenizer is passed into the dataset in the recipe
dataset:
_component_: torchtune.datasets.instruct_dataset
source: json
data_files: data/my_data.json
split: train
重命名列¶
您可以通过指定column_map为{"<默认列>": "<您的数据集中的列>"}来将默认列名重新映射到您的数据集中的列名。默认列名在每个数据集构建器中都有详细说明(参见instruct_dataset()和chat_dataset()作为示例)。
例如,如果默认列名是“input”、“output”,你需要将它们更改为其他名称,比如“prompt”、“response”,那么column_map = {"input": "prompt", "output": "response"}。
# data/my_data.json
[
{"prompt": "hello world", "response": "bye world"},
{"prompt": "are you a robot", "response": "no, I am an AI assistant"},
...
]
from torchtune.models.gemma import gemma_tokenizer
from torchtune.datasets import instruct_dataset
g_tokenizer = gemma_tokenizer("/tmp/gemma-7b/tokenizer.model")
ds = instruct_dataset(
tokenizer=g_tokenizer,
source="json",
data_files="data/my_data.json",
split="train",
column_map={"input": "prompt", "output": "response"},
)
# Tokenizer is passed into the dataset in the recipe
dataset:
_component_: torchtune.datasets.instruct_dataset
source: json
data_files: data/my_data.json
split: train
column_map:
input: prompt
output: response
指令模板¶
通常对于指导数据集,您会希望添加一个PromptTemplate以提供与任务相关的信息。例如,对于语法纠正任务,我们可能希望使用像GrammarErrorCorrectionTemplate这样的提示模板来构建每个样本。提示模板会被传递到分词器中,并自动应用于您正在微调的数据集。有关更多详细信息,请参阅使用提示模板。