目录

Instruct Datasets

指令微调涉及训练一个大型语言模型(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

Instruct dataset format

指令数据集应遵循输入-输出格式,其中用户提示在某一列,助手提示在另一列。

|  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加载本地或远程数据集,您需要指定sourcedata_filessplit参数。有关加载本地或远程文件的更多详细信息,请参阅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作为{"<default column>": "<column in your dataset>"}来将默认列名重新映射到数据集中的列名。默认列名在每个数据集构建器中都有详细说明(参见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 这样的提示模板来组织每个样本。提示模板会被传递给分词器,并自动应用于您正在微调的数据集上。 有关更多详细信息,请参阅 使用提示模板

内置指令数据集

文档

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

查看文档

教程

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

查看教程

资源

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

查看资源