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 \(\approx\) 5.2G
gradient: 1.3G * 4 \(\approx\) 5.2G
optimizer: 1.3G * 4 * 2 \(\approx\) 10.4G
sum \(\approx\) 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: \(W_0 + \triangle W = W + BA\)
backward: freeze \(W_0\), update \(\triangle W = BA\)

  • \(W_0 \in \mathbb{R}^{d \times k}\), \(A \in \mathbb{R}^{r \times k}\), \(B \in \mathbb{R}^{d \times r}\)
  • \(h = XW^T = XW_0^T + X\triangle W^T = XW_0^T + X(BA)^T\)
  • 预训练模型中存在一个极小的内在维度,这个内在维度是发挥核心作用的地方
  • 在继续训练的过程中,权重的更新依然也有如此特点,即也存在一个内在维度(内在秩)。
  • 权重更新: W = W + \(\triangle\)W
  • 因此,可以通过矩阵分解的方式,将原本要更新的大的矩阵变为两个小的矩阵。
  • 权重更新: W = W + \(\triangle\)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

Reference

Prompt Tuning 相比于 Fine Tuning 在哪些场景下表现更好? - zhihu

posted @ 2024-03-15 04:36  ForHHeart  阅读(4)  评论(0编辑  收藏  举报