04|本地部署:如何本地化部署开源大模型ChatGLM3-6B?

你好,我是独行。

前面听我讲了这么多,相信你也很想上手试一试了。从这节课开始,我们进入一个新的章节,这部分我们会学习如何部署开源大模型ChatGLM3-6B,本地搭建向量库并结合LangChain做检索增强(RAG),并且我会带你做一次微调,从头学习大模型的部署、微调、推理等过程。

这节课我们就来讲一下如何本地化部署ChatGLM3-6B(后面我们简称为6B)。讲6B之前我们先整体看一下目前国内外大模型的发展状况,以便我们进行技术选型。

大模型的选择

当前环境下,大模型百花齐放。我筛选出了一些核心玩家,你可以看一下表格。非核心的其实还有很多,这里我就不一一列举了。厂商虽然很多,但真正在研究技术的没多少,毕竟前面我们讲过,玩大模型投入非常大,光看得见的成本,包括人才、训练和硬件费用,一年就得投入几个亿,不是一般玩家能玩得起的。

图片

当然,也有不少厂商是基于LLaMA爆改的,或者叫套壳,不是真正意义上的自研大模型。

ChatGLM-6B和LLaMA2是目前开源项目比较热的两个,早在2023年年初,国内刚兴起大模型热潮时,智谱AI就开源了ChatGLM-6B,当然130B也可以拿过来跑,只不过模型太大,需要比较多的显卡,所以很多人就部署6B试玩。

从长远看,信创大潮下,国产大模型肯定是首选,企业布局AI大模型,要么选择MaaS服务,调用大厂大模型API,要么选择开源大模型,自己微调、部署,为上层应用提供服务。使用MaaS服务会面临数据安全问题,所以一般企业会选择私有化部署+公有云MaaS混合的方式来架构。在国产厂商里面,光从技术角度讲,我认为智谱AI是国内大模型研发水平最高的厂商,这也是我选择ChatGLM-6B的原因。

还有一点需要考虑,就是6B参数规模为62亿,单张3090显卡就可以进行微调(P-Turing)和推理,对于中小企业而言,简直就是福音。

图片

当然,如果企业预算充足(百万以上),可以尝试6B的老大哥GLM-130B,简称130B,千亿参数规模,推理能力更强,使用130B的话除了GPU资源费用,还需要进行商业授权,这个要注意。

图片

下面我们讲讲预算不足的情况下,怎么搞定显卡资源?

如何搞定显卡资源?

玩儿大模型第一步就是要想办法解决计算资源问题,要么CPU要么GPU,当然还有TPU,不过TPU太小众,这里我就不介绍了。我建议你想办法申请GPU,因为适合CPU计算的大模型不多,有些大模型可以在CPU上进行推理,但是需要使用低精度轻量化模型,而低精度下模型会失真,效果肯定不行,只适合简单把玩。如果要真正体验并应用到实际项目,必须上GPU。那我们可以从哪些渠道去购买GPU呢?

  1. 购买二手显卡:无论是个人使用还是企业使用,都可以考虑在网上购买二手RTX3090显卡,单卡24G显存,8000块左右,可以用于本地微调、推理。如果想用在产品上,也可以通过云服务做映射,提供简单的推理服务,但是不适合为大规模客户提供服务。
  2. 淘宝租赁显卡资源:适合个人学习使用,可以按天/周/月/年购买服务,比较灵活,成本也不高。
  3. 在线GPU租赁:比如autodl、RTX3090-24G,每月大概不到900块钱,也很划算。不仅仅可以用来本地测试,还可以用于生产环境推理,如果用在生产环境的话,最好按照实际推理需求,评估每秒推理量(具体方法我会在大模型应用架构部分讲解),搭建高可用推理环境。
  4. 各个平台免费资源:比如阿里云PAI平台、智谱AI的开放平台等,对于新人都有一定的免费GPU额度,这个方式省钱,但是不推荐,因为有时需要为平台推广拉人,也挺耗时间的。

