SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是一个可扩展的轻量级一站式训练、推理深度学习框架。它集成了各种高效的微调方法,如LoRA、QLoRA、阿里云自研的ResTuning-Bypass等,以及开箱即用的训练推理脚本,使开发者可以在单张商业级显卡上微调推理LLM&AIGC模型。此外,SWIFT与PEFT完全兼容,使开发者可以在ModelScope模型体系中使用PEFT的能力。
目前支持的方法:
主要能力:
activate_adapter
或deactivate_adapter
或set_active_adapters
来使部分tuner激活或失活,用户可以在推理时同时加载多个独立的tuners在不同线程中并行使用。用户可以查看 SWIFT官方文档 来了解详细信息。
swift export
, 对模型进行AWQ/GPTQ量化导出, 以及推送ModelScope Hub. 具体可以查看文档: LLM量化文档.--train_dataset_mix_ratio 2.0
开启训练!同时我们也开源了通用知识数据集 ms-bench.--merge_lora
参数.--deepspeed default-zero3
即可.swift web-ui
开启freeze_parameters
参数, 作为lora和全参数训练的折中方案. 对应的sh可以查看full_freeze_ddp. 支持disable_tqdm
, lazy_tokenize
, preprocess_num_proc
参数, 具体可以查看命令行参数.use_flash_attn
参数.Swift.prepare_model(model, NEFTuneConfig())
即可开启.使用Swift CLI运行
章节.安装SWIFT之后,用如下方式启动界面训练推理:
swift web-ui
支持的环境变量:
WEBUI_SHARE=1 控制gradio是否是share状态 SWIFT_UI_LANG=en/zh 控制web-ui界面语言 WEBUI_SERVER server_name参数, web-ui host ip,0.0.0.0代表所有ip均可访问,127.0.0.1代表只允许本机访问 WEBUI_PORT web-ui的端口号
下面是一个web-ui的简单视频介绍:
你可以通过运行以下代码来测试环境是否安装正确.
# pip install ms-swift[llm] -U
# Experimental environment: A10, 3090, V100, ...
# 8GB GPU memory
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import torch
from swift.llm import (
DatasetName, InferArguments, ModelType, SftArguments,
infer_main, sft_main, app_ui_main, merge_lora
)
model_type = ModelType.qwen1half_0_5b
sft_args = SftArguments(
model_type=model_type,
train_dataset_sample=2000,
dataset=[DatasetName.jd_sentiment_zh],
output_dir='output')
result = sft_main(sft_args)
best_model_checkpoint = result['best_model_checkpoint']
print(f'best_model_checkpoint: {best_model_checkpoint}')
torch.cuda.empty_cache()
infer_args = InferArguments(
ckpt_dir=best_model_checkpoint,
load_dataset_config=True,
val_dataset_sample=10)
merge_lora(infer_args, device_map='cpu')
result = infer_main(infer_args)
torch.cuda.empty_cache()
app_ui_main(infer_args)
你可以参考以下脚本来自定义属于你的训练脚本.
SCEdit由阿里巴巴通义实验室视觉智能团队(Alibaba TongYi Vision Intelligence Lab)所提出,是一个高效的生成式微调框架。该框架不仅支持文生图下游任务的微调能力,相比LoRA节省30%-50%的训练显存开销,实现快速迁移到特定的生成场景中;而且还可以直接扩展到可控图像生成任务中,仅需ControlNet条件生成7.9%的参数量并节省30%的显存开销,支持边缘图、深度图、分割图、姿态、颜色图、图像补全等条件生成任务。
我们使用了风格迁移数据集中的3D风格数据进行了训练,并使用相同的Prompt: A boy in a camouflage jacket with a scarf
进行测试,具体的定性和定量的结果如下:
Method | bs | ep | Target Module | Param. (M) | Mem. (MiB) | 3D style |
---|---|---|---|---|---|---|
LoRA/r=64 | 1 | 50 | q/k/v/out/mlp | 23.94 (2.20%) | 8440MiB | ![]() |
SCEdit | 1 | 50 | up_blocks | 19.68 (1.81%) | 7556MiB | ![]() |
LoRA/r=64 | 10 | 100 | q/k/v/out/mlp | 23.94 (2.20%) | 26300MiB | ![]() |
SCEdit | 10 | 100 | up_blocks | 19.68 (1.81%) | 18634MiB | ![]() |
LoRA/r=64 | 30 | 200 | q/k/v/out/mlp | 23.94 (2.20%) | 69554MiB | ![]() |
SCEdit | 30 | 200 | up_blocks | 19.68 (1.81%) | 43350MiB | ![]() |
使用SCEdit执行训练任务并复现上述结果:
# 先执行下面章节的安装步骤
cd examples/pytorch/multi_modal/notebook
python text_to_image_synthesis.py
SWIFT在Python环境中运行。请确保您的Python版本高于3.8。
# 全量能力
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
git clone https://github.com/modelscope/swift.git
cd swift
pip install -e .[llm]
SWIFT依赖torch>=1.13。
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)进行许可。
您可以通过加我们的微信群, 来和我们联系和交流:
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。