SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是一个可扩展的轻量级一站式训练、推理深度学习框架。它集成了各种高效的微调方法,如LoRA、QLoRA、阿里云自研的ResTuning-Bypass等,以及开箱即用的训练推理脚本,使开发者可以在单张商业级显卡上微调推理LLM&AIGC模型。此外,SWIFT与PEFT完全兼容,使开发者可以在ModelScope模型体系中使用PEFT的能力。
目前支持的方法:
- LoRA:LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
- QA-LoRA:Quantization-Aware Low-Rank Adaptation of Large Language Models.
- LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models
- Adapter:Parameter-Efficient Transfer Learning for NLP
- Prompt: Visual Prompt Tuning
- Side: Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks
- Res-Tuning: Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone < arXiv | Project Page | Usage >
- ROME: Rank-One Editing of Encoder-Decoder Models
- NEFTune: Noisy Embeddings Improve Instruction Finetuning
- 所有在PEFT上提供的tuners
主要能力:
- 可以通过model-id使SWIFT或PEFT的方法使用ModelScope Hub中的模型
- 在单次训练或推理中可以使用多个tuners
- 支持调用
activate_adapter
或deactivate_adapter
或set_active_adapters
来使部分tuner激活或失活,用户可以在推理时同时加载多个独立的tuners在不同线程中并行使用。 - 支持通过脚本方式和命令行方式开启训练和推理,同时支持Web-UI方式进行推理。
- 支持模型训练后的部署链路(vllm/chatglm.cpp/xinference),详情可以查看官方文档。
用户可以查看 SWIFT官方文档 来了解详细信息。
- 2023.12.9: 支持
freeze_parameters
参数, 作为lora和全参数训练的折中方案. 对应的sh可以查看full_freeze_ddp. 支持disable_tqdm
,lazy_tokenize
,preprocess_num_proc
参数, 具体可以查看命令行参数. - 2023.12.8: 支持sus-34b-chat, 支持yi-6b-200k, yi-34b-200k.
- 2023.12.7: 支持Multi-Node DDP训练.
- 2023.12.5: 支持模型: zephyr-7b-beta-chat, openbuddy-zephyr-7b-chat. 支持数据集: hc3-zh, hc3-en.
- 🔥 2023.12.2: 自我认知微调最佳实践, 10分钟对大模型进行自我认知微调, 创建专属于自己的大模型.
- 🔥 2023.11.30: 支持qwen-1_8b, qwen-72b, qwen-audio系列模型的训练的推理. 对应的sh脚本可以查看qwen_1_8b_chat, qwen_72b_chat, qwen_audio_chat
- 🔥 2023.11.29: 支持AnimateDiff的训练和推理
- 🔥 2023.11.24: 支持yi-34b-chat, codefuse-codellama-34b-chat模型. 对应的sh脚本可以查看yi_34b_chat, codefuse_codellama_34b_chat.
- 🔥 2023.11.18: 支持tongyi-finance-14b系列模型: tongyi-finance-14b, tongyi-finance-14b-chat, tongyi-finance-14b-chat-int4. 对应的sh脚本可以查看tongyi_finance_14b_chat_int4.
- 2023.11.16: 支持更多模型的flash attn支持: qwen系列, qwen-vl系列, llama系列, openbuddy系列, mistral系列, yi系列, ziya系列. 请使用
use_flash_attn
参数. - 🔥 2023.11.11: 支持NEFTune, 使用
Swift.prepare_model(model, NEFTuneConfig())
即可开启. - 🔥 2023.11.11: 支持命令行训练推理和Web-UI推理, 详情可以查看下方的
使用Swift CLI运行
章节. - 🔥 2023.11.11: 支持模型训练后的部署链路(vllm/chatglm.cpp/xinference),详情可以查看官方文档.
- 🔥 2023.11.10: 支持bluelm系列模型: bluelm-7b, bluelm-7b-chat, bluelm-7b-32k, bluelm-7b-chat-32k. 对应的sh脚本可以查看bluelm_7b_chat.
- 🔥 2023.11.08: 支持xverse-65b模型的训练和推理流程,脚本在xverse_65b.
- 🔥 2023.11.07: 支持yi-6b, yi-34b模型的训练和推理流程,脚本在yi_6b, yi_34b.
更多
- 🔥 2023.10.30: 支持 QA-LoRA 和 LongLoRA两种新的tuners.
- 🔥 2023.10.30: 支持使用ROME(Rank One Model Editing)来编辑模型,在无需训练的情况下即可给模型灌注新知识!
- 2023.10.30: 支持skywork-13b系列模型: skywork-13b, skywork-13b-chat. 对应的sh脚本可以查看skywork_13b.
- 🔥 2023.10.27: 支持chatglm3系列模型: chatglm3-6b-base, chatglm3-6b, chatglm3-6b-32k. 对应的sh脚本可以查看chatglm3_6b.
- 🔥 2023.10.17: 支持int4, int8模型的SFT: qwen-7b-chat-int4, qwen-14b-chat-int4, qwen-vl-chat-int4, baichuan2-7b-chat-int4, baichuan2-13b-chat-int4, qwen-7b-chat-int8, qwen-14b-chat-int8.
- 2023.10.15: 支持ziya2-13b系列模型: ziya2-13b, ziya2-13b-chat.
- 2023.10.12: 支持mistral-7b系列模型: openbuddy-mistral-7b-chat, mistral-7b, mistral-7b-chat.
- 🔥 2023.10.7: 支持DeepSpeed ZeRO-2, 使得lora(不仅仅是qlora)可以在双卡A10上运行DDP.
- 2023.10.4: 支持更多数学, 法律, SQL, 代码领域的数据集: blossom-math-zh, school-math-zh, text2sql-en, sql-create-context-en, lawyer-llama-zh, tigerbot-law-zh, leetcode-python-en.
- 🔥 2023.9.25: Supported qwen-14b model series: qwen-14b, qwen-14b-chat.
- 2023.9.18: Supported internlm-20b model series: internlm-20b, internlm-20b-chat.
- 2023.9.12: Supported training with MP+DDP to accelerate full-parameter fine-tuning speed.
- 2023.9.5: Supported openbuddy-llama2-70b-chat model.
- 2023.9.3: Supported baichuan2 model series: baichuan2-7b, baichuan2-7b-chat, baichuan2-13b, baichuan2-13b-chat.
- 【必读】10分钟对大模型进行自我认知微调, 创建专属于自己的大模型, 可以查看自我认知微调最佳实践.
- 快速对LLM进行推理, 搭建Web-UI, 可以查看LLM推理文档.
- 快速对LLM进行微调, 推理并搭建Web-UI. 可以查看LLM微调文档.
- 查看swift支持的模型和数据集. 可以查看支持的模型和数据集.
- 对swift中的模型, 数据集, 对话模板进行拓展, 可以查看自定义与拓展.
- 查询微调和推理的命令行参数, 可以查看命令行参数.
- 查看不同参数下的训练时间和训练显存对比, 可以查看Benchmark.
- 支持的SFT方法: lora, qlora, 全参数微调
- 支持的特性: 模型量化, DDP, 模型并行, gradient checkpointing, 支持推送ModelScope Hub, 自定义数据集, 多模态和Agent SFT, 多轮对话, ...
- 支持的模型
- 多模态:
- qwen-vl 系列: qwen-vl, qwen-vl-chat, qwen-vl-chat-int4
- qwen-audio 系列: qwen-audio, qwen-audio-chat
- 通用:
- qwen 系列: qwen-1_8b-chat, qwen-1_8b-chat-int4, qwen-1_8b-chat-int8, qwen-7b, qwen-7b-chat, qwen-7b-chat-int4, qwen-7b-chat-int8, qwen-14b, qwen-14b-chat, qwen-14b-chat-int4, qwen-14b-chat-int8, qwen-72b, qwen-72b-chat, qwen-72b-chat-int4, qwen-72b-chat-int8
- chatglm 系列: chatglm2-6b, chatglm2-6b-32k, chatglm3-6b-base, chatglm3-6b, chatglm3-6b-32k
- baichuan 系列: baichuan-7b, baichuan-13b, baichuan-13b-chat, baichuan2-7b, baichuan2-7b-chat, baichuan2-13b, baichuan2-13b-chat, baichuan2-7b-chat-int4, baichuan2-13b-chat-int4
- llama 系列: llama2-7b, llama2-7b-chat, llama2-13b, llama2-13b-chat, llama2-70b, llama2-70b-chat
- yi 系列: yi-6b, yi-6b-200k, yi-6b-chat, yi-34b, yi-34b-200k, yi-34b-chat
- openbuddy 系列: openbuddy-llama2-13b-chat, openbuddy-llama-65b-chat, openbuddy-llama2-70b-chat, openbuddy-mistral-7b-chat, openbuddy-zephyr-7b-chat
- internlm 系列: internlm-7b, internlm-7b-chat, internlm-7b-chat-8k, internlm-20b, internlm-20b-chat
- xverse 系列: xverse-7b, xverse-7b-chat, xverse-13b, xverse-13b-chat, xverse-65b
- bluelm 系列: bluelm-7b, bluelm-7b-chat, bluelm-7b-32k, bluelm-7b-chat-32k
- mistral 系列: mistral-7b, mistral-7b-chat
- zephyr 系列: zephyr-7b-beta-chat
- ziya 系列: ziya2-13b, ziya2-13b-chat
- skywork 系列: skywork-13b, skywork-13b-chat
- sus 系列: sus-34b-chat
- other: polylm-13b, seqgpt-560m
- 金融:
- tongyi-finance 系列: tongyi-finance-14b, tongyi-finance-14b-chat, tongyi-finance-14b-chat-int4
- 代码:
- codefuse series: codefuse-codellama-34b-chat
- 多模态:
- 支持的数据集:
- NLP:
- 通用: 🔥alpaca-en(gpt4), 🔥alpaca-zh(gpt4), multi-alpaca-all, instinwild-en, instinwild-zh, cot-en, cot-zh, firefly-all-zh, instruct-en, gpt4all-en, sharegpt-en, sharegpt-zh, tutu-v2-sft-mixture, wikipedia-zh, open-orca, open-orca-gpt4, sharegpt-gpt4
- Agent: damo-agent-zh, 🔥damo-agent-mini-zh, 🔥agent-instruct-all-en
- 代码: code-alpaca-en, 🔥leetcode-python-en, 🔥codefuse-python-en, 🔥codefuse-evol-instruction-zh
- 医疗: medical-en, medical-zh, medical-mini-zh
- 法律: 🔥lawyer-llama-zh, tigerbot-law-zh
- 数学: 🔥blossom-math-zh, school-math-zh, open-platypus-en
- SQL: text2sql-en, 🔥sql-create-context-en
- 文本生成: 🔥advertise-gen-zh, 🔥dureader-robust-zh
- 分类: cmnli-zh, 🔥cmnli-mini-zh, 🔥jd-sentiment-zh, 🔥hc3-zh, 🔥hc3-en
- 其他: finance-en, poetry-zh, webnovel-zh, generated-chat-zh, cls-fudan-news-zh, ner-jave-zh
- 多模态:
- 视觉: coco-en, 🔥coco-mini-en
- 音频: aishell1-zh, 🔥aishell1-mini-zh
- 自定义数据集
- NLP:
- 支持的对话模板:
- 文本生成: default-generation, default-generation-bos, chatglm-generation
- 对话: default, chatml(qwen), baichuan, chatglm2, chatglm3, llama, openbuddy, internlm, xverse, ziya, skywork, bluelm, yi, zephyr
SWIFT在Python环境中运行。请确保您的Python版本高于3.8。
- 方法1:使用pip命令安装SWIFT:
# 全量能力
pip install ms-swift[all] -U
# 仅使用LLM
pip install ms-swift[llm] -U
# 仅使用AIGC
pip install ms-swift[aigc] -U
# 仅使用adapters
pip install ms-swift -U
- 方法2:通过源代码安装SWIFT(方便运行训练推理脚本),请运行以下命令:
git clone https://github.com/modelscope/swift.git
cd swift
pip install -e .[llm]
SWIFT依赖torch>=1.13。
- 方法3:在我们的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支持多个tuners,包括由PEFT提供的tuners。要使用这些tuners,只需调用:
from swift import Swift, LoRAConfig
config = LoRAConfig(...)
model = Swift.prepare_model(model, config, extra_state_keys=['...'])
上面的代码片段随机初始化了tuner。输入model是torch.nn.Module的一个实例,config是SwiftConfig或PeftConfig的子类实例。extra_state_keys是要训练并存储在输出目录中的额外模块权重(如linear head)。
您可以通过以下方式组合多个tuners:
from swift import Swift, LoRAConfig, PromptConfig
model = Swift.prepare_model(model, {'lora': LoRAConfig(...), 'prompt': PromptConfig(...)})
在微调之后,您可以调用save_pretrained和push_to_hub方法:
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`安装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)
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')
这是一个使用transformers库实例化模型,并使用SWIFT进行高效微调的示例。
from swift import Swift, LoRAConfig, AdapterConfig, PromptConfig
from transformers import AutoModelForImageClassification
# 初始vit模型
model = AutoModelForImageClassification.from_pretrained("google/vit-base-patch16-224")
# 初始化LoRA tuner配置
lora_config = LoRAConfig(
r=10, # LoRA模块的rank
target_modules=['query', 'key', 'value'], # 将要被替换的模块的模块名后缀
merge_weights=False # 是否合并权重
)
# 初始化adapter tuner配置
adapter_config = AdapterConfig(
dim=768, # hidden states的维度
hidden_pos=0, # 要传递到adapter的hidden state的位置
target_modules=r'.*attention.output.dense$', # 要使用正则表达式替换的模块
adapter_length=10 # adapter长度
)
# 初始化prompt tuner配置
prompt_config = PromptConfig(
dim=768, # hidden states的维度
target_modules=r'.*layer\.\d+$', # 要使用正则表达式替换的模块
embedding_pos=0, # embedding张量的位置
prompt_length=10, # 提示符token的长度
attach_front=False # 是否将提示符附加在embedding前面
)
# 使用swift创建模型。在实践中,您可以使用其中任何一个调谐器或它们的组合。
model = Swift.prepare_model(model, {"lora_tuner": lora_config, "adapter_tuner": adapter_config, "prompt_tuner": prompt_config})
# 获取模型的可训练参数。
model.get_trainable_parameters()
# 'trainable params: 838,776 || all params: 87,406,432 || trainable%: 0.9596273189597764'
可以在SWIFT中使用PEFT提供的功能:
from swift import LoraConfig, Swift
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和Peft tuners之间的保存策略略有不同。可以通过以下方式为Swift tuners命名:
model = Swift.prepare_model(model, {'default': LoRAConfig(...)})
model.save_pretrained('./output')
在output目录中将会得到以下类似的目录结构:
output
|-- default
|-- adapter_config.json
|-- adapter_model.bin
|-- adapter_config.json
|-- adapter_model.bin
存储在output目录中的config/weights是extra_state_keys的配置和权重。这与Peft不同,Peft存储了default
tuner的config/weights。
-
ModelScope库是ModelScope项目的模型库,包含了各模态热门的深度学习模型。
本项目使用Apache License (Version 2.0)进行许可。
您可以通过加我们的微信群, 来和我们联系和交流: