用通俗易懂的方式讲解大模型:在 CPU 服务器上部署 ChatGLM3-6B 模型

大语言模型(LLM)的量化技术可以大大降低 LLM 部署所需的计算资源,模型量化后可以将 LLM 的显存使用量降低数倍,甚至可以将 LLM 转换为完全无需显存的模型,这对于 LLM 的推广使用来说是非常有吸引力的。

本文将介绍如何量化 ChatGLM3-6B 模型的 GGML 版本,并介绍如何在 Colab 的 CPU 服务器上部署量化后的模型,让大家在了解如何量化模型的同时也熟悉 Colab 的操作。

通俗易懂讲解大模型系列

  • 用通俗易懂的方式讲解大模型:ChatGLM3-6B 功能原理解析

  • 用通俗易懂的方式讲解大模型:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解大模型:一个强大的 LLM 微调工具 LLaMA Factory

  • 用通俗易懂的方式讲解大模型:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解大模型:LangChain Agent 原理解析

  • 用通俗易懂的方式讲解大模型:HugggingFace 推理 API、推理端点和推理空间使用详解

  • 用通俗易懂的方式讲解大模型:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解大模型:使用 FastChat 部署 LLM 的体验太爽了

  • 用通俗易懂的方式讲解大模型:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解大模型:使用 Docker 部署大模型的训练环境

  • 用通俗易懂的方式讲解大模型:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解大模型:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解大模型:LangChain 知识库检索常见问题及解决方案

  • 用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解大模型:代码大模型盘点及优劣分析

  • 用通俗易懂的方式讲解大模型:Prompt 提示词在开发中的使用

技术交流

建了大模型技术交流群! 想要学习、技术交流、获取如下原版资料的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

在这里插入图片描述

术语介绍

在开始实际操作之前,我们需要了解这次操作中涉及到的工具和术语的含义,这样才能更好的理解后面的内容。

Colab

Colab[1] 是由 Google 提供的一种免费的云端 Jupyter 笔记本服务。它允许用户在云端运行和共享 Python 代码,而无需进行任何设置或配置。它的一个最大的优势是可以免费试用 Google 的服务器,免费用户可以使用 CPU 服务器和 T4 GPU 服务器,而付费用户可以使用 TPU 服务器和 A100、V100 等 GPU 服务器。

ChatGLM3-6B

ChatGLM3-6B 是智源研究院(智谱 AI)和清华大学知识工程实验室联合开发的最新一代对话预训练模型。这个模型在保留了前两代模型的流畅对话和低部署门槛等优秀特性的基础上,引入了工具调用、代码解释器等新功能。更多细节可以参考我之前的文章 ChatGLM3-6B 部署指南、ChatGLM3-6B 功能原理解析。

GGML

GGML[4] 是一个 LLM 量化的工具库,也是量化文件的一种格式,量化的 LLM 不仅在容量上大幅降低(ChatGLM3-6B 从 12G 降低到 3.5G),而且可以直接在纯 CPU 的服务器上运行。

chatglm.cpp 介绍

我们将使用chatglm.cpp[6]这个工具来进行模型量化,它是基于GGML[4]库实现的量化工具,除了可以量化 ChatGLM 系列的 LLM 外,还支持其他比如 BaiChuan、CodeGeeX、InternLM 等 LLM 的量化。

chatglm.cpp 除了提供量化功能外,还提供了多种运行量化模型的方式,包括源码编译运行、Python 代码运行、 Web 服务和 API 服务等,这些运行方式可以让我们在不同的场景下使用量化后的模型。

量化 ChatGLM3-6B 模型

首先我们在 Colab 上新建一个 Jupyter 笔记本,然后将笔记本连接上一个运行时服务器,量化时因为需要用到比较大的内存(大概 15G),而 Colab 给免费用户提供的服务器内存只有 12G,所以我们需要使用付费用户的服务器。所幸 Colab 的付费价格并不高,可以选择 9.99 美元 100 个计算单元的计费模式,也可以选择每月 9.99 美元的 Pro 模式。升级为付费模式后,我们就选择大内存服务器了。这里我们选择大内存的 CPU 服务器,本文的所有操作都只需在 CPU 服务器上运行,所以选择 CPU 服务器即可。

