目录

配置数据集以进行微调

本教程将指导您完成如何设置要微调的数据集。

您将学到什么
  • 如何快速开始使用内置数据集

  • 如何从配置中配置现有数据集类

  • 如何完全自定义您自己的数据集

先决条件

数据集是微调工作流的核心组件,用作“指导” 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

如果你看一下这个类的代码, 您会注意到它与 对首选项数据中所选样本和拒绝样本的调整。PreferenceDatasetInstructDataset

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

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源