【大语言模型+Lora微调】10条对话微调Qwen-7B-Chat并进行推理 (聊天助手)

代码:https://github.com/QwenLM/Qwen/tree/main
国内源安装说明:https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary
通义千问:https://tongyi.aliyun.com/qianwen

在这里插入图片描述

一、环境搭建

下载源码

git clone https://github.com/QwenLM/Qwen.git

conda+pytorch (根据自己显卡驱动选择)

去pytorch官网 https://pytorch.org/get-started/previous-versions/

conda create -n qwenLM python=3.10 
conda activate qwenLM 
conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.8 -c pytorch -c nvidia

其他依赖

pip install transformers==4.32.0 accelerate tiktoken einops scipy transformers_stream_generator==0.0.4 peft deepspeed

UI相关依赖

cd Qwen
pip install -r requirements_web_demo.txt

可供选择(安不上不影响推理和训练)

git clone https://github.com/Dao-AILab/flash-attention
cd flash-attention && pip install .

二、模型下载与推理

2.1 运行 test_down.py

#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen-7B-Chat')

在这里插入图片描述

2.2 下载完成后

~/.cache/modelscope/hub/Qwen/Qwen-7B-Chat

在这里插入图片描述

2.2 推理

–server-name 如果不写,只能本机打开,0.0.0.0输入ip可以。。
CUDA_VISIBLE_DEVICES=0 表示选择显卡0,多显卡才用,单点卡不用输入
-c表示的是模型的地址
–server-port 也可指定端口 ,默认是8000,可改为其他

CUDA_VISIBLE_DEVICES=0 python web_demo.py  -c ~/.cache/modelscope/hub/qwen/Qwen-7B-Chat --server-name 0.0.0.0

在这里插入图片描述

三、微调-训练lora (见官网)

3.1 数据集示意:test_zhj_11.json (局部非完整)


[  {"id": "000000000","conversations": [{"from": "user","value": "你好"},{"from": "assistant","value": "我是曾小蛙的助手,支持xx游戏相关问答。"}]},       {"id": "000000001","conversations": [{"from": "user","value": "镇魂街游戏中,合击技是做什么用的?"},{"from": "assistant","value": "合击技是由寄灵人与守护灵搭配使用的技能,可以在战斗中释放强大效果。"}]},{"id": "000000002","conversations": [{"from": "user","value": "灵海之境"},{"from": "assistant","value": "灵海之境是玩家养成寄灵人和守护灵,提升他们能力的系统。"}]},{"id": "000000003","conversations": [{"from": "user","value": "共鸣神石是用来做什么的?"},{"from": "assistant","value": "共鸣神石可以提升对应元素的寄灵人和守护灵的能力等级。"}]},{"id": "000000004","conversations": [{"from": "user","value": "游戏中的竞技场?"},{"from": "assistant","value": "竞技场是玩家们进行PVP战斗,争夺排名的场所。"}]},{"id": "000000005","conversations": [{"from": "user","value": "游戏中,蓬莱宝库有什么特别之处?"},{"from": "assistant","value": "蓬莱宝库是探索活动,玩家可以通过解决事件获取奖励,并挑战更高层的内容。"}]},{"id": "000000006","conversations": [{"from": "user","value": "五灵宝珠"},{"from": "assistant","value": "五灵宝珠用于提升角色的五行属性,角色品质到橙色后可使用。"}]},{"id": "000000007","conversations": [{"from": "user","value": "千机黑刹是什么?"},{"from": "assistant","value": "千机黑刹是游戏中的挑战副本之一。玩家需要挑战守卫和收集强化buff来提升自己的阵容实力,并挑战首领【镇狱童子】,根据造成的伤害获得排名和奖励。"}]},{"id": "000000008","conversations": [{"from": "user","value": "星河罗盘有何作用?"},{"from": "assistant","value": "星河罗盘是游戏中的一个资源收集系统。通过收集星辉作为资源,玩家可以提升星河罗盘等级,从而获得对应职业属性的加持,提升角色实力。"}]},{"id": "000000009","conversations": [{"from": "user","value": "地狱道?"},{"from": "assistant","value": "地狱道是一个任务系统,玩家完成任务可以激活特权,提升地狱道等级后可以获得更多加成,并且每日可领取与等级相应的奖励。"}]},{"id": "000000010","conversations": [{"from": "user","value": "贪字营?"},{"from": "assistant","value": "贪字营是游戏中的悬赏任务系统,玩家可以接受任务并派遣符合条件的寄灵人和守护灵上阵,完成任务后可以获得丰富的奖励。"}]}
]