图片

然后就可以在 Jupyter 笔记本中编写代码了,我们先下载 ChatGLM3-6B 的模型,在 Colab 上下载 Huggingface 的资源非常快,基本几分钟就可以下载完成。

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

下载后的模型会保存在/content这个路径下,然后再下载 chatglm.cpp 项目的代码,在使用git clone命令时需要加上--recursive参数来保证下载的代码中包含子模块。

git clone --recursive https://github.com/li-plus/chatglm.cpp.git

下载后的 chatglm.cpp 同样会保存在/content路径下,接着我们需要安装一些项目所需的依赖,这里我们使用pip来安装。

python3 -m pip install -U pip
python3 -m pip install torch tabulate tqdm transformers accelerate sentencepiece

然后就可以执行我们的量化命令了,这里我们使用covert.py脚本来进行量化,执行命令如下:

python3 chatglm.cpp/chatglm_cpp/convert.py -i /content/chatglm3-6b -t q4_0 -o chatglm-ggml.bin

这里我们使用q4_0这个量化类型来进行量化,其他的量化类型可以参考 chatglm.cpp 的文档,量化完成后会在/content路径下生成一个chatglm-ggml.bin文件,这个文件就是量化后的模型文件。

可以看到量化后的模型文件大小为 3.5G,而原来的模型文件大小为 12G,因为我们是q4_0的量化方式,因此量化后的模型大小约为原模型大小的 1/4,大大降低了模型的容量。

保存量化模型到 Google Drive

我们可以将量化模型保存到 Google Drive,这样以后如果重启服务器就无需再执行以上步骤,直接从 Google Drive 读取量化模型即可。

首先我们需要在笔记本中挂载 Google Drive,命令如下:

from google.colab import drive
drive.mount('/content/gdrive')

执行命令后会弹出 Google Drive 的授权页面,选择允许即可,挂载成功后,我们就可以看到 Google Drive 的挂载目录/content/gdrive/MyDrive,然后将量化后的模型文件保存到 Google Drive 中,命令如下:

cp chatglm-ggml.bin /content/gdrive/MyDrive/chatglm-ggml.bin

以后如果重启服务器,我们只要挂载 Google Drive,然后就可以直接引用其中的模型文件了。

上传量化模型到 Huggingface

我们也可以将量化模型上传到 Huggingface,这样可以方便在其他服务器上进行部署。上传文件到 Huggingface 需要新建一个模型仓库,然后通过以下代码进行文件上传:

from huggingface_hub import login, HfApi
login()api = HfApi()
api.upload_file(path_or_fileobj="/content/chatglm-ggml.bin",path_in_repo="chatglm-ggml.bin",repo_id="username/chatglm3-6b-ggml",repo_type="model",
)
  • path_or_fileobj参数是量化模型的本地路径

  • path_in_repo参数是上传到 Huggingface 仓库中的路径

  • repo_id参数是 Huggingface 仓库的 ID,格式为username/repo-name

  • repo_type参数是 Huggingface 仓库的类型,这里是model

注意在代码执行过程中需要我们输入 Huggingface 账户的 Access Token,这个 Token 需要是有写入权限的 Token,不能是只读的 Token。

GGUF

了解过 GGML 量化的朋友可能会问,chatglm.cpp 支持 GGUF 格式吗?因为据 GGML 的官方介绍,以后的量化格式会慢慢从 GGML 过渡为 GGUF 格式,因为 GGUF 格式能更保存模型更多的额外信息,但 chatglm.cpp 因为 ChatGLM 模型架构的关系,目前还不支持 GGUF 格式[8]。

源码编译运行量化模型

我们得到量化的模型后,可以运行模型来验证一下模型是否正常,chatglm.cpp 提供了多种运行模型的方式,这里我们先介绍源码编译运行的方式。

首先编译 chatglm.cpp 的运行命令:

cd chatglm.cpp && cmake -B build && cmake --build build -j --config Release

编译完成后在 chatglm.cpp 目录下会生成一个build目录,编译完成后的命令就放在这个目录下,然后我们就可以运行模型了,运行命令如下:

chatglm.cpp/build/bin/main -m chatglm-ggml.bin -p "你好"# 结果显示
你好!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。

