Files
wehub-resource-sync a203934033
Lint test / lint (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:34:58 +08:00

134 lines
7.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 使用Tuners
tuner是指附加在模型上的额外结构部分,用于减少训练参数量或者提高训练精度。目前SWIFT支持的tuners有:
- LoRA: [LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS](https://arxiv.org/abs/2106.09685)
- LoRA+: [LoRA+: Efficient Low Rank Adaptation of Large Models](https://arxiv.org/pdf/2402.12354.pdf)
- LLaMA PRO: [LLAMA PRO: Progressive LLaMA with Block Expansion](https://arxiv.org/pdf/2401.02415.pdf)
- GaLore/Q-GaLore: [GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection](https://arxiv.org/abs/2403.03507)
- Liger Kernel: [Liger Kernel: Efficient Triton Kernels for LLM Training](https://arxiv.org/abs/2410.10989)
- LISA: [LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning](https://arxiv.org/abs/2403.17919)
- UnSloth: https://github.com/unslothai/unsloth
- SCEdit: [SCEdit: Efficient and Controllable Image Diffusion Generation via Skip Connection Editing](https://arxiv.org/abs/2312.11392) < [arXiv](https://arxiv.org/abs/2312.11392) | [Project Page](https://scedit.github.io/) >
- NEFTune: [Noisy Embeddings Improve Instruction Finetuning](https://arxiv.org/abs/2310.05914)
- LongLoRA: [Efficient Fine-tuning of Long-Context Large Language Models](https://arxiv.org/abs/2309.12307)
- Adapter: [Parameter-Efficient Transfer Learning for NLP](http://arxiv.org/abs/1902.00751)
- Vision Prompt Tuning: [Visual Prompt Tuning](https://arxiv.org/abs/2203.12119)
- Side: [Side-Tuning: A Baseline for Network Adaptation via Additive Side Networks](https://arxiv.org/abs/1912.13503)
- Res-Tuning: [Res-Tuning: A Flexible and Efficient Tuning Paradigm via Unbinding Tuner from Backbone](https://arxiv.org/abs/2310.19859) < [arXiv](https://arxiv.org/abs/2310.19859) | [Project Page](https://res-tuning.github.io/) >
- [PEFT](https://github.com/huggingface/peft)提供的tuners, 如AdaLoRA、DoRA、Fourierft等
## 接口列表
### Swift类静态接口
- `Swift.prepare_model(model, config, **kwargs)`
- 接口作用:加载某个tuner到模型上,如果是PeftConfig的子类,则使用Peft库的对应接口加载tuner。在使用SwiftConfig的情况下,本接口可以传入SwiftModel实例并重复调用,此时和config传入字典的效果相同。
- 本接口支持并行加载不同类型的多个tuners共同使用
- 参数:
- `model`: `torch.nn.Module``SwiftModel`的实例,被加载的模型
- `config`: `SwiftConfig``PeftConfig`的实例,或者一个自定义tuner名称对config的字典
- 返回值:`SwiftModel``PeftModel`的实例
- `Swift.merge_and_unload(model)`
- 接口作用:将LoRA weights合并回原模型,并将LoRA部分完全卸载
- 参数:
- model: `SwiftModel``PeftModel`的实例,已加载LoRA的模型实例
- 返回值:None
- `Swift.merge(model)`
- 接口作用:将LoRA weights合并回原模型,不卸载LoRA部分
- 参数:
- model: `SwiftModel``PeftModel`的实例,已加载LoRA的模型实例
- 返回值:None
- `Swift.unmerge(model)`
- 接口作用:将LoRA weights从原模型weights中拆分回LoRA结构
- 参数:
- model: `SwiftModel``PeftModel`的实例,已加载LoRA的模型实例
- 返回值:None
- `Swift.save_to_peft_format(ckpt_dir, output_dir)`
- 接口作用:将存储的LoRA checkpoint转换为Peft兼容的格式。主要改变有:
- `default`会从对应的`default`文件夹中拆分到output_dir根目录中
- weights中的`{tuner_name}.`字段会被移除,如`model.layer.0.self.in_proj.lora_A.default.weight`会变为`model.layer.0.self.in_proj.lora_A.weight`
- weights中的key会增加`basemodel.model`前缀
- 注意:只有LoRA可以被转换,其他类型tuner由于Peft本身不支持,因此会报转换错误。此外,由于LoRAConfig中存在额外参数,如`dtype`,因此在这些参数有设定的情况下,不支持转换为Peft格式,此时可以手动删除adapter_config.json中的对应字段
- 参数:
- ckpt_dir:原weights目录
- output_dir:目标weights目录
- 返回值:None
- `Swift.from_pretrained(model, model_id, adapter_name, revision, **kwargs)`
- 接口作用:从存储的weights目录中加载起tuner到模型上,如果adapter_name不传,则会将model_id目录下所有的tuners都加载起来。同`prepare_model`相同,本接口可以重复调用
- 参数:
- model`torch.nn.Module``SwiftModel`的实例,被加载的模型
- model_id`str`类型,待加载的tuner checkpoint 可以是魔搭hub的id,或者训练产出的本地目录
- adapter_name`str``List[str]``Dict[str, str]`类型或`None`,待加载tuner目录中的tuner名称,如果为`None`则加载所有名称的tuners,如果是`str``List[str]`则只加载某些具体的tuner,如果是`Dict`,则将`key`指代的tuner加载起来后换成`value`的名字
- revision: 如果model_id是魔搭的id,则revision可以指定对应版本号
### SwiftModel接口
下面列出用户可能调用的接口列表,其他内部接口或不推荐使用的接口可以通过`make docs`命令查看API Doc文档。
- `SwiftModel.create_optimizer_param_groups(self, **defaults)`
- 接口作用:根据加载的tuners创建parameter groups,目前仅对`LoRA+`算法有作用
- 参数:
- defaults`optimizer_groups`的默认参数,如`lr``weight_decay`
- 返回值:
- 创建的`optimizer_groups`
- `SwiftModel.add_weighted_adapter(self, ...)`
- 接口作用:将已有的LoRA tuners合并为一个
- 参数:
- 本接口是PeftModel.add_weighted_adapter的透传,参数可以参考:[add_weighted_adapter文档](https://huggingface.co/docs/peft/main/en/package_reference/lora#peft.LoraModel.add_weighted_adapter)
- `SwiftModel.save_pretrained(self, save_directory, safe_serialization, adapter_name)`
- 接口作用:存储tuner weights
- 参数:
- save_directory:存储目录
- safe_serialization 是否使用safe_tensors,默认为False
- adapter_name:存储的adapter tuner,如果不传则默认存储所有的tuners
- `SwiftModel.set_active_adapters(self, adapter_names, offload=None)`
- 接口作用:设置当前激活的adapters,不在列表中的adapters会被失活
-`推理`时支持环境变量`USE_UNIQUE_THREAD=0/1`,默认值`1`,如果为`0`则set_active_adapters只对当前线程生效,此时默认使用本线程激活的tuners,不同线程tuners互不干扰
- 参数:
- adapter_names:激活的tuners
- offload:失活的adapters如何处理,默认为`None`代表留在显存中,同时支持`cpu``meta`,代表offload到cpu和meta设备中以减轻显存消耗,在`USE_UNIQUE_THREAD=0`时offload不要传值以免影响其他线程
- 返回值:None
- `SwiftModel.activate_adapter(self, adapter_name)`
- 接口作用:激活一个tuner
-`推理`时支持环境变量`USE_UNIQUE_THREAD=0/1`,默认值`1`,如果为`0`则activate_adapter只对当前线程生效,此时默认使用本线程激活的tuners,不同线程tuners互不干扰
- 参数:
- adapter_name:待激活的tuner名字
- 返回值:None
- `SwiftModel.deactivate_adapter(self, adapter_name, offload)`
- 接口作用:失活一个tuner
-`推理`时环境变量`USE_UNIQUE_THREAD=0`时不要调用本接口
- 参数:
- adapter_name:待失活的tuner名字
- offload:失活的adapters如何处理,默认为`None`代表留在显存中,同时支持`cpu``meta`,代表offload到cpu和meta设备中以减轻显存消耗
- 返回值:None
- `SwiftModel.get_trainable_parameters(self)`
- 接口作用:返回训练参数信息
- 参数:无
- 返回值:训练参数信息,格式如下:
```text
trainable params: 100M || all params: 1000M || trainable%: 10.00% || cuda memory: 10GiB.
```