随着模型规模的不断扩大,模型会"涌现"出各种能力。特别是对大语言模型(LLM)来说,随着规模的扩大其在zero-shot、常识推理等能力上会有大幅度的提高。大模型的微调成本和部署成本都非常高。例如,GPT-3 175B模型微调需要1.2TB的显存。因此,如何降低大模型微调和部署成本,将是大模型商用的重要一环。
一、LoRA简析
LoRA是一种以极低资源微调大模型的方法,其来自于论文LoRA: Low-Rank Adaptation of Large Language Models。通常,神经网络中会包含许多进行矩阵乘法的稠密层,这些层通常是满秩的。Adgajanyan 等人的研究表示预训练语言模型具有低的"内在维度"。理论上,LoRA可以应用于任何神经网络的权重矩阵,从而减少可训练参数的数量。
Transformer架构中的自注意力模块有4个权重矩阵,以及两个MLP模型的权重矩阵。为了简单和参数高效,本研究仅限于适配下游任务的注意力权重,并冻结MLP模块。这样做的优点是,显存和存储空间的减少。对于使用Adam训练的大型Transformer,若对于GPT-3 175B,训练中的显存消耗从1.2TB减少自350GB。当r=4并且仅调整query矩阵和value矩阵时,checkpoint大小减少10000倍(从350GB减少自35MB)。另外,可以在部署时以更低的成本切换任务,仅需要交换LoRA权重即可。此外,与完全微调相比,GPT-3 175B训练速度提高了25%,因为不需要计算绝大多数参数的梯度。
二、BLOOM-LoRA实践
我们基于开源的bloomz-7b1-mt模型,采用transformers提供模型加载和训练,使用peft提供LoRA实现,使用DeepSpeed提供训练加速,最终实现大模型的微调。
以下是实践中主要的依赖包:
transformers==4.26.1 torch==1.13.1 deepspeed==0.8.2 peft==0.2. |
1、训练代码
首先我们导入依赖包
import os |
接下来设置参数
# LoRA参数 LORA_R = 8 LORA_ALPHA = 32 LORA_DROPOUT = 0.1 # 训练参数 EPOCHS=3 LEARNING_RATE=5e-5 OUTPUT_DIR="./checkpoints" BATCH_SIZE=4 # 2 GRADIENT_ACCUMULATION_STEPS=3 # 其他参数 MODEL_PATH = "bigscience/bloomz-7b1-mt" DATA_PATH = "./data/belle_open_source_1M.train.json" MAX_LENGTH = 512 PATTERN = "{}\n{}" DS_CONFIG = "ds_zero2_config.json" tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH) # 加载tokenizer |
之后将数据进行加载,tokenizer
dataset = datasets.load_dataset("json", data_files=DATA_PATH) collate_fn = DataCollatorForSeq2Seq(tokenizer, pad_to_multiple_of=8, return_tensors="pt", padding=True) |
接下来我们加载模型
device_map = {"": int(os.environ.get("LOCAL_RANK") or 0)} # device_map指定模型加载的GPU;troch_dtype=torch.float16表示半精度加载模型 model = AutoModelForCausalLM.from_pretrained(MODEL_PATH, torch_dtype=torch.float16, device_map=device_map) |
紧接着我们使用LoRA模型处理模型,并设置训练参数
# 转换模型 args = TrainingArguments( trainer = Trainer( |
启用DeepSpeed,进行配置
{ "train_micro_batch_size_per_gpu": "auto", "gradient_accumulation_steps": "auto", "steps_per_print": 50, "gradient_clipping": 1.0, "zero_optimization": { "stage": 2, "offload_optimizer": { "device": "cpu" }, "contiguous_gradients": true, "overlap_comm": true }, "zero_allow_untested_optimizer": true, "fp16": { "enabled": true, "loss_scale": 0, "loss_scale_window": 1000, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "Adam", "params": { "lr": "auto", "betas": "auto", "eps": "auto", "weight_decay": "auto" } }, "activation_checkpointing": { "partition_activations": true, "contiguous_memory_optimization": true }, "wall_clock_breakdown": false } |
启动训练
deepspeed --include=localhost:0,1,2,3 train.py
以上就完成了LoRA技术的大模型微调实现,对于需要控制算力成本的中小企业和个人开发者非常友好,大家也尝试起来吧!