上面的命令中,-m参数带上量化模型的地址,-p参数是输入的提示词,然后我们可以看到 LLM 的输出结果,跟运行原模型的结果是一样的。我们还可以通过-i参数来发起交互式对话,命令如下:

./build/bin/main -m chatglm-ggml.bin -i# 结果显示
Welcome to ChatGLM.cpp! Ask whatever you want. Type 'clear' to clear context. Type 'stop' to exit.Prompt   > 你好
ChatGLM3 > 你好!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。

使用 Python 包

chatglm.cpp 还提供了 Python 包,使用该工具包我们也可以运行量化后的模型,首先安装 Python 依赖包,命令如下:

pip install -U chatglm-cpp

代码执行

安装完 Python 包,我们就可以使用 Python 代码来运行量化模型了:

import chatglm_cpppipeline = chatglm_cpp.Pipeline("../chatglm-ggml.bin")
pipeline.chat([chatglm_cpp.ChatMessage(role="user", content="你好")])# 结果显示
ChatMessage(role="assistant", content="你好!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。", tool_calls=[])

可以看到跟源码编译运行的结果是一样的。

命令行执行

也可以使用 Python 脚本运行量化模型,脚本文件在 chatglm.cpp 项目下的 examples 目录中,命令如下:

python examples/cli_demo.py -m chatglm-ggml.bin -p 你好# 结果显示
你好!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。

部署 Web 服务

我们可以将量化后的模型部署为 Web 服务,这样就可以在浏览器中来调用模型,这里我们使用 chatglm.cpp 提供的 Web 服务脚本来部署模型。

Gradio

首先安装 Gradio 依赖,命令如下:

python3 -m pip install gradio

再修改 Web 服务脚本 examples/web_demo.py,将Share属性改为True,这样可以在服务器外访问 Web 服务,然后再启动 Web 服务,命令如下:

python3 chatglm.cpp/examples/web_demo.py -m chatglm-ggml.bin# 结果显示
Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://41db812a8754cd8ab3.gradio.live

浏览器访问public URL的显示结果:

图片

Streamlit

ChatGLM3-6B 除了提供 Gradio 的 Web 服务外,还提供了一个综合各种工具的 Streamlit Web 服务,我们再来部署该服务。首先安装 Streamlit 依赖,命令如下:

python3 -m pip install streamlit jupyter_client ipython ipykernel
ipython kernel install --name chatglm3-demo --user

再修改综合服务的脚本 examples/chatglm3_demo.py,将模型的地址改为量化模型的地址,改动如下:

-MODEL_PATH = Path(__file__).resolve().parent.parent / "chatglm3-ggml.bin"
+MODEL_PATH = "/content/chatglm-ggml.bin"

我们还需要将 Colab 服务器中的 Web 服务代理到公网,需要安装 CloudFlare 的反向代理,这样我们才可以在服务器外访问该 Web 服务,命令如下:

wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x cloudflared-linux-amd64

最后启动 Streamlit Web 服务和代理服务,命令如下:

# 启动 Stratmlit Web 服务
streamlit run chatglm.cpp/examples/chatglm3_demo.py &>/content/logs.txt &# 启动代理服务
grep -o 'https://.*\.trycloudflare.com' nohup.out | head -n 1 | xargs -I {} echo "Your tunnel url {}"
nohup /content/cloudflared-linux-amd64 tunnel --url http://localhost:8501 &# 结果显示
Your tunnel url https://incorporated-attend-totally-humidity.trycloudflare.com
nohup: appending output to 'nohup.out'

浏览器访问tunnel url的显示结果:

图片

图片

部署 API 服务

我们还可以将量化后的模型部署为 API 服务,chatglm.cpp 的 Python 包提供了启动 API 服务的功能,该 API 适配 OpenAI API。

首先是安装 chatglm.cpp 的 API 包,命令如下:

pip install -U 'chatglm-cpp[api]'

然后启动 API 服务,命令如下:

MODEL=./chatglm-ggml.bin uvicorn chatglm_cpp.openai_api:app --host 127.0.0.1 --port 8000

MODEL 环境变量是量化模型的地址,然后我们使用curl命令来验证一下 API 服务是否正常,命令如下:

