lora微调

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
import torch
import torch.nn as nn
import bitsandbytes as bnb
import transformers
from transformers import AutoTokenizer, AutoConfig, AutoModelForCausalLM
"""
opt-6.7b模型,它以float16的精度存储,大小大约为13GB!如果我们使用bitsandbytes库以8位加载它们,我们需要大约7GB的显存
"""
# load_in_8bit=True参数来调用bitsandbytes库进行8位量化
model = AutoModelForCausalLM.from_pretrained("facebook/opt-6.7b",load_in_8bit=True,device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-6.7b")

# 针对所有非int8的模块进行预处理以提升精度
from peft import prepare_model_for_int8_training
model = prepare_model_for_int8_training(model)

# 配置LoRA的参数
from peft import LoraConfig, get_peft_model
config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM")
model = get_peft_model(model, config)

def print_trainable_parameters(model):
    """Prints the number of trainable parameters in the model."""
    trainable_params = 0
    all_param = 0
    for _, param in model.named_parameters():
        all_param += param.numel()
        if param.requires_grad:
            trainable_params += param.numel()
            print(f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}")


# 加载数据(名人名言数据集作为训练数据)
from datasets import load_dataset
data = load_dataset("Abirate/english_quotes")
data = data.map(lambda samples: tokenizer(samples["quote"]), batched=True)

# 训练
trainer = transformers.Trainer(
    model=model,
    train_dataset=data["train"],
    args=transformers.TrainingArguments(per_device_train_batch_size=4,gradient_accumulation_steps=4,warmup_steps=100,max_steps=200,learning_rate=2e-4,fp16=True,logging_steps=1,output_dir="outputs",),
    data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False))
trainer.train()

# 推理
batch = tokenizer("Two things are infinite: ", return_tensors="pt")
with torch.cuda.amp.autocast():
    output_tokens = model.generate(**batch, max_new_tokens=50)
    print("\n\n", tokenizer.decode(output_tokens[0], skip_special_tokens=True))

参考链接:

1、​​​​​​​​​​​​​​2023年的深度学习入门指南(12) - PEFT与LoRA-优快云博客

2、https://github.com/huggingface/notebooks/blob/main/peft/Fine_tune_BLIP2_on_an_image_captioning_dataset_PEFT.ipynb​​​​​​​

### LoRA 微调 示例代码与使用指南 以下内容详细介绍了如何使用 LoRA 技术微调大语言模型,包括代码示例和关键注意事项。 #### 1. LoRA 理论基础 LoRA(Low-Rank Adaptation)通过引入低秩矩阵分解,在保持模型性能的同时显著降低训练成本和显存占用。这种方法特别适合于资源受限的场景,同时能够高效地适配特定任务[^1]。 #### 2. 环境准备 在开始之前,请确保安装了必要的依赖库: ```bash pip install torch transformers peft datasets ``` #### 3. LoRA 微调代码示例 以下是一个完整的 LoRA 微调代码示例,适用于 DeepSeek 或其他基于 Hugging Face 的预训练模型。 ##### 3.1 数据准备 数据文件通常以 JSON 格式存储,包含 `instruction`、`input` 和 `output` 字段。以下是数据文件的结构示例: ```json [ {"instruction": "解释人工智能的概念", "input": "", "output": "人工智能是模拟人类智能的技术..."}, {"instruction": "如何实现模型微调?", "input": "", "output": "通过提供标注数据并优化模型参数..."} ] ``` ##### 3.2 训练脚本 (`train.py`) 以下是使用 LoRA 微调模型的完整代码示例: ```python from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer from peft import LoraConfig, get_peft_model, TaskType import torch from datasets import load_dataset # 加载预训练模型和分词器 model_name = "deepseek/lite-base" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) # 配置 LoRA 参数 lora_config = LoraConfig( r=16, # 低秩矩阵的秩 lora_alpha=32, # 缩放因子 target_modules=["q_proj", "v_proj"], # 需要调整的模块 lora_dropout=0.05, # Dropout 概率 bias="none", task_type=TaskType.CAUSAL_LM # 任务类型 ) model = get_peft_model(model, lora_config) # 加载数据集 dataset = load_dataset("json", data_files="data/custom_data.json")["train"] def tokenize_function(example): prompt = f"Instruction: {example['instruction']}\nInput: {example['input']}\nOutput: {example['output']}" return tokenizer(prompt, truncation=True, max_length=512, padding="max_length") tokenized_dataset = dataset.map(tokenize_function, batched=True) # 定义训练参数 training_args = TrainingArguments( output_dir="./outputs", num_train_epochs=3, per_device_train_batch_size=4, gradient_accumulation_steps=2, learning_rate=1e-4, logging_dir="./logs", logging_steps=10, save_steps=100, save_total_limit=2, evaluation_strategy="steps", eval_steps=50, warmup_steps=50, weight_decay=0.01, fp16=True # 使用混合精度加速训练 ) # 使用 Trainer 进行训练 trainer = Trainer( model=model, args=training_args, train_dataset=tokenized_dataset, tokenizer=tokenizer ) trainer.train() ``` ##### 3.3 推理脚本 (`inference.py`) 推理脚本用于加载微调后的模型并生成文本: ```python from transformers import AutoTokenizer, AutoModelForCausalLM import torch # 加载模型和分词器 model_name = "deepseek/lite-base" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained("./outputs/checkpoint-xxx") # 推理函数 def generate_text(prompt, max_length=100): inputs = tokenizer(prompt, return_tensors="pt").to("cuda") outputs = model.generate(**inputs, max_new_tokens=max_length) return tokenizer.decode(outputs[0], skip_special_tokens=True) # 示例输入 prompt = "解释什么是人工智能?" response = generate_text(prompt) print(f"Prompt: {prompt}\nResponse: {response}") ``` #### 4. 关键注意事项 - **矩阵秩选择**:矩阵秩 `r` 是 LoRA 的核心超参数,决定了额外参数的数量和模型表达能力。通常建议从较小值(如 8 或 16)开始实验。 - **学习率调整**:由于 LoRA 只更新少量参数,学习率通常需要设置为较低值(如 1e-4 或更低)以避免破坏预训练权重。 - **任务适配性**:对于复杂任务或跨模态任务,LoRA 的效果可能不如全参数微调。在这种情况下,可以考虑结合其他技术(如 P-Tuning 或 Prompt Tuning)进行补充[^4]。 #### 5. 性能评估 微调后模型的质量可以通过以下指标进行评估: - **困惑度(Perplexity)**:衡量模型生成文本的概率分布质量。 - **BLEU 分数**:评估生成文本与参考文本的相似性。 - **人工评测**:针对特定任务,邀请领域专家对生成结果进行主观评价。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值