本文为魔搭社区轻量级训练推理工具SWIFT微调实战教程系列

SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是魔搭ModelScope开源社区推出的一套完整的轻量级训练、推理、评估和部署工具,支持200+大模型、15+多模态大模型以及10+轻量化Tuners,让AI爱好者能够使用自己的消费级显卡玩转大模型和AIGC。

 

近日,许多开发者提出希望魔搭社区的工具可以与NPU等更多类型的卡兼容。在社区开发者钏助斌的联合支持下,魔搭社区ms-swift大模型微调框架进行了适配。目前,ms-swift可支持NPU的单卡、DDP、ZeRO2和ZeRO3的训练与推理。接下来,将以Qwen1.5-7B-Chat为例,为大家提供基于NPU推理和微调大模型实操的教程,具体代码放置在GitHub

 

环境准备

实验环境:8 * 昇腾910B3,每张卡的显存为64GB (感谢昇腾社区对modelscope和swift的支持~)

 

这里我们对实验环境进行安装,其中包含了虚拟环境的创建、ms-swift以及相关依赖的安装以及torch-npu的安装。

# 创建新的conda虚拟环境(可选)
conda create -n swift-npu python=3.10 -y
conda activate swift-npu

# 设置pip全局镜像 (可选,加速下载)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

# 安装ms-swift(当前推荐从源码安装, 待发版后可直接pip安装)
git clone https://github.com/modelscope/swift.git
cd swift
pip install -e '.[llm]'

# 安装torch-npu
pip install torch-npu decorator
# 如果你想要使用deepspeed (控制显存占用,训练速度会有一定下降)
pip install deepspeed

# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试)
pip install -r requirements/framework.txt  -U
pip install -r requirements/llm.txt  -U

 

安装完环境后,我们测试实验环境是否安装正确,NPU能否被正常加载:

from transformers.utils import is_torch_npu_available
import torch

print(is_torch_npu_available())  # True
print(torch.npu.device_count())  # 8
print(torch.randn(10, device='npu:0'))

 

查看NPU的P2P连接,这里看到每个NPU都通过7条HCCS与其他NPU互联

(valle) root@valle:~/src# npu-smi info -t topo
     NPU0       NPU1       NPU2       NPU3       NPU4       NPU5       NPU6       NPU7       CPU Affinity
NPU0       X          HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       144-167
NPU1       HCCS       X          HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       144-167
NPU2       HCCS       HCCS       X          HCCS       HCCS       HCCS       HCCS       HCCS       96-119
NPU3       HCCS       HCCS       HCCS       X          HCCS       HCCS       HCCS       HCCS       96-119
NPU4       HCCS       HCCS       HCCS       HCCS       X          HCCS       HCCS       HCCS       0-23
NPU5       HCCS       HCCS       HCCS       HCCS       HCCS       X          HCCS       HCCS       0-23
NPU6       HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       X          HCCS       48-71
NPU7       HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       HCCS       X          48-71

Legend:

  X    = Self
  SYS  = Path traversing PCIe and NUMA nodes. Nodes are connected through SMP, such as QPI, UPI.
  PHB  = Path traversing PCIe and the PCIe host bridge of a CPU.
  PIX  = Path traversing a single PCIe switch
  PXB  = Path traversing multipul PCIe switches
  HCCS = Connection traversing HCCS.
  NA   = Unknown relationship.

 

