【大模型部署】mac m1本地部署 ChatGLM3-6B 超详细教程

article/2025/6/23 13:14:50
本人环境:macOS 15.5 (Sonoma) - Apple M1 / 16 G
目标:在 mac m1 16G 上 完全离线 的本地模型目录上,跑通官方 ChatGLM3-6B


目录

  1. 背景 & 踩坑记录

  2. 准备工作

  3. 新建 Conda 环境并安装依赖

  4. 关键环境变量

  5. 运行 composite_demo

  6. 常见报错与解决方案

  7. 运行效果截图

  8. 结语 & 参考链接


1 背景 & 踩坑记录

ChatGLM3-6B 出来后,很多小伙伴(包括我🙋‍♂️)直接 git clone + pip install -r requirements.txt 结果一路红 ❌:

报错

根因

ModuleNotFoundError: huggingface_hub.inference._text_generation

hub≥0.30 路径改动

ImportError: Using low_cpu_mem_usage=True ... requires Accelerate

accelerate 版本过低 / 未装

NotImplementedError: aten::isin ... on MPS

PyTorch MPS 后端缺少算子

RuntimeError: torch.classes ... __path__._path

Streamlit 热重载探测 torch.classes

因此本文一步到位给出一套「官方 issue 实测可行」的版本组合,并解释 为什么 这样配才最稳。

2 准备工作

  • 硬件:Apple M1 (16 GB 内存起步,建议 32 GB 更稳)

  • 软件

    • Conda ≥ 23.x(本文用 miniforge)

    • Git & Homebrew

  • 模型文件

~/models/chatglm3-6b/
├── config.json
├── pytorch_model-00001-of-00007.bin
├── ...
└── tokenizer.model

# 下载模型文件和权重文件 

cd models/
# 下载模型文件
git clone https://github.com/THUDM/ChatGLM3.git# 下载权重文件
# 1. 先下载小文件
GIT_LFS_SKIP_SMUDGE=1 git clone https://hf-mirror.com/THUDM/chatglm3-6b.git
# 2. 进入目录
cd chatglm3-6b
# 3. 下载大文件(分两步是方便看进度,因为权重50G,一步到位的下载看不到进度)
#git lfs pull 等价于先 git lfs fetch(只抓当前分支对应的对象)再 git lfs checkout(将指针替换为大文件)。
git lfs pull

也可以 git lfs clone https://huggingface.co/THUDM/chatglm3-6b,或从同事处拷贝离线权重。我这里是用的是代理方式下载。


3 新建 Conda 环境并安装依赖

为什么固定这些版本?

transformers 4.40.0 :ChatGLM3 官方示例锁的版本,兼容 hub<0.30
huggingface_hub 0.19.4 :仍包含旧私有路径 _text_generation
torch 2.2.2 :MPS 稳定版,兼容 peft/cpm_kernels
accelerate 0.26.0 :device_map="auto" 需要的最低版本
streamlit 1.45.1 :避免热重载新 BUG
其余库满足 GLM3 推理 + 内核 + Notebook 需求 


 新建conda 环境和下载依赖包

# 0)推荐单独新建,避免污染原有 Python
conda create -n glm3-demo python=3.10 -y && conda activate glm3-demo# 1)一次性安装“老三件”+ 其他依赖
pip install "torch==2.2.2" \"transformers==4.40.0" \"huggingface_hub==0.19.4" \"accelerate==0.26.0" \"peft==0.10.0" \"streamlit==1.45.1" \"cpm_kernels>=1.0.11" \"sentencepiece>=0.2.0" \"jupyter_client>=8.6.0"
⚠️ 注意

绝对不要 pip install -U transformers 或 pip install huggingface_hub>=0.30,否则又会踩回“私有路径丢失”坑。
如果你想体验最新功能,需手改源码 → 见第 6 节“升级方案”。 


4 关键环境变量

变量

作用

必须放在 import torch 之前

STREAMLIT_SERVER_ENABLE_FILE_WATCHER=false

关闭 Streamlit 热重载,绕开 torch.classes 路径报错

PYTORCH_ENABLE_MPS_FALLBACK=1

MPS 不支持算子时自动回退 CPU,避免 isin 报错

