win10系统gpu本地部署chatglm3-6b,从0开始安装

 开源地址:

GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型

前言:ChatGLM2与ChatGLM3区别

ChatGLM2与ChatGLM3模型架构是完全一致的,ChatGLM与后继者结构不同。可见ChatGLM3相对于ChatGLM2没有模型架构上的改进。

相对于ChatGLM,ChatGLM2、ChatGLM3模型上的变化:

  1. 词表的大小从ChatGLM的150528缩小为65024 (一个直观的体验是ChatGLM2、3加载比ChatGLM快不少)
  2. 位置编码从每个GLMBlock一份提升为全局一份
  3. SelfAttention之后的前馈网络有不同。ChatGLM用GELU(Gaussian Error Linear Unit)做激活;ChatGLM用Swish-1做激活。而且ChatGLM2、3应该是修正了之前的一个bug,因为GLU(Gated Linear Unit)本质上一半的入参是用来做门控制的,不需要输出到下层,所以ChatGLM2、3看起来前后维度不一致(27392->13696)反而是正确的。

ChatGLM2与ChatGLM区别 

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:

更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。

更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。

更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。

更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。

1、本机安装gpu驱动,cuda,本文选定版本11.8

安装cuda toolkit     CUDA Toolkit Archive | NVIDIA Developer
    
安装cudnn     Log in | NVIDIA Developer (要注册帐号)

2、Anaconda,下载后可以通过这个软件安装一个python==3.10.11的版本

Free Download | Anacondaicon-default.png?t=N7T8https://www.anaconda.com/download或者下载一个pycharm ,用这个装个python环境

PyCharm:JetBrains为专业开发者提供的Python IDEicon-default.png?t=N7T8https://www.jetbrains.com.cn/pycharm/

安装好Python后最好设定一下源! 

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple


 

3,pytorch window版本,选cuda11.8

Start Locally | PyTorchStart Locallyicon-default.png?t=N7T8https://pytorch.org/get-started/locally/

选中后得到安装脚本

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

运行如下图: 

4、环境安装

首先需要下载本仓库:

git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3

然后使用 pip 安装依赖:

pip install -r requirements.txt

5、 下载模型,有两种方法

方法1,可以自定路径,

git lfs install
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git

方法2,使用python代码下载,会下载到c盘C:\Users\用户名\.cache\modelscope\,大约10多个G,对于我C盘只有几十G剩余空间的贫困户来说不推荐。

from modelscope import snapshot_download
model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0")

加个参数local_dir='./model_glm3-6b'

from modelscope import AutoTokenizer, AutoModel, snapshot_download
model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0",local_dir='./model_glm3-6b')

运行模型

from modelscope import AutoTokenizer, AutoModel, snapshot_download
model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0",cache_dir='./model_glm3-6b')
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModel.from_pretrained(model_dir, trust_remote_code=True).half().cuda()
#model = AutoModel.from_pretrained(model_dir, trust_remote_code=True).quantize(4).cuda()
model = model.eval()
# response, history = model.chat(tokenizer, "你好", history=[])
# print(response)
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=[])
print(response)

注意,

  1. .half() 方法:

    • model.half() 将模型的参数类型转换为 16 位浮点数(half-precision floating-point)。这有助于减少模型在内存和显存中的占用空间,同时在支持 GPU 的设备上提高模型推理速度。
    • 16 位浮点数的优势在于,相较于 32 位浮点数,它使用更少的内存,并且在支持混合精度计算的 GPU 上,可以提高计算速度。这样模型点用的显存为6B*2约等于12G
  2. .quantize(4) 方法:

    • model.quantize(4) 是模型的量化操作。这将模型的权重和激活缩放到 4 位整数。量化是一种技术,通过减少模型中参数的表示位数,以减小模型的内存占用和提高推理速度。
    • 4 位整数的量化会带来更高的压缩比,但可能会引入量化误差,因为只有有限的整数可以表示模型的权重和激活。这样模型点用的显存为6B*0.5约等于3G,

 3.quantize(8) 这将模型的参数和激活值量化为 8 位整数。使用 8 位整数相对于 4 位整数来说,具有更高的位宽,因此可以表示更大的范围和更精细的数值,减小了量化误差。8 位整数的量化通常仍然可以显著减小模型的尺寸,同时保留较高的模型精度。 这样模型点用的显存为6B*1约等于6G

我在使用量化时报错Failed to load cpm_kernels:[WinError 267] 目录名称无效。: 'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe' 

