ChatGLM:清华开源本地部署(2023/05/06更新)

news/2025/1/12 13:44:52/

文章首发及后续更新:https://mwhls.top/4500.html,无图/无目录/格式错误/更多相关请至首发页查看。
新的更新内容请到mwhls.top查看。
欢迎提出任何疑问及批评,非常感谢!

服务部署汇总

本来这篇是为了打比赛写的,写着写着发现两个问题,AI部署连续几篇,等我比赛打完再发模型都不知道更新到哪个版本了。所以就直接发了。题图随便放个,我之后部属个文生图让它生成个。嘻嘻,蹭个热度
有问题推荐去 GitHub Issue,当然评论问我也行。

2023/05/06更新:增加 API 调用及

ChatGLM

清华开源大模型-ChatGLM-2023/04/29

  • ChatGLM_GitHub:THUDM/GLM: GLM (General Language Model)
  • ChatGLM-6B_GitHub:THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型
  • 联系作者或可商用:关于ChatGLM模型的商用 · Issue #799 · THUDM/ChatGLM-6B

ChatGLM-6B 环境配置及启动-2023/04/29

  1. GitHub 官方教程
  2. 创建虚拟环境:conda create --name ChatGLM python=3.8
  3. 进入虚拟环境:conda activate ChatGLM
  4. 下载源码:https://github.com/THUDM/ChatGLM-6B/archive/refs/heads/main.zip
  5. 进入该目录,安装依赖:pip install -r requirements.txt
  6. 安装 Torch:conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch
  • 这是我环境可以用的,不会的可以百度 PyTorch 安装。
  1. 下载模型
  • 注:我下载的是int8量化的。
  • 清华云
    • 这里会缺少文件,下载后还要在HuggingFace里下载除了最大文件以外的所有文件(有一个重复,无需下载)。
  • HuggingFace
  1. 文件修改:修改 web_demo.py 文件的开头几行如下,pretrain_path指的是模型文件夹的绝对路径。
  2. 运行 web_demo.py,成功
pretrain_path = r"F:\0_DATA\1_DATA\CODE\PYTHON\202304_RJB_C4\ChatGLM\chatglm-6b-int8"
tokenizer = AutoTokenizer.from_pretrained(pretrain_path, trust_remote_code=True)
model = AutoModel.from_pretrained(pretrain_path, trust_remote_code=True).half().cuda()

ChatGLM Web demo 源码阅读-2023/04/30

  • 涉及猜想,因为可以试错,所以有的地方可能不准确。
  • 小加了两个模式,一个精准一个创造性,类似New Bing。
from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html
import ospretrain_path = "chatglm-6b-int8"
pretrain_path = os.path.abspath(pretrain_path)
tokenizer = AutoTokenizer.from_pretrained(pretrain_path, trust_remote_code=True)
model = AutoModel.from_pretrained(pretrain_path, trust_remote_code=True).half().cuda()
model = model.eval()"""Override Chatbot.postprocess"""# 原来self还可以这样用,学习了
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 parse_text(text):# markdown代码转html,我猜我博客的插件也是这样"""copy from https://github.com/GaiZhenbiao/ChuanhuChatGPT/"""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("`", "\`")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 text# def set_mode(temperatrue_value, top_p_value):
#     return gr.Slider.update(value=temperatrue_value), gr.update(value=top_p_value)def set_mode(radio_mode):# 不理解,为什么点击按钮就不能传过去,用这玩意就可以传mode = {"创造性":  [0.95, 0.7], "精准": [0.01, 0.01]}return gr.Slider.update(value=mode[radio_mode][0]), gr.update(value=mode[radio_mode][1])def predict(input, chatbot, max_length, top_p, temperature, history):# 新增一项chatbot.append((parse_text(input), ""))for response, history in model.stream_chat(tokenizer, input, history, max_length=max_length, top_p=top_p,temperature=temperature):# 新增的那项修改为推理结果chatbot[-1] = (parse_text(input), parse_text(response))       yield chatbot, historydef reset_user_input():return gr.update(value='')def reset_state():return [], []with gr.Blocks() as demo:gr.HTML("""<h1 align="center">ChatGLM</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):with gr.Row():# with gr.Column():#     button_accuracy_mode = gr.Button("精准")# with gr.Column():#     button_creative_mode = gr.Button("创造性")radio_mode = gr.Radio(label="对话模式", choices=["精准", "创造性"], show_label=False)# 靠右的四个输入emptyBtn = gr.Button("清除历史")max_length = gr.Slider(0, 4096, value=2048, step=1.0, label="Maximum length", interactive=True)top_p = gr.Slider(0, 1, value=0.7, 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([])# 按钮点击后,执行predict,并将第二个参数[...]传给predict,将predict结果传给第三个参数[...]submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history], [chatbot, history], show_progress=True)submitBtn.click(reset_user_input, [], [user_input])# 将reset_state的结果传给outputsemptyBtn.click(reset_state, outputs=[chatbot, history], show_progress=True)radio_mode.change(set_mode, radio_mode, [temperature, top_p])# button_accuracy_mode.click(set_mode, [0.95, 0.7], outputs=[temperature, top_p])# button_creative_mode.click(set_mode, [0.01, 0.01], outputs=[temperature, top_p])# 这玩意debug不会用啊
demo.queue().launch(share=False, inbrowser=False)

ChatGLM API 调用-2023/05/05

  • 官方文档:THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型
  • 修改 ChatGLM/api.py :
    • 模型存储位置。
    • 主机地址。
      • 最后一行 host='0.0.0.0'host='localhost'
      • uvicorn.run(app, host='localhost', port=8000, workers=1)
