本地安装部署运行 ChatGLM-6B 的常见问题解答以及后续优化

article/2025/11/10 13:05:00

报错 No module named ‘transformers_modules.THUDM/chatglm-6b’

报错本身的意思是,没有在指定的路径THUDM/chatglm-6b找到推理用模型
一般常见于自己手动下载模型,而不是通过下边这些文件直接启动,自动下载的情况
你需要修改web_demo.pyweb_demo.pyold_web_demo2.pycli_demo.pyapi.py等文件中涉及模型路径部分的代码,一般在文件的开头或者结尾附近。

    tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()

将里面的"THUDM/chatglm-6b"改成实际模型存放路径名称即可,注意反斜杠问题

注意win系统下子文件夹的路径应该写成\"THUDM\chatglm-6b"), 原代码写的是linux文件系统用的/ ("THUDM/chatglm-6b")。

报错 not enough memory: you tried to allocate 123456789 bytes.

内存不足,显存不足,最简单就是换个更好的电脑吧,或者看后面ChatGLM-6B 减少显存与内存占用部分内容。

报错 AssertionError: Torch not compiled with CUDA enabled

原因是 你试图用GPU跑,但是你安装的 Torch 不支持CUDA,是仅支持CPU的版本

先执行命令:

python -c "import torch; print(torch.cuda.is_available())"

如果返回的是False,说明安装的PyTorch不支持CUDA,是仅支持CPU的,需要执行了下面的命令安装支持cuda的版本:

pip install torch==2.0.0+cu117 torchvision==0.15.1+cu117 -f https://download.pytorch.org/whl/cu117/torch_stable.html

其中里面的3处 cu117 需要根据你自己的CUDA版本修改

命令行执行nvidia-smi,命令,看下自己显卡支持的 CUDA版本(比如我这里是11.7)

ChatGLM-6B 减少显存与内存占用

全量模型运行加载 GPU运行模式下需要13GB显存+14G内存,CPU运行模式下需要28GB内存,如果你电脑没这么大显存或者内存,可以通过加载量化模型减少显存与内存占用

ChatGLM-6B 加载量化模型

加载量化模型运行,其实就是用性能的下降换硬件配置需求的下降,量化模型的运行速度会低于全量模型。ChatGLM-6B 在 4-bit 量化下仍然能够进行还算自然流畅的生成。

本地将全量模型转化为量化模型加载

优点嘛,你只需要下载一个全量模型,就可以自己选加载全量,INT4还是INT8
缺点是,量化过程需要在内存中首先加载 FP16 格式的模型,会消耗大概 13GB 的内存。
你电脑要是16GB内存,可能就不能同时运行太多其他程序了

你需要修改web_demo.pyweb_demo.pyold_web_demo2.pycli_demo.pyapi.py等文件中涉及模型部分的代码,一般在文件的开头或者结尾附近。(你需要那个文件就改哪个文件,不需要全改)

#原始代码
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
#INT4量化 显卡GPU加载
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).quantize(4).half().cuda()
  • 全量模型多轮对话后,大概需要14~15GB显存,IN8多轮对话后大概需要10GB显存,INT4多轮对话后大概需要6~7G显存
  • 量化过程需要在内存中首先加载 FP16 格式的模型,消耗大概 13GB 的内存。如果你的内存不足的话,可以看下一步直接加载量化后的模型

直接加载量化模型

如果你电脑内存实在捉襟见肘的话,可以选择直接使用现成的INT4量化模型,这样内存中只需要占用5.5GB左右了,使用GPU运行时,8G内存的电脑也可以一战了,使用CPU运行时,可以允许24GB甚至16GB内存的电脑运行,显著降低运行配置。

CPU运行量化模型需要安装GCC与openmp,多数 Linux 发行版默认已安装。对于 Windows ,可在安装 TDM-GCC 时勾选 openmp(你不一定非要用TDM-GCC,用MinGW-w64也可以的,主要是记得装openmp)。

