Qwen 微调LoRA之后合并模型
AI学习交流qq群 | 873673497 |
官网 | turingevo.com |
邮箱 | wmx@turingevo.com |
github | https://github.com/turingevo |
huggingface | https://huggingface.co/turingevo |
qwen_lora_merge.py :
import os
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
def save_model_and_tokenizer(path_to_adapter, new_model_directory):
"""
加载模型,合并模型,然后保存模型。
加载分词器并保存。
"""
# 检查路径有效性
if not os.path.exists(path_to_adapter):
raise FileNotFoundError(f"路径 {path_to_adapter} 不存在。")
if not os.path.exists(new_model_directory):
os.makedirs(new_model_directory, exist_ok=True)
try:
# 模型加载与合并
model = AutoPeftModelForCausalLM.from_pretrained(
path_to_adapter,
device_map="auto",
trust_remote_code=True
).eval()
merged_model = model.merge_and_unload()
# 保存合并后的模型
merged_model.save_pretrained(
new_model_directory,
max_shard_size="2048MB",
safe_serialization=True
)
# 加载并保存分词器
tokenizer = AutoTokenizer.from_pretrained(
path_to_adapter,
trust_remote_code=True
)
# 假设我们有一个函数来保存分词器,这里只是示意
save_tokenizer(tokenizer, new_model_directory)
except Exception as e:
# 异常处理,记录或抛出异常
print(f"加载或保存过程中遇到错误:{e}")
raise
def save_tokenizer(tokenizer, directory):
"""
保存分词器到指定目录。
"""
# 假设这里有一个路径拼接逻辑,将分词器文件保存到指定目录
tokenizer.save_pretrained(directory)
if __name__=="__main__":
lora_model_path="/media//huggingface_cache/out_models/qwen1_8b_chat_lora/checkpoint-1200"
new_model_directory = "/media/huggingface_cache/out_models/qwen1_8b_chat_lora/Qwen-1_8B-Chat_law_merge"
# 使用函数来执行任务
save_model_and_tokenizer(lora_model_path, new_model_directory)
使用 webui 测试
web_ui.py
import torch
print(torch.cuda.is_available())
print(torch.version.cuda)
print(torch.backends.cudnn.version())
import gradio as gr
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig
MODEL_PATH="/media/huggingface_cache/out_models/qwen1_8b_chat_lora/Qwen-1_8B-Chat_law_merge"
tokenizer = AutoTokenizer.from_pretrained(
MODEL_PATH,
trust_remote_code=True
)
model = AutoModelForCausalLM.from_pretrained(
MODEL_PATH,
device_map="auto",
trust_remote_code=True
).eval()
# Define Gradio interface components
title = "Transformer Chatbot"
description = "Enter your message and receive a response from the transformer-based language model."
def generate_answer_ui(query, history):
response, history = model.chat(tokenizer, "你好", history=history)
return f"> 问题:\n{query}\n\n> 回答:\n{response}\n\n>"
def main():
iface = gr.ChatInterface(
fn=generate_answer_ui,
title=title,
description=description,
examples=[
["这里可以使用你微调的数据代替"],
["你叫什么名字?"],
],
)
iface.launch(inbrowser=True)
if __name__ == '__main__':
main()