安装详情
用 pip 安装 DeepSpeed 最省事,会拉取最新版本,而且不绑定特定的 PyTorch 或 CUDA 版本。DeepSpeed 带了一些 C++/CUDA 扩展,也就是官方文档里常说的 op。默认情况下,这些扩展会在运行时通过 torch 的 JIT C++ 扩展加载器,它依赖于 ninja 构建并动态链接。
pip install deepspeed
安装后,可以用 DeepSpeed 环境报告(ds_report 或 python -m deepspeed.env_report)验证安装,并查看当前机器兼容哪些 op。排查安装和兼容性问题时,这个报告很有用。
ds_report
报错:
FileNotFoundError: [Errno 2] No such file or directory: ':/usr/local/cuda-11.8/bin/nvcc'
修改 .bashrc:
CUDA_HOME是一个 环境变量 ,用于指定 单个 CUDA 安装路径。- 不是
PATH类型的环境变量(即不支持多个路径用冒号:分隔)。
# 原始
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-11.8
# 修改后
export CUDA_HOME=/usr/local/cuda-11.8
运行
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 模型,并提供一组很小的训练和 checkpoint API。更完整的示例可以直接看官方教程。
初始化 DeepSpeed 引擎:
model_engine, optimizer, _, _ = deepspeed.initialize(args=cmd_args,
model=model,
model_parameters=params)
deepspeed.initialize 会处理必要的初始化,包括分布式数据并行和混合精度训练。除了包装模型,DeepSpeed 还可以根据传给 deepspeed.initialize 的参数和 DeepSpeed 配置文件,构建并管理优化器、数据加载器和学习率调度器。注意,DeepSpeed 会在每个训练 step 自动执行学习率调度。
如果已经手动设置分布式环境,需要把:
torch.distributed.init_process_group(...)
替换成:
deepspeed.init_distributed()
默认使用 NCCL 后端,DeepSpeed 对这条路径测得最多,也可以 覆盖默认值。
如果不需要在 deepspeed.initialize() 之前设置分布式环境,就不用显式调用这个函数,因为 DeepSpeed 会在 initialize 阶段自动初始化分布式环境。反过来,如果代码里已经有 torch.distributed.init_process_group,这里就要删掉,避免重复初始化。
训练
初始化 DeepSpeed 引擎后,可以使用三个简单的 API 进行模型训练:前向传播(可调用对象)、反向传播(backward)和权重更新(step)。
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 的学习率调度器时:- 如果调度器应该在每个训练 step 执行,可以在初始化 DeepSpeed 引擎时把调度器传给
deepspeed.initialize,交给 DeepSpeed 管理更新、保存和恢复。 - 如果调度器应该按其他间隔执行,例如按训练 epoch 执行,就不要在初始化时传给 DeepSpeed,需要自己显式管理。
- 如果调度器应该在每个训练 step 执行,可以在初始化 DeepSpeed 引擎时把调度器传给
模型检查点
保存和加载训练状态通过 DeepSpeed 中的 save_checkpoint 和 load_checkpoint API 处理,该 API 接受两个参数来唯一标识检查点
ckpt_dir:保存检查点的目录。ckpt_id:唯一标识目录中检查点的标识符。下面的代码片段用损失值作为检查点标识符。
#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。
注意:所有进程都必须调用这个方法,不能只让 rank 0 调用。每个进程都要保存自己的主权重、调度器和优化器状态;如果只在 rank 0 调用,它会一直等其他进程同步,最后卡住。
DeepSpeed 配置
DeepSpeed 的功能通过配置文件启用、禁用或配置,文件路径通常放在 args.deepspeed_config。下面是一个示例配置,完整字段见 API 文档。
{
"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 集成到模型里
client_entry.py是模型的入口脚本client args是argparse命令行参数ds_config.json是 DeepSpeed 的配置文件
资源配置(多节点)
DeepSpeed 使用与 OpenMPI 和 Horovod 兼容的 hostfile 配置多节点资源。hostfile 里写的是主机名(或 SSH 别名)和插槽计数:这些机器需要支持免密 SSH,插槽计数则表示系统上可用的 GPU 数量。例如:
worker-1 slots=4
worker-2 slots=4
这表示名为 worker-1 和 worker-2 的两台机器各有 4 张 GPU 可用于训练。
主机文件使用 --hostfile 命令行选项指定。如果未指定主机文件,则 DeepSpeed 会搜索 /job/hostfile。如果未指定或找到主机文件,则 DeepSpeed 会查询本地机器上的 GPU 数量以发现可用的本地插槽数量。
下面的命令会在 myhostfile 指定的所有可用节点和 GPU 上启动 PyTorch 训练任务:
deepspeed --hostfile=myhostfile <client_entry.py> <client args> \
--deepspeed --deepspeed_config ds_config.json
也可以把分布式训练限制到可用节点和 GPU 的一部分,主要靠 --num_nodes 和 --num_gpus 两个参数。比如只使用两个节点:
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:
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:
deepspeed --include="worker-2:0,1" \
<client_entry.py> <client args> \
--deepspeed --deepspeed_config ds_config.json
在没有无密码 SSH 的情况下启动
DeepSpeed 也支持不依赖免密 SSH 启动训练任务。这个模式适合 Kubernetes 之类的云环境:容器编排本来就能处理调度,再硬搭一套带免密 SSH 的 leader-worker 架构,反而多一层复杂度。
使用这个模式时,需要在所有节点上分别运行 DeepSpeed 命令,结构如下:
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>: 主节点的端口。
在这个设置下,hostfile 里的主机名不需要免密 SSH 访问。不过启动器仍然需要 hostfile 来收集环境信息,比如节点数和每个节点上的 GPU 数。
每个节点都必须用唯一的 node_rank 启动,并且所有节点都要拿到主节点(rank 0)的地址和端口。这个模式下,启动器会更接近 PyTorch 文档 里的 torchrun。
多节点环境变量
跨多节点训练时,经常需要把自定义环境变量传播到每个节点。默认情况下,DeepSpeed 会传播所有已设置的 NCCL 和 PYTHON 相关环境变量。如果还要传播其他变量,可以写到名为 .deepspeed_env 的点文件里,每行一个 VAR=VAL。DeepSpeed 启动器会在当前执行路径和主目录(~/)里查找这个文件。想换文件名或路径,可以用环境变量 DS_ENV_FILE 指定;多个作业需要不同变量时,这个参数很方便。
举个具体例子,某些集群需要在训练前设置特殊的 NCCL 变量。把这些变量写进主目录下的 .deepspeed_env 即可:
NCCL_IB_DISABLE=1
NCCL_SOCKET_IFNAME=eth0
之后 DeepSpeed 会确保每个节点上的每个进程启动时都带上这些环境变量。
MPI 和 AzureML 兼容性
DeepSpeed 自带并行启动器,用来启动多节点/多 GPU 训练任务。如果希望用 MPI(例如 mpirun)启动,DeepSpeed 也支持。要注意的是,DeepSpeed 仍然会使用 torch 分布式 NCCL 后端,而不是 MPI 后端。
要用 mpirun + DeepSpeed 或 AzureML(用 mpirun 作为启动器后端)启动训练任务,只需要安装 mpi4py Python 包。DeepSpeed 会用它发现 MPI 环境,并把必要状态(例如 world size、rank)传给 torch 分布式后端。
如果用了模型并行、流水线并行,或者在调用 deepspeed.initialize(..) 之前需要调用 torch.distributed,也可以走同样的 MPI 支持和额外的 DeepSpeed API。把原来的 torch.distributed.init_process_group(..) 替换为:
deepspeed.init_distributed()
资源配置(单节点)
如果只在一个节点(一个或多个 GPU)上跑,DeepSpeed 不需要上面那种 hostfile。没有检测到或传入 hostfile 时,DeepSpeed 会查询本机 GPU 数量来发现可用插槽。--include 和 --exclude 仍然正常可用,只是主机名要写成 localhost。
另外,不要用 CUDA_VISIBLE_DEVICES 配合 DeepSpeed 控制设备选择。比如只想使用当前节点的 GPU 1,应该这样写:
deepspeed --include localhost:1 ...
DeepSpeedExamples
监督微调 (SFT)
监督式微调(SFT)和临时语言任务(例如 WikiText-103)的标准语言模型微调很像。主要区别在数据集:SFT 会收集高质量的 query-answer 对,用来微调模型生成更像人类偏好的回答。
如何训练模型
training_scripts 目录提供了多套脚本,覆盖单 GPU(例如单张 A6000-48G、V100-32G、A100-40G)、单节点(例如 8/16x V100-32G、8 张 A100-40G/80G)和多节点设置(例如 64x A100-80G)。如果是单张 A6000-48G,直接跑对应脚本即可。
training_scripts/opt/single_gpu/run_1.3b.sh
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
报错:
(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,所以需要把上层项目目录加到系统路径里。
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
运行:
(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 里有多个 prompt,可以按需要修改。
模型和数据集
由于 GPT3 没有开源 checkpoint,这里用 Meta OPT 系列预训练模型(即 facebook/opt-1.3b)。也可以换成其他预训练模型,例如 GPT-Neo、Bloom 等。数据集使用 Huggingface Datasets 上的开源数据集:
Dahoas/rm-static
Dahoas/full-hh-rlhf
Dahoas/synthetic-instruct-gptj-pairwise
yitingxie/rlhf-reward-datasets
openai/webgpt_comparisons stanfordnlp/SHP
借助 DeepSpeed RLHF 的数据抽象和混合机制,可以把多个数据源混在一起训练。但不同数据集的 prompt 格式可能不一样,例如 Dohas/rm-static 用 “Human:” 表示查询,用 “Assistant:” 表示回答,所以要先自行对齐格式。这里统一使用 Dohas/rm-static 的格式。评估结果显示,整合不同数据集能提升模型质量。下面是不同 query-answer 对的示例。
来自 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 里的大多数参数都有说明,如果之前微调过 decoder-only 模型,基本不难理解。实在不确定的地方可以去 GitHub issue 里查或问。这里补充几个容易踩坑的参数。
| 参数 | 解释 | 注意 |
|---|---|---|
| –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 特定功能。将模型卸载到 CPU/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 的 autograd 系统后端) |
一个实际问题是:当前机器到底能训练多大的模型?这里给一个粗估方法。假设不使用卸载功能,并启用(i)ZeRO stage 3(多 GPU 时)、(ii)梯度检查点和(iii)LoRA,那么可训练的近似最大模型大小(单位:十亿参数)可以估为“总 GPU 显存(GB)除以 3”。例如一张 A6000-48G,大概可以训练 16B 级别模型。这个估算很粗,真正能不能跑还得自己验证。
其他
InstructGPT 的经验里,会建议把模型训练到一定程度的过拟合,也就是跑更长的 epoch,以获得更符合人类偏好的回答。实际尝试下来,这对 OPT-1.3B 这类较小模型尤其有帮助。脚本里的超参数没有大规模调参,别太迷信默认值,最好按自己的数据和硬件再找一轮配置。系统也能扩展到中文、日语等其他语言,training_scripts/other_language 目录下有两个示例。
使用 LLaMA-Factory 调用 DeepSpeed
其中 ds_z0_config.json 在 examples\deepspeed 中。
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