#下载模型放在chatglm-6b-int4文件夹内
git clone -b int4 https://huggingface.co/THUDM/chatglm-6b.git chatglm-6b-int4

然后修改相关代码
你需要修改web_demo.pyweb_demo.pyold_web_demo2.pycli_demo.pyapi.py等文件中涉及模型部分的代码,一般在文件的开头或者结尾附近。(你需要哪个文件就改那个文件,不需要全改)

#原始代码
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
#INT4量化 显卡GPU加载
tokenizer = AutoTokenizer.from_pretrained("chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("chatglm-6b-int4", trust_remote_code=True).quantize(4).half().cuda()
#INT4量化 处理器CPU加载
tokenizer = AutoTokenizer.from_pretrained("chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("chatglm-6b-int4",trust_remote_code=True).float()

注意这里我改了"THUDM/chatglm-6b"是因为我上边下载INT4的命令,指定下载到chatglm-6b-int4文件夹中,如果你改动了代码,请根据你自己的实际情况修改对应部分。

ChatGLM-6B 优化多轮对话后的内存/显存占用大,解决爆显存问题

通过修改代码,减少多轮后的返回对话数量,简单粗暴的解决问题,下边以web_demo_old.py为例,其他文件可以参照修改

修改代码,只保留最近3~4轮对话的内容

很简单粗暴的方式,不然有时候,很容易在进行到5~6轮对话就炸显存了

from transformers import AutoModel, AutoTokenizer
import gradio as grtokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval()MAX_TURNS = 20
MAX_BOXES = MAX_TURNS * 2def predict(input, max_length, top_p, temperature, history=None):if history is None:history = []for response, history in model.stream_chat(tokenizer, input, history, max_length=max_length, top_p=top_p,temperature=temperature):updates = []for query, response in history:updates.append(gr.update(visible=True, value="用户:" + query))updates.append(gr.update(visible=True, value="ChatGLM-6B:" + response))if len(updates) < MAX_BOXES:updates = updates + [gr.Textbox.update(visible=False)] * (MAX_BOXES - len(updates))yield [history] + updates

原始代码如上,请把第15行修改为这样的

for response, history in model.stream_chat(tokenizer, input,  max_length=max_length, top_p=top_p, temperature=temperature, history=(history if len(history) <= 3 else history[-3:])):
  • 历史对话轮数小于等于3(<= 3)那么直接返回history的内容
  • 否则返回最后3轮的内容(history[-3:]
  • 如有需要请自己改这两个数字

修改代码,只保留第一条,第二条,以及最近3轮对话

很多本地部署用户都有将 ChatGLM-6B 先设定人设,进而接入vits、智能音响、物联网设备等,而第一句话和第二句话通常用于树立和补充人设,是非常重要的,需要保留。

from transformers import AutoModel, AutoTokenizer
import gradio as grtokenizer = AutoTokenizer.from_pretrained("chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("chatglm-6b", trust_remote_code=True).float()
model = model.eval()MAX_TURNS = 20
MAX_BOXES = MAX_TURNS * 2first_ans = ('','')
second_ans = ('','')def predict(input, max_length, top_p, temperature, history=None):global first_ansglobal second_ansif history is None:history = []for response, history in model.stream_chat(tokenizer, input, max_length=max_length, top_p=top_p,temperature=temperature, history=(history if len(history) <= 4 else [first_ans] + [second_ans] + history[-3:])):if len(history) <= 1 :first_ans = history[0]if len(history) <= 2 and len(history) > 1 :second_ans = history[1]updates = []for query, response in history:updates.append(gr.update(visible=True, value="用户:" + query))updates.append(gr.update(visible=True, value="ChatGLM-6B:" + response))if len(updates) < MAX_BOXES:updates = updates + [gr.Textbox.update(visible=False)] * (MAX_BOXES - len(updates))yield [history] + updates
  • 第11和第12行为新增,意思是:搞一个分别名为first_ans与second_ans的全局变量,并把他们置空
  • 第15和第16行为新增,意思是:在函数内部声明first_ans与second_ans这两个全局变量,这样才能在函数predict中对它们进行修改,并且在函数外部也可以使用修改后的值。
  • 第20行为对原始代码第15行的修改,意思是:
    • 如果对话轮数小于等于4轮(<= 4),那么直接返回history的内容
    • 如果对话轮数大于4轮,那么将first_ans储存的第一句对话和second_ans储存的第二轮对话,拼接在最后3轮对话(history[-3:])前返回给history
  • 第21~24行为新增,意思是:判断对话轮数,在正确的轮数,保存对应的对话在全局变量first_ans和second_ans中。

ChatGLM-6B 的推理参数含义

Maximum length 参数

通常用于限制输入序列的最大长度,因为 ChatGLM-6B 是2048长度推理的,一般这个保持默认就行
太大可能会导致性能下降

Top P 参数

Top P 参数是指在生成文本等任务中,选择可能性最高的前P个词的概率累加和。这个参数被称为Top P,也称为Nucleus Sampling。
例如,如果将Top P参数设置为0.7,那么模型会选择可能性排名超过70%的词进行采样。这样可以保证生成的文本准确性较高,但可能会缺乏多样性。相反,如果将Top P参数设置为0.3,则会选择可能性超过30%的词进行采样,这可能会导致生成文本的准确性下降,但能够更好地增加多样性。

Temperature 参数

Temperature参数通常用于调整softmax函数的输出,用于增加或减少模型对不同类别的置信度。
具体来说,softmax函数将模型对每个类别的预测转换为概率分布。Temperature参数可以看作是一个缩放因子,它可以增加或减少softmax函数输出中每个类别的置信度。
比如将 Temperature 设置为 0.05 和 0.95 的主要区别在于,T=0.05 会使得模型更加自信,更加倾向于选择概率最大的类别作为输出,而 T=0.95 会使得模型更加不确定,更加倾向于输出多个类别的概率值较大。

ChatGLM-6B 其他设置

ChatGLM-6B 开启网页远程分享

可以让个人电脑部署的网页端,在互联网上也可以远程访问。

你需要修改web_demo.pyweb_demo.pyold_web_demo2.py等文件中涉及网络部分的代码,一般在文件结尾附近。(你需要哪个文件就改那个文件,不需要全改)

一般类似于demo.queue().launch(share=False, inbrowser=True)
share=False改成share=True
会得到一个 Gradio 服务器转发地址,就可以远程访问了,注意由于国内 Gradio 的网络访问较为缓慢,导致网页端的打字机体验大幅下降

ChatGLM-6B 开启局域网访问/开启公网访问

如果你的机器本身有公网,或者想在局域网内其他设备访问

你需要修改web_demo.pyweb_demo.pyold_web_demo2.py等文件中涉及网络部分的代码,一般在文件结尾附近。(你需要哪个文件就改那个文件,不需要全改)

一般类似于demo.queue().launch(share=False, inbrowser=True)
修改为demo.queue().launch(share=False, inbrowser=True, server_name='0.0.0.0', server_port=8070)
这将在所有可用的网络端口开放8070端口号,并且不启用Gradio 服务器转发。

ChatGLM-6B 修改本地网页端口号

因为默认是127.0.0.1:7860嘛,可能会和其他本地程序冲突

你需要修改web_demo.pyweb_demo.pyold_web_demo2.py等文件中涉及网络部分的代码,一般在文件结尾附近。(你需要哪个文件就改那个文件,不需要全改)

一般类似于demo.queue().launch(share=False, inbrowser=True)
修改为demo.queue().launch(share=False, inbrowser=True, port=7870)
这样端口就变成7870了。

后续调试

  • 减少爆显存问题
  • 解决对话超过10~20轮后开始大量复读的问题
  • 研究微调模型,自行输入数据集,训练情感支持对话机器人?


http://chatgpt.dhexx.cn/article/wUTBgAXV.shtml

相关文章

经实测利用POSTMAN根本无法进行并发测试,大家不要再被一些搬运工给误导了

关于利用postman进行并发测试&#xff0c;是错误的。postman发送的请求是串行发送的 以下为我的实测记录 一、先上我测试的接口代码&#xff0c;就是一个redis的tryLock分布式锁的获取&#xff0c;接口在获取到锁后&#xff0c;线程sleep了5秒&#xff0c;此时线程是不释放锁…

导致香港服务器运行不稳定的因素有哪些?

现如今&#xff0c;很多用户都喜欢租用香港服务器来建设网站&#xff0c;大家都知道&#xff0c;香港服务器所在的机房距离大陆是很近的&#xff0c;因此大陆访问速度也自然比较快&#xff0c;大可不必担心访问速度。可是&#xff0c;有许多用户在试用香港服务器的时候&#xf…

第三方接口开发(短信验证码)

第三方接口开发&#xff08;短信验证码&#xff09; ① 打开百度的API Store(API仓库)&#xff0c;网址&#xff1a;http://apistore.baidu.com/&#xff0c;找到一下接口&#xff1a; ② 分析凯信通接口API 分析可知&#xff0c;短信接口是使用GET请求进行发送的&#xff0…

什么是短信平台api接口?

自从人类诞生了手机&#xff0c;短信便随之而来&#xff0c;虽然后来有了更多的即时通信工具&#xff0c;如QQ和微信&#xff0c;个人用短信的机会已经很少了&#xff0c;但是对于企业公司来说&#xff0c;短信一直是非常方便的信息传递工具。 那些带有营销性质的企业和商家会通…

微信第三方平台开发接入

微信第三方平台开发接入 授权流程接入步骤如下&#xff1a;&#xff08; 微信https://open.weixin.qq.com/cgi-bin/showdocument?actiondir_list&tresource/res_list&verify1&idopen1453779503&token&langzh_CN&#xff09;1、接收微信服务器推送的comp…

函数计算如何在 AI 浪潮下顺利出圈?

函数计算的价值 每个企业都应该配备一个高效的函数计算平台&#xff0c;无论是直接使用公有云还是因涉及敏感数据而需私有部署&#xff0c;因为函数计算能为企业显著节省巨额成本&#xff0c;极大地提高业务更新迭代速度&#xff0c;助力企业更快发展。 -传统方式函数计算价值应…

关于利用postman来模拟并发请求

结论 先上结论&#xff1a;按csdn的一些博客的操作方式&#xff0c;创建文件中&#xff0c;创建请求&#xff0c;然后去模拟并发 &#xff0c;是不管用的&#xff0c;也就是说&#xff08;也有可能是我没找到正确方式&#xff09; 代码 利用jmeter 进行相同的并发测试

Google人工智能面试·真·题(附参考答案+攻略)

安妮 栗子 发自 泽浩寺量子位 出品 | 公众号 QbitAI 可能每个程序猿&#xff0c;都想过加入Google。 然而想要“应试”成功&#xff0c;考验的不仅仅是开发人员的编程技术&#xff0c;还能侧面考验着参赛者的渠道来源是否广泛、背景力量是否强大、脑洞回路是否清奇…… 不过&am…

人工智能AI面试题分享(含答案)

目前国内人工智能领域正在高速发展&#xff0c;各大企业都在积极布局人工智能技术应用。想要从事人工智能相关工作&#xff0c;不但要了解国内整体的发展方向。而进入企业唯有基础才是最好的敲门砖。人工智能面试题去哪找?今天我从网络采编了一些关于人工智能的面试题。希望对…

【文心一言】什么是文心一言,如何获得内测和使用方法。

文心一言 什么是文心一言怎么获得内测资格接下来就给大家展示一下文学创作商业文案创作数理逻辑推算中文理解多模态生成用python写一个九九乘法表写古诗 前言&#xff1a; &#x1f3e0;个人主页&#xff1a;以山河作礼。 &#x1f4dd;​&#x1f4dd;:本文章是帮助大家了解文…

定制自己的文档问答机器人

近期ChatGPT很火爆&#xff0c;功能很强大&#xff0c;其具有强大的逻辑推理能力和数据背景。但是如果我们想要使用ChatGPT聊一些它没有训练过的知识&#xff0c;或者我们自己的一些数据时&#xff0c;由于ChatGPT没有学习过这些知识&#xff0c;所以回答结果不准确。 下文就介…

SAP宣布推出商业AI:在第四次工业革命时代行稳致远

6月14日&#xff0c;SAP在中国最大规模的顶级盛会——2023 SAP中国峰会召开。1个月前&#xff0c;SAP刚在美国奥兰多召开了它的全球顶级蓝宝石峰会&#xff08;SAPPHIRE NOW&#xff09;。这次&#xff0c;一位中国的老朋友将SAPPHIRE 上最受关注的发布——商业AI&#xff08;S…

GPT-4要革程序员的命?智能开发的理想与现实 | 爱分析调研

“生成式人工智能&#xff08;AIGC&#xff09;将在三年内终结编程。” ——Matt Welsh&#xff0c;前哈佛大学计算机科学教授、Google 工程主管 GPT-4 也许还不完美&#xff0c;但智能开发时代真的来了 美国时间3月14日&#xff0c;OpenAI 正式发布 GPT-4&#xff0c;在 Chat…

中国四大银行正在大规模内测数字货币APP|可凭手机号完成转账

数字货币由央行牵头进行&#xff0c;各家银行此前数月正在就落地场景等进行测试。目前&#xff0c;部分大行内部员工已经开始使用&#xff0c;用于转账、缴费等场景。 “数字货币”在我国落地的脚步声越来越近。 数位国有大行人士表示&#xff0c;正在深圳等地大规模测试数字钱…

模仿中国银行APP

模仿中国银行APP 1. 描述 实现了登录、初始化数据库、取款、存款、查询、改密、转账等功能 使用 LitePal 轻量型数据库 2. 部分效果图展示 | 在这里插入图片描述 | 3. 初始化信息 第几初始化数据库&#xff0c;生成3个账户信息&#xff0c;如下&#xff0c;可用LitePa…

一些好书推荐给大家

推荐一&#xff1a;《荆棘鸟》 作者&#xff1a;[澳]考琳麦卡洛 有一个传说&#xff0c;关于一只鸟&#xff0c;它一生只唱歌一次&#xff0c;比地球上任何其他生物都更甜美。从它离开巢穴开始&#xff0c;它就开始寻找那棵荆棘树&#xff0c;直到找到它想要的东西才肯罢休。…

能帮你提高社交能力的好书推荐

人际交往和社交首先是要有高情商&#xff0c;从这方面来讲我觉得最经典的人际交往书籍应该是《情商必读12篇》。这本书真的是低情商人士和不擅社交者的大救星&#xff0c;即有理论知识又十分实战&#xff0c;再怎么夸它都不为过。 要想在人际交往方面游刃有余&#xff0c;最重要…

好书推荐—《改变千万人生的励志经典》

好书推荐——《改变千万人生的励志经典 》 作  者&#xff1a; 李津 编译出 版 社&#xff1a; 海南出版时间&#xff1a; 2007-11-1编辑推荐如果你有志于成功的话&#xff0c;你就不可以忽略这些经典之作&#xff1b;如果你想做个卓然超群的大人物&#xff0c;你就必须掌握和…

1月好书推荐-8本值得读的好书,让你受益终生

当我们第一遍读一本好书的时候&#xff0c;我们仿佛觉得找到了一个朋友&#xff1b;当我们再一次读这本书的时候&#xff0c;仿佛又和老朋友重逢。——伏尔泰 2018年一下就过去了&#xff0c;是不是后悔没有做一些有意义的事情&#xff0c;比如没有多读几本好书&#xff1f; 2…