【Finetune】(一)、transformers之BitFit微调

文章目录

0、参数微调简介

参数微调方法是仅对模型的一小部分的参数(这一小部分可能是模型自身的,也可能是外部引入的)进行训练,便可以为模型带来显著的性能变化,在一些场景下甚至不输于全量微调。

由于训练一小部分参数,极大程度降低了训练大模型的算力需求,不需要多机多卡,单卡就可以完成对一些大模型的训练。不仅如此,少量的训练参数,对存储的要求同样降低很多,大多数的参数微调方法只需要保存训练部分的参数,与动辄几十GB的原始大模型相比,几乎可以忽略。

1、常见的微调方法

常见的微调方法如图所示:

Lialin, Vladislav, Vijeta Deshpande, and Anna Rumshisky. "Scaling down to scale up: A guide to parameter-efficient fine-tuning." arXiv preprint arXiv:2303.15647 (2023).

2、代码实战

  • 模型------bloom-389m-zh
  • 数据集------alpaca_data_zh

2.1、导包

python 复制代码
from datasets import load_dataset, Dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, DataCollatorForSeq2Seq, TrainingArguments, Trainer

2.2、加载数据集

python 复制代码
ds = Dataset.load_from_disk("./alpaca_data_zh/")

2.3、数据集处理

python 复制代码
tokenizer = AutoTokenizer.from_pretrained("../Model/bloom-389m-zh")
tokenizer
python 复制代码
def process_func(example):
    MAX_LENGTH = 256
    input_ids, attention_mask, labels = [], [], []
    instruction = tokenizer("\n".join(["Human: " + example["instruction"], example["input"]]).strip() + "\n\nAssistant: ")
    response = tokenizer(example["output"] + tokenizer.eos_token)
    input_ids = instruction["input_ids"] + response["input_ids"]
    attention_mask = instruction["attention_mask"] + response["attention_mask"]
    labels = [-100] * len(instruction["input_ids"]) + response["input_ids"]
    if len(input_ids) > MAX_LENGTH:
        input_ids = input_ids[:MAX_LENGTH]
        attention_mask = attention_mask[:MAX_LENGTH]
        labels = labels[:MAX_LENGTH]
    return {
        "input_ids": input_ids,
        "attention_mask": attention_mask,
        "labels": labels
    }
python 复制代码
tokenized_ds = ds.map(process_func, remove_columns=ds.column_names)
tokenized_ds

2.4、创建模型

python 复制代码
model = AutoModelForCausalLM.from_pretrained("../Model/bloom-389m-zh",low_cpu_mem_usage=True)

2.5、BitFit微调*

python 复制代码
#选择模型参数里面的所有bias部分
#非bias部分冻结
num_param = 0
for name,param in model.named_parameters():
    if 'bias' not in name:
        param.requires_grad = False
    else:
        num_param+=param.numel()
num_param

2.6、配置模型参数

python 复制代码
args = TrainingArguments(
    output_dir="./chatbot",
    per_device_train_batch_size=1,
    gradient_accumulation_steps=4,
    logging_steps=10,
    num_train_epochs=1
)

2.7、创建训练器

python 复制代码
trainer = Trainer(
    args=args,
    model=model,
    train_dataset=tokenized_ds,
    data_collator=DataCollatorForSeq2Seq(tokenizer, padding=True, )
)

2.8、模型训练

python 复制代码
trainer.train()

2.9、模型推理

python 复制代码
from transformers import pipeline

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
python 复制代码
ipt = "Human: {}\n{}".format("考试有哪些技巧?", "").strip() + "\n\nAssistant: "
pipe(ipt, max_length=256, do_sample=True, temperature=0.5)
相关推荐
第七序章3 天前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
SmartBrain3 天前
DeerFlow 实践:华为IPD流程的评审智能体设计
人工智能·语言模型·架构
JoannaJuanCV3 天前
大语言模型基石:Transformer
人工智能·语言模型·transformer
大千AI助手3 天前
TruthfulQA:衡量语言模型真实性的基准
人工智能·语言模型·自然语言处理·llm·模型评估·truthfulqa·事实性基准
张较瘦_3 天前
[论文阅读] 人工智能 + 软件工程 | 大语言模型驱动的多来源漏洞影响库识别研究解析
论文阅读·人工智能·语言模型
什么都想学的阿超3 天前
【大语言模型 58】分布式文件系统:训练数据高效存储
人工智能·语言模型·自然语言处理
金井PRATHAMA3 天前
认知语义学隐喻理论对人工智能自然语言处理中深层语义分析的赋能与挑战
人工智能·自然语言处理·知识图谱
J_Xiong01173 天前
【VLMs篇】07:Open-Qwen2VL:在学术资源上对完全开放的多模态大语言模型进行计算高效的预训练
人工智能·语言模型·自然语言处理
苏苏susuus3 天前
NLP:Transformer之self-attention(特别分享3)
人工智能·自然语言处理·transformer
艾醒(AiXing-w)3 天前
探索大语言模型(LLM):Ollama快速安装部署及使用(含Linux环境下离线安装)
linux·人工智能·语言模型