配置数据集以进行微调¶
本教程将指导您完成如何设置要微调的数据集。
如何快速开始使用内置数据集
如何从配置中配置现有数据集类
如何完全自定义您自己的数据集
了解如何从配置中配置组件
数据集是微调工作流的核心组件,用作“指导” wheel“来指导特定用例的 LLM 生成。许多公开共享 开源数据集在微调 LLM 方面已经很流行,并且是一个很棒的 训练模型的起点。我们支持多种广泛使用的数据集,以帮助 快速引导您的微调。让我们来看看如何设置一个通用的 API 进行微调。
您可以直接从配置文件中轻松指定数据集:
# Dataset
dataset:
_component_: torchtune.datasets.alpaca_dataset
这将指示配方创建迭代样本的 dataset 对象 来自 HuggingFace 数据集上的 tatsu-lab/alpaca。
我们还提供了常用旋钮,以根据您的需求调整数据集。例如,假设
您希望在不更改批处理大小的情况下减少每个批处理的内存占用。
您可以直接从配置中进行调整以实现此目的。max_seq_len
# Dataset
dataset:
_component_: torchtune.datasets.alpaca_dataset
# Original is 512
max_seq_len: 256
自定义 instruct 模板¶
要对特定任务微调 LLM,一种常见的方法是创建一个固定的指令
模板,该模板指导模型生成具有特定目标的输出。Instruct 模板
只是构建模型输入的 flavor 文本。它与模型无关
并且通常像任何其他文本一样进行标记化,但它可以帮助调节模型
以更好地响应预期的格式。例如,AlpacaInstructTemplate
按以下方式构建数据:
"Below is an instruction that describes a task, paired with an input that provides further context. "
"Write a response that appropriately completes the request.\n\n"
"### Instruction:\n{instruction}\n\n### Input:\n{input}\n\n### Response:\n"
下面是一个格式为AlpacaInstructTemplate
:
from torchtune.data import AlpacaInstructTemplate
sample = {
"instruction": "Classify the following into animals, plants, and minerals",
"input": "Oak tree, copper ore, elephant",
}
prompt = AlpacaInstructTemplate.format(sample)
print(prompt)
# Below is an instruction that describes a task, paired with an input that provides further context.
# Write a response that appropriately completes the request.
#
# ### Instruction:
# Classify the following into animals, plants, and minerals
#
# ### Input:
# Oak tree, copper ore, elephant
#
# ### Response:
#
我们为常见任务(如摘要和语法更正)提供了其他 instruct 模板。如果您需要创建自己的
instruct 模板,您可以创建自己的InstructTemplate
类并在 Config 中指向它。
dataset:
_component_: torchtune.datasets.instruct_dataset
source: mydataset/onthehub
template: CustomTemplate
train_on_input: True
max_seq_len: 512
自定义聊天格式¶
聊天格式类似于 instruct 模板,只是它们格式化 system,
user 和 Assistant 消息(请参阅ChatFormat
)
以获取对话数据集。这些可以配置得与 instruct 非常相似
数据。
dataset:
_component_: torchtune.datasets.chat_dataset
source: Open-Orca/SlimOrca-Dedup
conversation_style: sharegpt
chat_format: Llama2ChatFormat
以下是使用Llama2ChatFormat
:
from torchtune.data import Llama2ChatFormat, Message
messages = [
Message(
role="system",
content="You are a helpful, respectful, and honest assistant.",
),
Message(
role="user",
content="I am going to Paris, what should I see?",
),
Message(
role="assistant",
content="Paris, the capital of France, is known for its stunning architecture..."
),
]
formatted_messages = Llama2ChatFormat.format(messages)
print(formatted_messages)
# [
# Message(
# role="user",
# content="[INST] <<SYS>>\nYou are a helpful, respectful and honest assistant.\n<</SYS>>\n\n"
# "I am going to Paris, what should I see? [/INST] ",
# ),
# Message(
# role="assistant",
# content="Paris, the capital of France, is known for its stunning architecture..."
# ),
# ]
请注意,系统消息现在已合并到用户消息中。如果您创建自定义 ChatFormat 您还可以添加更高级的行为。
完全自定义的数据集¶
更高级的任务和数据集格式可能需要您创建自己的数据集
class 以获得更大的灵活性。让我们来看看 ,
它具有 RLHF 首选项数据的自定义功能,以了解您需要做什么。PreferenceDataset
如果你看一下这个类的代码,
您会注意到它与
对首选项数据中所选样本和拒绝样本的调整。PreferenceDataset
InstructDataset
chosen_message = [
Message(role="user", content=prompt, masked=True),
Message(role="assistant", content=transformed_sample[key_chosen]),
]
rejected_message = [
Message(role="user", content=prompt, masked=True),
Message(role="assistant", content=transformed_sample[key_rejected]),
]
chosen_input_ids, c_masks = self._tokenizer.tokenize_messages(
chosen_message, self.max_seq_len
)
chosen_labels = list(
np.where(c_masks, CROSS_ENTROPY_IGNORE_IDX, chosen_input_ids)
)
rejected_input_ids, r_masks = self._tokenizer.tokenize_messages(
rejected_message, self.max_seq_len
)
rejected_labels = list(
np.where(r_masks, CROSS_ENTROPY_IGNORE_IDX, rejected_input_ids)
)
如果任何现有的数据集类不能满足您的目的,您也可以 使用其中一个作为起点并添加您需要的功能。
为了能够从配置中使用自定义数据集,您需要创建
构建器函数。这是 的 builder 函数 ,
这会创建一个 configured 以使用
来自 Hugging Face 的配对数据集。请注意,我们还具有
以添加自定义 Instruct 模板。stack_exchanged_paired_dataset()
PreferenceDataset
def stack_exchanged_paired_dataset(
tokenizer: Tokenizer,
max_seq_len: int = 1024,
) -> PreferenceDataset:
return PreferenceDataset(
tokenizer=tokenizer,
source="lvwerra/stack-exchange-paired",
template=StackExchangedPairedTemplate(),
column_map={
"prompt": "question",
"chosen": "response_j",
"rejected": "response_k",
},
max_seq_len=max_seq_len,
split="train",
data_dir="data/rl",
)
现在我们可以轻松地从配置中指定我们的自定义数据集。
# This is how you would configure the Alpaca dataset using the builder
dataset:
_component_: torchtune.datasets.stack_exchanged_paired_dataset
max_seq_len: 512