文章目录
一、目的
分布式训练是一种在多个计算节点上共同完成机器学习模型训练任务的过程,它可以充分利用多台计算机的资源,提高训练效率和模型准确性。分布式训练的主要优势包括:
1. 加速训练过程
通过并行计算,分布式训练大幅缩短了训练时间,提高了训练效率。
提高模型准确性:利用更多的计算资源和数据样本进行训练,减少了过拟合风险,提高了模型的泛化能力和准确性。
2. 适应大规模数据
分布式训练能够处理传统单机训练难以应对的大规模数据集。
3. 资源利用率高
有效利用了计算资源,避免了单机训练时的资源闲置和浪费。
4. 提升训练速度
通过并行计算,分布式训练能够显著缩短模型训练的时间,尤其是在处理大规模数据集和复杂模型时效果更为明显。
5. 增大系统容量
随着业务量的增长,单机性能已无法满足需求。分布式训练通过多台计算设备的协同工作,能够应对更大规模的应用场景。
6. 提高系统可用性
分布式架构能够消除单点故障,提高系统的整体可用性。即使某个计算设备出现故障,也不会影响整个训练任务的进行。
7. 加速模型迭代
在快速迭代的机器学习项目中,分布式训练能够更快地完成模型训练,从而加速模型迭代和优化过程。
总的来说,分布式训练在深度学习领域提高训练效率和加快模型收敛的重要手段 。
二、 LLaMA-Factory
1.安装
在安装 LLaMA-Factory 之前,请确保您安装了下列依赖:
运行以下指令以安装 LLaMA-Factory 及其依赖:
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
如果出现环境冲突,请尝试使用 pip install --no-deps -e . 解决
2. LLaMA-Factory 校验
完成安装后,可以通过使用 llamafactory-cli version 来快速校验安装是否成功
如果看到类似下面的界面,就说明安装成功了。
Successfully uninstalled requests-2.31.0
Attempting uninstall: anyio
Found existing installation: anyio 4.4.0
Uninstalling anyio-4.4.0:
Successfully uninstalled anyio-4.4.0
Successfully installed accelerate-1.2.1 aiofiles-23.2.1 aiohappyeyeballs-2.4.6 aiohttp-3.11.12 aiosignal-1.3.2 annotated-types-0.7.0 anyio-4.8.0 audioread-3.0.1 av-14.1.0 click-8.1.8 datasets-3.2.0 dill-0.3.8 docstring-parser-0.16 einops-0.8.1 fastapi-0.115.8 ffmpy-0.5.0 fire-0.7.0 frozenlist-1.5.0 gradio-5.12.0 gradio-client-1.5.4 huggingface-hub-0.28.1 jieba-0.42.1 joblib-1.4.2 lazy-loader-0.4 librosa-0.10.2.post1 llamafactory-0.9.2.dev0 llvmlite-0.44.0 markdown-it-py-3.0.0 mdurl-0.1.2 msgpack-1.1.0 multidict-6.1.0 multiprocess-0.70.16 nltk-3.9.1 numba-0.61.0 orjson-3.10.15 pandas-2.2.3 peft-0.12.0 pooch-1.8.2 propcache-0.2.1 pyarrow-19.0.0 pydantic-2.10.6 pydantic-core-2.27.2 pydub-0.25.1 python-multipart-0.0.20 pytz-2025.1 regex-2024.11.6 requests-2.32.3 rich-13.9.4 rouge-chinese-1.0.3 ruff-0.9.6 safehttpx-0.1.6 safetensors-0.5.2 scikit-learn-1.6.1 scipy-1.15.1 semantic-version-2.10.0 sentencepiece-0.2.0 shellingham-1.5.4 shtab-1.7.1 soundfile-0.13.1 soxr-0.5.0.post1 sse-starlette-2.2.1 starlette-0.45.3 termcolor-2.5.0 threadpoolctl-3.5.0 tiktoken-0.9.0 tokenizers-0.21.0 tomlkit-0.13.2 tqdm-4.67.1 transformers-4.48.3 trl-0.9.6 typer-0.15.1 typing-extensions-4.12.2 tyro-0.8.14 tzdata-2025.1 uvicorn-0.34.0 websockets-14.2 xxhash-3.5.0 yarl-1.18.3
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
root@autodl-container-c2d74383d9-db8bb7c4:~/autodl-tmp/LLaMA-Factory# llamafactory-cli version
----------------------------------------------------------
| Welcome to LLaMA Factory, version 0.9.2.dev0 |
| |
| Project page: https://github.com/hiyouga/LLaMA-Factory |
----------------------------------------------------------
root@autodl-container-c2d74383d9-db8bb7c4:~/autodl-tmp/LLaMA-Factory#
三、 训练引擎
LLaMA-Factory 支持单机多卡和多机多卡分布式训练。同时也支持 DDP , DeepSpeed 和 FSDP 三种分布式引擎。
1.DDP
DDP (DistributedDataParallel) 通过实现模型并行和数据并行实现训练加速。 使用 DDP 的程序需要生成多个进程并且为每个进程创建一个 DDP 实例,他们之间通过 torch.distributed 库同步。
2. DeepSpeed
DeepSpeed 是微软开发的分布式训练引擎,并提供ZeRO(Zero Redundancy Optimizer)、offload、Sparse Attention、1 bit Adam、流水线并行等优化技术。 您可以根据任务需求与设备选择使用。
3.FSDP
通过全切片数据并行技术(Fully Sharded Data Parallel)来处理更多更大的模型。在 DDP 中,每张 GPU 都各自保留了一份完整的模型参数和优化器参数。而 FSDP 切分了模型参数、梯度与优化器参数,使得每张 GPU 只保留这些参数的一部分。 除了并行技术之外,FSDP 还支持将模型参数卸载至CPU,从而进一步降低显存需求。
由于deepseek分布式训练加速,采用混合精度(fp16/fp32)和ZeRO优化,减少显存占用,从而加速训练。所以本文采用DeepSpeed 是训练引擎。
四、WebUI
LLaMA-Factory 支持通过 WebUI 零代码微调大语言模型。 在完成 安装 后,您可以通过以下指令进入 WebUI:
llamafactory-cli webui
WebUI 主要分为四个界面:训练、评估与预测、对话、导出。
当运行上面命令后,打开如下界面
在开始训练模型之前,需要指定的参数有:
模型名称及路径
训练阶段
微调方法
训练数据集
学习率、训练轮数等训练参数
微调参数等其他参数
输出目录及配置路径
五. 参数配置
1. 模型
模型就选择deepseek7b蒸馏版,下载完成大小15G左右,下载地址直接去魔塔社区就行。
root@autodl-container-c2d74383d9-db8bb7c4:~/autodl-tmp/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B# ll -h
total 15G
drwxr-xr-x 3 root root 4.0K Feb 16 09:40 ./
drwxr-xr-x 3 root root 49 Feb 15 20:36 ../
-rw-r--r-- 1 root root 62 Feb 16 09:34 .mdl
-rw------- 1 root root 855 Feb 16 09:40 .msc
-rw-r--r-- 1 root root 36 Feb 16 09:40 .mv
-rw-r--r-- 1 root root 1.1K Feb 15 20:36 LICENSE
-rw-r--r-- 1 root root 19K Feb 15 20:36 README.md
-rw-r--r-- 1 root root 680 Feb 15 20:36 config.json
-rw-r--r-- 1 root root 73 Feb 15 20:36 configuration.json
drwxr-xr-x 2 root root 35 Feb 15 20:36 figures/
-rw-r--r-- 1 root root 181 Feb 15 20:36 generation_config.json
-rw-r--r-- 1 root root 8.1G Feb 16 09:40 model-00001-of-000002.safetensors
-rw-r--r-- 1 root root 6.2G Feb 16 00:49 model-00002-of-000002.safetensors
-rw-r--r-- 1 root root 28K Feb 15 20:36 model.safetensors.index.json
-rw-r--r-- 1 root root 6.8M Feb 15 20:36 tokenizer.json
-rw-r--r-- 1 root root 3.0K Feb 15 20:36 tokenizer_config.json
root@autodl-container-c2d74383d9-db8bb7c4:~/autodl-tmp/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B# du -sh
15G .
root@autodl-container-c2d74383d9-db8bb7c4:~/autodl-tmp/llm/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B#
微调还是用lora
2. 数据
测试数据集可以去魔塔社区下载,也可以使用自己私有数据集
本文使用的数据集
#数据集下载
from modelscope.msdatasets import MsDataset
ds = MsDataset.load('AI-ModelScope/ruozhiba', subset_name='post-annual', split='train')
print(next(iter(ds)))
数据集的加载,
首先把自己数据集放LLaMA-Factory的data文件夹下,
然后把新加的数据集添加到配置文件dataset_info.json里面。
然后点击Dataset
可以看到数据已经有了,点击选择
点击旁边Preview dataset预览,可以查看数据内容
推理引擎这块选择vllm
3. 训练参数
训练参数修改,epochs给个200,最大样本给个1000,长度512,验证集比例0.01
4. 多卡参数
重点就是下面这个参数,如果我们服务器是多卡的,会自动检测到。
关于DeepSpeed stage,这里选2,因为数据集不是很大,如果特别大数据集可以选3,但是3的速度会比2慢,后面详细解释。
在使用 DeepSpeed 之前,您需要先估计训练任务的显存大小,再根据任务需求与资源情况选择合适的 ZeRO 阶段。
1. ZeRO-1
仅划分优化器参数,每个GPU各有一份完整的模型参数与梯度。
2. ZeRO-2
划分优化器参数与梯度,每个GPU各有一份完整的模型参数。
3. ZeRO-3
划分优化器参数、梯度与模型参数。
简单来说:从 ZeRO-1 到 ZeRO-3,阶段数越高,显存需求越小,但是训练速度也依次变慢。此外,设置 offload_param=cpu 参数会大幅减小显存需求,但会极大地使训练速度减慢。因此,如果您有足够的显存, 应当使用 ZeRO-1,并且确保 offload_param=none。
LLaMA-Factory提供了使用不同阶段的 DeepSpeed 配置文件的示例。包括:
ZeRO-0 (不开启)
ZeRO-2
ZeRO-2+offload
ZeRO-3
ZeRO-3+offload
下面是配置完以后的整体参数
最下面部分
六、训练
点击 Start 按钮开始训练模型。
点击训练以后会报一个错误
File "/root/miniconda3/lib/python3.12/site-packages/transformers/utils/generic.py", line 62, in __get__
cached = self.fget(obj)
^^^^^^^^^^^^^^
File "/root/miniconda3/lib/python3.12/site-packages/transformers/training_args.py", line 2224, in _setup_devices
self.distributed_state = PartialState(**accelerator_state_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/miniconda3/lib/python3.12/site-packages/accelerate/state.py", line 198, in __init__
raise ImportError(
ImportError: DeepSpeed is not available => install it using `pip3 install deepspeed` or build it from source
Traceback (most recent call last):
File "/root/autodl-tmp/LLaMA-Factory/src/llamafactory/launcher.py", line 23, in <module>
launch()
没有安装deepspeed,按要求pip一下即可。
然后重新点击start,等会就开始训练了
NFO|trainer.py:2375] 2025-02-17 00:54:43,158 >> Total train batch size (w. parallel, distributed & accumulation) = 128
[INFO|trainer.py:2376] 2025-02-17 00:54:43,158 >> Gradient Accumulation steps = 8
[INFO|trainer.py:2377] 2025-02-17 00:54:43,158 >> Total optimization steps = 700
[INFO|trainer.py:2378] 2025-02-17 00:54:43,161 >> Number of trainable parameters = 20,185,088
1%|▋ | 5/700 [00:18<44:05, 3.81s/it][INFO|2025-02-17 00:55:01] llamafactory.train.callbacks:157 >> {'loss': 2.7893, 'learning_rate': 4.9994e-05, 'epoch': 0.63, 'throughput': 4374.60}
{'loss': 2.7893, 'grad_norm': 0.0692906379699707, 'learning_rate': 4.9993705873562665e-05, 'epoch': 0.63, 'num_input_tokens_seen': 81920}
1%|█▎ | 10/700 [00:38<44:33, 3.87s/it][INFO|2025-02-17 00:55:21] llamafactory.train.callbacks:157 >> {'loss': 2.6877, 'learning_rate': 4.9975e-05, 'epoch': 1.25, 'throughput': 4360.59}
{'loss': 2.6877, 'grad_norm': 0.1393151581287384, 'learning_rate': 4.997482666353287e-05, 'epoch': 1.25, 'num_input_tokens_seen': 165824}
2%|██ | 15/700 [00:56<43:07, 3.78s/it][INFO|2025-02-17 00:55:39] llamafactory.train.callbacks:157 >> {'loss': 2.2245, 'learning_rate': 4.9943e-05, 'epoch': 1.89, 'throughput': 4392.98}
{'loss': 2.2245, 'grad_norm': 0.0785844698548317, 'learning_rate': 4.99433718761614e-05, 'epoch': 1.89, 'num_input_tokens_seen': 248640}
3%|██▍ | 18/700 [01:06<40:15, 3.54s/i
等待训练结束,可以查看一下显存占用情况
可以看到,2张卡基本都在90%以上。
在llamfactory页面,可以实时看到loss变化的曲线,已经训练的进度
训练结束信息
INFO|tokenization_utils_base.py:2491] 2025-02-17 01:38:39,088 >> tokenizer config file saved in saves/DeepSeek-R1-7B-Distill/lora/train_2025-02-17-00-40-18/tokenizer_config.json
[INFO|tokenization_utils_base.py:2500] 2025-02-17 01:38:39,089 >> Special tokens file saved in saves/DeepSeek-R1-7B-Distill/lora/train_2025-02-17-00-40-18/special_tokens_map.json
***** train metrics *****
epoch = 87.5079
num_input_tokens_seen = 11378048
total_flos = 450831897GF
train_loss = 0.432
train_runtime = 0:43:47.37
train_samples_per_second = 38.061
train_steps_per_second = 0.266
Figure saved at: saves/DeepSeek-R1-7B-Distill/lora/train_2025-02-17-00-40-18/training_loss.png
[WARNING|2025-02-17 01:38:39] llamafactory.extras.ploting:162 >> No metric eval_loss to plot.
[WARNING|2025-02-17 01:38:39] llamafactory.extras.ploting:162 >> No metric eval_accuracy to plot.
[INFO|modelcard.py:449] 2025-02-17 01:38:39,857 >> Dropping the following result as it does not have all the necessary fields:
{'task': {'name': 'Causal Language Modeling', 'type': 'text-generation'}}
可视化loss
生成一下目录
可以拿最后一次checkpoint进行推理
七、推理
把微调完的模型路径放进来
推理引擎选择vllm
如果出现load model error,那就是没有安装vllm,只需要pip一下。
pip install vllm
然后重新加载,就会显示成功下面出现对话框
加载完成以后,就可以测试,数据集随便挑一些问题给模型
对比原始数据集
基本能回答正确,文字重复性差不多在80%-90%之间。
八、XTuner
本文主要介绍使用LLaMA-Factory进行微调训练,也可以使用XTuner微调可以参考下面
链接: XTuner微调
对于多卡,和Llamafctory类似,也是支持DeepSeed.
可以去官网查看,和llamafactory主要区别就是它没有提供UI界面,使用命令行训练,多卡训练主要是加个deepspeed参数。
# 以下命令根据需要任选其一
xtuner train xxx --deepspeed deepspeed_zero1
xtuner train xxx --deepspeed deepspeed_zero2
xtuner train xxx --deepspeed deepspeed_zero2_offload
xtuner train xxx --deepspeed deepspeed_zero3
xtuner train xxx --deepspeed deepspeed_zero3_offload