查看NPU状态, npu-smi命令详解可以查看官方文档(https://support.huawei.com/enterprise/zh/doc/EDOC1100079287/10dcd668

(valle) root@valle:~/src# npu-smi info
+------------------------------------------------------------------------------------------------+
| npu-smi 24.1.rc1.b030            Version: 24.1.rc1.b030                                        |
+---------------------------+---------------+----------------------------------------------------+
| NPU   Name                | Health        | Power(W)    Temp(C)           Hugepages-Usage(page)|
| Chip                      | Bus-Id        | AICore(%)   Memory-Usage(MB)  HBM-Usage(MB)        |
+===========================+===============+====================================================+
| 0     910B3               | OK            | 101.8       43                0    / 0             |
| 0                         | 0000:C1:00.0  | 0           0    / 0          3318 / 65536         |
+===========================+===============+====================================================+
| 1     910B3               | OK            | 92.0        39                0    / 0             |
| 0                         | 0000:C2:00.0  | 0           0    / 0          3314 / 65536         |
+===========================+===============+====================================================+
| 2     910B3               | OK            | 102.0       40                0    / 0             |
| 0                         | 0000:81:00.0  | 0           0    / 0          3314 / 65536         |
+===========================+===============+====================================================+
| 3     910B3               | OK            | 99.8        40                0    / 0             |
| 0                         | 0000:82:00.0  | 0           0    / 0          3314 / 65536         |
+===========================+===============+====================================================+
| 4     910B3               | OK            | 98.6        45                0    / 0             |
| 0                         | 0000:01:00.0  | 0           0    / 0          3314 / 65536         |
+===========================+===============+====================================================+
| 5     910B3               | OK            | 99.7        44                0    / 0             |
| 0                         | 0000:02:00.0  | 0           0    / 0          3314 / 65536         |
+===========================+===============+====================================================+
| 6     910B3               | OK            | 103.8       45                0    / 0             |
| 0                         | 0000:41:00.0  | 0           0    / 0          3314 / 65536         |
+===========================+===============+====================================================+
| 7     910B3               | OK            | 98.2        44                0    / 0             |
| 0                         | 0000:42:00.0  | 0           0    / 0          3315 / 65536         |
+===========================+===============+====================================================+

 

微调

接下来,我们介绍在单卡、DDP、ZeRO2和ZeRO3的设置下,使用ms-swift对Qwen1.5-7B-Chat在blossom-math-zh数据集下进行LoRA微调的sh脚本、显存需求和运行时长。如果要进行全参数的微调,设置参数--sft_type full即可。要了解更多的超参数设置,请查看ms-swift的官方文档:https://github.com/modelscope/swift/blob/main/docs/source/LLM/index.md

 

单卡训练

通过如下命令启动单卡微调:

# 实验环境: 昇腾910B3
# 显存需求: 28 GB
# 运行时长: 8小时
ASCEND_RT_VISIBLE_DEVICES=0 \
swift sft \
    --model_type qwen1half-7b-chat \
    --dataset blossom-math-zh \
    --num_train_epochs 5 \
    --sft_type lora \
    --output_dir output \

 

数据并行训练

我们使用其中的4卡进行ddp训练

# 实验环境: 4 * 昇腾910B3
# 显存需求: 4 * 22 GB
# 运行时长: 2小时
NPROC_PER_NODE=4 \
ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \
swift sft \
    --model_type qwen1half-7b-chat \
    --dataset blossom-math-zh \
    --num_train_epochs 5 \
    --sft_type lora \
    --output_dir output \

 

Deepspeed训练

ZeRO2:

# 实验环境: 4 * 昇腾910B3
# 显存需求: 4 * 28GB
# 运行时长: 3.5小时
NPROC_PER_NODE=4 \
ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \
swift sft \
    --model_type qwen1half-7b-chat \
    --dataset blossom-math-zh \
    --num_train_epochs 5 \
    --sft_type lora \
    --output_dir output \
    --deepspeed default-zero2 \

 

ZeRO3:

# 实验环境: 4 * 昇腾910B3
# 显存需求: 4 * 22 GB
# 运行时长: 8.5小时
NPROC_PER_NODE=4 \
ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 \
swift sft \
    --model_type qwen1half-7b-chat \
    --dataset blossom-math-zh \
    --num_train_epochs 5 \
    --sft_type lora \
    --output_dir output \
    --deepspeed default-zero3 \

 

这里展示在不同设置下(单卡、DDP、ZeRO2和ZeRO3)进行LoRA微调的NPU的显存占用情况:

模型大小 NPU数量 训练设置 最大显存占用量
7B 1 单卡 1 * 28 GB
7B 4 DDP 4 * 22 GB
7B 4 ZeRO2 4 * 28 GB
7B 4 ZeRO3 4 * 22 GB
7B 8 DDP 8 * 22 GB
14B 1 单卡 1 * 45 GB
14B 8 DDP 8 * 51 GB
14B 8 ZeRO2 8 * 49 GB
14B 8 ZeRO3 8 * 31 GB

 

推理

然后,我们展示使用ms-swift对原始的Qwen1.5-7B-Chat以及微调后的模型进行推理的sh脚本:

 

原始模型:

ASCEND_RT_VISIBLE_DEVICES=0 swift infer \
    --model_type qwen1half-7b-chat

 

LoRA微调后:

# 直接推理
ASCEND_RT_VISIBLE_DEVICES=0 swift infer \
    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --load_dataset_config true

# Merge LoRA增量权重并推理
CUDA_VISIBLE_DEVICES=0 swift export \
    --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx' --merge_lora true
CUDA_VISIBLE_DEVICES=0 swift infer --ckpt_dir 'xxx/vx-xxx/checkpoint-xxx-merged'

 

总结

本文详细介绍了如何在NPU环境下使用ms-swift对Qwen1.5-7B-Chat进行微调和推理,包括环境安装、相关脚本以及对于设置的显存占用等。

 

本文为SWIFT LLM&AIGC微调场景化最佳实践系列之一,后续将继续通过魔搭社区推出场景化教程。目前SWIFT已支持近200种LLM和MLLM(多模态大模型)的训练、推理、评测和部署,支持LoRA、QLoRA、LISA、LongLoRA等十余种tuners,一行代码即可开启模型训练,欢迎对大模型和AIGC微调部署感兴趣的开发者小伙伴们多多交流!

 

Github:

https://github.com/modelscope/swift

 

点击直达本文代码github,感谢支持star~

swift/docs/source/LLM/NPU推理与微调最佳实践.md at main · modelscope/swift · GitHub

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