设置方式:(推荐)

export STREAMLIT_SERVER_ENABLE_FILE_WATCHER=false
export PYTORCH_ENABLE_MPS_FALLBACK=1

或者在 composite_demo/main.py 顶部写:(我没有这么干)

import os, torch
os.environ["STREAMLIT_SERVER_ENABLE_FILE_WATCHER"] = "false"
os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1"
torch.classes.__path__ = []   # 再保险

5 运行 composite_demo

cd /path/to/ChatGLM3  # 仓库根目录
streamlit run composite_demo/main.py --server.fileWatcherType none

浏览器自动打开 http://localhost:8501,就能看到下图界面👇


6 常见报错与解决方案

报错关键词

可能原因

解决办法

_text_generation Not found

hub ≥ 0.30 改路径

固定 hub==0.19.4 或改 client.py 引入

low_cpu_mem_usage=True requires Accelerate

accelerate 未装 / 版本<0.26

pip install -U accelerate>=0.26.0

aten::isin ... MPS

MPS 缺算子

export PYTORCH_ENABLE_MPS_FALLBACK=1 或安装 PyTorch Nightly

torch.classes __path__._path

Streamlit 热重载

export STREAMLIT_SERVER_ENABLE_FILE_WATCHER=false

OOM / swap 爆掉

模型全精度占内存 13 GB+

加 4-bit int 模型或 CPU+FP32

升级到最新版 transformers?

想要 4.52.x + hub 0.32.x,需要:

# client.py 旧写法
from huggingface_hub.inference._text_generation import TextGenerationStreamResult
# 改成
from huggingface_hub.inference._generated.types.text_generation import (TextGenerationStreamResult,
)

再升级库即可。


7 运行效果截图

下侧参数栏 = top_p / temperature / repetition_penalty / max_new_tokens

到此,Mac M1 完全离线跑 ChatGLM3-6B 的流程就梳理完毕。核心思想只有三点:

  1. 锁定 “老三件”(transformers 4.40 + hub 0.19 + accelerate 0.26)

  2. 关闭 Streamlit 热重载,同时 开启 MPS Fallback

  3. 缺什么补什么,不轻易乱升级

  4. 下面讲一讲这个页面的参数设置


参数设置解释:

下面用更口语化、简单易懂的话来解释这四个参数,让你一看就明白它们对生成效果的影响。

1. top_p(核采样概率)

  • 干什么的?

    控制“候选词”的范围。模型每一步会给出很多可能的词,并给出它们的“可能性”高低。top_p 就是说:我只要把概率累加到某个百分比,就把这些最有希望出现的词留下来,其他概率特别低的词就不考虑,最后在留住的那批词中随机选一个出来。

  • 怎么影响结果?

    • 如果 top_p=1.0,就意味着“全盘考虑”,所有词都有机会被选。(这跟不做 top_p 过滤等价)

    • 如果 top_p=0.8,就只在概率最前面累加到 80% 的那部分词里挑,剩下20%低概率的词被直接扔掉。这样能保证输出不会太“离谱”,也还保留了一点随机。

  • 简单说:

    • 把这个数字调小(比如 0.5),候选范围就更小,句子更“保守”、更容易生成常见表达。

    • 调到接近 1.0(比如 0.95),候选更多,生成会更“活跃”、“多样”,但也有可能出现一些冷门、奇怪的词。


2. 温度(temperature)

  • 干什么的?

    控制“随机性”的强弱。模型给每个词一个得分,接着做 Softmax 变成概率。这个概率之前会先除以温度 T:

  • 把分数 ÷ T,然后再做归一化

    • 当 T < 1 时,分数差距会被“放大”,高分词更容易被选,随机性降低,句子更“确定”。

    • 当 T > 1 时,分数差距会被“压平”,低分词的机会增大,随机性变高,句子更“花样”,可能有点“天马行空”。

  • 怎么影响结果?

    • T = 0.5(低温度):输出很稳定,几乎总是挑几率最大的词,适合希望答案很靠谱、不爱跑偏的场景。

    • T = 1.0:默认的“正常随机度”。

    • T = 1.3(高温度):输出比较活跃,可能会冒出一些有创意、没那么常见的词,但也容易跑题。

  • 简单说:

    温度越低(0.2~0.5),句子越“板正”、越不会出意外;温度越高(1.0~1.5),句子越“活泼”、“有新意”,但风险是可能会出现不太靠谱的表达。


