Python:清华ChatGLM-6B中文对话模型部署

news2024/12/23 6:59:05

1、简介

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

GitHub:https://github.com/THUDM/ChatGLM-6B

2、硬件要求

量化等级最低 GPU 显存(推理)最低 GPU 显存
FP16(无量化)13 GB14 GB
INT88 GB9 GB
INT46 GB7 GB

本机硬件:Win11 系统 + GeForce RTX 3070Ti 8GB 显存 + 16G内存

3、环境准备

3.1 安装Python

到Python官网下载https://www.python.org/getit/指定版本:Python 3.10.0
在这里插入图片描述
安装这边就不多说了。

3.2 安装TDM-GCC

如果需要在 cpu 上运行量化后的模型, 还需要安装 gcc 与 openmp。多数 Linux 发行版默认已安装。对于 Windows ,可在安装 TDM-GCC 时勾选 openmp。Windows 测试环境 gcc 版本为 TDM-GCC 10.3.0, Linux 为 gcc 11.3.0。
官网地址:https://jmeubank.github.io/tdm-gcc/

在这里插入图片描述

3.3 安装插件

进入当前从https://github.com/THUDM/ChatGLM-6B下载的目录下CMD:
在这里插入图片描述

使用 pip 安装依赖:

pip install gradio
pip install -r requirements.txt

遇到问题:

AssertionError: Torch not compiled with CUDA enabled

出现以上问题是因为pytorch版本和CUDA版本不一致导致的。

解决方法:
A、通过nvidia-smi查看当前显存CUDA的版本号,从以下版本我们可以看出CUDA版本11.6
在这里插入图片描述
B、然后我们去pytorch查找CUDA版本11.6对应的版本
pytorch官网:https://pytorch.org/get-started/previous-versions/
找到Wheel pip安装模式CUDA11.6版本对应的指令
在这里插入图片描述
在当前ChatGLM-6B目录下,执行匹配的指令:

pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116

3.4、模型加载

以上代码会由 transformers 自动下载模型实现和参数。完整的模型实现可以在 Hugging Face Hub。如果你的网络环境较差,下载模型参数可能会花费较长时间甚至失败。此时可以先将模型下载到本地,然后从本地加载。

从 Hugging Face Hub 下载模型需要先安装Git LFS,然后运行

git clone https://huggingface.co/THUDM/chatglm-6b

如果你从 Hugging Face Hub 上下载 checkpoint 的速度较慢,可以只下载模型实现

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b

然后从这里手动下载模型参数文件,并将下载的文件替换到本地的 chatglm-6b 目录下。

将模型下载到本地之后,将以上代码中的 THUDM/chatglm-6b 替换为你本地的 chatglm-6b 文件夹的路径,即可从本地加载模型。

因本机显存只有8G,顾采用4-bit来搭建本地放模型,直接从服务器下载4-bit资源到本地,服务器地址:

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b-int4

下载完成直接存放到chatglm-6b-int4目录底下。
在这里插入图片描述

4、低成本部署

因网络下载模型缓慢,所以采用本地加载的方式来加载模型,顾需要调整当前web_demo.py等启动UI脚本,统一将THUDM/chatglm-6b-int4调整本地目录。

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

4.1 模型量化

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

model=AutoModel.from_pretrained("chatglm6b",trust_remote_code=True).quantize(4).half().cuda()

进行 2 至 3 轮对话后,8-bit 量化下 GPU 显存占用约为 10GB,4-bit 量化下仅需 6GB 占用。随着对话轮数的增多,对应消耗显存也随之增长,由于采用了相对位置编码,理论上 ChatGLM-6B 支持无限长的 context-length,但总长度超过 2048(训练长度)后性能会逐渐下降。

量化过程需要在内存中首先加载 FP16 格式的模型,消耗大概 13GB 的内存。如果你的内存不足的话,可以直接加载量化后的模型,仅需大概 5.2GB 的内存:

model = AutoModel.from_pretrained("chatglm-6b-int4", trust_remote_code=True).half().cuda()

4.2 CPU 部署

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

model = AutoModel.from_pretrained("chatglm-6b", trust_remote_code=True).float()

