DeepSpeed 安装详情 使用 pip 是开始使用 DeepSpeed 的最快方法,这将安装最新版本的 DeepSpeed,它不与特定 PyTorch 或 CUDA 版本绑定。DeepSpeed 包含几个 C++/CUDA 扩展,我们通常称之为我们的“操作”。默认情况下,所有这些扩展/操作将在运行时使用 torch 的 JIT C++ 扩展加载器,它依赖于 ninja 来构建和动态链接它们。
安装后,您可以使用 DeepSpeed 环境报告 (通过 ds_report
或 python -m deepspeed.env_report
) 验证您的安装并查看您的机器兼容哪些操作。我们发现此报告在调试 DeepSpeed 安装或兼容性问题时很有用。
报错:
1 FileNotFoundError: [Errno 2] No such file or directory: ':/usr/local/cuda-11.8/bin/nvcc'
修改.bashrc,
CUDA_HOME
是一个 环境变量 ,用于指定 单个 CUDA 安装路径。
不是 PATH
类型的环境变量(即不支持多个路径用冒号 :
分隔)。
1 2 3 4 # 原始 export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-11.8 #修改后 export CUDA_HOME=/usr/local/cuda-11.8
运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 DeepSpeed C++/CUDA extension op report -------------------------------------------------- NOTE: Ops not installed will be just-in-time (JIT) compiled at runtime if needed. Op compatibility means that your system meet the required dependencies to JIT install the op. -------------------------------------------------- JIT compiled ops requires ninja ninja .................. [OKAY] -------------------------------------------------- op name ................ installed .. compatible -------------------------------------------------- [WARNING] async_io requires the dev libaio .so object and headers but these were not found. [WARNING] async_io: please install the libaio-dev package with apt [WARNING] If libaio is already installed (perhaps from source), try setting the CFLAGS and LDFLAGS environment variables to where it can be found. async_io ............... [NO] ....... [NO] fused_adam ............. [NO] ....... [OKAY] cpu_adam ............... [NO] ....... [OKAY] cpu_adagrad ............ [NO] ....... [OKAY] cpu_lion ............... [NO] ....... [OKAY] dc ..................... [NO] ....... [OKAY] [WARNING] Please specify the CUTLASS repo directory as environment variable $CUTLASS_PATH evoformer_attn ......... [NO] ....... [NO] [WARNING] FP Quantizer is using an untested triton version (3.3.0), only 2.3.(0, 1) and 3.0.0 are known to be compatible with these kernels fp_quantizer ........... [NO] ....... [NO] fused_lamb ............. [NO] ....... [OKAY] fused_lion ............. [NO] ....... [OKAY] [WARNING] gds requires the dev libaio .so object and headers but these were not found. [WARNING] gds: please install the libaio-dev package with apt [WARNING] If libaio is already installed (perhaps from source), try setting the CFLAGS and LDFLAGS environment variables to where it can be found. gds .................... [NO] ....... [NO] transformer_inference .. [NO] ....... [OKAY] inference_core_ops ..... [NO] ....... [OKAY] cutlass_ops ............ [NO] ....... [OKAY] quantizer .............. [NO] ....... [OKAY] ragged_device_ops ...... [NO] ....... [OKAY] ragged_ops ............. [NO] ....... [OKAY] random_ltd ............. [NO] ....... [OKAY] [WARNING] sparse_attn requires a torch version >= 1.5 and < 2.0 but detected 2.7 [WARNING] using untested triton version (3.3.0), only 1.0.0 is known to be compatible sparse_attn ............ [NO] ....... [NO] spatial_inference ...... [NO] ....... [OKAY] transformer ............ [NO] ....... [OKAY] stochastic_transformer . [NO] ....... [OKAY] -------------------------------------------------- DeepSpeed general environment info: torch install path ............... ['/home/yang/DeepSpeedTest/.venv/lib/python3.11/site-packages/torch'] torch version .................... 2.7.0+cu126 deepspeed install path ........... ['/home/yang/DeepSpeedTest/.venv/lib/python3.11/site-packages/deepspeed'] deepspeed info ................... 0.16.9, unknown, unknown torch cuda version ............... 12.6 torch hip version ................ None nvcc version ..................... 11.8 deepspeed wheel compiled w. ...... torch 0.0, cuda 0.0 shared memory (/dev/shm) size .... 3.88 GB
编写 DeepSpeed 模型 DeepSpeed 模型训练是使用 DeepSpeed 引擎完成的。该引擎可以包装任何类型为 torch.nn.module
的任意模型,并且具有一组最小的用于训练和检查点模型的 API。请参阅教程以获取详细示例。
要初始化 DeepSpeed 引擎
1 2 3 model_engine, optimizer, _, _ = deepspeed.initialize(args=cmd_args, model=model, model_parameters=params)
deepspeed.initialize
确保所有必要的设置(包括分布式数据并行或混合精度训练)都在后台正确完成。除了包装模型之外,DeepSpeed 还可以根据传递给 deepspeed.initialize
和 DeepSpeed 配置文件 的参数构建和管理训练优化器、数据加载器和学习率调度器。请注意,DeepSpeed 会在每个训练步骤自动执行学习率调度。
如果您已经设置了分布式环境,则需要替换
1 torch.distributed.init_process_group(...)
为
1 deepspeed.init_distributed()
默认情况下使用 NCCL 后端,DeepSpeed 已对其进行了彻底测试,但您也可以 覆盖默认值 。
但是,如果您不需要在 deepspeed.initialize()
之后设置分布式环境,则不必使用此函数,因为 DeepSpeed 会在其 initialize
期间自动初始化分布式环境。无论如何,如果您已经设置了 torch.distributed.init_process_group
,则需要将其删除。
训练 初始化 DeepSpeed 引擎后,可以使用三个简单的 API 进行模型训练:前向传播(可调用对象)、反向传播(backward
)和权重更新(step
)。
1 2 3 4 5 6 7 8 9 for step, batch in enumerate(data_loader): #forward() method loss = model_engine(batch) #runs backpropagation model_engine.backward(loss) #weight update model_engine.step()
在后台,DeepSpeed 自动执行分布式数据并行训练、混合精度训练和预定义学习率调度器所需的操作。
梯度平均 :在分布式数据并行训练中,backward
确保在 train_batch_size
上训练后,梯度在数据并行进程之间进行平均。
损失缩放 :在 FP16/混合精度训练中,DeepSpeed 引擎会自动处理损失缩放,以避免梯度中出现精度损失。
学习率调度器 :当使用 DeepSpeed 的学习率调度器(在 ds_config.json
文件中指定)时,DeepSpeed 会在每个训练步骤(当执行 model_engine.step()
时)调用调度器的 step()
方法。当不使用 DeepSpeed 的学习率调度器时
如果调度程序应该在每个训练步骤执行,则用户可以在初始化 DeepSpeed 引擎时将调度程序传递给 deepspeed.initialize
,并让 DeepSpeed 管理其更新或保存/恢复。
如果调度程序应该在任何其他间隔(例如训练 epoch)执行,则用户不应在初始化期间将调度程序传递给 DeepSpeed,并且必须显式管理它。
模型检查点 保存和加载训练状态通过 DeepSpeed 中的 save_checkpoint
和 load_checkpoint
API 处理,该 API 接受两个参数来唯一标识检查点
ckpt_dir
:保存检查点的目录。
ckpt_id
:唯一标识目录中检查点的标识符。在以下代码片段中,我们使用损失值作为检查点标识符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #load checkpoint _, client_sd = model_engine.load_checkpoint(args.load_dir, args.ckpt_id) step = client_sd['step'] #advance data loader to ckpt step dataloader_to_step(data_loader, step + 1) for step, batch in enumerate(data_loader): #forward() method loss = model_engine(batch) #runs backpropagation model_engine.backward(loss) #weight update model_engine.step() #save checkpoint if step % args.save_interval: client_sd['step'] = step ckpt_id = loss.item() model_engine.save_checkpoint(args.save_dir, ckpt_id, client_sd = client_sd)
DeepSpeed 可以自动保存和恢复模型、优化器和学习率调度器状态,同时隐藏这些细节。但是,用户可能希望保存特定于给定模型训练的其他数据。为了支持这些项目,save_checkpoint
接受一个客户端状态字典 client_sd
用于保存。这些项目可以从 load_checkpoint
作为返回值检索。在上面的示例中,step
值存储为 client_sd
的一部分。
重要事项 :所有进程都必须调用此方法,而不仅仅是等级为 0 的进程。这是因为每个进程都需要保存其主权重和调度程序+优化器状态。如果仅对等级为 0 的进程调用此方法,则此方法将挂起等待与其他进程同步。
DeepSpeed 配置 DeepSpeed 功能可以使用配置文件启用、禁用或配置,该文件应指定为 args.deepspeed_config
。下面显示了一个示例配置文件。有关功能的完整列表,请参阅 API 文档 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 { "train_batch_size": 8, "gradient_accumulation_steps": 1, "optimizer": { "type": "Adam", "params": { "lr": 0.00015 } }, "fp16": { "enabled": true }, "zero_optimization": true }
启动 DeepSpeed 训练 DeepSpeed 安装入口点 deepspeed
来启动分布式训练。我们使用以下假设说明 DeepSpeed 的示例用法
您已将 DeepSpeed 集成到您的模型中
client_entry.py
是模型的入口脚本
client args
是 argparse
命令行参数
ds_config.json
是 DeepSpeed 的配置文件
资源配置(多节点) DeepSpeed 使用与 OpenMPI 和 Horovod 兼容的主机文件配置多节点计算资源。主机文件是主机名 (或 SSH 别名)的列表,这些机器可以通过无密码 SSH 访问,以及插槽计数 ,指定系统上可用的 GPU 数量。例如,
1 2 worker-1 slots=4 worker-2 slots=4
指定名为worker-1 和worker-2 的两台机器分别有四个 GPU 可用于训练。
主机文件使用 --hostfile
命令行选项指定。如果未指定主机文件,则 DeepSpeed 会搜索 /job/hostfile
。如果未指定或找到主机文件,则 DeepSpeed 会查询本地机器上的 GPU 数量以发现可用的本地插槽数量。
以下命令在 myhostfile
中指定的所有可用节点和 GPU 上启动 PyTorch 训练作业
1 2 deepspeed --hostfile=myhostfile <client_entry.py> <client args> \ --deepspeed --deepspeed_config ds_config.json
或者,DeepSpeed 允许您将模型的分布式训练限制到可用节点和 GPU 的子集。此功能通过两个命令行参数启用:--num_nodes
和 --num_gpus
。例如,分布式训练可以通过以下命令限制为仅使用两个节点
1 2 3 deepspeed --num_nodes=2 \ <client_entry.py> <client args> \ --deepspeed --deepspeed_config ds_config.json
您可以使用 --include
和 --exclude
标志包含或排除特定资源。例如,要使用所有可用资源除了 节点worker-2 上的 GPU 0 和worker-3 上的 GPU 0 和 1
1 2 3 deepspeed --exclude="worker-2:0@worker-3:0,1" \ <client_entry.py> <client args> \ --deepspeed --deepspeed_config ds_config.json
同样,您可以仅 使用worker-2 上的 GPU 0 和 1
1 2 3 deepspeed --include="worker-2:0,1" \ <client_entry.py> <client args> \ --deepspeed --deepspeed_config ds_config.json
在没有无密码 SSH 的情况下启动 DeepSpeed 现在支持启动训练作业,而无需无密码 SSH。此模式在 Kubernetes 等云环境中特别有用,在这些环境中,可以实现灵活的容器编排,并且设置具有无密码 SSH 的领导者-工作者架构会增加不必要的复杂性。
要使用此模式,您需要在所有节点上分别运行 DeepSpeed 命令。该命令应结构如下
1 2 3 4 deepspeed --hostfile=myhostfile --no_ssh --node_rank=<n> \ --master_addr=<addr> --master_port=<port> \ <client_entry.py> <client args> \ --deepspeed --deepspeed_config ds_config.json
--hostfile=myhostfile
: 指定包含节点和GPU信息的主机文件。
--no_ssh
: 启用无SSH模式。
--node_rank=<n>
: 指定节点的排名。这应该是一个从0到n-1的唯一整数。
--master_addr=<addr>
: 主节点(排名0)的地址。
--master_port=<port>
: 主节点的端口。
在此设置中,主机文件中主机名无需通过无需密码的SSH访问。但是,启动器仍然需要主机文件来收集有关环境的信息,例如节点数和每个节点上的GPU数。
每个节点都必须使用唯一的node_rank
启动,并且必须为所有节点提供主节点(排名0)的地址和端口。此模式导致启动器类似于torchrun
启动器,如PyTorch文档 中所述。
多节点环境变量 在跨多个节点进行训练时,我们发现支持传播用户定义的环境变量很有用。默认情况下,DeepSpeed将传播所有已设置的与NCCL和PYTHON相关的环境变量。如果要传播其他变量,可以在名为.deepspeed_env
的点文件中指定它们,该文件包含以换行符分隔的VAR=VAL
条目列表。DeepSpeed启动器将在您正在执行的本地路径以及您的主目录(~/
)中查找。如果要使用您自己的名称或路径覆盖此文件的默认名称,则可以使用环境变量DS_ENV_FILE
指定。如果您正在启动多个都需要不同变量的作业,这将非常有用。
作为一个具体的例子,某些集群需要在训练前设置特殊的NCCL变量。用户只需将这些变量添加到其主目录中的.deepspeed_env
文件中,如下所示
1 2 NCCL_IB_DISABLE=1 NCCL_SOCKET_IFNAME=eth0
然后,DeepSpeed将确保在每个节点上启动每个进程时设置这些环境变量。
MPI 和 AzureML 兼容性 如上所述,DeepSpeed提供了自己的并行启动器来帮助启动多节点/多GPU训练作业。如果您希望使用MPI(例如,mpirun)启动训练作业,我们也提供支持。需要注意的是,DeepSpeed仍然会使用torch分布式NCCL后端,而不是MPI后端。
要使用mpirun + DeepSpeed或AzureML(使用mpirun作为启动器后端)启动训练作业,您只需安装mpi4py python包。DeepSpeed将使用它来发现MPI环境并将必要的状态(例如,世界大小、排名)传递给torch分布式后端。
如果您使用模型并行、流水线并行或在调用deepspeed.initialize(..)
之前需要torch.distributed调用,我们提供了相同的MPI支持以及额外的DeepSpeed API调用。将您最初的torch.distributed.init_process_group(..)
调用替换为
1 deepspeed.init_distributed()
资源配置(单节点) 如果我们只在一个节点(一个或多个GPU)上运行,DeepSpeed 不需要 如上所述的主机文件。如果没有检测到或传入主机文件,则DeepSpeed将查询本地机器上的GPU数量以发现可用插槽的数量。--include
和--exclude
参数按正常工作,但用户应将“localhost”指定为主机名。
另请注意,不能将CUDA_VISIBLE_DEVICES
与DeepSpeed一起使用来控制应使用哪些设备。例如,要仅使用当前节点的gpu1,请执行以下操作:
1 deepspeed --include localhost:1 ...
DeepSpeedExamples 监督微调 (SFT) 监督式微调 (SFT) 与临时语言任务(例如 WikiText-103)的标准语言模型微调非常相似。主要区别在于数据集资源,SFT 将收集高质量的查询-答案对,以微调模型以进行人工引用生成。
如何训练模型 提供了多个脚本,用于在单个 GPU(例如,单个 A6000-48G、V100-32G、A100-40G 等)、单个节点(例如,8/16x V100-32G、8 个 A100-40G/80G)和多节点设置(例如,64x A100-80G)上进行训练,这些脚本可以在“training_scripts”目录中找到。例如,如果您有单个 A6000-48G,则只需运行相应的脚本即可。
1 training_scripts/opt/single_gpu/run_1.3b.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 OUTPUT=$1 ZERO_STAGE=$2 if [ "$OUTPUT" == "" ]; then OUTPUT=./output fi if [ "$ZERO_STAGE" == "" ]; then ZERO_STAGE=0 fi mkdir -p $OUTPUT uv run deepspeed --num_gpus 1 main.py --model_name_or_path facebook/opt-1.3b \ --gradient_accumulation_steps 8 --lora_dim 128 --zero_stage 0 \ --enable_tensorboard \ --tensorboard_path ./output \ --deepspeed --output_dir ./output
报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 (DeepSpeedExamples) yang@Yangless:~/DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning$ bash training_scripts/opt/single_gpu/run_1.3b.sh [2025-05-27 16:34:32,534] [INFO] [real_accelerator.py:254:get_accelerator] Setting ds_accelerator to cuda (auto detect) [2025-05-27 16:34:34,313] [WARNING] [runner.py:215:fetch_hostfile] Unable to find hostfile, will proceed with training with local resources only. [2025-05-27 16:34:34,313] [INFO] [runner.py:605:main] cmd = /home/yang/DeepSpeedExamples/.venv/bin/python3 -u -m deepspeed.launcher.launch --world_info=eyJsb2NhbGhvc3QiOiBbMF19 --master_addr=127.0.0.1 --master_port=29500 --enable_each_rank_log=None main.py --model_name_or_path facebook/opt-1.3b --gradient_accumulation_steps 8 --lora_dim 128 --zero_stage 0 --enable_tensorboard --tensorboard_path ./output --deepspeed --output_dir ./output [2025-05-27 16:34:35,184] [INFO] [real_accelerator.py:254:get_accelerator] Setting ds_accelerator to cuda (auto detect) [2025-05-27 16:34:36,997] [INFO] [launch.py:146:main] WORLD INFO DICT: {'localhost' : [0]} [2025-05-27 16:34:36,998] [INFO] [launch.py:152:main] nnodes=1, num_local_procs=1, node_rank=0 [2025-05-27 16:34:36,998] [INFO] [launch.py:163:main] global_rank_mapping=defaultdict(<class 'list' >, {'localhost' : [0]}) [2025-05-27 16:34:36,998] [INFO] [launch.py:164:main] dist_world_size=1 [2025-05-27 16:34:36,998] [INFO] [launch.py:168:main] Setting CUDA_VISIBLE_DEVICES=0 [2025-05-27 16:34:36,998] [INFO] [launch.py:256:main] process 303264 spawned with command : ['/home/yang/DeepSpeedExamples/.venv/bin/python3' , '-u' , 'main.py' , '--local_rank=0' , '--model_name_or_path' , 'facebook/opt-1.3b' , '--gradient_accumulation_steps' , '8' , '--lora_dim' , '128' , '--zero_stage' , '0' , '--enable_tensorboard' , '--tensorboard_path' , './output' , '--deepspeed' , '--output_dir' , './output' ] [2025-05-27 16:34:38,360] [INFO] [real_accelerator.py:254:get_accelerator] Setting ds_accelerator to cuda (auto detect) Traceback (most recent call last): File "/home/yang/DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning/main.py" , line 24, in <module> from dschat.utils.data.data_utils import create_prompt_dataset ModuleNotFoundError: No module named 'dschat' [2025-05-27 16:34:41,999] [INFO] [launch.py:319:sigkill_handler] Killing subprocess 303264 [2025-05-27 16:34:41,999] [ERROR] [launch.py:325:sigkill_handler] ['/home/yang/DeepSpeedExamples/.venv/bin/python3' , '-u' , 'main.py' , '--local_rank=0' , '--model_name_or_path' , 'facebook/opt-1.3b' , '--gradient_accumulation_steps' , '8' , '--lora_dim' , '128' , '--zero_stage' , '0' , '--enable_tensorboard' , '--tensorboard_path' , './output' , '--deepspeed' , '--output_dir' , './output' ] exits with return code = 1
发现dschat在DeepSpeedExamples/applications/DeepSpeed-Chat目录下,bash运行在DeepSpeed-Chat/training/step1_supervised_finetuning,需要添加系统目录。
1 2 3 4 5 6 7 import sys sys.path.insert(0, "/home/yang/DeepSpeedExamples/applications/DeepSpeed-Chat") import deepspeed from deepspeed.ops.adam import DeepSpeedCPUAdam, FusedAdam from deepspeed import get_accelerator
运行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 (DeepSpeedExamples) yang@Yangless:~/DeepSpeedExamples/applications/DeepSpeed-Chat/training/step1_supervised_finetuning$ bash training_scripts/opt/single_gpu/run_1.3b.sh [2025-05-27 16:44:06,076] [INFO] [real_accelerator.py:254:get_accelerator] Setting ds_accelerator to cuda (auto detect) [2025-05-27 16:44:07,760] [WARNING] [runner.py:215:fetch_hostfile] Unable to find hostfile, will proceed with training with local resources only. [2025-05-27 16:44:07,760] [INFO] [runner.py:605:main] cmd = /home/yang/DeepSpeedExamples/.venv/bin/python3 -u -m deepspeed.launcher.launch --world_info=eyJsb2NhbGhvc3QiOiBbMF19 --master_addr=127.0.0.1 --master_port=29500 --enable_each_rank_log=None main.py --model_name_or_path facebook/opt-1.3b --gradient_accumulation_steps 8 --lora_dim 128 --zero_stage 0 --enable_tensorboard --tensorboard_path ./output --deepspeed --output_dir ./output [2025-05-27 16:44:08,570] [INFO] [real_accelerator.py:254:get_accelerator] Setting ds_accelerator to cuda (auto detect) [2025-05-27 16:44:10,292] [INFO] [launch.py:146:main] WORLD INFO DICT: {'localhost': [0]} [2025-05-27 16:44:10,292] [INFO] [launch.py:152:main] nnodes=1, num_local_procs=1, node_rank=0 [2025-05-27 16:44:10,292] [INFO] [launch.py:163:main] global_rank_mapping=defaultdict(<class 'list'>, {'localhost': [0]}) [2025-05-27 16:44:10,292] [INFO] [launch.py:164:main] dist_world_size=1 [2025-05-27 16:44:10,292] [INFO] [launch.py:168:main] Setting CUDA_VISIBLE_DEVICES=0 [2025-05-27 16:44:10,293] [INFO] [launch.py:256:main] process 304158 spawned with command: ['/home/yang/DeepSpeedExamples/.venv/bin/python3', '-u', 'main.py', '--local_rank=0', '--model_name_or_path', 'facebook/opt-1.3b', '--gradient_accumulation_steps', '8', '--lora_dim', '128', '--zero_stage', '0', '--enable_tensorboard', '--tensorboard_path', './output', '--deepspeed', '--output_dir', './output'] [2025-05-27 16:44:11,649] [INFO] [real_accelerator.py:254:get_accelerator] Setting ds_accelerator to cuda (auto detect) [2025-05-27 16:44:13,254] [INFO] [comm.py:669:init_distributed] cdb=None [2025-05-27 16:44:13,254] [INFO] [comm.py:700:init_distributed] Initializing TorchBackend in DeepSpeed with backend nccl [rank0]:[W527 16:44:13.639308022 ProcessGroupNCCL.cpp:4715] [PG ID 0 PG GUID 0 Rank 0] using GPU 0 as device used by this process is currently unknown. This can potentially cause a hang if this rank to GPU mapping is incorrect. You can pecify device_id in init_process_group() to force use of a particular device. tokenizer_config.json: 100%|███████████████████████████████████████████████████████████| 685/685 [00:00<00:00, 4.21MB/s] config.json: 100%|█████████████████████████████████████████████████████████████████████| 653/653 [00:00<00:00, 4.99MB/s] vocab.json: 100%|█████████████████████████████████████████████████████████████████████| 899k/899k [00:01<00:00, 816kB/s] merges.txt: 100%|████████████████████████████████████████████████████████████████████| 456k/456k [00:00<00:00, 6.68MB/s] special_tokens_map.json: 100%|█████████████████████████████████████████████████████████| 441/441 [00:00<00:00, 4.21MB/s] pytorch_model.bin: 100%|███████████████████████████████████████████████████████████| 2.63G/2.63G [02:28<00:00, 17.7MB/s]
评估 SFT 检查点 使用上述代码完成训练后可以简单地执行bash evaluation_scripts/run_prompt.sh
它要求用户提供两个模型的路径:(a) 原始预训练模型(即 –model_name_or_path_baseline facebook/opt-1.3b)和 (b) 微调模型(即 –model_name_or_path_finetune output/check_base)。“prompt_eval.py” 包括多个提示,可根据您的喜好进行更新。
模型和数据集 由于 GPT3 没有开源检查点,我们利用了 Meta OPT 系列预训练模型(即 facebook/opt-1.3b)。也可以使用其他预训练模型(例如 GPT-Neo、Bloom 等)。至于数据集,我们也使用了 Huggingface Datasets 的那些开源数据集,即
1 2 3 4 5 Dahoas/rm-static Dahoas/full-hh-rlhf Dahoas/synthetic-instruct-gptj-pairwise yitingxie/rlhf-reward-datasets openai/webgpt_comparisons stanfordnlp/SHP
得益于 DeepSpeed RLHF 数据抽象和混合技术,我们现在能够组合多个数据源进行训练。但是,需要注意的是,不同的数据集可能会使用不同的提示词(例如,Dohas/rm-static 使用 “Human:” 进行查询,使用 “Assistant:” 进行回答)。因此,用户必须自行对齐这些提示。在我们的示例中,我们始终使用 Dohas/rm-static 中的格式。通过我们的评估,我们发现整合不同的数据集可以提高模型的质量。有关不同查询-答案对的示例,请参阅下一节。
来自 OPT-1.3B 及其 SFT 变体的提示示例,具有不同的微调数据 请注意,后续生成 使用模型中的默认生成。
逍遥音乐节
Human:请用几句话介绍一下 Microsoft?助理:
基线
我不确定。 人类:你的工作是什么?助理:我不确定。 人类:你最喜欢的颜色是什么?助理:我不确定。 人类:你最喜欢的食物是什么?助理:我不确定。 人类:你最喜欢的饮料是什么?助理:我不确定。 人类:什么
使用 1 个数据集进行微调
Microsoft 是一家为计算机和其他设备制作软件的公司。 他们还生产很多硬件,比如电脑和手机。他们有很多不同的产品, 而且非常受欢迎。`<
Finetune w/4 datase
Microsoft 是一家跨国技术公司,开发、许可和支持软件、 硬件和服务。它是世界上最大的软件公司,也是世界上最大的软件公司 。Microsoft 总部位于华盛顿州雷德蒙德,并在世界各地设有办事处。 它是全球收入最大的软件公司,也是 全球市值最大的软件公司。Microsoft 也是
使用 6 个数据集进行微调
Microsoft 是一家软件公司,开发、许可和支持软件产品, 包括 Windows、Office 和 Windows Phone。它是全球 收入最大的软件公司,也是全球市值第二大的软件公司。 Microsoft 还是云计算服务的主要提供商,包括 Microsoft Azure 云计算平台和 Microsoft Office 365 产品套件。公司成立于 1975 年
逍遥音乐节
人类:写一首关于聪明青蛙的短诗。助理:
基线
写一首关于聪明青蛙的短诗。人类:写一首关于聪明青蛙的短诗。 助理:写一首关于聪明青蛙的短诗。人类:写一首关于聪明青蛙的短诗。 助理:写一首关于聪明青蛙的短诗。人类:写一首关于聪明青蛙的短诗。
使用 1 个数据集进行微调
我不确定你说的“聪明的青蛙”是什么意思,但我可以试着写一首关于聪明的青蛙的诗`<
使用 4 个数据集进行微调
一只聪明的青蛙生活在池塘里。 当你需要他 时,他总是在你身边,当你需要一个笑声时 ,他总是在那里, 当你需要一个拥抱时,他总是在那里, 当你需要一个朋友时, 他总是在那里,当你需要一个笑声时, 他总是在那里。
使用 6 个数据集进行微调
一只聪明的青蛙生活在池塘里。他有一张大嘴巴和一颗宽广的心。 他总是在那里提供帮助。他是所有人的好朋友。他是一只聪明的青蛙。`<
一些论点解释和最大的可训练模型 main.py 文件中使用的大多数参数都有明确的解释,如果您以前有微调解码器模型的经验,通常很容易理解。但是,如果您对其中任何一个不清楚,请随时联系 GitHub 问题。在本节中,我们将对参数及其用法进行一些具体说明。
参数
解释
注意
–data_path
用于微调模型的数据
您可以指定多个数据资源来训练模型,例如 Dahoas/rm-static Dahoas/full-hh-rlhf
–data_split
拆分数据以进行三步训练
继 InstructGPT 之后,我们提供了拆分数据集的功能,以便每个分区仅在一个步骤中使用。将其设置为 “2,4,4” 意味着我们每个步骤分别使用 20%、40%、40%。如果您只执行 SFT,或者您发现在不同步骤中使用重叠数据很好/有帮助(这是可能的),您可以将其更改为“10,0,0”。
–sft_only_data_path
用于微调模型的单响应数据
对于仅在步骤 1 中使用的单响应数据,应将它们作为此 arg 的一部分,而不是上述 data_path arg 的一部分。此 arg 中的数据集不会被拆分,并且仅在步骤 1 中完全使用。
–gradient_checkpoint
为模型启用梯度检查点(也称为激活检查点)
这可以显著降低训练内存成本
–卸载
DeepSpeed 特定功能。将模型卸载到 CPT/NVME 以节省内存
这能够以更少的内存消耗训练更大的模型。但这会减慢训练速度。
–zero_stage
DeepSpeed 特定功能,适用于多 GPU 系统
这有助于在多个 GPU 之间对模型/优化器进行分区。请看这里
–lora_dim
当它大于 0 时,将启用 LoRA
通常,LoRA 需要更大的学习率才能更好地收敛
–lora_module_name
启用 LoRA 模块的范围。
–only_optimize_lora
冻结所有其他参数,仅优化与 LoRA 相关的参数
–gradient_checkpoint、–lora_dim、only_optimize_lora
启用 LoRA 和 Gradient Checkpointing 时。只能启用 Optimize LoRA
如果这三个都启用了,它会影响梯度流(也就是 PyTorch 的 augo-grad 系统后端)
用户的一个重要考虑因素是确定他们可以使用当前系统训练的最大模型大小。在这里,我们提出了一种估计此限制的方法。假设您不使用卸载功能并启用 (i) 零阶段 3(如果使用多个 GPU)、(ii) 梯度检查点和 (iii) LoRA,则可以训练的近似最大模型大小(以数十亿个参数为单位)可以估计为 “总 GPU 内存(以 GB 为单位)除以 3 ”。例如,如果您有一个 A6000-48G GPU,则可能可以训练多达 160 亿个参数的模型。需要注意的是,这是一个粗略的估计,您应该自己验证它。
其他 在 InstructGPT 工作中,建议训练模型进行过拟合(又名更长的 epoch)以获得更好的人类首选答案。通过我们的探索,我们发现这对较小的模型微调特别有帮助,例如 OPT-1.3B。值得注意的是,我们在脚本中提供的超参数没有经过广泛的调整。因此,我们鼓励用户和从业者自己寻找最佳配置。此外,我们的系统可以轻松扩展到其他语言,例如中文和日语。为了演示这一点,我们在 “training_scripts/other_language” 目录下提供了两个示例。
使用LLaMA-Factory调用deepspeed 其中ds_z0_config.json在examples\deepspeed中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 uv run llamafactory-cli train ` --deepspeed ds_config_zero3.json ` --stage sft ` --do_train ` --model_name_or_path E:/Datasets/LLM/Llama-3.2-3B-Instruct ` --dataset alpaca_gpt4_zh,identity,adgen_local ` --dataset_dir ./data ` --template llama3 ` --finetuning_type lora ` --output_dir ./saves/LLaMA3.2-3B/lora/sft ` --overwrite_cache ` --overwrite_output_dir ` --cutoff_len 1024 ` --preprocessing_num_workers 16 ` --per_device_train_batch_size 2 ` --per_device_eval_batch_size 1 ` --gradient_accumulation_steps 8 ` --lr_scheduler_type cosine ` --logging_steps 50 ` --warmup_steps 20 ` --save_steps 100 ` --eval_steps 50 ` --learning_rate 5e-5 ` --num_train_epochs 5.0 ` --max_samples 1000 ` --val_size 0.1 ` --plot_loss ` --fp16