手把手教你本地CPU环境部署清华大模型ChatGLM-6B,利用量化模型,本地即可开始智能聊天,达到ChatGPT的80%

news2024/11/25 12:55:54

大家好,我是微学AI,今天教你们本地CPU环境部署清华大ChatGLM-6B模型,利用量化模型,每个人都能跑动大模型。ChatGLM-6B是一款出色的中英双语对话模型,拥有超过62亿个参数,可高效地处理日常对话场景。与GLM-130B模型相比,ChatGLM-6B在对话场景处理能力方面表现更加卓越。此外,在使用体验方面,ChatGLM-6B采用了模型量化技术和本地部署技术,为用户提供更加便利和灵活的使用方式。值得一提的是,该模型还能够在单张消费级显卡上顺畅运行,速度较快,是一款非常实用的对话模型。

ChatGLM-6B是清华开发的中文对话大模型的小参数量版本,目前已经开源了,可以单卡部署在个人电脑上,利用 INT4 量化还可以最低部署到 6G 显存的电脑上,在 CPU 也可以运行起来的。

项目地址:mirrors / THUDM / chatglm-6b · GitCode

第1步:下载:

git clone https://gitcode.net/mirrors/THUDM/chatglm-6b.git

第2步:进入ChatGLM-6B-main目录下,安装相关依赖

pip install -r requirements.txt

其中 torch安装CPU版本即可。

第3步:打开ChatGLM-6B-main目录的web_demo.py文件,源代码:

from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html

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()

这个是在GPU版本下的代码,现在改为CPU版本下的代码:

from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).float()
model = model.eval()

模型下载改成THUDM/chatglm-6b-int4,也就是int4量化版本。模型量化到int4是一种将神经网络模型中的参数从浮点数格式调整为4位精度的整数格式的技术,可以显著提高硬件设备的效率和速度,并且适用于需要在低功耗设备上运行的场景。

INT4量化的预训练文件下载地址:https://huggingface.co/THUDM/chatglm-6b-int4/tree/main

 第4步:kernel的编译

CPU版本的安装还需要安装好C/C++的编译环境。这里大家可以安装TDM-GCC。

下载地址:https://jmeubank.github.io/tdm-gcc/,大家选择选取TDM-GCC 10.3.0 release下载安装。特别注意:安装的时候在选项gcc选项下方,勾选openmp,这个很重要,踩过坑,直接安装的话后续会报错。

 安装完在cmd中运行”gcc -v”测试是否成功即可。

安装gcc的目的是为了编译c++文件,quantization_kernels.cquantization_kernels_parallel.c

 quantization_kernels.c文件:

void compress_int4_weight(void *weight, void *out, int n, int m)
{
    for(int i=0;i<n*m;i++)
    {
        (*(unsigned char*)(out)) = ((*(unsigned char*)(weight)) << 4);
        weight += sizeof(char);
        (*(unsigned char*)(out)) |= ((*(unsigned char*)(weight)) & 15);
        weight += sizeof(char);
        out += sizeof(char);
    }
}

void extract_int8_weight_to_float(void *weight, void *scale_list, void *out, int n, int m)
{
	for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            (*(float*)(out + sizeof(float) * (i * m + j))) = (*(float*)(scale_list + sizeof(float) * i)) * (*(char*)(weight + sizeof(char) * (i * m + j)));
}

void extract_int4_weight_to_float(void *weight, void *scale_list, void *out, int n, int m)
{
	for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            (*(float*)(out)) = (*(float*)(scale_list)) * ((*(char*)(weight)) >> 4);
            out += sizeof(float);
            (*(float*)(out)) = (*(float*)(scale_list)) * (((char)((*(unsigned char*)(weight)) << 4))>> 4);
            out += sizeof(float);
            weight += sizeof(char);
        }
        scale_list += sizeof(float);
    }
}

以上C++程序对于每个8位的输入权重值,都会被压缩成一个4位的输出权重值,并存储到指定的输出数组中。这种权重量化方式可以有效减小模型的内存占用,提高模型的推理速度。

 第5步:运行web_demo.py文件

注意如果大家在运行中遇到了错误提示,说明两个文件编译出问题。我们可以手动去编译这两个文件:即在上面下载的D:..\chatglm-6b-int4本地目录下进入cmd,运行两个编译命令:

gcc -fPIC -pthread -fopenmp -std=c99 quantization_kernels.c -shared -o quantization_kernels.so
gcc -fPIC -pthread -fopenmp -std=c99 quantization_kernels_parallel.c -shared -o quantization_kernels_parallel.so