if __name__ == '__main__':pretrain_path = "chatglm-6b-int8"pretrain_path = os.path.abspath(pretrain_path)tokenizer = AutoTokenizer.from_pretrained(pretrain_path, trust_remote_code=True)model = AutoModel.from_pretrained(pretrain_path, trust_remote_code=True).half().cuda()model.eval()uvicorn.run(app, host='localhost', port=8000, workers=1)
  • 使用 python requests 包的调用示例
import requestsurl = "http://localhost:8000"
data = {"prompt": "你好", "history": []}
headers = {'Content-Type': 'application/json'}
response = requests.post(url, json=data, headers=headers)
print(response.text)
  • 实际上我还写了一个专门的类,不过还没开源到 GitHub 上,可能过几天会更新:asd123pwj/asdTools: Simple tools for simple goals

闻达

  • 不会用,下面可以不用看。

介绍-2023/05/02

  • l15y/wenda: 闻达:一个LLM调用平台。为小模型外挂知识库查找和设计自动执行动作,实现不亚于于大模型的生成能力
  • 昨晚看视频的时候发现 GPT 读取本地文档的,发现了 fess 的方案,进而发现了这个闻达库,NB。

懒人包-2023/05/02

  • 作者有提供懒人包,B站也有人做教程,我没用过,没流量,流量全用来下游戏删游戏下游戏删游戏下游戏删游戏下游戏删游戏了。

部署-2023/05/02

  • 考虑到作者都搞懒人包了,手动部署的应该都是自己会的,我就简单说下我的部署操作。
  • 复制example.config.xml作为config.xml,并对应修改。
  • 修改envirment.bat,注释掉懒人包路径,修改自己的python路径,如下,注释掉的我就不放出来了
chcp 65001
title 闻达
set "PYTHON=F:\0_DATA\2_CODE\Anaconda\envs\ChatGLM\python.exe "
:end

我是废物,改用懒人包-2023/05/02

  • 不知道怎么用本地文档搜索和网络搜索,搞不懂搞不懂,又去下了懒人包。
    • 可是为什么还是没有哇。

fess安装-2023/05/02

  • 闻达要安装 fess,但是懒人包好像没有?

  • codelibs/fess: Fess is very powerful and easily deployable Enterprise Search Server. - https://github.com/codelibs/fess - https://github.com/codelibs/fess/releases/tag/fess-14.7.0 - https://github.com/codelibs/fess

  • 安装:Elasticsearch

    • 这玩意好像商用要收费,算了,咱不用闻达了,看看它源码怎么写的算了。心好累。我是废物。

http://www.ppmy.cn/news/85139.html

相关文章

px rem em rpx 区别 用法

任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em16px。那么12px0.75em,10px0.625em。为了简化font-size的换算&#xff0c;需要在css中的body选择器中声明Font-size62.5%&#xff0c;这就使em值变为 16px*62.5%10px, 这样12px1.2em, 10px1em, 也就是说只需要…

spring练习1

1、练习网站案例 1、建好相应的java类 package spring;public class Player {public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getPosit…

Jmeter连接不同类型数据库语法

Jmeter连接不同类型数据库语法 添加&#xff1a;配置原件->JDBC Connection Configuration variable name for created pool&#xff1a;自定义一个线程池变量名database Connection Configuration database URL: 填写数据库ip、端口、dbname等&#xff0c;但是不同数据库…

分享50个AI绘画prompt的关键词,让你的AI绘画更贴近想法

我们在使用AI绘画工具时&#xff0c;最关键的就是prompt,但是我们不能总是拾人牙慧&#xff0c;总是用别人写出的现成的prompt,那样的话&#xff0c;最终画出来的画&#xff0c;也是别人画出来的&#xff0c;并不能完全生成自己想要的效果。所以&#xff0c;我们需要学习编写pr…

20道python面试题,学python的你,快看一下,你会多少

请问Python中列表(list)和元组(tuple)的区别是什么? 答:列表可变(mutable),而元组不可变(immutable)。这意味着创建元组后不能更改其值,而列表可以添加、删除和修改元素。PEP 8是什么? 答:PEP 8是一组Python编程风格和最佳实践指南。其覆盖的主题包括命名规范、空…

数据库+Python----------Python操作MySQL

目录 1.在Python中安装pymysql 2.创建数据 1.连接数据库&#xff0c;创建一个数据库对象 2.开启游标功能&#xff0c;创建游标对象 3.发送指令 获取查询结果集的方法 4.实操 5.注意 不可以&#xff01;&#xff01;&#xff01; 正确写法 6.用户输入数据 3.查询数…

kali安装ARL灯塔过程

&#xff08;一&#xff09;安装docker环境 1、检查是否存在docker环境 docker 2、如果没有docker&#xff0c;就先安装docker apt install docker.io 出现 unable to locate package docker.io这些&#xff0c;这是因为没有跟新 输入跟新命令&#xff1a; apt-get update 在…

Hotbit交易平台停运,百万用户待清退,币圈危机再度蔓延

“币圈”的危机似乎还没有走到尽头。5月22日&#xff0c;加密货币交易平台Hotbit发文宣布&#xff0c;决定从世界标准时间当日4:00停止所有CEX&#xff08;中心化交易所&#xff09;操作&#xff0c;希望所有用户在6月21日4:00之前提取剩余资产。据悉&#xff0c;该平台在其任期…