curl http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"messages": [{"role": "user", "content": "你好"}]}'# 返回结果
{"id":"chatcmpl","model":"default-model","object":"chat.completion","created":1703052225,"choices": [{"index":0,"message": {"role":"assistant","content":"你好!我是人工能助手 ChatGLM3-6B,很高兴见到你,欢迎问任何问题。"},"finish_reason":"stop"}],"usage":{"prompt_tokens":8,"completion_tokens":29,"total_tokens":37}
}

可以看到 API 返回结果的数据结构跟 OpenAI API 的数据结构是一样的。

总结

本文介绍了如何在 Colab 上使用 chatglm.cpp 对 ChatGLM3-6B 模型进行 GGML 版本的量化,并介绍了多种部署方式来运行量化后的模型,这些运行方式可以让我们在不同的场景下使用量化模型,而且全程是在 CPU 服务器上运行的,无需任何 GPU 显卡。希望本文对大家部署 LLM 或打造私有化 LLM 应用有所帮助,文中的 Colab 脚本见这里[9],如果文中有什么错误或不足之处,欢迎在评论区指出。

关注我,一起学习各种人工智能和 AIGC 新技术,欢迎交流,如果你有什么想问想说的,欢迎在评论区留言。

参考:

[1]Colab: https://colab.research.google.com/

[4]GGML: https://github.com/ggerganov/ggml

[6]chatglm.cpp: https://github.com/li-plus/chatglm.cpp

[7]GGML: https://github.com/ggerganov/ggml

[8]还不支持 GGUF 格式: https://github.com/li-plus/chatglm.cpp/issues/135#issuecomment-1752027324

[9]这里: https://colab.research.google.com/drive/1j__5w9vMVyO5X8xFgCi8cUl231G1G55c?usp=sharing

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

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

相关文章

Flume基础知识(三):Flume 实战监控端口数据官方案例

1. 监控端口数据官方案例 1)案例需求: 使用 Flume 监听一个端口,收集该端口数据,并打印到控制台。 2)需求分析: 3)实现步骤: (1)安装 netcat 工具 sudo yum …

SVN服务端的下载、安装

地址 : Apache Subversion Binary Packages 下载 点击 VisualSVN 安装 都是点击 next 点击next ,即可安装成功

SpringBoot学习(三)-员工管理系统开发(重在理解)

注:此为笔者学习狂神说SpringBoot的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!! 本文是基于狂神老师SpringBoot教程中的员工管理系统从0到1的实践和理解。该系统应用SpringB…

B端产品经理学习-需求挖掘

B端产品需求挖掘 目录 识别和管理干系人 决策人和负责人需求挖掘 针对用户进行需求挖掘 用户访谈结果整理 B端产品的需求来源是非常复杂的,要考虑多个方面;如果你是一个通用性的产品,要考虑市场、自身优劣势、干系人。而定制型B端产品会…

uniapp:签字版、绘画板 插件l-signature

官方网站:LimeUi - 多端uniapp组件库 使用步骤: 1、首先从插件市场将代码下载到项目 海报画板 - DCloud 插件市场 2、下载后,在项目中的uni_modules目录 3、最后 没有其它步骤,直接官网代码复制到vue文件中就可以了&#xff0c…

综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学

前言 有在自动化测试领域的小伙伴应该都知道,app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦,动不动就是用appium写代码脚本维护什么的,不仅步骤繁琐,环境配置方面也是繁琐无比,动不动就与客户…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 1. 课程介绍2. 电路系统建模、基尔霍夫定律 1. 课程介绍 2. 电路系统建模、基尔霍夫定律 基本元件: 电量 库伦&…

多模态——旷视大模型Vary更细粒度的视觉感知实现文档级OCR或图表理解

概述 现代大型视觉语言模型(LVLMs),例如CLIP,使用一个共同的视觉词汇,以适应多样的视觉任务。然而,在处理一些需要更精细和密集视觉感知的特殊任务时,例如文档级OCR或图表理解,尤其…

前缀和算法 -- 寻找数组的中心坐标

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 输入描述 给定一个数组&#xff0c;接口为int pivotIndex(vector<int>& nums) 输出描述 我们以示例1为例画图解释&#xf…

DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)