3.2 单卡 训练lora 脚本(直接放入命令端)

num_train_epochs 默认为 5
output_dir 训练后lora保存
data_path 数据集json的路径
model_name_or_path 使用绝对路径
gradient_accumulation_steps 数据少时 ,要改为1(默认为8),否则loss训练不下去

CUDA_VISIBLE_DEVICES=1 python finetune.py \--model_name_or_path "your_dir/modelscope/hub/Qwen/Qwen-7B-Chat" \--data_path "./datasets/test_zhj_11.json"\--bf16 True \--output_dir output_qwen/test1 \--num_train_epochs 5 \--per_device_train_batch_size 2 \--per_device_eval_batch_size 1 \--gradient_accumulation_steps 1 \--evaluation_strategy "no" \--save_strategy "steps" \--save_steps 1000 \--save_total_limit 10 \--learning_rate 3e-4 \--weight_decay 0.1 \--adam_beta2 0.95 \--warmup_ratio 0.01 \--lr_scheduler_type "cosine" \--logging_steps 1 \--report_to "none" \--model_max_length 512 \--lazy_preprocess True \--gradient_checkpointing \--use_lora

训练过程

在这里插入图片描述

训练后的lora模型(未融合)

在这里插入图片描述

3.3 加载lora (未合并 合并见官网)

官网加载示意 (部分代码)

from peft import AutoPeftModelForCausalLMmodel = AutoPeftModelForCausalLM.from_pretrained(path_to_adapter, # path to the output directorydevice_map="auto",trust_remote_code=True
).eval()

修改 web_demo.py 为web_demo_lora.py (代码见附录)

下面代码DEFAULT_CKPT_PATH 改为自己主模型的绝对路径,非lora

