跳转到主要内容

培训库

项目描述

InstructLab培训库

Lint Build Release License

为了简化使用 LAB 方法微调模型的过程,这个库提供了一个简单的训练接口。

安装库

要开始使用这个库,您必须克隆此存储库,并通过 pip 安装。

安装库

pip install instructlab-training 

然后您可以安装库以进行开发

pip install -e ./training

额外的 NVIDIA 软件包

这个库使用了 flash-attn 包以及其他一些依赖包,这些包需要安装 NVIDIA 特定的 CUDA 工具。如果您使用的是带有 CUDA 的 NVIDIA 硬件,您需要安装以下附加依赖项。

基本安装

pip install .[cuda]

可编辑安装(开发)

pip install -e .[cuda]

使用库

您可以通过导入必要的项来使用这个训练库。

from instructlab.training import (
    run_training,
    TorchrunArgs,
    TrainingArgs,
    DeepSpeedOptions
)

然后您可以定义各种训练参数。它们将成为您训练运行的参数。参见

了解训练参数

TrainingArgs 类提供了训练作业的大部分自定义选项。您可以指定许多选项,例如设置 DeepSpeed 配置值或运行一个 LoRA 训练作业而不是完整的微调。

TrainingArgs

字段 描述
model_path 一个指向 HuggingFace 仓库的引用或一个指向以 HuggingFace 格式保存的模型的路径。
data_path 训练数据集的 .jsonl 路径。这应采用消息格式。
ckpt_output_dir 训练模型检查点将被保存的目录。
data_output_dir 处理后的训练数据存储的目录(过滤/标记化/掩码后)
max_seq_len 要包含在训练集中的最大序列长度。超出此长度的样本将被丢弃。
max_batch_len 每个批次中每个 gpu 的最大标记数,这些标记将在一次步骤中处理。用作多包计算的一部分。如果遇到内存不足错误,尝试降低此值,但不能低于 max_seq_len
num_epochs 在停止之前运行的 epoch 数量。
effective_batch_size 在我们更新模型参数之前要查看的批次中的样本数量。
save_samples 模型在保存检查点之前应查看的样本数量。这可以视为检查点保存频率。
learning_rate 在梯度下降期间优化权重时的速度。较高的值可能会导致学习性能不稳定。通常建议使用低学习率和高有效批量大小。
warmup_steps 模型在达到完整学习率之前应通过的步骤数。我们从 0 开始,线性增加到 learning_rate
is_padding_free 布尔值,表示我们是否在训练一个无填充的变压器模型,例如 Granite。
random_seed PyTorch 将使用的随机种子。
mock_data 是否在训练期间使用模拟的、随机生成的数据。用于调试目的。
mock_data_len 单个模拟数据样本的最大长度。相当于 max_seq_len,但用于模拟数据。
deepspeed_options 指定给 DeepSpeed 优化器的配置选项。
lora 如果您打算执行 LoRA 训练而不是完整的微调,请指定选项。
chat_tmpl_path 指定用于训练的聊天模板/特殊标记。
checkpoint_at_epoch 我们是否应在每个 epoch 结束时保存检查点。
fsdp_options 当选择 FSDP 作为分布式后端时的设置。
distributed_backend 指定要使用的分布式训练后端。支持选项为 "fsdp" 和 "deepspeed"。
disable_flash_attn 当设置为 true 时,禁用 flash attention。这允许在较旧的设备上训练。

DeepSpeedOptions

该库目前仅在 DeepSpeedOptions 中支持少数选项:默认情况下,使用 DeepSpeed 运行,因此这些选项目前仅允许您自定义 ZeRO 阶段 2 优化器的方面。

字段 描述
cpu_offload_optimizer 是否在 DeepSpeed 阶段 2 进行 CPU 卸载。
cpu_offload_optimizer_ratio 介于 0 & 1 之间的浮点数。指定在 CPU 端更新参数(即优化器步骤)的比例。
cpu_offload_optimizer_pin_memory 如果为 true,则卸载到页锁定 CPU 内存。这可能会提高吞吐量,但会带来额外的内存开销。
save_samples 在保存 DeepSpeed 检查点之前要查看的样本数。

有关 DeepSpeed 的更多信息,请参阅 deepspeed.ai

FSDPOptions

与 DeepSpeed 类似,我们仅公开了您可以使用 FSDP 修改的一些参数。下面列出了它们

字段 描述
cpu_offload_params 当设置为 true 时,从加速器卸载参数到 CPU。这是一个全有或全无的选项。
sharding_strategy 指定 FSDP 应使用的模型分片策略。有效选项为:FULL_SHARD(ZeRO-3)、HYBRID_SHARD(ZeRO-3*)、SHARD_GRAD_OP(ZeRO-2)和 NO_SHARD