如果你的内存不足,可以直接加载量化后的模型:

model = AutoModel.from_pretrained("chatglm-6b-int4",trust_remote_code=True).float()

4.3 启动UI

4.3.1 网页版 Demo

首先安装 Gradio:pip install gradio,然后运行仓库中的 web_demo.py:

python web_demo.py

在这里插入图片描述

4.3.2 命令行 Demo

运行仓库中 cli_demo.py:

python cli_demo.py

程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear 可以清空对话历史,输入 stop 终止程序。

4.3.3 API请求

首先需要安装额外的依赖 pip install fastapi uvicorn,然后运行仓库中的 api.py:

python api.py

默认部署在本地的 8000 端口,通过 POST 方法进行调用

curl -X POST "http://127.0.0.1:8000" \
     -H 'Content-Type: application/json' \
     -d '{"prompt": "你好", "history": []}'

得到的返回值为

{
  "response":"你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。",
  "history":[["你好","你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"]],
  "status":200,
  "time":"2023-03-23 21:38:40"
}

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

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

相关文章

SpringBoot程序运行时动态修改主数据库配置(不需要改配置,不需要重启)

SpringBoot程序运行时修改主数据库配置(不需要改配置,不需要重启)搞事背景心路历程搞事背景 在面试某家单位的时候,碰到了一家单位线上考试,要求开发一个springboot后台。一眼看去都是正常的需求,突然我在…

Raft: 基于 Log 复制的共识算法

References Raft 演示 In Search of an Understandable Consensus Algorithm (Extended Version) 1. Raft 是什么 1.1 目标: 复制 Log 在讲解 Raft 协议的具体行为之前我们需要明白 Raft 的目标是什么?在一些情况下我们需要保证分布式集群中的机器拥有相同的数…

IOC容器——Bean

IOC容器——BeanBean配置name别名属性Bean作用范围scopeBean的实例化构造方法示例化静态工厂实例化实例工厂与FactoryBean实例工厂FactoryBeanbean的生命周期Bean配置 name别名属性 Bean ID 唯一,而关于Spring别名,我们可以在配置文件中使用name来定义&…

Google Play管理中心和ASO的重要性

Android Vitals 是我们应用优化的重要组成部分,能够显示应用的运行状况。一般来说,如果应用具有良好的体验,它会更容易在Google Play中被用户发现,从而获得更好的排名和更多的安装量。 从开发者的角度来看,Android Vi…

JAVA8新特性stream流收集为Map,value为null导致空指针的问题

jdk8 新特性stream深受喜爱&#xff0c;平时使用比较多&#xff0c;其中有&#xff1a; Map<String, String> collect2 list.stream().collect(Collectors.toMap(Book::getName, Book::getIdNO,(pre, after) -> pre)); 现象如下&#xff1a; package MainTest.str…

HTML5 <nav> 标签、HTML5 <noscript> 标签

HTML5 <nav> 标签 实例 HTML5 <nav>标签用于表示HTML页面中的导航&#xff0c;可以是页与页之间导航&#xff0c;也可以是页内的段与段之间导航。 一个导航链接实例&#xff1a; <nav> <a href"/html/">HTML</a> | <a href&qu…

关于pinduoduo开放接口测试

什么是接口测试 接口测试是测试系统组件间接口的一种方式&#xff0c;接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是检查数据的增删改查操作&#xff0c;以及系统之间的逻辑关系等。 接口测试作为集成测试的一部分&#xff0c;通过直接…

归并排序(非递归实现) 计数排序

上一期我们说了归并排序的递归是如何实现的&#xff0c;但是递归如果层次太多的话容易栈溢出&#xff0c;所以我们还需要掌握非递归的实现&#xff0c;但是我们非递归需要如何实现&#xff1f; 下面我们就来看一下非递归的实现 归并排序的非递归实现他并不需要栈队列这些东西…

No.042<软考>《(高项)备考大全》【第26章】法律法规(合同法、招投标法、政府采购法、著作权法)

【第26章】法律法规&#xff08;合同法、招投标法、政府采购法、著作权法&#xff09;1 考试相关2 合同法练习题参考答案3 招投标法3.1 法规时间总结3.2 招投标流程3.3 招标3.4 投标3.5 评标3.6 练习题参考答案3.7 论文写作3.8 投标文件的编写应该注意哪些事项4 著作权法4.1 练…