当使用quantize(4) 方法时会报错 

blockDim = (min(round_up(m, 32), 1024), 1, 1)
NameError: name 'round_up' is not defined

貌似代码实现有问题,改成quantize(8)就可以了,反正我使用的1080ti用quantize(8)也勉强够用。

上代码,可以运行的两种方式,打开basic_demo目录

改进cli_demo.py

增加

os.environ['MODEL_PATH'] = r'C:\Users\gpu\.cache\modelscope\hub\ZhipuAI\chatglm3-6b'

整体代码

import os
import platform
from transformers import AutoTokenizer, AutoModel
os.environ['MODEL_PATH'] = r'C:\Users\gpu\.cache\modelscope\hub\ZhipuAI\chatglm3-6b'
MODEL_PATH = os.environ.get('MODEL_PATH', 'THUDM/chatglm3-6b')
TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
#model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()
model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True ).quantize(8).cuda()
os_name = platform.system()
clear_command = 'cls' if os_name == 'Windows' else 'clear'
stop_stream = Falsewelcome_prompt = "欢迎使用 ChatGLM3-6B 模型,输入内容即可进行对话,clear 清空对话历史,stop 终止程序"def build_prompt(history):prompt = welcome_promptfor query, response in history:prompt += f"\n\n用户:{query}"prompt += f"\n\nChatGLM3-6B:{response}"return promptdef main():past_key_values, history = None, []global stop_streamprint(welcome_prompt)while True:query = input("\n用户:")if query.strip() == "stop":breakif query.strip() == "clear":past_key_values, history = None, []os.system(clear_command)print(welcome_prompt)continueprint("\nChatGLM:", end="")current_length = 0for response, history, past_key_values in model.stream_chat(tokenizer, query, history=history, top_p=1,temperature=0.01,past_key_values=past_key_values,return_past_key_values=True):if stop_stream:stop_stream = Falsebreakelse:print(response[current_length:], end="", flush=True)current_length = len(response)print("")if __name__ == "__main__":main()

运行 python cli_demo.py 就可以在命令行中愉快使用

打开basic_demo目录

改进web_demo_streamlit.py,也是在头部增加了

os.environ['MODEL_PATH'] = r'C:\Users\gpu\.cache\modelscope\hub\ZhipuAI\chatglm3-6b'
"""
This script is a simple web demo based on Streamlit, showcasing the use of the ChatGLM3-6B model. For a more comprehensive web demo,
it is recommended to use 'composite_demo'.Usage:
- Run the script using Streamlit: `streamlit run web_demo_streamlit.py`
- Adjust the model parameters from the sidebar.
- Enter questions in the chat input box and interact with the ChatGLM3-6B model.Note: Ensure 'streamlit' and 'transformers' libraries are installed and the required model checkpoints are available.
"""import os
import streamlit as st
import torch
from transformers import AutoModel, AutoTokenizer
os.environ['MODEL_PATH'] = r'D:\ChatGLM3\model_glm3-6b\ZhipuAI\chatglm3-6b'
MODEL_PATH = os.environ.get('MODEL_PATH', 'THUDM/chatglm3-6b')
TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)st.set_page_config(page_title="ChatGLM3-6B Streamlit Simple Demo",page_icon=":robot:",layout="wide"
)@st.cache_resource
def get_model():tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)#model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).quantize(8).cuda()return tokenizer, model# 加载Chatglm3的model和tokenizer
tokenizer, model = get_model()if "history" not in st.session_state:st.session_state.history = []
if "past_key_values" not in st.session_state:st.session_state.past_key_values = Nonemax_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.6, step=0.01)buttonClean = st.sidebar.button("清理会话历史", key="clean")
if buttonClean:st.session_state.history = []st.session_state.past_key_values = Noneif torch.cuda.is_available():torch.cuda.empty_cache()st.rerun()for i, message in enumerate(st.session_state.history):if message["role"] == "user":with st.chat_message(name="user", avatar="user"):st.markdown(message["content"])else:with st.chat_message(name="assistant", avatar="assistant"):st.markdown(message["content"])with st.chat_message(name="user", avatar="user"):input_placeholder = st.empty()
with st.chat_message(name="assistant", avatar="assistant"):message_placeholder = st.empty()prompt_text = st.chat_input("请输入您的问题")
if prompt_text:input_placeholder.markdown(prompt_text)history = st.session_state.historypast_key_values = st.session_state.past_key_valuesfor response, history, past_key_values in model.stream_chat(tokenizer,prompt_text,history,past_key_values=past_key_values,max_length=max_length,top_p=top_p,temperature=temperature,return_past_key_values=True,):message_placeholder.markdown(response)st.session_state.history = historyst.session_state.past_key_values = past_key_values

