transformers
01 - Overview & Environments
Step 1: Create a environment
conda create -n transformers python==3.9.16 -y
Step 2: Activate environment
conda activate transformers
Step 3: Install libraries
pip install transformers datasets peft
Modelscope
pip install modelscope
from modelscope.hub.snapshot_download import snapshot_download
snapshot_download(model_id='modelscope/Llama-2-7b-ms',cache_dir='your/path')
Resource 1: In-depth guide to fine-tuning LLMs with LoRA and QLoRA | Mercity
Resource 2: 手把手带你实战HuggingFace Transformers | Bilibili
model size = 1.3B
model: 1.3G * 4 5.2G
gradient: 1.3G * 4 5.2G
optimizer: 1.3G * 4 * 2 10.4G
sum 20.8G
1 Prompt-Tuning

PEFT Step 1: Configration
from peft import PromptTuningConfig, get_peft_model, TaskType, PromptTuningInit
# Soft Prompt
# config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM, num_virtual_tokens=10)
# config
# Hard Prompt
config = PromptTuningConfig(task_type=TaskType.CAUSAL_LM,
prompt_tuning_init=PromptTuningInit.TEXT,
prompt_tuning_init_text="下面是一段人与机器人的对话。",
num_virtual_tokens=len(tokenizer("下面是一段人与机器人的对话。")["input_ids"]),
tokenizer_name_or_path="Langboat/bloom-1b4-zh")
config
PEFT Step 2: Model
model = get_peft_model(model, config)
model # check the architecture, to choose the layer
config # check the architecture, to set the arguments
# check the names of parameters
for name, param in model.named_parametes():
print(name)
model.print_trainable_parameters()
2 P-Tuning

PEFT Step 1: Configration
from peft import PromptEncoderConfig, TaskType, get_peft_model, PromptEncoderReparameterizationType
config = PromptEncoderConfig(
task_type=TaskType.CAUSAL_LM, # task type
num_virtual_tokens=10, # the length of prompt
encoder_reparameterization_type=PromptEncoderReparameterizationType.MLP # MLP/LSTM
)
config
3 Prefix-Tuning
- 原理
相较于Prompt-Tuning和P-Tuning, Prefix-Tuning不再将Prompt加在输入的Embedding层,而是将其作为可学习的前缀,放置在Transformer模型的每一层中,具体表现形式为past_key_values

-
如何理解past_ key_ _values
past_key_values: Transformer模型中历史计算过的key和value的结果,最早是用于生成类模型解码加速,解码逻辑是根据历史输入,每次预测一个新的token,然后将新的token加入输入,再预测下一个token。这个过程中,会存在大量的重复计算,因此可以将key和value的计算结果缓存,作为past_key_values输入到下一次的计算中,这一技术又被称之为kv_cache。Prefix-Tuning中,就是通过past_key_values的形式将可学习的部分放到了模型中的每- -层, 这部分内容又被称之为前缀

PEFT Step 1: Configration
from peft import PrefixTuningConfig, get_peft_model, TaskType
config = PrefixTuningConfig(
task_type=TaskType.CAUSAL_LM, # task type
num_virtual_tokens=10, # the length of prompt
prefix_projection=True # the MLP layer
)
config
4 LoRA
原理
forward:
backward: freeze , update
- , ,
- 预训练模型中存在一个极小的内在维度,这个内在维度是发挥核心作用的地方
- 在继续训练的过程中,权重的更新依然也有如此特点,即也存在一个内在维度(内在秩)。
- 权重更新: W = W + W
- 因此,可以通过矩阵分解的方式,将原本要更新的大的矩阵变为两个小的矩阵。
- 权重更新: W = W + W = W + BA
- 具体做法,即在矩阵计算中增加一个旁系分支,旁系分支由两个低秩矩阵A和B组成。
- 训练时,输入分别与原始权重和两个低秩矩阵进行计算,共同得到最终结果,反向传播优化则仅优化A和B。
- 训练完成后,可以将两个低秩矩阵与原始模型中的权重进行合并,合并后的模型与原始模型无异,避免了推理期间Prompt系列方法带来的额外计算量

PEFT Step 1: Configration
from peft import LoraConfig, TaskType, get_peft_model
config = LoraConfig(
task_type=TaskType.CAUSAL_LM, # task type
target_module=['query_key_value','dense_4h_to_h']
)
config
5 - IA3
IA3, Infused Adapter by Inhibiting and Amplifying Inner Activations
原理
- 抑制和放大内部激活,通过可学习的向量对激活值进行抑制或放大。具体来说,会对K、V、FFN三部分的值进行调整,训练过程中同样冻结原始模型的权重,只更新可学习的部分向量部分。训练完成后,与Lora类似,也可以将学习部分的参数与原始权重合并,没有额外推理开销。

PEFT Step 1: Configration
from peft import IA3Config, TaskType, get_peft_model
config = IA3Config(
task_type=TaskType.CAUSAL_LM, # task type
target_module=['query_key_value','dense_4h_to_h']
)
config
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~