文章目录 一、djangorestframework-simplejwt快速使用1.基础使用步骤2.自己配置视图校验访问局部配置认证及权限类全局配置认证及权限类 3.关于双token认证问题 二、定制返回格式三、多方式登录 一、djangorestframework-simplejwt快速使用 JWT主要用于签发登录接口需要配合认证…

频谱论文:约束飞行轨迹下基于生成对抗网络的三维无线电地图重构

#频谱# T. Hu, Y. Huang, J. Chen, Q. Wu and Z. Gong, "3D Radio Map Reconstruction Based on Generative Adversarial Networks Under Constrained Aircraft Trajectories," in IEEE Transactions on Vehicular Technology, vol. 72, no. 6, pp. 8250-8255, June …

Vue - 多行文本“展开、收起”功能

TextClamp 使用 js 实现文本展开、收起&#xff0c;并非纯 CSS 实现。 Props&#xff1a; fontSize&#xff1a;Number&#xff0c;默认&#xff1a;14lines&#xff1a;Number&#xff0c;默认&#xff1a;1lineHeight&#xff1a;Number&#xff0c;默认&#xff1a;20 F…

字符编码转换

宽窄字符和字符编码的关系 多字节(窄)字符&#xff1a;在C/C中&#xff0c;char是一种数据类型&#xff0c;规定sizeof(char)1&#xff0c;即一个char占用一个字节&#xff0c;1Byte8bit。并没有规定一个char就要与ASCII对应&#xff0c;不过&#xff0c;通常情况下char值与AS…

2023 年博客总结

当无所事事&#xff0c;没有多少收获的时候&#xff0c;时间过得格外的快… 当充实有为&#xff0c;经常有收获有进步的时候&#xff0c;才觉得时间没有浪费… 2023年收获不多… 以前说孩子小&#xff0c;需要照顾所以没时间&#xff0c;我以为孩子大点就有时间了&#xff0c;…

图片处理相关网站(图片分辨率、尺寸修改、AI扩图等)

分享一些免费的可进行图片的各种处理的网站&#xff0c;包括图片分辨率、尺寸修改、AI扩图等&#xff0c;持续增加中。。。 1.photokit.com 可进行图片分辨率、尺寸、压缩等修改。 免费在线图片编辑器 - 在线抠图、改图、修图、美图 - PhotoKit.comPhotoKit是一款免费的…

【RocketMQ每日一问】RocketMQ SQL92过滤用法以及原理?

1.生产端 public class SQLProducer {public static int count 10;public static String topic "xiao-zou-topic";public static void main(String[] args) {DefaultMQProducer producer MQUtils.createLocalProducer();IntStream.range(0, count).forEach(i -&g…

自动化测试面试题及答案大全(上)

selenium中如何判断元素是否存在&#xff1f; 没有提供原生的方法判断元素是否存在&#xff0c;一般我们可以通过定位元素异常捕获的方式判断selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f; 不可以&#xff0c;想点击的话&#xff0c;可以用…

[ASIS 2019]Unicorn shop

点入题目看见四个可购买的东西&#xff0c;但是都购买不了&#xff0c;最后一个价格大的脱俗&#xff0c;猜测成功买到后会得到flag&#xff0c;但是购买时提示操作失败只允许一个字符。查看源码发现在utf-8后面特意标注提示 涉及到了字符编码和字符集的概念&#xff1a; UTF-…

2024 年度 AAAI Fellows 揭晓!清华大学朱军教授入选!

今日&#xff0c;国际人工智能领域最权威的学术组织 AAAI 揭晓 2024 年度 Fellows 评选结果&#xff0c;新增 12 位 Fellow。 其中&#xff0c;清华大学计算机系教授朱军因「在机器学习理论与实践方面做出的重大贡献」而成功入选&#xff0c;成为本年度入选的唯一华人学者&…

2023最大技术潮:大模型冲击下的智能汽车

作者 |德新 编辑 |王博 过去这年最大的技术潮&#xff0c;非大模型莫属。 2023年初&#xff0c;由ChatGPT掀起的浪花&#xff0c;迅速地演变成了席卷全球的AI科技浪潮。汽车行业在其中也不可避免。各大车企纷纷投入与大模型相关的布局。 长城官宣成立了AI Lab&#xff0c;到…