【Finetune】(二)、transformers之Prompt-Tuning微调

0、prompt-tuning基本原理

 prompt-tuning的基本思想就是冻结主模型的全部参数,在训练数据前加入一小段Prompt,只训练Prompt的表示向量,即一个Embedding模块。其中,prompt又存在两种形式,一种是hard prompt,一种是soft prompt。

在这里插入图片描述

1、实战

1.1、导包

from datasets import load_dataset, Dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, DataCollatorForSeq2Seq, TrainingArguments, Trainer

1.2、加载数据

ds = Dataset.load_from_disk("../Data/alpaca_data_zh/")

1.3、数据预处理

tokenizer = AutoTokenizer.from_pretrained("../Model/bloom-389m-zh")
tokenizer

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
    }
tokenized_ds = ds.map(process_func, remove_columns=ds.column_names)
tokenized_ds

1.4、创建模型

model = AutoModelForCausalLM.from_pretrained("../Model/bloom-389m-zh",low_cpu_mem_usage=True)

1.5、Prompt Tuning*

1.5.1、配置文件

#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='../Model/bloom-389m-zh',

    )
config

1.5.2、创建模型

model= get_peft_model(model,config)
model

打印模型训练参数

model.print_trainable_parameters()

1.6、配置训练参数

args = TrainingArguments(
    output_dir="./chatbot",
    per_device_train_batch_size=1,
    gradient_accumulation_steps=4,
    logging_steps=10,
    num_train_epochs=1
)

1.7、创建训练器

trainer = Trainer(
    args=args,
    model=model,
    train_dataset=tokenized_ds,
    data_collator=DataCollatorForSeq2Seq(tokenizer, padding=True, )
)

1.8、模型训练

trainer.train()

1.9、推理:加载预训练好的模型

from peft import PeftModel
peft_model =  PeftModel.from_pretrained(model=model,model_id='./chat_bot/checkpoint500/')
from transformers import pipeline

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
ipt = "Human: {}\n{}".format("考试有哪些技巧?", "").strip() + "\n\nAssistant: "
pipe(ipt, max_length=256, do_sample=True, temperature=0.5)
<think>嗯,用户想找关于ChatGLM3-6B模型微调代码示例。首先,我需要回顾一下提供的引用内容。引用1和2提到官方文档里有全量微调、P-Tuning v2、SFT和LoRA的示例,包括多轮对话和输入输出格式的样例。引用3是关于ChatGLM2-6B的P-Tuning实践,里面详细讲了环境准备、数据集准备、依赖安装、训练和评估步骤。引用4则提供了一个GitHub仓库的链接,里面有chatglm3-6b的微调实战代码,包括LORA、多卡训练等。 用户可能已经看过官方文档,但需要具体的代码示例,特别是实际的实现步骤。可能需要区分不同微调方法,比如全量微调、P-Tuning v2和LoRA。引用3和4中的实际项目可能更实用,尤其是GitHub上的代码库,用户可能更倾向于实际操作步骤。 接下来,应该分步骤给出不同微调方法的示例。例如,全量微调可能需要准备数据集、加载模型、设置训练参数等。P-Tuning v2可能涉及使用特定的训练脚本和配置。LoRA则需要使用相应的库,比如peft,并调整模型参数。 需要注意的是,用户可能需要环境准备的指导,比如安装CUDA、PyTorch、相关依赖库。此外,数据集格式的要求也很重要,比如JSON格式和特定的键名如"prompt"和"response"。 可能还需要提到微调后的推理步骤,如何加载训练好的模型进行测试。同时,引用中的GitHub项目可能有踩坑经验,可以提醒用户注意常见问题,比如依赖版本冲突或显存不足。 最后,生成相关问题时要覆盖不同微调方法、数据集处理、环境配置、性能优化等,帮助用户进一步探索。</think>以下为关于ChatGLM3-6B模型微调代码示例及实现步骤说明: ### 一、微调方法及代码示例 #### 1. **全量微调(SFT)** ```python from transformers import AutoModel, TrainingArguments, Trainer # 加载预训练模型 model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True) # 配置训练参数 training_args = TrainingArguments( output_dir="./output", per_device_train_batch_size=4, gradient_accumulation_steps=2, learning_rate=2e-5, num_train_epochs=3, fp16=True ) # 自定义数据集加载函数 def load_dataset(file_path): # 需包含"prompt"和"response"字段的JSON格式数据 ... trainer = Trainer( model=model, args=training_args, train_dataset=load_dataset("data/train.json") ) trainer.train() ``` > 说明:全量微调会更新所有模型参数,需要较大显存[^1][^2] #### 2. **P-Tuning v2微调** ```bash # 使用官方提供的训练脚本 git clone https://github.com/THUDM/ChatGLM3 cd ChatGLM3/finetune_ptuning python main.py \ --dataset your_data \ --prompt_column prompt \ --response_column response \ --quantization_bit 4 ``` > 特点:仅更新部分参数,显存需求较低[^3] #### 3. **LoRA微调** ```python from peft import LoraConfig, get_peft_model # 添加LoRA适配器 lora_config = LoraConfig( r=8, lora_alpha=16, target_modules=["query_key_value"], lora_dropout=0.05, bias="none" ) model = get_peft_model(model, lora_config) ``` > 优势:参数效率高,适合单卡训练[^4] ### 、关键实现步骤 1. **环境准备** ```bash conda create -n chatglm python=3.10 pip install torch==2.0.1+cu118 -f https://download.pytorch.org/whl/torch_stable.html pip install -r requirements.txt # 包含transformers, peft等 ``` 2. **数据集格式** ```json { "prompt": "解释量子计算", "response": "量子计算是利用量子力学原理...", "history": [] } ``` 3. **多卡训练配置** ```python training_args = TrainingArguments( deepspeed="./configs/deepspeed.json", gradient_checkpointing=True ) ``` ### 三、微调后推理 ```python from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True) model = AutoModel.from_pretrained("./output/checkpoint-1000", trust_remote_code=True).cuda() response, history = model.chat( tokenizer, "如何提升模型微调效果?", history=[] ) print(response) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸可落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值