3. 重复惩罚(repetition_penalty)

  • 干什么的?

    防止模型不停地重复同一句话或同一个词。每次模型想输出一个已经在对话里出现过的词,就给它打点折扣,让它这次不要总选同一个。

  • 怎么影响结果?

    • repetition_penalty = 1.0:不做惩罚(相当于关闭),模型可能出现“我我我……”“哈哈哈……”“再见再见……”这种重复。

    • repetition_penalty = 1.1:轻度惩罚,出现过一次的词,下次出现的可能性会被除以 1.1,能稍微抑制重复。

    • repetition_penalty = 1.3 甚至更高:惩罚力度更大,模型几乎不会重复之前那一串字。但如果惩罚过强,也可能把一些该出现的关联词也给压下去,造成句子稍微奇怪。

  • 简单说:

    想让输出更“丰富”、不要老是同样几句话循环,就把这个数字调高一点(1.1~1.2);

    想让输出更“流畅”,没什么重复烦恼,就留在 1.0~1.1。


4. 输出长度(max_new_tokens 或 max_output_length)

  • 干什么的?

    控制“最多能多说多少字”。默认是让模型在看到你的提问后,最多生成这么多个 token(token 通常相当于一个汉字或一个单词的一部分)的回答。到了上限就不再往下说了。

  • 怎么影响结果?

    • 输出长度 = 20~50:短小精悍的回答,就像一句话或两句话,适合问个小问题拿个结论。

    • 输出长度 = 256~512:回答会很长,像一段段故事、长文档、代码示例之类,适合写文章、写长段解释。

    • 如果你设置得太短,模型可能回答得过于简略;设置太长,容易让模型“唠叨”或跑题。

  • 简单说:

    这就像给模型“说话时间”的最大限制——给多少就说多少。


5. 重试 & 清除历史

  • 重试:点一次“重试”就再用当前这套参数(top_p、temperature、重复惩罚、输出长度)重新生成一个答案,通常会和上一次稍有不同,因为其中有随机采样的成分。

  • 清除历史:清掉当前对话框里已经生成过的所有问答内容,下次提问就好像从零开始,没有上下文,比较适合换话题。


简单的调参思路

  1. 想要稳定靠谱

    • 温度(temperature)调低到 0.7~0.9;

    • top_p 调到 0.8 左右;

    • 重复惩罚(repetition_penalty)设 1.0~1.1;

    • 输出长度控制在 128~256 之间。

      这样,生成的大部分句子都比较常规、不离谱,也不会乱跑题。

  2. 想要更“有趣”或“发散”

    • 温度提高到 1.1~1.3;

    • top_p 增加到 0.9~0.95;

    • 重复惩罚设 1.1~1.2;

    • 输出长度可以 256 起跳、甚至 512。

      此时会出现一些比较新奇的表达或意想不到的句子,但也要小心有时会跑偏、语义不太连贯。

  3. 只想要一句话回答

    • 输出长度设得小一些(如 20~50);

    • 温度 0.5~0.7;

    • top_p 0.8;

    • 重复惩罚 1.0~1.1。

      这样回答简短干脆,不会多说。

  4. 出现老是重复同一句话的情况

    • 把重复惩罚从 1.0 调到 1.2~1.3 看看;

    • 也可以稍微调低温度或调低 top_p,减少随机性有时也有帮助。


总结

  • top_p(核采样):控制候选词的“范围”——去掉那部分“太低概率”的词。

  • 温度(temperature):控制随机性——温度低.outputs 更确定;温度高.outputs 更随机。

  • 重复惩罚(repetition_penalty):防止循环重复——值越大越抑制重复。

  • 输出长度(max_new_tokens):规定最多能多“说”多少字,就到上限停下。

只要搞清楚它们各自的作用,就可以根据自己的需求(“要稳”还是“要酷”或“要短”)去调参,让模型输出符合预期。


8 结语 & 参考链接

  • ChatGLM3 官方 Repo

  • PyTorch GitHub Issue #77764

  • HuggingFace Hub 路径迁移 PR #2199

