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

本人環境: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.pswp.cn/diannao/85790.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85790.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85790.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis命令使用

Redis是以鍵值對進行數據存儲的&#xff0c;添加數據和查找數據最常用的2個指令就是set和get。 set&#xff1a;set指令用來添加數據。把key和value存儲進去。get&#xff1a;get指令用來查找相應的鍵所對應的值。根據key來取value。 首先&#xff0c;我們先進入到redis客戶端…

Linux打開.img鏡像文件

kparkx 可以查看和修改img文件的內容 1.安裝kparkx 1.安裝 kpartx sudo apt-get update sudo apt-get install kpartx2.使用kpartx映射鏡像文件 假設鏡像文件名為 example.img &#xff0c;以下命令會將其分區映射到 dev/mapper/ sudo kpartx -av example.img? -a表示添加…

6.4 計算機網絡面試題

HTTP到底是不是無狀態的&#xff1f; 無狀態即每個請求都是獨立的&#xff0c;服務器不會在多個請求間保存關于客戶端狀態的信息。 HTTP雖然是無狀態的&#xff0c;但是可以通過一些機制保存狀態&#xff0c;如使用cookies session跟蹤用戶狀態。 攜帶Cookie的HTTP請求是有狀…

基于千帆大模型的AI體檢報告解讀系統實戰:使用OSS與PDFBox實現PDF內容識別

目錄 說明 前言 需求 流程說明 表結構說明 整體流程 百度智能云 注冊和實名認證 創建應用 費用說明 大模型API說明 集成大模型 設計Prompt 上傳體檢報告 讀取PDF內容 功能實現 智能評測 抽取大模型工具 功能實現 總結 說明 AI體檢報告解讀、病例小結或者…

湖北理元理律師事務所:債務優化中的生活保障實踐

在債務壓力與生活質量失衡的普遍困境中&#xff0c;法律服務的價值不僅在于解決債務問題&#xff0c;更在于幫助債務人重建生活秩序。湖北理元理律師事務所通過其債務優化服務&#xff0c;探索出一條“法律生活”的雙軌路徑。 債務規劃的核心矛盾&#xff1a;還款能力與生存需…

無人機智能識別交通目標,AI視覺賦能城市交通治理新高度

在城市化快速發展的當下&#xff0c;如何實現對道路交通的智能化管理、保障出行安全&#xff0c;成為城市治理的重要命題。傳統的交通監控往往依賴地面攝像頭&#xff0c;受限于固定視角與安裝環境。而今&#xff0c;隨著人工智能與無人機技術的深度融合&#xff0c;一種更高效…

unity UI Rect Transform“高”性能寫法

&#x1f3af; Unity UI 性能優化終極指南 — RectTransform篇 &#x1f9e9; RectTransform 是什么&#xff1f; Unity UI中每一個UI元素的必備組件繼承自 Transform&#xff0c;但專門用于 2D 布局負責定義UI的位置、大小、錨點、旋轉、縮放 ?? 特別注意&#xff1a;所有…

JDK21深度解密 Day 8:Spring Boot 3與虛擬線程整合

【JDK21深度解密 Day 8】Spring Boot 3與虛擬線程整合 引言:Spring Boot 3遇上JDK21虛擬線程 在本系列的第8天,我們將聚焦于Spring Boot 3與JDK21虛擬線程的整合實踐。作為全網首套完整的JDK21特性解析,我們不僅會探討虛擬線程如何顛覆傳統Java并發模型,還會通過完整的Sp…

【STM32F407 PWM配置和應用指南 】

PWM基本概念 PWM&#xff08;脈沖寬度調制&#xff09;是一種通過快速開關數字信號來控制模擬電路的技術&#xff0c;通過改變脈沖的占空比來控制平均電壓。STM32F407的定時器外設可以生成PWM信號。 STM32F407 PWM配置步驟 1. 定時器時鐘使能 首先需要使能定時器的時鐘&…

鴻蒙【HarmonyOS 5】 (React Native)的實戰教程

一、環境配置 ?安裝鴻蒙專屬模板? bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ?配置 ArkTS 模塊路徑? 在 entry/src/main/ets 目錄下創建原生模塊&…

MYSQL MGR高可用

