伴随着大数据的发展和强大的分布式并行计算能力,以预训练+微调的模型开发范式渐渐成为深度学习领域的主流。
2023年各家推出的大模型浩如烟海,如GPT4、Llama、ChatGLM、Baichuan、RWKV、Stable-Diffusion等。这些模型在达到越来越好的效果的同时也需要越来越多的算力资源:全量finetune它们动辄需要几十至上百G显存训练部署,一般的实验室和个人开发者无力承担。
为了解决这个问题,业界提出了众多高效微调的方法, 例如Adapter-Tuning、Prompt-Tuning、LoRA、QLoRA等。基于这些高效微调的技术,魔搭ModelScope开源社区推出了一套完整的轻量级训练推理工具:帮开发者构建一个端到端的框架SWIFT,让AI爱好者用自己的消费级显卡就能玩转大模型和AIGC。
SWIFT:让训练推理轻快如飞
SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是基于PyTorch的轻量级、开箱即用的模型微调、推理框架。它不仅集成了各类开源tuners,如LoRA、QLoRA、Adapter等,并且融合了ModelScope独立自研的特有tuner ResTuning,得益于此,各个模态的开发者均可以找到适合自己模型的开发方式。
SWIFT的tuners不仅适配于所有Transformer结构的模型,也适配于其他结构的深度学习模型,做到一行代码创建可微调模型,实现参数高效、内存高效和时间高效的训练流程。
SWIFT可以无缝集成到ModelScope生态系统中,打通数据集读取、模型下载、模型训练、模型推理、模型上传等流程。此外,SWIFT与PEFT完全兼容, 熟悉PEFT的用户可以使用SWIFT能力结合ModelScope的模型进行便捷地训练推理。
作为ModelScope独立自研的开源轻量级tuner ResTuning,该技术在cv、多模态等领域均经过了系列验证,在训练效果和其他微调方法相当的情况下,可以做到显存节省30%~60%,为cv、多模态模型的训练提供了新的范式,在未来会应用在越来越多的场景上。
CV Task (ViT) |
Multi-Modal Task (SD) |
|
LoRA |
6.88 GB |
61.03 GB |
Adapter |
6.53 GB |
54.30 GB |
ResTuning |
4.73 GB |
21.35 GB |
作为开箱即用的框架,SWIFT提供了可以直接使用的微调、推理脚本。开发者或AI爱好者甚至不需要系统知识即可在自己的消费级显卡上进行业界流行模型的使用和学习。SWIFT框架提供的各类脚本均经过了ModelSope专业算法同学的缜密调试,可以直接用于训练,开发者也可以根据自己的需求调节超参数和训练过程。
为方便将模型在开发环境下训练和生产条件下部署,SWIFT做到了线程安全的工程设计美学。SWIFT提供了简单、统一的接口支持各类tuners直接使用。SWIFT中提供的各tuner可以在一个模型上混合使用训练,例如,开发者可以可以设置多种配置的LoRA模块,或将LoRA和Adapter混合在一个模型上训练,开发者可以借此优势挖掘模型的隐藏潜力。
推理时,SWIFT支持在不同线程中设置激活使用的tuners,例如在stable diffusion场景下,这项技术使得单一模型在不显著增加显存的情况下加载更多的LoRA模型,允许不同用户在不同线程中指定各自的LoRA模型同时推理,这大大缩减模型加载的时长,避免了模型切换加载的时间成本,节省了显存占用,并缩小开发复杂度。在GPU条件下可以更高效地利用CPU和GPU,提高推理效率。
SWIFT:安装和使用
SWIFT的github地址:
https://github.com/modelscope/swift
SWIFT的官方文档:
https://github.com/modelscope/swift/blob/main/docs/source/GetStarted/Introduction.md
安装SWIFT
SWIFT在Python环境中运行。请确保python>=3.8,torch>=1.13。
安装方法1:使用pip命令安装SWIFT:
pip install ms-swift -U
安装方法2:如果您想通过源代码安装SWIFT(方便使用训练和推理脚本),请运行以下命令:
git clone https://github.com/modelscope/swift.git cd swift pip install -r requirements/framework.txt pip install -e .
安装方法3:在ModelScope的Docker镜像中使用SWIFT
docker pull registry.cn-hangzhou.aliyuncs.com/modelscope-repo/modelscope:ubuntu20.04-cuda11.8.0-py38-torch2.0.1-tf2.13.0-1.9.1
使用SWIFT
- 使用SWIFT提供的训练推理脚本
首先,确定您使用了上面的安装方法2,这样本地的swift目录中会存在examples文件夹。
# 在swift目录中 cd examples/pytorch/llm # 运行训练 sh scripts/baichuan2_7b_chat/qlora/sft.sh # 训练后推理,注意修改infer.sh中的ckpt_dir参数的值为实际的checkpoint path sh scripts/baichuan2_7b_chat/qlora/infer.sh
训练推理脚本的详细使用可以参考文档:
https://github.com/modelscope/swift/blob/main/examples/pytorch/llm/README_CN.md
- tuners的基本使用
SWIFT支持多个tuners,包括由PEFT提供的tuners。要使用这些tuners,只需调用:
from swift import Swift, LoRAConfig config = LoRAConfig(...) model = Swift.prepare_model(model, config, extra_state_keys=['...']) # 进行后续的训练
上面的伪代码片段随机初始化了一个LoRA tuner。输入model是torch.nn.Module的一个实例,config是SwiftConfig或PeftConfig的具体实例。extra_state_keys是要训练并存储在输出目录中的额外模块权重(如linear head)。
- 组合多个tuners使用
from swift import Swift, LoRAConfig, PromptConfigmodel = Swift.prepare_model(model, {'lora': LoRAConfig(...), 'prompt': PromptConfig(...)})# 进行后续的训练
- 保存weights用于后续推理
在微调之后,您可以调用save_pretrained(存储tuner weights)和push_to_hub(推送到ModelHub保存)方法:
from swift import push_to_hub model.save_pretrained('some-output-folder') push_to_hub('my-group/some-repo-id-modelscope', 'some-output-folder', token='some-ms-token')
假设my-group/some-repo-id-modelscope是Hub中的model-id,而some-ms-token是用于上传的令牌。
使用该model-id进行后续推理
from swift import Swift model = Swift.from_pretrained(model, 'my-group/some-repo-id-modelscope')
- 结合上面的说明,下面是一个可运行的示例
import os import tempfile # 请通过`pip install modelscope -U`安装modelscope from modelscope import Model from swift import LoRAConfig, SwiftModel, Swift, push_to_hub tmp_dir = tempfile.TemporaryDirectory().name if not os.path.exists(tmp_dir): os.makedirs(tmp_dir) model = Model.from_pretrained('modelscope/Llama-2-7b-ms', device_map='auto') lora_config = LoRAConfig(target_modules=['q_proj', 'k_proj', 'v_proj']) model: SwiftModel = Swift.prepare_model(model, lora_config) # 注意,在这里进行一些微调操作 model.save_pretrained(tmp_dir) # 需要配置MODELSCOPE_API_TOKEN环境变量,值为modelscope的API token,并修改my-group/swift_llama2为自己实际的`组织名/模型名` push_to_hub('my-group/swift_llama2', output_dir=tmp_dir) model = Model.from_pretrained('modelscope/Llama-2-7b-ms', device_map='auto') model = SwiftModel.from_pretrained(model, 'my-group/swift_llama2', device_map='auto')
更多可运行的示例请参考官方文档的说明
- 在SWIFT中使用PEFT的能力
from swift import LoraConfig, Swift # PEFT的LoraConfig from peft import TaskType lora_config = LoraConfig(target_modules=['query', 'key', 'value'], task_type=TaskType.CAUSAL_LM) model_wrapped = Swift.prepare_model(model, lora_config) # 或者使用from_pretrained从modelscope hub中加载权重。 model_wrapped = Swift.from_pretrained(model, 'some-id-in-the-modelscope-modelhub')
SWIFT:雨燕虽小五脏俱全
- 多种模型,多种数据集,多种tuners,一行代码开启训练
- 支持的模型:
qwen 系列、qwen-vl 系列、baichuan 系列、chatglm2 系列、llama 系列、openbuddy-llama 系列、internlm 系列、stable diffusion系列、其他系列模型(polylm-13b,seqgpt-560m) - 支持的数据集:
- NLP:alpaca-en (gpt4),alpaca-zh (gpt4),finance-en,multi-alpaca-all,code-en,instinwild-en,instinwild-zh,cot-en,cot-zh,firefly-all-zh,poetry-zh,instruct-en,gpt4all-en,cmnli-zh,jd-zh,dureader-robust-zh,medical-en,medical-zh,medical-mini-zh,sharegpt-en,sharegpt-zh,code-python-zh,advertise-gen
- Agent:damo-agent-zh,damo-agent-mini-zh
- 多模态:coco-en
- 其他:cls-fudan-news-zh,ner-jave-zh
- 可支持的微调方法:LoRA,QLoRA,ResTuning,Side,Prompt,Adapter,PEFT全系列tuners,全参数
- 支持的显卡:GTX20系列、30系列、40系列消费级显卡,A10,A100,V100,T4,H100
上面仅列出了可直接开启训练脚本的模型,开发者可利用这些脚本适配其他结构的模型,同样也非常方便快捷,SWIFT目前支持的Tuners有:
-
II
- LoRA:LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
- Adapter:Parameter-Efficient Transfer Learning for NLP
- Prompt Tuning: Visual Prompt Tuning
- Side: Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks
- ResTuning:Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone
- 在PEFT上提供的全系列tuners
- 轻量显存,快速训练,多样化训练场景
SWIFT支持通过模型量化、模型并行、Gradient checkpointing、梯度累加、FlashAttention、XFormers等技术或框架来降低显存的消耗。也支持DDP的技术来提高训练速度。支持自定义数据集、预训练、指令微调、增量训练、多轮对话、Agent和多模态的SFT、训练期间推送ModelScope Hub等功能,适合具有不同需求的开发者们。
SWIFT给每个系列的模型都书写了可以直接运行的sh脚本,并标注了推荐的运行环境和显存消耗。我们准备了两种配置情况下的运行脚本,在低配置情况下,我们提供了QLoRA的微调脚本,可以在12G的显存情况下进行微调。在高配置情况下,例如8卡A100,我们提供了全参数微调+模型并行+数据并行方式的微调脚本,可以在高显卡利用率的情况下训练。
- ResTuning
SWIFT中接入了自研的参数和内存高效微调方法:ResTuning。 它将主流微调模块从主干网络中拆解出来并从理论和实验证明其等价性,进而通过各种独立微调模块的灵活组合,构建了一种新的调优范式。同时它提出了一种内存高效的结构ResTuning-Bypass,通过一系列独立微调模块组成的旁路分支,有效地将其从主干分支中分离出来,使得训练时梯度仅反向传播到旁路分支而不经过主干,同时在进行执行多任务时只需要主干网络进行一次推理,减少了训练时的内存开销和推理多任务时的冗余计算。
- 多个tuners同时使用
在一些情况下,一个模型上可能在不同的模块中使用不同的tuner。
比如,对Embedding、Linear使用不同的LoRA Rank,或者混合使用LoRA和Adapter进行训练
比如,在一个基模型上加载多个用户的tuners,并在HTTP请求中使用特定的tuners进行推理
对这种情况SWIFT进行了良好的支持。开发者可以混合使用多种tuners进行训练,或在不同的线程中独立无关地激活对应的tuners并进行推理。
- 完全兼容PEFT
SWIFT内部融合PEFT的技术,开发者可以从SWIFT引入PEFT模块,经过这样引入的模块中,所有的模型将从ModelScope ModelHub上拉取和推送,方便国内用户使用。
- 深度融合ModelScope生态
- 通过集成ModelScope库,可以通过model id轻松获取模型。
- SWIFT和ModelScope Notebook深度融合,开发者可以直接使用Notebook提供的免费A10显卡来学习和训练。
- 训练完成后,开发者可以将模型自动推送到ModelScope ModelHub上,是否开源由开发者自由决定。
SWIFT:值得期待的未来
为了更好地支持LLM时代的模型需求,基于目前已有的技术沉淀,SWIFT会持续添加新的能力和应用场景:
- 评测能力:基于ModelScope的评测技术开展,用户可以基于此能力获得已训练模型的真实能力,找到最适合自己业务场景的模型
- 部署能力:基于业界开源的部署框架,支持LLM和AGIC模型的生产环境部署,开发者可以一键训练、推理、部署,将大模型理解成本和开发复杂度降到最低
- 更多的tuners:引入更多ModelScope特有或业界SOTA的tuners,更好地挖掘模型潜力
- 支持更多模型的一键训练推理:没什么比更多更好玩的模型更重要了,对不对?
也欢迎更多开发者小伙伴通过魔搭开发者联盟群围绕SWIFT展开更多互动交流
了解更多SWIFT干货,来魔搭社区的新栏目《开发者笔记》,我们已经通过魔搭社区发布了 《SWIFT:轻量级微调框架》 教程特辑,今天我们先奉上关于SWIFT的基本框架、技术原理详解(更多应用实践案例可移步B站:ModelScope官方账号)!
基本框架简介:
https://live.csdn.net/v/330024
4
技术原理详解:
https://live.csdn.net/v/330023
6:22