找漏洞赚外快?给ChatGPT挑毛病,最高奖励14万

反正闲着也是闲着&#xff0c;不如来给ChatGPT找漏洞&#xff1f;毕竟&#xff0c;万一真的找到漏洞了还能赚一笔外快。 当地时间 4 月 11 日&#xff0c;OpenAI 宣布推出漏洞赏金计划。该公司将根据报告问题的严重性和影响提供现金奖励&#xff0c;奖励范围从 200 美元到 200…

Spring经典扩展接口应用:BeanPostProcessor

备注&#xff1a;新进行基本思路总结&#xff0c;四五月总结完 一、BeanPostProcessor基本知识总结 BeanPostProcessor是Bean级处理器&#xff0c;用于在bean实例化后、初始化后自定义修改bean实例&#xff0c;如属性校验、针对自定义bean做统一处理等。 BeanPostProcessor接…

实战:向人工智能看齐用Docker部署一个ChatGPT

文章目录前言鉴赏chatgpt环境要求开始搭建云安装docker从docker仓库拉取chatgpt-web镜像创建容器并运行chatgpt-web创建容器启动chatgpt-web访问自己的chatgpt总结前言 目前GPT-4都官宣步入多模态大型语言模型领域了&#xff0c;大佬竟然还没有体验GPT么。作为一个资深搬砖人士…

容器编排部署

一、概述 容器编排部署的作用&#xff1a; 实现复杂容器应用架构之间的互联&#xff0c;减少大量容器部署的成本 Docker"三剑客"编排部署 工具︰ docker machine 用于创建和管理docker host docker compose 通过一个文件定义复杂的容器应用之间的关系 容器与容…

【FMCW系统性能参数之测量精度公式推导】

本文编辑&#xff1a;调皮哥的小助理 连续多篇文章都在说FMCW雷达系统性能参数这个事儿&#xff0c;如&#xff1a; &#xff08;1&#xff09;从奈奎斯特采样定理推导FMCW雷达系统性能参数 &#xff08;2&#xff09;从FMCW毫米波雷达系统的性能参数理解4D成像毫米波雷达的设…

深度学习语义分割篇——FCN原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解    目标检测系列——Faster R-CNN原理详解 &#x1f34a;近期目标&…

Unity --- 3d数学 --- 坐标系统

1.世界坐标系是固定不动的 2.每一个游戏物体在世界坐标系中都有对应的坐标和方向 1.轴心点的位置不是固定的&#xff0c;是可以人为设定的 1.Screen Space --- 屏幕坐标 2.我们看到的屏幕其实就是相机所在的平面的位置 --- 而屏幕坐标系的Z其实就是游戏中的物体到相机平面的…

GDOUCTF

WEB hate eat snake 这是一个JS的题目&#xff0c;但是这个题目好像有点奇怪&#xff0c;不是很理解&#xff0c;当时我找到了我寝室JS的大哥&#xff0c;跟大哥说了一下我的思路&#xff0c;就是他根据这个time然后/1000转化为秒&#xff0c;就当作是我们玩游戏的一个分数&a…

速卖通韩国下载量再次登顶,7500万投资换来回报

韩国市场&#xff0c;还是一片蓝海。 速卖通终于等到了回报。 近日&#xff0c;数据平台 Data ai 显示&#xff0c;3 月 9 日以来&#xff0c;速卖通再次成为韩国购物 App 下载量第一名&#xff0c;超过当地电商平台 Coupang。 这或许和速卖通近日在韩国的布局有关。 前些天…

使用File System Access API 让浏览器可以操作文件

使用File System Access API 让浏览器可以操作文件 在早期我们开始学习前端三件套时&#xff0c;经常会听到这样的说法&#xff1a;浏览器是一个沙盒&#xff0c;它不允许我们操作本地文件&#xff0c;但是现在这个说法已经不再适用了&#xff0c;因为我们可以使用 File Syste…

2023接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义&#xff0c;接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型&#xff0c;测试类型又主…