快捷方式

关于配置

本深入探讨将指导您编写用于运行配方的配置。

本深入探讨将涵盖的内容
  • 如何编写 YAML 配置并使用它运行配方

  • 如何使用 instantiateparse API

  • 如何有效地使用配置和 CLI 覆盖来运行配方

先决条件

参数在哪里?

有两个主要入口点供您配置参数:配置CLI 覆盖。配置是 YAML 文件,定义了在一个位置运行配方所需的所有参数。它们是重现运行的唯一真实来源。可以使用 tune 在命令行上覆盖配置参数,以便快速更改和实验,而无需修改配置。

编写配置

配置是 torchtune 中运行配方的主要入口点。它们应该是 YAML 文件,并且它们只是列出您要为特定运行定义的参数的值。

seed: null
shuffle: True
device: cuda
dtype: fp32
enable_fsdp: True
...

使用 instantiate 配置组件

许多字段将需要指定具有相关关键字参数作为参数的 torchtune 对象。模型、数据集、优化器和损失函数是常见的例子。您可以使用 _component_ 子字段轻松完成此操作。在 _component_ 中,您需要指定要在配方中实例化的对象的点路径。点路径是您通常在 Python 文件中导入对象时使用的确切路径。例如,要指定 alpaca_dataset 在您的配置中使用自定义参数

dataset:
  _component_: torchtune.datasets.alpaca_dataset
  train_on_input: False

这里,我们正在将 train_on_input 的默认值从 True 更改为 False

在你的配置文件中指定 _component_ 后,你可以在你的食谱的设置中像这样创建一个指定对象的实例

from torchtune import config

# Access the dataset field and create the object instance
dataset = config.instantiate(cfg.dataset)

这将自动使用在 dataset 下的字段中指定的任何关键字参数。

如上所述,前面的示例实际上会抛出一个错误。如果你查看 alpaca_dataset 的方法,你会注意到我们缺少一个必需的位置参数,即分词器。由于这也是另一个可配置的 torchtune 对象,让我们通过查看 instantiate() API 来了解如何处理这个问题。

def instantiate(
    config: DictConfig,
    *args: Tuple[Any, ...],
    **kwargs: Dict[str, Any],
)

instantiate() 也接受位置参数和关键字参数,并在创建对象时自动将其与配置一起使用。这意味着我们不仅可以传入分词器,而且还可以根据需要添加配置中未指定的其他关键字参数。

# Tokenizer is needed for the dataset, configure it first
tokenizer:
  _component_: torchtune.models.llama2.llama2_tokenizer
  path: /tmp/tokenizer.model

dataset:
  _component_: torchtune.datasets.alpaca_dataset
  train_on_input: True
# Note the API of the tokenizer we specified - we need to pass in a path
def llama2_tokenizer(path: str) -> Tokenizer:

# Note the API of the dataset we specified - we need to pass in a tokenizer
# and any optional keyword arguments
def alpaca_dataset(
    tokenizer: Tokenizer,
    train_on_input: bool = True,
    max_seq_len: int = 512,
) -> InstructDataset:

from torchtune import config

# Since we've already specified the path in the config, we don't need to pass
# it in
tokenizer = config.instantiate(cfg.tokenizer)
# We pass in the instantiated tokenizer as the first required argument, then
# we change an optional keyword argument
dataset = config.instantiate(
    cfg.dataset,
    tokenizer,
    train_on_input=False,
)

请注意,额外的关键字参数将覆盖配置中任何重复的键。

使用插值引用其他配置字段

有时你需要对多个字段使用相同的多个值。你可以使用插值来引用另一个字段,instantiate() 会自动为你解析它。

output_dir: /tmp/alpaca-llama2-finetune
metric_logger:
  _component_: torchtune.utils.metric_logging.DiskLogger
  log_dir: ${output_dir}

验证你的配置

我们提供了一个方便的 CLI 工具,tune validate,用于快速验证你的配置是否格式正确,以及所有组件是否可以正确实例化。你也可以传入覆盖,如果你想测试你将要运行实验的精确命令。如果任何参数格式不正确,tune validate 将列出所有找到错误的位置。

tune cp llama2/7B_lora_single_device ./my_config.yaml
tune validate ./my_config.yaml

编写配置的最佳实践

让我们讨论一些编写配置的指南,以充分利用它们。

严谨的配置

虽然将尽可能多的内容放入配置中以在切换实验参数时获得最大灵活性可能很诱人,但我们鼓励您只在配置中包含将在配方中使用或实例化的字段。这确保了对配方运行的选项的完全清晰度,并将使调试变得更加容易。

# dont do this
alpaca_dataset:
  _component_: torchtune.datasets.alpaca_dataset
  train_on_input: True
slimorca_dataset:
  ...

# do this
dataset:
  # change this in config or override when needed
  _component_: torchtune.datasets.alpaca_dataset
  train_on_input: True

仅使用公共 API

如果您希望在配置中指定的组件位于私有文件中,请在配置中使用公共点路径。这些组件通常在其父模块的 __init__.py 文件中公开。这样,您可以保证在配置中使用的 API 的稳定性。您的组件点路径中不应包含下划线。

# don't do this
dataset:
  _component_: torchtune.datasets._alpaca.alpaca_dataset
  train_on_input: True

# do this
dataset:
  _component_: torchtune.datasets.alpaca_dataset
  train_on_input: True

命令行覆盖

配置是收集运行配方所需所有参数的主要位置,但有时您可能希望快速尝试不同的值,而无需更新配置本身。为了实现快速实验,您可以通过 tune 命令为配置中的参数指定覆盖值。这些应指定为键值对 k1=v1 k2=v2 ...

例如,要使用自定义模型和标记器目录运行 lora_finetune_single_device 配方,您可以提供覆盖

tune run lora_finetune_single_device \
--config llama2/7B_lora_single_device \
checkpointer.checkpoint_dir=/home/my_model_checkpoint \
checkpointer.checkpoint_files=['file_1','file_2'] \
tokenizer.path=/home/my_tokenizer_path

覆盖组件

如果您想覆盖配置中通过 _component_ 字段实例化的类或函数,您可以通过直接分配给参数名称来实现。组件中的任何嵌套字段都可以使用点表示法覆盖。

dataset:
  _component_: torchtune.datasets.alpaca_dataset
  train_on_input: True
# Change to slimorca_dataset and set train_on_input to False
tune run lora_finetune_single_device --config my_config.yaml \
dataset=torchtune.datasets.slimorca_dataset dataset.train_on_input=False

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

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

查看教程

资源

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

查看资源