ChatGLM-6B LLM大模型使用;P-Tuning微调;prompt角色扮演

ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。

本机显卡只有6G(GTX 1660 Ti),所以刚好可以使用,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存),可以去下面参考链接下载对应模型

参考:https://huggingface.co/THUDM/chatglm-6b-int4
https://github.com/THUDM/ChatGLM-6B

安装环境

1、安装对应cuda 版本的torch包

在这里插入图片描述
** CUDA 11.3

pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113

2、安装transformers等包

pip install protobuf transformers==4.27.1 cpm_kernels sentencepiece

1、使用

运算推理还是比较慢,长的内容需要3分钟多

from transformers import AutoTokenizer, AutoModel## 在线加载下载模型很慢,所以这边离线下载本地加载
##模型下载地址:https://cloud.tsinghua.edu.cn/d/674208019e314311ab5c/tokenizer = AutoTokenizer.from_pretrained(r"C:\Users\lonng\Downloads\chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained(r"C:\Users\lonng\Downloads\chatglm-6b-int4", trust_remote_code=True).half().cuda()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
historyresponse, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)

chatglm-6b-int4 模型bin文件3个多G
在这里插入图片描述

在这里插入图片描述

response, history = model.chat(tokenizer, "单细胞测序分析方法", history=history)

在这里插入图片描述
在这里插入图片描述

