配置数据集以进行微调¶
本教程将指导您如何设置数据集以进行微调。
如何快速上手内置数据集
如何从配置中配置现有的数据集类
如何完全自定义您自己的数据集
了解如何 从配置中配置组件
数据集是微调工作流的核心组件,可作为“方向盘”,引导大语言模型(LLM)针对特定应用场景生成内容。许多公开共享的开源数据集已广泛应用于LLM微调,并为训练您的模型提供了极佳的起点。我们支持多个广泛使用的数据集,以帮助您快速启动微调流程。下面我们将逐步介绍如何为微调配置一个常用数据集。
您可以轻松地直接从配置文件中指定数据集:
# Dataset
dataset:
_component_: torchtune.datasets.alpaca_dataset
这将指示示例代码创建一个数据集对象,该对象可遍历来自 HuggingFace 数据集上的 tatsu-lab/alpaca 的样本。
我们还提供了常见的调整选项来根据您的需求调整数据集。例如,假设您希望在不改变批次大小的情况下减少每个批次的内存占用。您可以调整max_seq_len以直接从配置中实现这一点。
# Dataset
dataset:
_component_: torchtune.datasets.alpaca_dataset
# Original is 512
max_seq_len: 256
自定义指令模板¶
要对大型语言模型(LLM)针对特定任务进行微调,一种常见的方法是创建一个固定的指令模板,以引导模型生成具有特定目标的输出。指令模板本质上是一种用于为模型结构化输入的修饰性文本。它与具体模型无关,并像其他任何文本一样被正常分词,但它可以帮助模型更好地适应预期的响应格式。例如,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:
#
我们为摘要生成和语法纠错等常见任务提供了其他指令模板。如果您需要为自定义任务创建自己的指令模板,可以创建一个自己的InstructTemplate类,并在配置中引用它。
dataset:
_component_: torchtune.datasets.instruct_dataset
source: mydataset/onthehub
template: CustomTemplate
train_on_input: True
max_seq_len: 512
自定义聊天格式¶
聊天格式类似于指令模板,但它们将系统、用户和助手的消息格式化为消息列表(参见ChatFormat)
以获取对话数据集。这些可以配置得与指令数据集非常相似。
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..."
# ),
# ]
请注意,系统消息现已整合到用户消息中。如果您创建自定义的 ChatFormats,还可以添加更高级的行为。
完全自定义的数据集¶
更高级的任务和数据集格式可能需要您创建自己的数据集类以获得更大的灵活性。让我们通过PreferenceDataset,它具有针对RLHF偏好数据的自定义功能,来了解您需要做什么。
如果你查看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)
)
如果现有的任何数据集类都无法满足您的需求,您同样可以将其之一作为起点,并添加所需的功能。
要能够从配置中使用自定义数据集,您需要创建一个构建函数。这是stack_exchanged_paired_dataset()的构建函数,它创建了一个PreferenceDataset,配置为使用来自Hugging Face的配对数据集。请注意,我们还必须添加一个自定义指令模板。
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