# Copyright (c) Alibaba Cloud.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree."""A simple web interactive chat demo based on gradio."""
import os
from argparse import ArgumentParserimport gradio as gr
import mdtex2htmlimport torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfigDEFAULT_CKPT_PATH = 'Qwen/Qwen-7B-Chat'
from peft import AutoPeftModelForCausalLMdef _get_args():parser = ArgumentParser()parser.add_argument("-c", "--checkpoint-path", type=str, default=DEFAULT_CKPT_PATH,help="Checkpoint name or path, default to %(default)r")parser.add_argument("--cpu-only", action="store_true", help="Run demo with CPU only")parser.add_argument("--share", action="store_true", default=False,help="Create a publicly shareable link for the interface.")parser.add_argument("--inbrowser", action="store_true", default=False,help="Automatically launch the interface in a new tab on the default browser.")parser.add_argument("--server-port", type=int, default=8000,help="Demo server port.")parser.add_argument("--server-name", type=str, default="127.0.0.1",help="Demo server name.")args = parser.parse_args()return argsdef _load_model_tokenizer(args):tokenizer = AutoTokenizer.from_pretrained(args.checkpoint_path, trust_remote_code=True, resume_download=True,)if args.cpu_only:device_map = "cpu"else:device_map = "auto"model = AutoPeftModelForCausalLM.from_pretrained(args.checkpoint_path, # path to the output directorydevice_map=device_map,trust_remote_code=True,).eval()config = GenerationConfig.from_pretrained(DEFAULT_CKPT_PATH , trust_remote_code=True, resume_download=True,)return model, tokenizer, configdef postprocess(self, y):if y is None:return []for i, (message, response) in enumerate(y):y[i] = (None if message is None else mdtex2html.convert(message),None if response is None else mdtex2html.convert(response),)return ygr.Chatbot.postprocess = postprocessdef _parse_text(text):lines = text.split("\n")lines = [line for line in lines if line != ""]count = 0for i, line in enumerate(lines):if "```" in line:count += 1items = line.split("`")if count % 2 == 1:lines[i] = f'<pre><code class="language-{items[-1]}">'else:lines[i] = f"<br></code></pre>"else:if i > 0:if count % 2 == 1:line = line.replace("`", r"\`")line = line.replace("<", "&lt;")line = line.replace(">", "&gt;")line = line.replace(" ", "&nbsp;")line = line.replace("*", "&ast;")line = line.replace("_", "&lowbar;")line = line.replace("-", "&#45;")line = line.replace(".", "&#46;")line = line.replace("!", "&#33;")line = line.replace("(", "&#40;")line = line.replace(")", "&#41;")line = line.replace("$", "&#36;")lines[i] = "<br>" + linetext = "".join(lines)return textdef _gc():import gcgc.collect()if torch.cuda.is_available():torch.cuda.empty_cache()def _launch_demo(args, model, tokenizer, config):def predict(_query, _chatbot, _task_history):print(f"User: {_parse_text(_query)}")_chatbot.append((_parse_text(_query), ""))full_response = ""for response in model.chat_stream(tokenizer, _query, history=_task_history, generation_config=config):_chatbot[-1] = (_parse_text(_query), _parse_text(response))yield _chatbotfull_response = _parse_text(response)print(f"History: {_task_history}")_task_history.append((_query, full_response))print(f"Qwen-Chat: {_parse_text(full_response)}")def regenerate(_chatbot, _task_history):if not _task_history:yield _chatbotreturnitem = _task_history.pop(-1)_chatbot.pop(-1)yield from predict(item[0], _chatbot, _task_history)def reset_user_input():return gr.update(value="")def reset_state(_chatbot, _task_history):_task_history.clear()_chatbot.clear()_gc()return _chatbotwith gr.Blocks() as demo:gr.Markdown("""\
<p align="center"><img src="https://qianwen-res.oss-cn-beijing.aliyuncs.com/logo_qwen.jpg" style="height: 80px"/><p>""")gr.Markdown("""<center><font size=8>Qwen-Chat Bot</center>""")gr.Markdown("""\
<center><font size=3>This WebUI is based on Qwen-Chat, developed by Alibaba Cloud. \
(本WebUI基于Qwen-Chat打造,实现聊天机器人功能。)</center>""")gr.Markdown("""\
<center><font size=4>
Qwen-7B <a href="https://modelscope.cn/models/qwen/Qwen-7B/summary">🤖 </a> | 
<a href="https://huggingface.co/Qwen/Qwen-7B">🤗</a>&nbsp | 
Qwen-7B-Chat <a href="https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary">🤖 </a> | 
<a href="https://huggingface.co/Qwen/Qwen-7B-Chat">🤗</a>&nbsp | 
Qwen-14B <a href="https://modelscope.cn/models/qwen/Qwen-14B/summary">🤖 </a> | 
<a href="https://huggingface.co/Qwen/Qwen-14B">🤗</a>&nbsp | 
Qwen-14B-Chat <a href="https://modelscope.cn/models/qwen/Qwen-14B-Chat/summary">🤖 </a> | 
<a href="https://huggingface.co/Qwen/Qwen-14B-Chat">🤗</a>&nbsp | 
&nbsp<a href="https://github.com/QwenLM/Qwen">Github</a></center>""")chatbot = gr.Chatbot(label='Qwen-Chat', elem_classes="control-height")query = gr.Textbox(lines=2, label='Input')task_history = gr.State([])with gr.Row():empty_btn = gr.Button("🧹 Clear History (清除历史)")submit_btn = gr.Button("🚀 Submit (发送)")regen_btn = gr.Button("🤔️ Regenerate (重试)")submit_btn.click(predict, [query, chatbot, task_history], [chatbot], show_progress=True)submit_btn.click(reset_user_input, [], [query])empty_btn.click(reset_state, [chatbot, task_history], outputs=[chatbot], show_progress=True)regen_btn.click(regenerate, [chatbot, task_history], [chatbot], show_progress=True)gr.Markdown("""\
<font size=2>Note: This demo is governed by the original license of Qwen. \
We strongly advise users not to knowingly generate or allow others to knowingly generate harmful content, \
including hate speech, violence, pornography, deception, etc. \
(注:本演示受Qwen的许可协议限制。我们强烈建议,用户不应传播及不应允许他人传播以下内容,\
包括但不限于仇恨言论、暴力、色情、欺诈相关的有害信息。)""")demo.queue().launch(share=args.share,inbrowser=args.inbrowser,server_port=args.server_port,server_name=args.server_name,)def main():args = _get_args()model, tokenizer, config = _load_model_tokenizer(args)_launch_demo(args, model, tokenizer, config)if __name__ == '__main__':main()

运行命令

CUDA_VISIBLE_DEVICES=0  python web_demo_lora.py    --server-name 0.0.0.0   -c ./output_qwen/test1   --server-port 8088

结果

我是曾小蛙的小助手
在这里插入图片描述

文章目录

  • 一、环境搭建
    • 下载源码
    • conda+pytorch (根据自己显卡驱动选择)
    • 其他依赖
      • UI相关依赖
      • 可供选择(安不上不影响推理和训练)
  • 二、模型下载与推理
    • 2.1 运行 test_down.py
    • 2.2 下载完成后
    • 2.2 推理
  • 三、微调-训练lora (见官网)
    • 3.1 数据集示意:**test_zhj_11.json** (局部非完整)
    • 3.2 单卡 训练lora 脚本(直接放入命令端)
      • 训练过程
      • 训练后的lora模型(未融合)
    • 3.3 加载lora (未合并 合并见官网)
      • 官网加载示意 (部分代码)
      • 修改 web_demo.py 为web_demo_lora.py (代码见附录)
      • 运行命令
      • 结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

是用computed获取vuex数据后,修改数据页面不响应的问题

问题描述&#xff1a; 代码里使用computed获取mapGetters的数据后&#xff0c;直接在页面使用&#xff0c;在methods中更新数据后&#xff0c;控制台打印数据已经更改&#xff0c;但是页面上的数据没有同步更改和响应。 分析&#xff1a; 1.computed是计算属性&#xff0c;所有…

【Linux 进程间通信】管道(三)

文章目录 1.管道的五种特征2.管道的四种情况 1.管道的五种特征 ①&#x1f34e;匿名管道只能用于有血缘关系的进程之间进行通信&#xff08;爷孙进程之间可以进行通信&#xff09;&#xff0c;常用于父子之间进行通信&#xff1b; ②&#x1f34e;管道内部&#xff0c;自带进…

【数据结构】时间复杂度的例题

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构 &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 这篇文章是关于时间复杂度的一些例题&#xff0c;关于时间复杂度和空间复杂度和算法的计算效率的基本知识点我放在…

Linux之C编程入门

目录 第1关&#xff1a;第一个C程序 任务描述 相关知识 编译C程序 编程要求 答案及其步骤&#xff1a; 第2关&#xff1a;Linux编译C程序 任务描述 相关知识 gcc编译器使用方法 编程要求 答案及其步骤&#xff1a; 第3关&#xff1a;Linux之静态库编写 任务描述 相关知识 生成…

【深度学习】Attention、Self-Attention、Multi-Head Attention

一、Attention 在CV领域&#xff0c;注意力机制通常分为通道注意力和空间注意力或者两者结合。 一张图像经backbone得到的特征通常包括多个通道&#xff0c;每个通道是一个像素矩阵&#xff0c;每个通道对任务的贡献不尽相同&#xff0c;单个通道的特征图中每个像素对任务的贡…

2W 3KVDC 隔离双输出 DC/DC 电源模块——TPD-2W 系列

TPD-2W系列提供双独立输出电压&#xff0c;并且两组电压可以不同&#xff0c;这样就节省一个电源模块&#xff0c;特别适合一块板上有多个不同电压要求的设计&#xff0c;而外形尺寸和TPA一样&#xff0c;工作温度范围广-40℃到 105℃。

LabVIEW连接postgre sql

一、安装ODBC 下载对应postgreSQL版本的ODBC 下载网址&#xff1a;http://ftp.postgresql.org/pub/odbc/versions/msi/ 下载好后默认安装就行&#xff0c;这样在ODBC数据源中才能找到。 二、配置系统DSN 实现要新建好要用的数据库&#xff0c;这里的用户名&#xff1a;postg…

new[]与delete[]

&#xff08;要理解之前关于new,delete的一些概念&#xff0c;看​​​​​​ CSDN&#xff09; 引子&#xff1a; 相比new&#xff0c;new[]不仅仅是个数的增加&#xff0c;还有int大小记录空间的创建&#xff0c; 下图中错误的用模拟多个new来替代new[]&#xff0c;释放步…

9.MMD 基础内容总结及制作成品流程

前期准备 1. 导入场景和模型 在左上角菜单栏&#xff0c;显示里将编辑模型时保持相机和光照勾选上&#xff0c;有助于后期调色 将抗锯齿和各向异性过滤勾掉&#xff0c;可以节省资源&#xff0c;避免bug 在分辨率设定窗口&#xff0c;可以调整分辨率 3840x2160 4k分辨率 1…

【python】图形用户界面学习之tkinter

认识tkinter Tkinter是Python中内置的图形用户界面&#xff08;GUI&#xff09;库。它是Tk GUI工具包的接口&#xff0c;可以创建和管理窗口、按钮、标签、文本框等各种GUI组件&#xff0c;并与用户交互。 使用Tkinter&#xff0c;可以创建各种GUI应用程序&#xff0c;如桌面…

QT Webengine开发过程报错qml: Render process exited with code 159 (killed)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、解决方法二、补充说明总结 前言 基于QT的Webengine开发过程中&#xff0c;QT的官方示例quicknanobrowser也无法成功运行&#xff0c;程序运行后&#xff0…

git的学习

设置用户&#xff08;目的在于可以在远端看到是谁提交了内容&#xff0c;更方便公司的管理&#xff09; 1、设置全局用户&#xff08;在家路径下创建用户&#xff0c;每个项目都用这一个用户&#xff09;>: git config --global user.name manba >: git config --global …

使用Go语言和chromedp库下载Instagram图片:简易指南

摘要/导言 本文将介绍如何使用Go语言配合chromedp库来下载Instagram上的图片。我们将通过一个简单的示例来展示整个过程&#xff0c;包括如何设置爬虫代理IP以绕过网络限制。 背景/引言 在数据采集和自动化测试领域&#xff0c;Go语言以其出色的执行效率、简洁的语法和卓越的…

【科学研究】那些考进精英大学的农家子弟们

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

智能化转型的得力助手:山海鲸智慧工厂解决方案详解

在数字化浪潮席卷全球的今天&#xff0c;工业领域正迎来一场前所未有的智能化变革。作为这一变革的领军者&#xff0c;山海鲸智慧工厂解决方案以其前瞻性的技术理念和创新的解决方案&#xff0c;为工业发展注入了强大的动力。 山海鲸智慧工厂解决方案的核心在于其高度的集成性…

Windows Server 2012 R2 中 IIS 8.5 安装证书

文章目录 前言一、获取服务器证书二、证书格式转换二、IIS8安装证书1.Win R 键打开运行窗口 → 输入【inetmgr】→ 点击【确定】2.打开【IIS管理器】→ 点击计算机名称 → 双击打开【服务器证书】3.点击【导入】4.选择证书文件 → 输入密码 → 点击【确定】5.选择要使用证书的…

14. Spring AOP(二)实现原理

源码位置&#xff1a;spring_aop 上一篇文章中我们主要学习了AOP的思想和Spring AOP使用&#xff0c;本文讲的是Spring是如何实现AOP的&#xff0c;Spring AOP是基于动态代理来实现AOP的&#xff0c;在将动态代理之前先来了解一下什么是代理模式。 1. 代理模式 在现实中就有许…

深度学习transformer架构详细详解

一、transformer的贡献 transformer架构的贡献&#xff1a;该架构只使用自注意力机制&#xff0c;没有使用RNN或卷积网络。且可以实现并行计算&#xff0c;加快模型训练速度。 &#xff08;将所有的循环层全部换成&#xff1a;multi-headed self-attention&#xff09; 二、t…

VisualStudio2019和2022开发Winform项目用到Devexpress组件报错不能正确加载的解决办法

1.报错1 问题简单描述&#xff1a;DevExpress.Utils.ImageCollectionStreamer 无法强制转换为 DevExpress.Utils.ImageCollectionStreamer。 原因分析&#xff1a;原项目某个组件使用的是 DevExpresss.XtraBars.v15.1版本&#xff0c;直接引用扩展控件改成引用v20.2。 解决办法…

负载均衡集群——Nginx

目录 1.Nginx反向代理实战 2.Nginx 反向代理和负载均衡实践 实验操作步骤 步骤 1 Nginx1 和 Nginx2 配置 步骤2 测试资源是否可用 步骤 3 安装和配置 Nginx 代理 步骤 4 代理服务器配置检测 步骤 5 在 Nginx1 和 Nginx2 配置虚拟主机 步骤 6 将虚拟主机添加入后端主机组…