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

news2024/9/20 22:32:26

报错 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 gr

tokenizer = 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 * 2


def 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 gr

tokenizer = 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 * 2

first_ans = ('','')
second_ans = ('','')

def predict(input, max_length, top_p, temperature, history=None):
    global first_ans
    global second_ans
    if 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://www.coloradmin.cn/o/660029.html

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

相关文章

分层测试终究是大梦一场空?

分层测试分了个寂寞&#xff1f; 分层测试这个风吹了好多年&#xff0c;不分层都不好意思说自己是专业测试。各互联网公司更是对此乐此不疲&#xff0c;测试架构、测试平台&#xff0c;搞了一套又一套&#xff0c;然而。。。 理想总是丰满&#xff0c;现实总是骨干&#xff0…

第十三章 反射操作相关函数

1. 【检测对象是否可被调用】callable()函数 语法参考 callable函数的语法格式如下&#xff1a; callable(object)参数说明&#xff1a; object&#xff1a;对象&#xff1b; 返回值&#xff1a;如果对象可调用返回 True&#xff0c;否则返回 False。 说明&#xff1a;对于…

Python 中print 和return 的区别,你了解吗?

1、print() print()函数的作用是输出数据到控制台,就是打印在你能看到的界面上。 2、return return语句[表达式]退出函数&#xff0c;选择性地向调用方返回一个表达式。不带参数值的return语句返回None。 return作为脚本单独运行时则需要print函数才能显示&#xff0c;但是…

【id:17】【1分】A. DS顺序表--类实现

题目描述 用C语言和类实现顺序表 属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09; 操作包括&#xff1a;创建、插入、删除、查找 类定义参考 输入 第1行先输入n表示有n个数据&#xff0c;即n是实际长度&#xff1b;接着输入n个数据 第2行输…

c语言项目——三子棋小游戏(带详细讲解解析)

1.三子棋是什么&#xff1f; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利&#xff0c;而对方就算输了&#xff0c;但是…

【MySQL 索引、事务与存储引擎】

目录 一、索引的介绍2、索引的作用3、创建索引的原刚依据&#xff08;面试题&#xff09; 二、索引的分类和创建1、普通索引2、唯一索引3、主键索引4、组合索引5、全文索引6、查看索引7、删除索引8、分析是否使用索引 三、MySQL事务介绍1、事务的ACID特性2、隔离性 --- 不一致的…

Linux编译器gcc/g++

文章目录 Liinux编译器gcc/g1.背景知识(程序的翻译)2.动态库、静态库 Liinux编译器gcc/g 1.背景知识(程序的翻译) 以gcc编译 以g编译&#xff0c;但是此时会发现没有g这个指令&#xff0c;所有需要安装它&#xff0c;安装指令 yum install gcc gcc-c gcc和g都会形成可执行文…

TransFusion:利用 Transformer 进行鲁棒性融合来进行 3D 目标检测

Query 初始化 Input-dependent 以往 Query 位置是随机生成或学习作为网络参数的&#xff0c;而与输入数据无关&#xff0c;因此需要额外的阶段&#xff08;解码器层&#xff09;来学习模型向真实对象中心移动的过程。 论文提出了一种基于center heatmap 的 input-dependent 初…

在 Python 中使用令牌进行 API 调用

文章目录 在 Python 中进行不带令牌的 API 调用在 Python 中使用令牌调用 API总结 当我们第一次遇到如何在 Python 中调用 API 的问题时&#xff0c;我们的第一个想法是&#xff0c;“什么是 API&#xff1f;”。 API是应用程序编程接口的首字母缩写&#xff1b; 它允许您访问…

【面试】Java并发编程

ThreadLocal ThreadLocal 为什么会导致内存泄漏 hreadLocalMap使用ThreadLocal的弱引用作为key&#xff0c;如果一个ThreadLocal不存在外部强引用时&#xff0c;Key(ThreadLocal)势必会被GC回收&#xff0c;这样就会导致ThreadLocalMap中key为null&#xff0c; 而value还存在着…

15-ajax、实现过程、封装