[!NOTE] 对于 sharding_strategy - 目前仅 SHARD_GRAD_OP 经过广泛测试,并得到本库的积极支持。

loraOptions

当前支持的 LoRA 选项

字段 描述
rank LoRA 训练的 rank 参数。
alpha LoRA 训练的 alpha 参数。
dropout LoRA 训练的 dropout 率。
target_modules LoRA 训练的目标模块列表。
quantize_data_type LoRA 训练中量化的数据类型。有效选项为 None"nf4"

带有 LoRa 选项的示例运行

如果您想进行 LoRA 训练,可以通过 LoraOptions 对象将 LoRa 选项指定给 TrainingArgs

from instructlab.training import LoraOptions, TrainingArgs

training_args = TrainingArgs(
    lora = LoraOptions(
        rank = 4,
        alpha = 32,
        dropout = 0.1,
    ),
    # ...
)

了解 TorchrunArgs 参数

在运行训练脚本时,我们始终调用 torchrun

如果您正在运行单 GPU 系统或不需要分布式训练配置的其他系统,您可以创建一个默认对象

run_training(
    torchrun_args=TorchrunArgs(),
    training_args=TrainingArgs(
        # ...
    ),
)

但是,如果您想指定更复杂的配置,该库目前支持 torchrun 今天接受的全部选项。

[!NOTE] 关于 torchrun 参数的更多信息,请参阅 torchrun 文档

带有 TorchrunArgs 参数的示例训练运行

例如,在一个 8-GPU、2 机器的系统上,我们会指定以下 torchrun 配置

MASTER_ADDR = os.getenv('MASTER_ADDR')
MASTER_PORT = os.getnev('MASTER_PORT')
RDZV_ENDPOINT = f'{MASTER_ADDR}:{MASTER_PORT}'

# on machine 1
torchrun_args = TorchrunArgs(
    nnodes = 2, # number of machines 
    nproc_per_node = 4, # num GPUs per machine
    node_rank = 0, # node rank for this machine
    rdzv_id = 123,
    rdzv_endpoint = RDZV_ENDPOINT
)

run_training(
    torchrun_args=torchrun_args,
    training_args=training_args
)
MASTER_ADDR = os.getenv('MASTER_ADDR')
MASTER_PORT = os.getnev('MASTER_PORT')
RDZV_ENDPOINT = f'{MASTER_ADDR}:{MASTER_PORT}'

# on machine 2
torchrun_args = TorchrunArgs(
    nnodes = 2, # number of machines 
    nproc_per_node = 4, # num GPUs per machine
    node_rank = 1, # node rank for this machine
    rdzv_id = 123,
    rdzv_endpoint = f'{MASTER_ADDR}:{MASTER_PORT}'
)

run_training(
    torch_args=torchrun_args,
    train_args=training_args
)

带有参数的示例训练运行

定义训练参数,这些参数将作为我们训练运行的参数

# define training-specific arguments
training_args = TrainingArgs(
    # define data-specific arguments
    model_path = "ibm-granite/granite-7b-base",
    data_path = "path/to/dataset.jsonl",
    ckpt_output_dir = "data/saved_checkpoints",
    data_output_dir = "data/outputs",

    # define model-trianing parameters
    max_seq_len = 4096,
    max_batch_len = 60000,
    num_epochs = 10,
    effective_batch_size = 3840,
    save_samples = 250000,
    learning_rate = 2e-6,
    warmup_steps = 800,
    is_padding_free = True, # set this to true when using Granite-based models
    random_seed = 42,
)

我们还需要定义通过 torchrun 运行多进程作业的设置。为此,创建一个 TorchrunArgs 对象。

[!TIP] 注意,对于单 GPU 作业,您只需将 nnodes = 1nproc_per_node=1 设置为即可。

torchrun_args = TorchrunArgs(
    nnodes = 1, # number of machines 
    nproc_per_node = 8, # num GPUs per machine
    node_rank = 0, # node rank for this machine
    rdzv_id = 123,
    rdzv_endpoint = '127.0.0.1:12345'
)

最后,只需调用 run_training,此库将处理其余部分 😊。

run_training(
    torchrun_args=torchrun_args,
    training_args=training_args,
)

项目详情


下载文件

下载您平台所需的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源代码分布

instructlab_training-0.5.2.tar.gz (4.8 MB 查看哈希值)

上传时间 源代码

构建分布

instructlab_training-0.5.2-py3-none-any.whl (47.0 kB 查看哈希值)

上传时间 Python 3

支持者