没有报错说明运行成功,目录下看到下面两个新的文件:quantization_kernels_parallel.soquantization_kernels.so。说明编译成功,后面我们手动载入,这里要多加一行代码

model = model.quantize(bits=4, kernel_file="D:..\\chatglm-6b-int4\\quantization_kernels.so")

如果原来代码没有错可以去掉这行。

 第6步:web_demo.py文件运行成功

 出现地址就大功告成了。

 第7步:测试问题

1.鲁迅和周树人是同一个人吗?

ChatGLM的结果:

 ChatGPT的结果:

 2.树上9只鸟,用枪打掉1只,还剩几只?

ChatGLM的结果:

 ChatGPT的结果:

ChatGLM在某些中文问题和常识问题上超过ChatGPT,但是总体上是不如ChatGPT,他在总结任务上,代码编写上不如ChatGPT,总体达到ChatGPT的80%左右,可以做简单的任务。

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

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

相关文章

数据备份系列:Rsync 备份详解(一)

一、Rsync 简介 1.1 Rsync 是一个远程增量文件备份软件工具 1.2 Rsync 的特性 支持拷贝特殊文件&#xff0c;如连接文件、设备等。可以有排除指定文件或目录同步的功能&#xff0c;相当于打包命令 tar 的排除功能。可以做到保持原文件或目录的权限、时间、软硬链接、属主、组…

MySQL中的锁有哪些,作用是什么?

概述&#xff1a; 锁最要是用来实现MySQL的隔离性。我们都知道事务有四大特性分别是&#xff1a;原子性、一致性、隔离性、持久性&#xff0c;即所说的ACID。 一、什么是ACID 1、原子性&#xff1a;事务中包含有很多操作&#xff0c;这些操作要么全部执行&#xff0c;要么全…

ShareSDK 抖音平台注册

注册开发者账号 进入抖音开放平台 &#xff1a;抖音开放平台 登录/注册账户 进入[控制台] —> [移动应用] —> [认证企业资质] 完成认证后提交 创建应用 进入[控制台] —> [移动应用] —> [创建移动应用] 填写相关信息同意隐私协议后提交 这里必须要填写好自己的…

移动端click事件300ms延迟

文章目录 移动端click事件300ms延迟问题原因解决将click事件放在touchstart或touchend中处理禁止双击缩放 移动端click事件300ms延迟 问题 在移动端中&#xff0c;点击屏幕的按钮会产生200~300ms的延迟响应&#xff0c;会导致用户认为页面卡顿问题。 如下&#xff1a; <…

备战2个月,四轮面试拿下字节offer...

背景 菜 J 一枚&#xff0c;本硕都是计算机&#xff08;普通二本&#xff09;&#xff0c;2021 届应届硕士&#xff0c;软件测试方向。个人也比较喜欢看书&#xff0c;技术书之类的都有看&#xff0c;最后下面也会推荐一些经典书籍。 先说一下春招结果&#xff1a;拿下了四个…

C++11中的线程类

前面介绍的线程是利用了POSIX线程库&#xff0c;这是传统C/C程序员使用线程的方式&#xff0c;而C11提供了语言层面使用线程的方式。 C11新标准中引入了5个头文件来支持多线程编程&#xff0c;分别是atomic、thread、mutex、condition_variable和future。 atomic&#xff1a;该…

spring事物初始化过程分析

1.注入4个bd InfrastructureAdvisorAutoProxyCreator 父类&#xff1a;AbstractAutoProxyCreator BeanFactoryTransactionAttributeSourceAdvisor 父类&#xff1a;Advisor TransactionInterceptor 父类&#xff1a;Advice AnnotationTransact…

SpringBoot整合Druid配置多数据源

目录 1.初始化项目 1.1.初始化工程 1.2.添加依赖 1.3.配置yml文件 1.4.Spring Boot 启动类中添加 MapperScan 注解&#xff0c;扫描 Mapper 文件夹 1.5.配置使用数据源 1.5.1.注解方式 1.5.2.基于AOP手动实现多数据源原生的方式 2.结果展示 Mybatis-Plus:简介 | MyBat…

DGMIL:分布引导的WSI分类多实例学习

文章目录 DGMIL: Distribution Guided Multiple Instance Learning for Whole Slide Image Classification摘要本文方法Cluster-Conditioned Feature Distribution ModelingPseudo Label-Based Feature Space Refinement 实验结果 DGMIL: Distribution Guided Multiple Instanc…

花了几百万,上的软件全成了垃圾,数字化转型不是这么搞的!