建议本地部署使用量化版本,因为 m1 电脑版本还是太低了,没有cuda,mps 目前还不支持,只靠cpu ,推理特别的慢,本次只是能用,建议换个好点的GPU啥的也行。

如果本文对你有帮助,不妨 点赞 / 收藏 / 关注,后续我会持续更新 深度学习,和大模型相关的知识 在 Apple Silicon 上的部署踩坑记录。

Happy Hacking! 🎉


http://www.hkcw.cn/article/YwBVDOINRZ.shtml

相关文章

评标专家随机抽选系统-建设方案——仙盟创梦IDE

政策要求 抽选记录保存 专辑库管理 系统统计 抽选打印 系统分级管理 项目管理 系统分级管理 集团公司管理 专家补抽 评标专家随机抽选 1、系统分级管理合规 符合《数据安全法》第二十一条&#xff08;分类分级制度&#xff09;&#xff0c;安全按照不同职级&#xff0c;配置权…

2.5/Q2,Charls最新文章解读

文章题目&#xff1a;Trajectories of depressive symptoms and risk of chronic liver disease: evidence from CHARLS DOI&#xff1a;10.1186/s12876-025-03943-7 中文标题&#xff1a;抑郁症状的轨迹和慢性肝病风险&#xff1a;来自 CHARLS 的证据 发表杂志&#xff1a;BM…

win1011安装WinGet和Windows Terminal

前言 winget是微软推出的类似Ubuntu apt 的包管理器。安装winget建议一同安装微软推出的代替conhost.exe的新版命令提示符工具Windows Terminal。 安装 Windows Terminal 微软商店 github 安装后以管理员打开老版命令提示符&#xff0c;上方任务栏右键-默认值-终端-默认终端…

深 入 剖 析 单 链 表:从 原 理 到 实 战 应 用

深 入 剖 析 单 链 表&#xff1a;从 原 理 到 实 战 应 用 顺 序 表 的 问 题单 链 表单 链 表 与 顺 序 表 区 别相 关 概 念链 表 定 义单 链 表 定 义存 储 结 构 单 链 表 的 操 作 实 现代 码 全 貌 与 功 能 介 绍单 链 表 的 功 能 说 明代 码 效 果 展 示代 码 详 解S…

【LLM相关知识点】关于LLM项目实施流程的简单整理(一)

【LLM相关知识点】关于LLM项目实施流程的简单整理&#xff08;一&#xff09; 文章目录 【LLM相关知识点】关于LLM项目实施流程的简单整理&#xff08;一&#xff09;零、学习计划梳理&#xff1a;结合ChatGPT从零开始学习LLM & 多模态大模型一、大模型相关应用场景和头部企…

Vue 核心技术与实战day07

1. vuex概述 2. 构建 vuex [多组件数据共享] 环境 <template><div id"app"><h1>根组件- {{ title }}- {{ count }}</h1><input :value"count" input"handleInput" type"text"><Son1></Son1>…

【android bluetooth 案例分析 04】【Carplay 详解 3】【Carplay 连接之车机主动连手机】

1. 背景 在前面的文章中&#xff0c;我们已经介绍了 carplay 在车机中的角色划分&#xff0c; 并实际分析了 手机主动连接车机的案例。 感兴趣可以 查看如下文章介绍。 【android bluetooth 案例分析 04】【Carplay 详解 1】【CarPlay 在车机侧的蓝牙通信原理与角色划分详解】…

【stm32开发板】单片机最小系统原理图设计

一、批量添加网络标签 可以选择浮动工具中的N&#xff0c;单独为引脚添加网络标签。 当芯片引脚非常多的时候&#xff0c;选中芯片&#xff0c;右键选择扇出网络标签/非连接标识 按住ctrl键即可选中多个引脚 点击将引脚名称填入网络名 就完成了引脚标签的批量添加 二、电源引…

Linux --OS和PCB

目录 认识冯诺依曼系统 操作系统概念与定位 1.概念 2.设计OS的目的 3.OS的核心功能 4.系统调⽤和库函数概念 深⼊理解进程概念&#xff0c;了解PCB 1.基本概念与基本操作 2.描述进程-PCB 基本概念 task_ struct 的内容分类 认识冯诺依曼系统 在计算机中小到个人的笔…