api多进程高并发 python fastapi代码
from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModel
import uvicorn, json, datetime
import torchDEVICE = "cuda"
DEVICE_ID = "0"
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICEdef torch_gc():if torch.cuda.is_available():with torch.cuda.device(CUDA_DEVICE):torch.cuda.empty_cache()torch.cuda.ipc_collect()app = FastAPI()@app.post("/")
async def create_item(request: Request):global model, tokenizerjson_post_raw = await request.json()json_post = json.dumps(json_post_raw)json_post_list = json.loads(json_post)prompt = json_post_list.get('prompt')history = json_post_list.get('history')max_length = json_post_list.get('max_length')top_p = json_post_list.get('top_p')temperature = json_post_list.get('temperature')response, history = model.chat(tokenizer,prompt,history=history,max_length=max_length if max_length else 2048,top_p=top_p if top_p else 0.7,temperature=temperature if temperature else 0.95)now = datetime.datetime.now()time = now.strftime("%Y-%m-%d %H:%M:%S")answer = {"response": response,"history": history,"status": 200,"time": time}log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'print(log)torch_gc()return answer# Set the device to the second GPU
torch.cuda.set_device(1)tokenizer = AutoTokenizer.from_pretrained("/mnt/data/chatglm/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("/mnt/data/chatglm/chatglm2-6b-int4", trust_remote_code=True).cuda()
model.eval()if __name__ == '__main__':# 多显卡支持,使用下面三行代替上面两行,将num_gpus改为你实际的显卡数量# model_path = "THUDM/chatglm2-6b"# tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)# model = load_model_on_gpus(model_path, num_gpus=2)#model.eval()uvicorn.run("api:app", host='192.168.19.14', port=8000, reload=True, workers=3)

在这里插入图片描述

2、P-Tuning v2微调

参考:https://github.com/THUDM/ChatGLM-6B/tree/main/ptuning

运行以下指令进行训练:

bash train.sh
###train.sh文件
PRE_SEQ_LEN=128
LR=2e-2CUDA_VISIBLE_DEVICES=0 python3 main.py \--do_train \--train_file AdvertiseGen/train.json \--validation_file AdvertiseGen/dev.json \--prompt_column content \--response_column summary \--overwrite_cache \--model_name_or_path ****/chatglm-6b-int4 \--output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \--overwrite_output_dir \--max_source_length 64 \--max_target_length 64 \--per_device_train_batch_size 1 \--per_device_eval_batch_size 1 \--gradient_accumulation_steps 16 \--predict_with_generate \--max_steps 3000 \--logging_steps 10 \--save_steps 1000 \--learning_rate $LR \--pre_seq_len $PRE_SEQ_LEN \--quantization_bit 4

train.sh 中的 PRE_SEQ_LENLR 分别是 soft prompt 长度和训练的学习率,可以进行调节以取得最佳的效果。P-Tuning-v2 方法会冻结全部的模型参数,可通过调整 quantization_bit 来被原始模型的量化等级,不加此选项则为 FP16 精度加载。

在默认配置 quantization_bit=4per_device_train_batch_size=1gradient_accumulation_steps=16 下,INT4 的模型参数被冻结,一次训练迭代会以 1 的批处理大小进行 16 次累加的前后向传播,等效为 16 的总批处理大小,此时最低只需 6.7G 显存。若想在同等批处理大小下提升训练效率,可在二者乘积不变的情况下,加大 per_device_train_batch_size 的值,但也会带来更多的显存消耗,请根据实际情况酌情调整。

如果你想要从本地加载模型,可以将 train.sh 中的 THUDM/chatglm-6b 改为你本地的模型路径。

在这里插入图片描述

结果会保存ChatGLM-6B-main/ptuning/output下:
在这里插入图片描述
在这里插入图片描述

加载微调权重:
参考:https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/main.py
在这里插入图片描述

##加载微调模型验证
sh evaluate.sh

在这里插入图片描述

3、指定角色扮演

参考:https://aistudio.baidu.com/aistudio/projectdetail/6306692

只要就是提前构建好history,注意histor字典里每轮结果是元组结构,包含两部分每个元组用户内容,系统内容,即[(用户内容,系统内容),(),()]

import os
import platform
import signal
from transformers import AutoTokenizer, AutoModel
import readlinetokenizer = AutoTokenizer.from_pretrained("/mnt/data/chatglm/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("/mnt/data/chatglm/chatglm2-6b-int4", trust_remote_code=True).half().cuda()
model = model.eval()os_name = platform.system()
clear_command = 'cls' if os_name == 'Windows' else 'clear'
stop_stream = Falsedef build_prompt(history):prompt = "欢迎使用 杰创智能小助手 ,输入内容即可进行对话,clear 清空对话历史,stop 终止程序"for query, response in history:prompt += f"\n\n用户:{query}"prompt += f"\n\n小杰:{response}"return promptdef signal_handler(signal, frame):global stop_streamstop_stream = Truedef main():history = [("你名字叫***小助手,小名昵称为***,是***公司研发的AI助手,你主要擅长领域是*******","好的,小**很乐意为你服务")]global stop_streamprint("欢迎使用 ***小助手 ,输入内容即可进行对话,clear 清空对话历史,stop 终止程序")while True:query = input("\n用户:")if query.strip() == "stop":breakif query.strip() == "clear":history = []os.system(clear_command)print("欢迎使用 *****小助手 ,输入内容即可进行对话,clear 清空对话历史,stop 终止程序")continuecount = 0for response, history in model.stream_chat(tokenizer, query, history=history):if stop_stream:stop_stream = Falsebreakelse:count += 1if count % 8 == 0:os.system(clear_command)print(build_prompt(history[1:]), flush=True)  ##history[1:]注意是屏蔽制定角色内容不展示到前端signal.signal(signal.SIGINT, signal_handler)os.system(clear_command)print(build_prompt(history[1:]), flush=True)if __name__ == "__main__":main()
gradio版本
from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html
from utils import load_model_on_gpustokenizer = AutoTokenizer.from_pretrained("/mnt/data/chatglm/chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("/mnt/data/chatglm/chatglm2-6b-int4", trust_remote_code=True).half().cuda()
# 多显卡支持,使用下面两行代替上面一行,将num_gpus改为你实际的显卡数量
#from utils import load_model_on_gpus
#model = load_model_on_gpus("/mnt/data/chatglm/chatglm2-6b-int4", num_gpus=4)
model = model.eval()"""Override Chatbot.postprocess"""def 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 predict(input, chatbot, max_length, top_p, temperature, history, past_key_values):chatbot.append((input, ""))print("history:",history)for response, history in model.stream_chat(tokenizer, input, history,max_length=max_length, top_p=top_p,temperature=temperature):chatbot[-1] = (input, response)print(response, history)yield chatbot, historydef reset_user_input():return gr.update(value='')def reset_state():### 提前设置角色return [], [('你名字叫*********安全','好的,小杰很乐意为你服务')], Nonewith gr.Blocks() as demo:gr.HTML("""<h1 align="center">杰创智能AI聊天</h1>""")chatbot = gr.Chatbot()with gr.Row():with gr.Column(scale=4):with gr.Column(scale=12):user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10).style(container=False)with gr.Column(min_width=32, scale=1):submitBtn = gr.Button("Submit", variant="primary")with gr.Column(scale=1):emptyBtn = gr.Button("Clear History")max_length = gr.Slider(0, 32768, value=8192, step=1.0, label="Maximum length", interactive=True)top_p = gr.Slider(0, 1, value=0.8, step=0.01, label="Top P", interactive=True)temperature = gr.Slider(0, 1, value=0.95, step=0.01, label="Temperature", interactive=True)### 提前设置角色history = gr.State([('你名字叫******更安全','好的,小杰很乐意为你服务')])past_key_values = gr.State(None)submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history, past_key_values],[chatbot, history], show_progress=True)submitBtn.click(reset_user_input, [], [user_input])emptyBtn.click(reset_state, outputs=[chatbot, history], show_progress=True)demo.queue().launch(server_name="192.168.19.14", share=False)

streamlit版本

from transformers import AutoModel, AutoTokenizer
import streamlit as st
from streamlit_chat import messagest.set_page_config(page_title="ChatGLM2-6b 演示",page_icon=":robot:",layout='wide'
)@st.cache_resource
def get_model():tokenizer = AutoTokenizer.from_pretrained("/mnt/data/chatglm/chatglm2-6b-int4", trust_remote_code=True)model = AutoModel.from_pretrained("/mnt/data/chatglm/chatglm2-6b-int4", trust_remote_code=True).half().cuda()# 多显卡支持,使用下面两行代替上面一行,将num_gpus改为你实际的显卡数量# from utils import load_model_on_gpus# model = load_model_on_gpus("THUDM/chatglm2-6b", num_gpus=2)model = model.eval()return tokenizer, modelMAX_TURNS = 20
MAX_BOXES = MAX_TURNS * 2def predict(input, max_length, top_p, temperature, history=None):tokenizer, model = get_model()if history is None:history = []with container:if len(history) > 0:if len(history)>MAX_BOXES:history = history[-MAX_TURNS:]for i, (query, response) in enumerate(history):message(query, avatar_style="big-smile", key=str(i) + "_user")message(response, avatar_style="bottts", key=str(i))message(input, avatar_style="big-smile", key=str(len(history)) + "_user")st.write("AI正在回复:")with st.empty():for response, history in model.stream_chat(tokenizer, input, history, max_length=max_length, top_p=top_p,temperature=temperature):query, response = history[-1]st.write(response)return historycontainer = st.container()# create a prompt text for the text generation
prompt_text = st.text_area(label="用户命令输入",height = 100,placeholder="请在这儿输入您的命令")max_length = st.sidebar.slider('max_length', 0, 32768, 8192, step=1
)
top_p = st.sidebar.slider('top_p', 0.0, 1.0, 0.8, step=0.01
)
temperature = st.sidebar.slider('temperature', 0.0, 1.0, 0.95, step=0.01
)if 'state' not in st.session_state:### 提前设置角色st.session_state['state'] = [("你名字叫*****更安全","好的,小杰很乐意为你服务")]
print(st.session_state['state']) 
if st.button("发送", key="predict"):with st.spinner("AI正在思考,请稍等........"):# text generationst.session_state["state"] = predict(prompt_text, max_length, top_p, temperature, st.session_state["state"])

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

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

相关文章

使用jatoolsPrinter实现套打

最近在工作中遇到了套打的需求,前前后后,花了不少时间,现在总结一下套打的实现方式。 一、设计思路 1、将待打印的文档扫描生成图片,作为网页的背景图片。 2、通过css将待打印的文字进行定位 3、使用jatoolsPrinter插件打印已定位好的网页信息。 二、设计实现 1、下载…

【编译原理】【C语言】实验一:手动构造词法分析器

C语言 实验环境&#xff1a;Visual Studio 2019 author&#xff1a;zoxiii 词法分析器 1、实验内容2、前期准备2.1 待分析的C语言子集的词法2.2 C语言子集的单词符号表示表2.3 C语言子集对应的状态转换图 3、分析过程3.1 词法分析子程序3.2 主程序3.3 源代码 4、测试5、遇到的问…

编译原理实验(1) 开发环境的安装与配置

flex词法分析器的安装与配置 版本&#xff1a;使用的Flex分析器版本为2.5.4。 下载并使用安装程序安装。 进行环境变量的设置&#xff1a; 此电脑–右键–属性–高级系统设置–环境变量 在系统变量中找到PATH&#xff0c;将flex安装后的bin目录加入PATH&#xff1b; 找到CLA…

Eclipse:使用Eclipse创建一个Java小练习项目

1、创建工程 就是说现在创建的工程是符合java的工程&#xff0c;而我们创建的是JAVAEE的工程&#xff0c;要不要使用java的透视图&#xff0c;这里选择 NO:https://blog.csdn.net/weixin_63610637/article/details/125099915?spm1001.2014.3001.5501http://这里选择yes的&…

反垃圾邮件网关工作原理-Coremail带你了解杰创智能如何使用邮件网关安全升级

杰创智能科技股份有限公司&#xff08;以下简称杰创智能)成立于2008年&#xff0c;于2022年在深交所创业板挂牌上市。 公司采用广州、北京双总部运作模式&#xff0c;在全国范围内设立近30家分支机构&#xff0c;业务覆盖全国辐射全球。 随着杰创智能业务的飞速发展&#xff0…

零代码编程:用ChatGPT打造小宇宙播客下载软件2.0

之前用ChatGPT写了一个简单的小宇宙播客下载应用&#xff0c;但是实际使用一段时间后&#xff0c;发现有几个问题&#xff0c;比如&#xff1a;如果文件名中有一些特殊符号&#xff0c;下载不成功&#xff1b;有些m4a格式的也下载不成功&#xff1b;文件大下载的慢&#xff1b;…

零代码编程:用ChatGPT批量下载播客音频文件

国外有很多优质的播客podcast资源&#xff0c;且都是可以免费下载的。 比如&#xff0c;我们想下载ChatGPT相关的播客。可以先打开播客搜索网站&#xff1a;https://podnews.net/ 在搜索框里面输入&#xff1a;ChatGPT&#xff0c;上面是stories&#xff0c;往下拉一下&#x…

流量玩家必看,微信问一问轻松获取200+引流秘籍

最近&#xff0c;微信推出了全新的“问一问”功能&#xff0c;为流量玩家带来了巨大的流量红利。这一新的流量入口势必成为流量玩家们追逐的热门目标。 “问一问”可以被视为一个问答型平台&#xff0c;可以简单理解为“微信版的知乎”。熟悉在知乎上进行问答引流的人都知道&am…

DNSPod十问林洪祥:顶级带货主播,其实是数字人?

本期嘉宾 林洪祥 风平智能CEO 林洪祥&#xff0c;风平智能CEO。风平智能拥有全球领先的数字人AIGC预训练大模型技术&#xff0c;利用数字人AI知识大模型打造视频版ChatGPT&#xff0c;实现数字人名师、数字人医生、数字人保险客服、数字广告模特、数字人AI直播等&#xff0c;…

chatgpt赋能python:Python机器学习手册

Python机器学习手册 介绍 Python机器学习手册提供了从数据预处理到深度学习的全面指南。本手册适合有一定Python编程经验的工程师和数据科学家。 数据预处理 数据预处理是机器学习流程的重要一步&#xff0c;包括数据清洗、特征选择和数据转换等。Python提供了很多数据预处…

机器学习复习(下)

严正声明&#xff1a;本文的答案是ChatGPT的回答&#xff0c;仅供参考&#xff0c;不代表就是正确答案&#xff01;&#xff01;&#xff01; 9.什么是泛化误差和经验误差&#xff0c;是不是越小越好?为什么? 泛化误差&#xff1a;在“未来”样本上的误差 经验误差&#xff…

【回答问题】ChatGPT上线了!请使用C++语言写一个谷歌 LaMDA模型?

【回答问题】ChatGPT上线了!请使用C++语言写一个谷歌 LaMDA模型? 很高兴为您服务!您可以使用以下 C 语言代码来实现 Google LaMDA 模型: 复制 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX

Edge解决默认Bing搜索跳转到国内版的问题

近期BingGPT申请通过以后&#xff0c;每次用PC端Edge去跳转的时候不管是否念Proxy咒都会进入国内版本Bing&#xff0c;排查得到默认Bing参数如下 因此&#xff0c;在edge://settings/searchEngines内添加搜索引擎&#xff0c;具体参数如下&#xff1a; 搜索引擎&#xff1a;必应…

微软Bing突然爆炸级更新!BingChat全面开放,下一代搜索要来啦!

夕小瑶科技说 分享 来源 | 量子位 作者 | 杨净 明敏 所有人都能上手微软Bing了&#xff01; 今天&#xff0c;微软突然官宣全面开放BingChat&#xff1a; 无需任何等待。只需注册一个账户&#xff0c;首页即可体验。 更关键的是&#xff0c;还有一大堆堪称“家底”的新功能来…

ChatGPT 让 Python 爬虫再次伟大!

ChatGPT 的爆火改变了很多东西&#xff0c;就与多年前移动互联网的普及一样&#xff0c;我们正处于 AI 改变世界的前夜。 在 OpenAI 为其推出了 GPT-4 语言模型后&#xff0c;ChatGPT 的回答准确性有了极大提高&#xff0c;也具备了更高水平的识图能力&#xff0c;这让 ChatGPT…

程序员离开上海回农村会后悔吗?年薪50万,存款180万,想回老家建别墅,搞自媒体,过田园生活!

现代版的“归园田居”什么样&#xff1f; 来看一位网友的案例&#xff1a;想离开上海回农村建个别墅&#xff0c;会后悔吗&#xff1f; 1.想回去的原因&#xff1a;和老公在上海八年&#xff0c;觉得日子真没意思&#xff0c;我们都喜欢田园生活&#xff0c;互联网也不可能有…

花几万元报IT培训班,只为进入互联网大厂:有人年薪百万,有人黯然退场

俗话说&#xff0c;英雄不问出处。但在职场中&#xff0c;“出处”却是一个敏感的话题&#xff0c;是否拥有高学历、大厂背景&#xff0c;是否是科班出身&#xff0c;这些都是招聘方会考虑的重要因素。 程序员千千万万&#xff0c;出身也是五花八门&#xff0c;有人是985高校计…

AIGC热门技术岗平均年薪超百万,脉脉林凡认为白领可能先于蓝领失业

3月&#xff0c;国内外AIGC新品相继发布引发热议&#xff0c;AIGC的人才需求也更加旺盛。脉脉高聘人才智库近期发布《2023 AIGC人才趋势报告》&#xff0c;数据显示&#xff0c;AIGC人才供需结构性失衡&#xff0c;热招岗位偏技术岗位&#xff0c;以算法工程师、自然语言处理、…

一位失业的P9,以及他的四页半简历

前几天在脉脉上看到一个热帖&#xff0c;是刚从PDD毕业的P9级别员工吴可发的&#xff0c;同时附上了他的简历&#xff0c;这个简历很有意思&#xff0c;基本上和国内互联网这十多年来的发展步骤重叠&#xff0c;能够反映出&#xff0c;在这样一个跌宕起伏的时代里&#xff0c;个…

程序员想要年薪五十万,需要付出多少努力?

关 &#x1f381;福利&#x1f381; 全网最全《Python学习资料》免费赠送&#x1f193;&#xff01; 最近火热ChatGPT 等人工智能应用对 Python 编程语言产生了积极的影响&#xff0c;它推动了 Python 的普及和发展&#xff0c;在文本处理和 NLP 领域提升了 Python 的地位&…