ChatGLM3-6B部署

ChatGLM-6B目前已经发展到第3代ChatGLM3-6B,除了中英文推理,还增强了数学、代码等推理能力,我记得一年前的6B在代码或者数学方面是比较弱的。根据目前的官方信息,在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base在10B以下的基础模型中性能是最强的,除此之外,还具有8K、32K、128K等多个长文理解能力版本。下面我们就一步一步来安装部署ChatGLM3-6B,你也可以在官方文档里找到安装教程。

准备环境

操作系统推荐Linux环境,如Ubuntu或者CentOS。

图片

  • Python推荐3.10~3.11版本。
  • Transformers库推荐4.36.2版本。
  • Torch 推荐使用 2.0 及以上的版本,以获得最佳的推理性能。

克隆代码

git clone https://github.com/THUDM/ChatGLM3

图片

安装依赖

注意:要切换成国内pip源,比如阿里云,下载会快很多。

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
cd ChatGLM3
pip install -r requirements.txt

显示以下内容表明依赖安装成功。

图片

下载模型

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

如果Huggingface下载比较慢的话,也可以选择ModelScope进行下载。下载完将chatglm3-6b文件夹重新命名成model并放在ChatGLM3文件夹下,这一步非必需,只要放在一个路径下,在下一步提示的文件里,指定好模型文件路径即可。

命令行模式启动

打开文件 basic_demo/cli_demo.py,修改模型加载路径。

MODEL_PATH = os.environ.get('MODEL_PATH', '../model')

执行 python cli_demo.py
图片

Web控制台模式启动

打开文件 basic_demo/web_demo_gradio.py,修改模型加载路径。

MODEL_PATH = os.environ.get('MODEL_PATH', '../model')

同时修改最后一行:

demo.launch(server_name="127.0.0.1", server_port=7870, inbrowser=True, share=False)

server_name修改为本地IP,并指定端口server_port即可。也可以设置share=True,使用gradio提供的链接进行访问。

执行 python web_demo_gradio.py

图片

默认情况下,模型以FP16精度加载,大概需要13GB显存。如果你的电脑没有GPU,只能通过CPU启动,6B也是支持的,需要大概32G的内存。我们修改一下模型加载脚本。

model = AutoModel.from_pretrained(MODEL_PATH trust_remote_code=True).float()

如果你的电脑有GPU,但是显存不够,也可以通过修改模型加载脚本,在4-bit量化下运行,只需要6GB左右的显存就可以进行流程推理。

model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, ).quantize(4).cuda()

同时,官方也提供了一个全新的web demo,支持Chat、Tool、Code Interpreter,就在我们克隆下来的代码里,在文件夹composite_demo下。

cd composite_demo
pip install -r requirements.txt
export MODEL_PATH=../model
streamlit run main.py 或者 python -m streamlit run main.py

页面确实上了一个档次。

图片

接下来我简单总结一下部署过程:

  1. 安装Python环境,包含pip;
  2. 下载代码;
  3. 下载模型;
  4. 安装依赖;
  5. 修改示例代码,指定模型路径、精度等参数;
  6. 命令行启动。

整体来说,如果Python版本在3.10~3.11之间,网络环境也没问题的话,安装还是很快的,如果有GPU的话,推理效果也是很好的。在我们部署好模型之后,就可以进行推理了。推理之前,6B有几个参数可以进行设置,就是超参数,用来控制模型的推理准确度,我们知道大模型推理每次给的回答可能都和之前不一样,这也是为什么大模型不能用来处理精确度要求很高的任务的原因,比如让大模型算个税、算工资等等。

超参数介绍

ChatGLM3-6B有3个参数可以设置。

  1. max_length:模型的总token限制,包括输入和输出的tokens。
  2. temperature:模型的温度。温度只是调整单词的概率分布。它最终的宏观效果是,在较低的温度下,我们的模型更具确定性,而在较高的温度下,则不那么确定。数字越小,给出的答案越精确。
  3. top_p:模型采样策略参数。每一步只从累积概率超过某个阈值 p 的最小单词集合中进行随机采样,而不考虑其他低概率的词。只关注概率分布的核心部分,忽略了尾部。

