示例打包¶
样本打包涉及将数据集中的多个样本连接成单个序列,直到达到最大序列长度。这需要一些数据集的预处理,可能会减慢首次批次的处理时间,但根据数据集的不同,可以显著提高训练速度。在 torchtune 中,样本打包是通过遍历数据集并在初始化时执行贪婪打包来完成的。您可以通过传递 packed=True 与任何单数据集构建器一起使用样本打包。
要将打包的最大序列长度设置为目标值,请确保在您的分词器上定义 max_seq_len。
from torchtune.datasets import alpaca_dataset, PackedDataset
from torchtune.models.llama3 import llama3_tokenizer
# Load in tokenizer
tokenizer = llama3_tokenizer(
path="/tmp/Llama-3.2-1B-Instruct/original/tokenizer.model",
max_seq_len=8192,
)
dataset = alpaca_dataset(
tokenizer=tokenizer,
packed=True,
)
print(isinstance(dataset, PackedDataset)) # True
# YAML config
tokenizer:
_component_: torchtune.models.llama3.llama3_tokenizer
path: /tmp/Llama-3.2-1B-Instruct/original/tokenizer.model
max_seq_len: 8192
dataset:
_component_: torchtune.datasets.alpaca_dataset
packed: True
# Command line
tune run full_finetune_single_device --config llama3_2/1B_full_single_device \
dataset.packed=True tokenizer.max_seq_len=8192
当启用样本打包时,torchtune 将自动处理文档掩码和相对位置 ID,以防止不同不相关的样本之间发生交叉注意力。这是通过 PyTorch 的 Flex Attention 实现的,它支持在非因果掩码下使用 flash attention。如果您的硬件不支持 Flex Attention(对于 CUDA 设备,必须是 Turing 架构或更高版本),系统将回退到使用具有内存高效注意力的标准 SDPA,同时保留文档掩码和相对位置 ID。