培训库
项目描述
InstructLab培训库
为了简化使用 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 = 1
和nproc_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,
)
项目详情
下载文件
下载您平台所需的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。
源代码分布
构建分布
Hashes for instructlab_training-0.5.2-py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 606416e9d88afbac035128072a82a5a3c604eefc96bdf85e7eb03557de73a3b4 |
|
MD5 | 09f6e244c53b4e3da214ed6443013c74 |
|
BLAKE2b-256 | 1c7b937edcf0b3223adb005630d315a7de21642046b549b5e7edd41c1f5abcc8 |