1&#xff0c;MYSQL MGR高可用是什么 簡單來說&#xff0c;MySQL MGR 的核心目標就是&#xff1a;確保數據庫服務在部分節點&#xff08;服務器&#xff09;發生故障時&#xff0c;整個數據庫集群依然能夠繼續提供讀寫服務&#xff0c;最大限度地減少停機時間。 2. 核心優勢 v…

(18)混合云架構部署

文章目錄 &#x1f680; 混合云架構部署&#xff1a;Java應用的云原生之旅&#x1f329;? 混合云架構簡介? Java應用云原生部署五大核心技術1?? 容器化與編排技術2?? 服務網格與API網關3?? CI/CD自動化流水線4?? 多云管理平臺5?? 云原生Java框架與運行時 &#x1f…

虛擬現實教育終端技術方案——基于EFISH-SCB-RK3588的全場景國產化替代

一、VR教育終端技術挑戰與替代價值 ?實時交互性能瓶頸? 賽揚N100/N150僅支持3DOF渲染&#xff08;延遲&#xff1e;25ms&#xff09;&#xff0c;動態手勢識別幀率≤15FPS&#xff0c;難以滿足6DOF教學場景需求RK3588 Mali-G610 GPU支持6DOF空間渲染&#xff08;延遲≤12ms&…

pikachu靶場通關筆記14 XSS關卡10-XSS之js輸出(五種方法滲透)

目錄 一、源碼分析 1、進入靶場 2、代碼審計 二、滲透實戰 1、根據提示輸入tmac 2、XSS探測 3、注入Payload1 4、注入Payload2 5、注入Payload3 6、注入Payload4 7、注入Payload5 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關&#xff09;滲透集合&#x…

PARADISE:用于新生兒缺氧缺血性腦病(HIE)疾病識別與分割的個性化和區域適應性方法|文獻速遞-深度學習醫療AI最新文獻

Title 題目 PARADISE: Personalized and regional adaptation for HIE disease identification and segmentation PARADISE&#xff1a;用于新生兒缺氧缺血性腦病&#xff08;HIE&#xff09;疾病識別與分割的個性化和區域適應性方法 1 文獻速遞介紹 缺氧缺血性腦病&…

OpenCV C++ 心形雨動畫

?? OpenCV C 心形雨動畫 ?? 本文將引導你使用 C 和 OpenCV 庫創建一個可愛的心形雨動畫。在這個動畫中&#xff0c;心形會從屏幕頂部的隨機位置落下&#xff0c;模擬下雨的效果。使用opencv定制自己的專屬背景 目錄 簡介先決條件核心概念實現步驟 創建項目定義心形結構…

【記錄】Python|Python支持if 1<a<2、if not a、if a is None這三種寫法

今天讓AI幫我寫代碼&#xff0c;突然發現寫出來一句類似1<a<2&#xff0c;我頓感疑惑&#xff1a;不是只能用and連接嗎&#xff1f; 一試發現真行&#xff0c;那我辛辛苦苦寫了好幾年的 (條件1) and (條件2) 算什么&#xff1f;算我勤快嗎&#xff1f;&#x1f62d; 常…

Matlab | MATLAB 中的插值詳解

MATLAB 中的插值詳解 插值是數值分析中的核心技術,用于在已知數據點之間估計未知點的值。MATLAB 提供了完整的插值函數庫,涵蓋一維到高維數據,支持多種插值方法。以下從基礎到高級全面解析: 一、插值核心概念 1. 數學本質 給定數據點 ( x i , y i ) (x_i, y_i) (<

正則表達式檢測文件類型是否為視頻或圖片

// 配置化文件類型檢測&#xff08;集中管理支持的類型&#xff09; const FILE_TYPE_CONFIG {video: {extensions: [mp4, webm, ogg, quicktime], // 可擴展支持更多格式regex: /^video\/(mp4|webm|ogg|quicktime)$/i // 自動生成正則},image: {extensions: [jpeg, jpg, png,…

Redis最佳實踐——熱點數據緩存詳解

Redis在電商熱點數據緩存中的最佳實踐 一、熱點數據定義與識別 1. 熱點數據特征 高頻訪問&#xff08;QPS > 1000&#xff09;數據規模適中&#xff08;單條 < 10KB&#xff09;數據變化頻率低&#xff08;更新間隔 > 5分鐘&#xff09;業務關鍵性高&#xff08;直接…