2025最新版在Windows上安装Redis(仅限开发环境)

使用一位GitHub的博主做的Redis-Windows,截止现在更新到8.0.2 Releases redis-windows/redis-windows GitHub https://github.com/redis-windows/redis-windows/releases 我使用6.2.18版本做例子,使用6.2以上版本,因为一些语法,比如lpop,rpop,zrange,zdiff集合操作比旧版有…

[python]Prophet‘ object has no attribute ‘stan_backend‘解决方法

测试环境&#xff1a; prophet1.1.4 写代码&#xff1a; from prophet import Prophet modelProphet() print(123) 在anaconda prompt里面没有报错&#xff0c;但是打开jupyter notebook会报错Prophet object has no attribute stan_backend&#xff0c;据此猜测jupyter应该…

Python----目标检测(《基于区域提议网络的实时目标检测方法》和Faster R-CNN)

一、《基于区域提议网络的实时目标检测方法》 1.1、基本信息 标题&#xff1a;Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 作者&#xff1a;任少卿&#xff08;中国科学技术大学、微软研究院&#xff09;、何凯明&#xff08;微软研究…

流媒体基础解析:从压缩到传输的基本了解

流媒体&#xff0c;又称为流式媒体&#xff0c;已成为现代网络视频传输的核心技术。其基本原理是将连续的影像和声音信息经过精心设计的压缩&#xff08;编码&#xff09;处理后&#xff0c;妥善存放在网站服务器上。随后&#xff0c;这些压缩后的数据通过网络高效传输至终端用…

【MFC】如何设置让exe的控制台不会跟着exe退出而退出

在 Windows 下&#xff0c;MFC 程序&#xff08;如 echo.exe&#xff09;如果用 AllocConsole 创建了控制台窗口&#xff0c;默认情况下&#xff0c;当主程序&#xff08;exe&#xff09;退出时&#xff0c;控制台窗口也会自动关闭。这是操作系统的行为&#xff0c;不能直接阻止…

图像风格迁移笔记

图像风格迁移 最早实现风格迁移的原理:损失函数内容损失函数风格损失函数融合内容损失函数与风格损失函数可以融合多种风格图片的效果同一个网络可以生成多种风格图像的效果效果改进最早实现风格迁移的原理: 最早出现的论文的实现想法是将风格图像、内容图像、白噪声图像输入…

浏览器隐私:原理与检测方法

引言 浏览器信号和详细信息是在线识别用户和防止欺诈的关键。这些数据包括用户代理字符串、JavaScript设置和屏幕分辨率等信息&#xff0c;有助于区分不同的浏览器。然而&#xff0c;一些用户会有意修改这些信号&#xff0c;使用用户代理欺骗等方法来隐藏自己的身份。虽然一些…

python:在 PyMOL 中如何查看和使用内置示例文件?

参阅&#xff1a;开源版PyMol安装保姆级教程 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 可视化示例‌&#xff1a;打开 PyM…

设计模式——建造者设计模式(创建型)

摘要 本文详细介绍了建造者设计模式&#xff0c;这是一种创建型设计模式&#xff0c;旨在将复杂对象的构建过程与其表示分离&#xff0c;便于创建不同表示。文中阐述了其设计意图&#xff0c;如隐藏创建细节、提升代码可读性和可维护性&#xff0c;并通过构建电脑的示例加以说…

深入Java性能调优:原理详解与实战

一、JVM内存模型与GC机制 原理&#xff1a; 堆内存结构&#xff1a; 新生代&#xff1a;Eden 2个Survivor区&#xff08;Minor GC&#xff09; 老年代&#xff1a;长期存活对象&#xff08;Major GC/Full GC&#xff09; 元空间&#xff1a;类元信息&#xff08;替代永久代…

acwing刷题

目录 6122. 农夫约翰的奶酪块 6123. 哞叫时间 6122. 农夫约翰的奶酪块 #include <iostream> using namespace std; int res; int n, q; int X[1010][1010]; int Y[1010][1010]; int Z[1010][1010]; void solve() {int x, y, z;cin >> x >> y >> z;X…