对于以下场景,官方推荐使用这样的参数进行设置:

图片

系统设置好,我们基本就可以开始进行问答了,ChatGLM3-6B采用了一种新的Prompt格式,看上去应该是模仿的ChatGPT。下面我们介绍下这种提问格式。

新的Prompt格式

新的提示格式,主要是增加了几个角色,在对话场景中,有且仅有以下三种角色。

  • system:系统信息,出现在消息的最前面,可以指定回答问题的角色。
  • user:我们提的问题。
  • assistant:大模型给出的回复。

在代码场景中,有且仅有user、assistant、system、observation四种角色。observation是外部返回的结果,比如调用外部API,代码执行逻辑等返回的结果,都通过observation返回。observation必须放在assistant之后。

下面这个是官方提供的例子,基本把以上4种角色都解释清楚了。

<|system|>
Answer the following questions as best as you can. You have access to the following tools:
[
    {
        "name": "get_current_weather",
        "description": "Get the current weather in a given location",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g. San Francisco, CA",
                },
                "unit": {"type": "string"},
            },
            "required": ["location"],
        },
    }
]
<|user|>
今天北京的天气怎么样?
<|assistant|>
好的,让我们来查看今天的天气
<|assistant|>get_current_weather


```python
tool_call(location="beijing", unit="celsius")

<|observation|>
{"temperature": 22}
<|assistant|>
根据查询结果,今天北京的气温为 22 摄氏度。

为什么会这么设计呢?

首先,当前阶段的大模型经过训练后,都可以遵守系统消息,而系统消息不算用户对话的一部分,与用户是隔离的,但是可以控制模型与用户交互的范围,比如我们在system角色里指定模型充当Java技术专家,那么就可以指导模型的输出偏向于Java技术范围。

还有一个原因就是防止用户进行输入注入攻击。在进行多轮对话的时候,每次新的对话都会把历史对话都带进去。如果我们在前面的对话中,告诉模型错误的提示,那么这些错误的提示会在后续的对话中被当作正确的上下文带进去。我们知道基于自回归的模型,会根据上下文进行内容推理,这样就可能生成错误的内容。角色可以使内容更加容易区分,增加注入攻击的复杂度。这种方式不一定能处理所有的攻击类型,类似于我们日常开发中的XSS注入,只能尽可能减少,完全避免有点难。

小结

这节课我们学习了如何部署6B。从模型的选择到环境配置再到模型启动、推理,整体来说已经比较全面了,如果你在实际操作的过程中遇到环境问题,可以自己Google一下尝试去解决。毕竟每个人的环境不一样,可能会遇到各种各样的问题,主要还是Python相关的多一些。如果这一节课有些内容你没有看懂也不用急,先把模型部署及推理这一块熟悉一下,后面我们会逐渐深入地讲解。

图片

思考题

我们知道ChatGLM3-6B是一个具有62亿参数规模的大语言模型,那你知道大模型的参数是什么意思吗?62亿表示什么?欢迎你把你的观点分享到评论区,我们一起讨论,如果你觉得这节课的内容对你有帮助的话,也欢迎你分享给其他朋友,我们下节课再见!

戳此加入课程交流群

精选留言

  • 2024-06-17 13:07:55

    1. 网络问题,可以用国内的地址,https://gitee.com/mirrors/chatglm3和 https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git,注意不要用 hf 的,模型不全报错
    2. 显卡驱动问题,需要把N 卡驱动最低升级到11.8,要先卸载干净旧驱动,再升级。
    3. chatglm 如果没有找到 GPU,就会使用 CPU 运算,响应速度会非常慢,用 TOP 查看 CPU 使用率
    4. 注意 cuda 版本和pytorch的版本一定要匹配,这里我踩了坑
    作者回复

    感谢分享👍

    2024-06-17 15:30:44

  • 张 ·万岁!

    2024-07-15 19:37:59

    现在是24年7月15,刚刚结束这个模型部署模块。我使用的是阿里云的PAI平台,如果有人和我一样希望我能帮到你们。
    1.git clone https://github.com/THUDM/ChatGLM3换成git clone https://gitee.com/mirrors/chatglm3。因为阿里云不支持HF
    2.下载模型不要用git clone https://huggingface.co/THUDM/chatglm3-6b,我尝试过各种各样的lfs,都不好用。先pip install modelscope,然后使用python代码from modelscope import snapshot_download
    model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0"),他会下载到cache区,使用linux基本指令移过来就好
    3.MODEL_PATH = os.environ.get('MODEL_PATH', '../model')这里,一定要用绝对地址!!!!
    4.UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe8 in position 24: invalid continuation byte如果有编码问题,命令行改编码export LANGUAGE=en_US.UTF-8,因为他一开始是zh_CN.UTF-8,一定要改成en_US.UTF-8。输入locale检查一下,确保都是en_US.UTF-8
    5.使用综合web那个案例中,记得去client中改一下# MODEL_PATH = os.environ.get('MODEL_PATH', 'THUDM/chatglm3-6b')
    MODEL_PATH = os.environ.get('MODEL_PATH', '/mnt/workspace/modelscope/hub/ZhipuAI/chatglm3-6b')
    而且,这里transformers和huggingface_hub版本不能太高,我的transformer是4.30.2,huggingface_hub是0.19.0
    作者回复

    2024-07-19 17:15:44

  • 微笑的向日葵

    2024-07-06 13:58:24

    我本地跑起来了 redmi G 2020 Windows 环境 , 显卡: RTX 3060 laptop 参考 的是
    https://www.bilibili.com/video/BV1ce411J7nZ/?p=33&spm_id_from=pageDriver&vd_source=c16aa13fad5b13a7c51efcfcad58e883

    https://www.bilibili.com/read/cv29866295/

    很详细
    作者回复

    感谢分享!

    2024-07-09 18:00:09

  • Geek_6bdb4e

    2024-06-12 17:51:12

    国产也能成为推荐理由吗
    作者回复

    可以的,而且很多时候是决定性理由,目前信创大潮下,有些企业尤其是央国企,已经发文必须使用国产化软件,像操作系统、数据库、服务器等等都必须用国产的。大模型私有化部署一般来说都是稍微大一点的企业玩的,即便并不是所有公司都要求必须使用国产化软件,但是它是一个属性,企业可以自主选择。

    2024-06-12 19:42:26

  • Eleven

    2024-06-12 22:57:19

    大模型的参数指的是在模型训练过程中需要学习和确定的变量或数值。这些参数决定了模型如何处理输入数据并生成相应的输出。在深度学习和自然语言处理领域,模型的参数数量通常与模型的复杂性和功能强大程度有关。
    作者回复

    没错,可以结合例子理解下参数的训练过程

    2024-06-13 09:27:04

  • Geek_5203b4

    2024-06-12 20:35:32

    学习打卡~想请教老师一个问题,temperature和top_p对生成的结果影响大吗?如何测试到最佳的数值呢?谢谢老师!
    作者回复

    大,这几个超参数你可以暴漏给用户,作为用户选项,不知道你有没有用过微软的copilot,页面上就有三个选项:有创造力、平衡、精确,我猜测底层就是通过这几个超参数控制的

    2024-06-13 09:26:25

  • 任帅兵

    2024-11-20 08:42:25

    requirements.txt 中有一个 vllm>=0.4.2,这个包安装时报错:

    AssertionError: vLLM only supports Linux platform (including WSL).

    搜索了一下这个包目前不支持windows环境,请问一下这个该如何解决啊?
  • go home

    2024-08-24 17:35:27

    爲什麽不用LLaMA3呢,它在推理上面更加具有優勢。
    作者回复

    可以用LLaMA3,文中使用6B,一来是因为课程做的比较早,二来支持国产化软件

    2024-09-05 17:58:53

  • 阿斯蒂芬

    2024-07-06 21:52:38

    「如果你的电脑有 GPU,但是显存不够,也可以通过修改模型加载脚本,在 4-bit 量化下运行,只需要 6GB 左右的显存就可以进行流程推理。」如果没有GPU呢,怎么跑量化?

    win本,32G mem,纯cpu 跑还是挺吃力的,速度慢到怀疑人生。今天折腾了下使用 chatglm.cpp 成功部署了量化版,速度杠杠滴。
    作者回复

    参考这里的说明:https://github.com/THUDM/ChatGLM-6B/blob/main/README.md

    2024-07-10 17:56:39

  • Eleven

    2024-06-14 22:18:04

    RuntimeError: Internal: could not parse ModelProto from ../model/tokenizer.model
    作者回复

    可以参考下这个文章:https://github.com/chatchat-space/Langchain-Chatchat/issues/3103

    2024-06-15 09:10:20

  • 张申傲

    2024-06-12 16:05:48

    第4讲打卡~
    关于思考题,问了下ChatGPT,回答如下:
    大模型的参数指的是模型中的可调整的变量,这些变量决定了模型如何处理输入数据并生成输出。在人工智能和机器学习中,参数是模型学习和适应新数据的关键部分。常见的参数如权重(w)和偏置(b)。
    作者回复

    哈哈,参数就是权重和偏置,具体什么是权重什么是偏置,我们后面的课程中有详细的介绍,有疑问可以随时问我。

    2024-06-12 19:48:23

  • Geek_ce0dd6

    2025-04-30 16:59:09

    环境:mac m1 在安装 vllm依赖时候,该依赖没有arm版本
  • hao-kuai

    2025-03-27 14:29:15

    教程简洁明了
    作者回复

    感谢🙏

    2025-04-16 23:55:45

  • mydream

    2025-03-13 21:23:12

    执行python cli_demo.py遇到错误,老师能否修改下代码?

    Traceback (most recent call last):
    File "/home/robert/src/ChatGLM3/basic_demo/cli_demo.py", line 9, in <module>
    tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
    File "/home/robert/.local/lib/python3.10/site-packages/transformers/models/auto/tokenization_auto.py", line 847, in from_pretrained
    return tokenizer_class.from_pretrained(
    File "/home/robert/.local/lib/python3.10/site-packages/transformers/tokenization_utils_base.py", line 2089, in from_pretrained
    return cls._from_pretrained(
    File "/home/robert/.local/lib/python3.10/site-packages/transformers/tokenization_utils_base.py", line 2311, in _from_pretrained
    tokenizer = cls(*init_inputs, **init_kwargs)
    File "/home/robert/.cache/huggingface/modules/transformers_modules/chatglm3-6b/tokenization_chatglm.py", line 109, in __init__
    self.tokenizer = SPTokenizer(vocab_file)
    File "/home/robert/.cache/huggingface/modules/transformers_modules/chatglm3-6b/tokenization_chatglm.py", line 18, in __init__
    self.sp_model = SentencePieceProcessor(model_file=model_path)
    File "/home/robert/.local/lib/python3.10/site-packages/sentencepiece/__init__.py", line 468, in Init
    self.Load(model_file=model_file, model_proto=model_proto)
    File "/home/robert/.local/lib/python3.10/site-packages/sentencepiece/__init__.py", line 961, in Load
    return self.LoadFromFile(model_file)
    File "/home/robert/.local/lib/python3.10/site-packages/sentencepiece/__init__.py", line 316, in LoadFromFile
    return _sentencepiece.SentencePieceProcessor_LoadFromFile(self, arg)
    RuntimeError: Internal: could not parse ModelProto from ../chatglm3-6b/tokenizer.model
    作者回复

    感觉应该是官方模型更新了,你可以参考最新的模型加载代码试下,正好熟悉下python代码

    2025-03-19 10:28:33

  • h.g.

    2025-03-02 02:12:25

    pip install torch torchvision torchaudio -i https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

    Looking in indexes: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
    ERROR: Could not find a version that satisfies the requirement torch (from versions: none)
    ERROR: No matching distribution found for torch

    试了几个源,还是安装不上
    作者回复

    通义千问给的回复:安装PyTorch时遇到问题可能有多种原因。根据你提供的信息,似乎尝试从清华的镜像源安装但未找到合适的版本。这里有几个步骤和建议可以帮助你解决问题:

    1. **检查Python版本**:确保你的Python版本与想要安装的PyTorch版本兼容。某些版本的PyTorch可能不支持较旧或最新的Python版本。

    2. **操作系统兼容性**:确认你的操作系统是Windows、macOS还是Linux,并选择适合你操作系统的安装命令。有时特定的操作系统版本可能缺少必要的依赖库。

    3. **使用官方推荐的方法**:访问[PyTorch官网](https://pytorch.org/get-started/locally/),在这里你可以根据自己的配置(包括操作系统、包管理器、Python版本以及是否需要GPU支持)生成自定义的安装命令。例如,对于Linux用户,若想安装带有CUDA 11.7支持的最新稳定版PyTorch,可以使用以下命令:
    ```bash
    pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
    ```

    4. **尝试不同的镜像源**:如果特定的镜像源出现问题,可以尝试更换为其他镜像源或者直接使用默认的PyTorch源进行安装。

    5. **虚拟环境**:考虑在新的虚拟环境中安装PyTorch,以避免与其他已安装的包产生冲突。可以使用`venv`或`conda`来创建虚拟环境。

    6. **网络问题**:如果你在中国大陆,由于网络限制可能会导致无法访问外部资源的问题,这时使用国内的镜像源是一个好办法。但如果遇到问题,也可以尝试切换到官方源或其他国外的可靠镜像源。

    如果以上方法仍然无法解决问题,请提供更多的错误信息或上下文,以便进一步诊断。

    2025-03-12 14:19:04

  • Abner S.

    2025-02-27 12:28:08

    现在是 25 年 2 月底,听了朋友推荐,使用 Ollama 运行 DeepSeek-R1:8b,启动简单,轻松运行,电脑环境 M1 Pro,准备尝试一下 14b
    作者回复

    👍多实践

    2025-03-04 11:30:26

  • Percy Hon

    2025-02-14 00:56:25

    我在AWS的EC2上部署的,实例规格是16核,64GiB内存,显卡是NVIDIA T4 Tensor Core GPUs。部署没问题,但是整个应答过程非常慢,大概一分钟生成一个字
    作者回复

    精度降低点试试

    2025-03-12 14:25:39

  • 小豪

    2025-02-13 13:13:17

    我是4070s的显卡
    第一次跑的时候,模型加载代码如下:
    AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()
    运行起来后,终端会显示:“Some parameters are on the meta device because they were offloaded to the cpu”, 并且推理速度比较慢,怀疑是在用CPU进行推理。
    第二次把device_map改成了"cuda":
    AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="cuda").eval()
    推理速度明显加快了
    这是什么原因呢
    作者回复

    有些参数被加载到CPU了

    2025-03-12 14:28:07

  • 神奇小懒懒

    2025-01-16 16:03:06

    使用glm-4-9b-chat模型。需要10G显存。
    在Intel(R) Core(TM) i5-10500 CPU
    32g内存
    3060 12G显卡的情况下异常卡顿
  • 月狼葱葱

    2024-12-02 14:42:01

    System:win11
    显卡:4080laptop
    Python:3.10.15

    glm3:https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b
    cuda:https://developer.nvidia.com/cuda-downloads

    transformers:pip install transformers==4.40.0
    vllm:pip install vllm==0.6.4
    pytorch(这个去官网看,有对应的命令):pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

    composite_demo中client.py的MODEL_PATH可以写死绝对路径,要不就去改环境变量