大模型时代,还缺一只雨燕 | SWIFT:魔搭社区轻量级微调推理框架

本文涉及的产品
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 伴随着大数据的发展和强大的分布式并行计算能力,以预训练+微调的模型开发范式渐渐成为深度学习领域的主流。 2023年各家推出的大模型浩如烟海,如GPT4、Llama、ChatGLM、Baichuan、RWKV、Stable-Diffusion等。这些模型在达到越来越好的效果的同时也需要越来越多的算力资源:全量finetune它们动辄需要几十至上百G显存训练部署,一般的实验室和个人开发者无力承担。

伴随着大数据的发展和强大的分布式并行计算能力,以预训练+微调的模型开发范式渐渐成为深度学习领域的主流。


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


直达链接:https://github.com/modelscope/swift

相关文章
|
NoSQL 关系型数据库 数据库
Swift 服务器框架对比
Swift 服务器框架对比
267 0
|
1月前
|
JSON 数据处理 Swift
Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用
本文深入探讨了 Swift 中的网络编程,主要介绍了 URLSession 和 Alamofire 两大框架的特点、用法及实际应用。URLSession 由苹果提供,支持底层网络控制;Alamofire 则是在 URLSession 基础上增加了更简洁的接口和功能扩展。文章通过具体案例对比了两者的使用方法,帮助开发者根据需求选择合适的网络编程工具。
35 3
|
4月前
|
人工智能 自然语言处理 Swift
"轻量级微调推理框架SWIFT:大模型时代的速度革命,让你秒变AI部署高手!"
【8月更文挑战第17天】随着AI技术的发展,大模型如GPT-3和BERT引领风潮,但其部署与推理速度面临挑战。为此,魔搭社区推出了SWIFT(Simple Weight-Integrated Fine-Tuning)框架,它采用轻量级微调技术,实现模型参数压缩与加速,确保大模型能在移动端和边缘设备上高效运行。SWIFT具备四大特点:创新微调方法减少训练参数;内置优化策略提高推理速度;跨平台支持便于部署;兼容主流预训练模型。通过示例可见,从加载预训练模型到模型的微调、评估及导出,SWIFT简化了工作流程,降低了大模型的应用门槛,促进了AI技术的实际应用。
539 3
|
5月前
|
物联网 PyTorch 算法框架/工具
介绍一个大语言模型的微调框架Swift | AIGC
介绍一个大语言模型的微调框架Swift 【7月更文挑战第4天】
561 3
|
7月前
|
人工智能 物联网 API
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
LLM 大模型学习必知必会系列(十三):基于SWIFT的VLLM推理加速与部署实战
|
7月前
|
API 图形学 Swift
【Swift开发专栏】Swift与Core Graphics框架
【4月更文挑战第30天】本文介绍了Swift如何与Apple的Core Graphics框架结合,用于高性能的图形渲染和用户界面设计。Core Graphics提供底层绘图接口,包括图形上下文、路径、颜色空间、渐变和阴影等概念。在Swift中,开发者可直接调用Core Graphics函数,创建图形上下文、设置绘图属性、绘制图形和处理图像。文章还展示了如何实现渐变填充、阴影效果及自定义绘图代码,帮助开发者利用Swift创造复杂的图形和动画。通过掌握这些技能,开发者能为移动应用打造更具吸引力的视觉体验。
140 1
|
7月前
|
持续交付 开发工具 Swift
【Swift开发专栏】Swift与第三方库和框架的集成
【4月更文挑战第30天】本文探讨了Swift中集成第三方库和框架的策略,包括选择有功能需求、社区支持、丰富文档和合适许可证的库。集成步骤涉及使用CocoaPods等工具安装,`import`导入库,遵循错误处理和性能优化。建议遵循代码组织、单一职责原则,做好错误处理和日志记录,使用版本控制和CI/CD,以提升项目稳定性和用户体验。
176 0
|
7月前
|
编译器 API Swift
【Swift开发专栏】Swift中的SwiftUI框架初探
【4月更文挑战第30天】SwiftUI是苹果2019年推出的界面构建框架,简化iOS应用开发。通过声明式语法和编译器优化,提供直观高效的UI设计。本文将介绍SwiftUI概述、主要特性及实际案例。SwiftUI强调“少即是多”,用少量代码实现复杂界面,提供简洁API、自动布局、双向数据绑定等功能。通过视图组合和实时预览加速开发。案例展示如何用SwiftUI构建用户列表界面,体现其结构清晰、易扩展的优势。SwiftUI在iOS开发中的重要性日益提升。
102 0
|
JSON HandyJSON 开发工具
swift网络请求 数据解析 图片显示 模型转换
Alamofire :swift版本的网络请求sdk,是AFNetworking研发团队研发的swift版网络请求工具类 SwiftyJSON:当然就是用来解析json数据的咯 Kingfisher: 是用来显示网络图片的与oc中的SDWebImage类似 HandyJSON: 可将json转模型
264 0
swift网络请求 数据解析 图片显示 模型转换
|
5月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
187 3

热门文章

最新文章