运行这个代码 :

streamlit run web_demo_streamlit.py

(venv) PS D:\ChatGLM3> cd .\basic_demo\
(venv) PS D:\ChatGLM3\basic_demo> streamlit run web_demo_streamlit.py

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://10.10.10.251:8501
 

会出现一个网页(注代码中模型均已使用quantize(8).cuda()量化)

 

另外一个web_demo_gradio.py运行起来有问题,这里就不描述了,运行方法同上,

默认情况下,模型以 FP16 精度加载,运行上述代码需要大概 13GB 显存。如果你的 GPU 显存有限,可以尝试以量化方式加载模型,使用方法如下:

model = AutoModel.from_pretrained("THUDM/chatglm3-6b",trust_remote_code=True).quantize(4).cuda()

模型量化会带来一定的性能损失

CPU 部署

如果你没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。使用方法如下(需要大概 32GB 内存)

model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).float()

 下一步开始进行微调,进入到

.\finetune_chatmodel_demo 目录

在windows下直接安装deepspeed会报错

改为 pip install deepspeed==0.3.16 就没有问题了

原requirement.txt改为

transformers>=4.36.2
deepspeed
datasets>=2.16.0
astunparse>=1.6.3
accelerate>=0.25.0
sentencepiece>=0.1.99

改为

transformers>=4.36.2
deepspeed==0.3.16
datasets>=2.16.0
astunparse>=1.6.3
accelerate>=0.25.0
sentencepiece>=0.1.99

整体成功!

参考文献

ChatGLM、ChatGLM2、ChatGLM3模型架构对比 - 知乎 (zhihu.com)

ChatGLM2-6B、ChatGLM-6B 模型介绍及训练自己数据集,2080TI显卡全流程实战 - 知乎 (zhihu.com) 

 

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

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

相关文章

杨辉三角型打印