定义 &#x1f37f;&#x1f37f;&#x1f37f;Async Javascript and XML 异步的JavaScript 和XML&#xff0c;是一种创建交互式网页应用的网页开发技术&#xff0c;可以在不重新加载整个网页的情况下&#xff0c;与服务器交换数据&#xff0c;并且更新部分网页 离不开 XMLH…

【C语言】万字教学,带你分步实现扫雷游戏(内含递归函数解析),剑指扫雷,一篇足矣

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 带你轻松玩转扫雷游戏 前言一. 扫雷游戏的介绍以及内部需要实现的功能解析1.什么是扫雷游戏2.扫雷游戏所需的几个步骤 二.扫雷游戏的具体实现1.打印菜单菜单上的选择功能 2.初始化以及打印棋盘初始化函数InitBoard打印棋…

如何使用测试驱动开发(TDD)来实现100%的测试覆盖率?

本文以 DDM 为例&#xff0c;简单地介绍一下如何用测试驱动开发(TDD, Test-Driven Development)的方法来驱动出这个函数库。 本文以DDM为例&#xff0c;简单地介绍一下如何用测试驱动开发&#xff08;TDD, Test-Driven Development)的方法来驱动出这个函数库。 DDM简介 DDM是…

vue-cli3的安装和项目创建

一 vue-cli3的安装 &#xff08;注意&#xff1a;vue-cli3在安装之前&#xff0c;需要先删除旧版本&#xff0c;即vue-cli2&#xff09; cnpm i -g vue/cli vue-cli3的卸载&#xff1a;cnpm uninstall -g vue/cli 然后用命令“vue -V”查看是否删除vue&#xff0c;如果没有删…

kafka原理架构深入

目录 1. 下载安装2. 命令行命令3. 概述3.1 定义3.2 基本架构 4. 架构深入4.1 生产者4.1.1 分区4.1.2 数据可靠性保证4.1.3 Exactly Once语义4.1.4 发送消息流程 4.2 broker4.2.1 日志结构4.2.2 存储策略4.2.3 Controller & ZooKeeper4.2.4 高效读写数据 4.3 消费者4.3.1 消…

模型-视图-控制器模式(MVC模式,10种常见体系架构模式之一)

、简介&#xff1a; 架构模式是一个通用的、可重用的解决方案&#xff0c;用于在给定上下文中的软件体系结构中经常出现的问题。架构模式与软件设计模式类似&#xff0c;但具有更广泛的范围。 模型-视图-控制器模式&#xff0c;也称为MVC模式。是软件工程中的一种软件架构模式&…

Word模板引擎poi-tl

文章目录 ◆ 方案对比◆ 版本◆ 特性◆ 模板◆ 数据◆ 输出◆ 数据模型◆ 标签1. 文本2. 图片3. 表格4. 列表5. 嵌套6. 区块对 ◆ SpingEL2. 单系列图标3. 多系列图标4. 组合图表 ◆ 配置1. 标签前后缀2. 标签类型3. 标签匹配值4. 标签值计算5. SpringEL6. 数据模型序列化7. 错…

设计模式之抽象工厂笔记

设计模式之抽象工厂模式笔记 说明Abstract Factory(抽象工厂)目录UML抽象工厂示例类图甜品抽象类甜品提拉米苏类甜品抹茶慕斯类 咖啡抽象类美式咖啡类拿铁咖啡类 甜品工厂接口美式风味的甜品工厂意大利风味的甜品工厂 测试类模式扩展 说明 记录下学习设计模式-抽象工厂模式的写…

吴恩达471机器学习入门课程3第1周——K-means

K-means 聚类 1 - 实现 K-means1.1 找到最近的质心练习11.2 计算质心均值练习2 2 - K-means在样本数据集上的应用3 - 随机初始化4 - K-means图像压缩4.1 数据集可视化处理数据 4.2图像像素上的 K-mean4.3 压缩图片 实现 K-means 算法&#xff0c;并将其用于图像压缩。 您将从一…

Autoware 跑 Demo(踩坑指南)

Autoware 跑 Demo&#xff08;踩坑指南&#xff09; 网上的博客和官方的教程&#xff0c;几乎都是一样的&#xff0c;但实际上跑不起来 Autoware 1.12学习整理–01–运行rosbag示例 Autoware入门学习&#xff08;三&#xff09;——Autoware软件功能使用介绍&#xff08;1/3&a…