企业信息化建设很复杂&#xff0c;不同的行业、业务部门对应的选型、评估方式都是不一样的&#xff0c;如果真有这样一套选型标准的出现&#xff0c;那多半掺水&#xff0c;不可信。 现在市面上比较多且还算通用的&#xff0c;都是从行业角度出发的评判标准&#xff0c;下面给…

记录 docker linux部署jar

第一步 web sso user admin 中yml文件还原到阿里mysql数据库 第二步 各个jar进行打包处理 第三步 正式服务器的Jar备份 第四步 拉取以上jar包 到正式服务器中 第五步 查看 docker images 其中 web_service 1.0.2是上一个版本 上一个版本build 镜像命令是这样的&#xff08;需…

代码评审平台Gerrit安装配置方法介绍

Gerrit是一款开源免费的基于 web 的代码审查工具&#xff0c;是基于 Git 的版本控制系统。在代码入库之前对开发人员的提交进行审阅&#xff0c;检视通过的代码才能提交入库。本文记录如何安装部署gerrit平台。 目录 Gerrit简介环境准备1. 安装Java2. 安装Git3. 安装nginx4. 安…

宝塔面板+悟空CRM功能模块安装搭建部署教程 环境配置

悟空CRM目录结构 wk_modules ├── module – 无代码模块 ├── common – 基础模块 平台使用的主要技术栈 名称 版本 说明 spring-cloud-alibaba 2021.0.4 核心框架 spring-boot 2.6.11 spring版本 mybatis-plus 3.5.2 ORM框架 nacos 2.1.0 注册中心以及配置管理 seata 1.2.…

论文笔记:A Simple Framework for Contrastive Learning of Visual Representations

0 简介 论文&#xff1a;A Simple Framework for Contrastive Learning of Visual Representations 代码&#xff1a;https://github.com/google-research/simclr 发表&#xff1a;2020年发表在ICML会议上 1 核心思想 如何构建对比学习的比较对象&#xff1f;本文按如下方式…

国民技术N32G430开发笔记(8)- 内部Flash的读写操作

N32G430 内部Flash的读写操作 1、主存储区最大为 64KB&#xff0c;也称作主闪存存储器&#xff0c;包含 32 个 Page&#xff0c;用于用户程序的存放和运行&#xff0c;以及数 据存储。 每一页的大小为2K字节 2、IAP 升级我们将64K的flash分区如下&#xff1a; Boot 0x800000…

scanf老是出错?带你详细解决输入缓冲区问题

文章目录 1.前言2.getchar 和 putchar3.缓冲区问题3.1先观察一个代码3.2输入缓冲区3.3清除缓冲区 结尾 1.前言 我们一般在进行输入输出的时候&#xff0c;就会用到 scanf / printf 。并且根据格式指定可以输入输出各种类型的数据。可以输入整形&#xff0c;字符&#xff0c;浮…

【元分析研究方法】学习笔记4.评估研究的质量

评估研究的质量 该步骤的作用该步骤中需要注意的问题该步骤中知识点1&#xff1a;判断编码的分类方式该步骤中知识点2&#xff1a;统计识别异常值 参考来源&#xff1a;库珀 (Cooper, H. M. )., 李超平, & 张昱城. (2020). 元分析研究方法: A step-by step approach. 中国人…

SpringBoot的事务与锁

在一人一单问题里&#xff0c;为什么加了事务还是会出现一人下多单呢&#xff1f; 本质的原因是&#xff0c;我们使用Java的对象锁&#xff0c;可以保证临界区只有一个线程访问&#xff0c;但是这和SpringBoot里加Transactional注解不是等价的。数据库里的事务保证的是要么全部…

ChatGPT+Word的智能化文字生成和应用

在Word中引入OpenAI代码需要使用VBA编辑器。以下是在Word中引入OpenAI代码的步骤&#xff1a; 打开Word文档&#xff0c;按下Alt F11键打开VBA编辑器。 在VBA编辑器中&#xff0c;选择“插入”菜单&#xff0c;然后选择“模块”。 在新建的模块中&#xff0c;将OpenAI代码粘…

【教学类-35-01】(256*256*256)RGB色卡图片

作品展示&#xff1a; 背景需求&#xff1a; 甲流传染病&#xff0c;班级来了三位孩子&#xff0c;他们玩折纸的时候讨论&#xff0c; 09号问&#xff1a;“绿色和蓝色混合是什么颜色&#xff1f;” 08号问&#xff1a;“绿色加蓝色加浅蓝合在一起是什么颜色” 17号说&…