注: 利用杨辉三角形可以快速的列出牛顿二项式分解。 如:杨辉三角第6行值是 1 6 15 20 15 6 1 对应的二项式分解就是 ( m n ) 6 m 6 6 m 5 n 15 m 4 n 2 20 m 3 n 3 15 m 2 n 4 6 m n 5 n 6 (mn)^6m^66m^5n15m^4n^220m^3n^315m^2n^46mn^5n^6 (m…

NLP项目之语种识别

目录 1. 代码及解读2. 知识点n-grams仅保留最常见的1000个n-grams。意思是n1000 ? 1. 代码及解读 in_f open(data.csv) lines in_f.readlines() in_f.close() dataset [(line.strip()[:-3], line.strip()[-2:]) for line in lines] print(dataset[:5])[(1 december wereld…

付费进群系统源码带定位完整独立版(12月30日)再次修复首发

搭建教程 nginx1.2 php5.6–7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库(shujuku.sql) 第三步修改/config/database.php里面的数据库地址 第四步修改/config/extra/ip.php里面的域名 第四步设置伪静态thinkphp 总后台账号&…

2023年度个人总结

现在是北京时间2023年12月31日 下午17:13,再有不到7个小时就要迈入2024年。回望2023年真的是一言难尽,苦不堪言,不管是工作上还是生活中都经历了重重困难,肉体和精神上都备受折磨,特别痛苦。2023年是特别的艰辛、痛苦、…

ArkUI中自定义组件的生命周期

文章概叙 本文主要是介绍下在作为page以及component的时候的生命周期,以及调用API等应该在哪个生命周期使用。 书接上回 之前的博客已经结束了对底部栏的操作,现在开始需要关注到具体内容的对接了。 而开发的第一步,我们对页面的生命周期…

探索抖音详情API:塑造未来的媒体交互

一、引言 随着数字媒体的迅猛发展,抖音作为全球领先的短视频平台,其API接口为开发者提供了无尽的创新机会。了解抖音详情API的请求格式与参数,是每位有远见的开发者和媒体策划者的必修课。本文将深入剖析API的内在逻辑与潜力,为您…

Windows 产品历史

Windows 1.0~3.0概述 Windows 3.1及以前版本均为16位系统,因而不能充分利用硬件迅速发展的强大功能。同时,它们只能在MS-DOS上运行,必须与MS-DOS共同管理系统资源,故它们还不是独立的、完整的操作系统。1995年推出的Windows 95已摆脱MS-DOS的…

Vue懒加载深度解析:提升性能、优化用户体验的完整指南

文章目录 🌳引言🌳Vue懒加载基础🌲什么是懒加载?🌲组件级懒加载🌲图片懒加载 🌳懒加载的原理与优势🌲组件懒加载原理🌲图片懒加载原理🌲懒加载的优势 &#x…

最后一次纪念在泰山OFFICE的日子,明年开源量子OFFICE

今天去泰山在无锡的办公地点,给门卫送了一点零食表示感谢。送了之后,我也没进去怀旧,然后就去附近的南山𦹐礼佛求福。 2021年的最后一天,公司举办了迎新活动。看了恍如隔世。我怀念泰山OFFICE,是因为在这里…

上海周边公路骑行路线分享,维乐带你抓住秋天的小尾巴

路线一:松江郊里骑行      在魔都上海,藏着一条自然风景适宜,能眺望黄浦江的美丽骑行路线。导航到华长路杨家角就能到达起点,一路向西,这里路况非常好,只有一条小道,没有汽车的障碍&#xf…

25、WEB攻防——通用漏洞SQL读写注入MYSQLMSSQLPostgreSQL

文章目录 Mysql-root高权限读写注入PostgreSQL——dba高权限读写注入Mssql-sa高权限读写注入 Access无高权限注入点——只能猜解,而且是暴力猜解; MYSQL,PostgreSQL,MSSQL(SQL server)高权限注入点——可升级读写(文件…

学习体系结构 - AArch64 异常模型

学习体系结构 - AArch64 异常模型 Learn the architecture - AArch64 Exception Model version 1.3 根据DeepL翻译 校准 1、Overview AArch64异常模型指南,介绍了Armv8-A和Armv9-A中的异常和特权模型。它涵盖了Arm架构中不同类型的异常以及处理器在处理异常时的行…

12/31

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读:用于密集预测的多路径视觉Transformer1、研究背景2、方法提出3、相关方法3.1、Vision Transformers for dense predictions3.2、C…

GAMES101:作业4记录

文章目录 总览算法编写代码:recursive_bezier()的实现Bezier()函数的实现提高部分:反走样 总览 Bzier 曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实现 de Casteljau 算法来绘制由 4 个控制点表示的 Bzier 曲线 (当你正确实现该算法时,…

一次 irq_fpu_usable 内核报错排查总结

开发了一个内核ko模块async_memory_reclaim_for_cold_file_area(内核版本5.14.0-284.11.1),使用kprobe技术捕捉内核copy_page_to_iter()函数,在里边执行自定义的hot_file_update_file_status()函数,统计文件页page的访问信息,源码…

亚信安慧AntDB数据库两项目分别入选2023“星河”标杆、优秀案例

近日,由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织的第七届大数据“星河(Galaxy)”案例评选结果公示,亚信安慧AntDB数据库两项目入选,其中“基于Ant…

国图公考:研究生可以考选调生吗?

研究生可以报考选调生吗?当然是可以的,但是同样需要满足一定的条件才可以。 除本科生外,具有硕士、博士学位的考生均可申请考试。但是,除了满足应届毕业生的身份,还需要满足年龄限制。一般来说,本科生不超过25岁&…

Kubernetes集群部署Rook Ceph实现文件存储,对象存储,块存储

Kubernetes集群部署Rook Ceph部署Ceph集群 1. Rook Ceph介绍 Rook Ceph是Rook项目中的一个存储方案,专门针对Ceph存储系统进行了优化和封装。Ceph是一个高度可扩展的分布式存储系统,提供了对象存储、块存储和文件系统的功能,广泛应用于提供…

FTP简介FTP服务器的搭建【虚拟机版】以及计算机端口的介绍

目录 一. FTP简介 二. FTP服务器的搭建【虚拟机Windows2012版】 1. 启用防火墙 2. 打开服务器管理器➡工具➡计算机管理 3. 选择本地用户与组➡新建组 4. 给组命名,输入描述,点击创建 5. 新建用户,设置用户名称,添加描述&a…

传感器原理与应用复习--光电式与半导体式传感器

文章目录 上一篇光电传感器光电器件 光纤传感器光纤传感器的工作原理及组成 半导体传感器下一篇 上一篇 传感器原理与应用复习–磁电式与霍尔传感器 光电传感器 光电器件 每个光子的能量为 E h v E hv Ehv h为普朗克常数 6.626 ∗ 1 0 − 34 ( J / s ) 6.626 * 10^{-…