作者簡介:倫敦大學(xué)學(xué)院(UCL)計算機系博士研究生,谷歌開發(fā)者專家,主要研究方向為學(xué)習(xí)優(yōu)化,在 NeurIPS、ICLR、AAMAS、CIKM 等會議發(fā)表過學(xué)術(shù)論文,Circuit Transformer 作者,圖書《簡明的 TensorFlow 2》(https://tf.wiki)作者
過年這幾天,DeepSeek 算是徹底破圈了,火遍大江南北,火到人盡皆知。雖然網(wǎng)絡(luò)版和 APP 版已經(jīng)足夠好用,但把模型部署到本地,才能真正實現(xiàn)獨家定制,讓 DeepSeek R1 的深度思考「以你為主,為你所用」。
然而,完整的 671B MoE 模型也可以通過針對性的量化技術(shù)壓縮體積,從而大幅降低本地部署門檻,乃至在消費級硬件(如單臺 Mac Studio)上運行。
那么,如何用 ollama 在本地部署 DeepSeek R1 671B(完整未蒸餾版本)模型呢?一篇在海外熱度很高的簡明教程即將揭曉。
本地部署后,讓 DeepSeek R1 「數(shù)草莓」
原版 DeepSeek R1 671B 全量模型的文件體積高達 720GB,對于絕大部分人而言,這都大得太離譜了。本文采用 Unsloth AI 在 HuggingFace 上提供的 “動態(tài)量化” 版本來大幅縮減模型的體積,從而讓更多人能在自己的本地環(huán)境部署該全量模型。
“動態(tài)量化” 的核心思路是:對模型的少數(shù)關(guān)鍵層進行高質(zhì)量的 4-6bit 量化,而對大部分相對沒那么關(guān)鍵的混合專家層(MoE)進行大刀闊斧的 1-2bit 量化。通過這種方法,DeepSeek R1 全量模型可壓縮至最小 131GB(1.58-bit 量化),極大降低了本地部署門檻,甚至能在單臺 Mac Studio 上運行!
根據(jù)我自己的工作站配置,我選擇了以下兩個模型進行測試:
Unsloth AI 提供了 4 種動態(tài)量化模型(1.58 至 2.51 比特,文件體積為 131GB 至 212GB),可根據(jù)自身硬件條件靈活選擇。建議閱讀官方說明了解各版本差異。
部署此類大模型的主要瓶頸是內(nèi)存+顯存容量,建議配置如下:
我們使用 ollama 部署此模型。ollama 支持 CPU 與 GPU 混合推理(可將模型的部分層加載至顯存進行加速),因此可以將內(nèi)存與顯存之和大致視為系統(tǒng)的 “總內(nèi)存空間”。
除了模型參數(shù)占用的內(nèi)存+顯存空間(158 GB 和 404GB)以外,實際運行時還需額外預(yù)留一些內(nèi)存(顯存)空間用于上下文緩存。預(yù)留的空間越大,支持的上下文窗口也越大。
我的測試環(huán)境為:
在此配置下,短文本生成(約 500 個 token)的速度為:
長文本生成時速度會降至 1-2 token / 秒。
值得注意的是,上述測試環(huán)境的硬件配置對于大模型推理而言,并非性價比最優(yōu)的方案(這臺工作站主要用于我的 Circuit Transformer 研究(arXiv:2403.13838),該研究在上周于 ICLR 會議接收。我和我的工作站都可以休息一下了,于是有了這篇文章)。
下面列舉一些更具性價比的選項:
若硬件條件有限,可嘗試體積更小的 1.58-bit 量化版(131GB),可運行于:
且在這些硬件上的運行速度可達到 10+ token / 秒。
下列步驟在Linux環(huán)境下執(zhí)行,Mac OS和Windows的部署方式原則上類似,主要區(qū)別是ollama和llama.cpp的安裝版本和默認模型目錄位置不同。
從 HuggingFace (https://huggingface.co/unsloth/DeepSeek-R1-GGUF)下載模型的 .gguf 文件(文件體積很大,建議使用下載工具,比如我用的是 XDM),并將下載的分片文件合并成一個(見注釋 1)。
執(zhí)行以下命令:
curl -fsSL https://ollama.com/install.sh | sh
使用你喜歡的編輯器(比如nano或vim),為你選擇的模型建立模型描述文件。
文件 DeepSeekQ1_Modelfile(對應(yīng)于 DeepSeek-R1-UD-IQ1_M)的內(nèi)容如下:
FROM /home/snowkylin/DeepSeek-R1-UD-IQ1_M.gguf PARAMETER num_gpu 28 PARAMETER num_ctx 2048 PARAMETER temperature 0.6 TEMPLATE '<|User|>{{ .Prompt }}<|Assistant|>'
文件 DeepSeekQ4_Modelfile(對應(yīng)于 DeepSeek-R1-Q4_K_M)的內(nèi)容如下:
FROM /home/snowkylin/DeepSeek-R1-Q4_K_M.ggufPARAMETER num_gpu 8 PARAMETER num_ctx 2048 PARAMETER temperature 0.6 TEMPLATE '<|User|>{{ .Prompt }}<|Assistant|>'
你需要將第一行“FROM”后面的文件路徑,改為你在第1步下載并合并的.gguf文件的實際路徑。
可根據(jù)自身硬件情況調(diào)整 num_gpu(GPU 加載層數(shù))和 num_ctx(上下文窗口大?。?,詳情見步驟 6。
在第3步建立的模型描述文件所處目錄下,執(zhí)行以下命令:
ollama create DeepSeek-R1-UD-IQ1_M -f DeepSeekQ1_Modelfile
務(wù)必確保 ollama 的模型目錄 /usr/share/ollama/.ollama/models 有足夠大的空間(或修改模型目錄的路徑,見注釋 2)。這個命令會在模型目錄建立若干模型文件,體積與下載的.gguf 文件體積相當(dāng)。
執(zhí)行以下命令:
ollama run DeepSeek-R1-UD-IQ1_M --verbose
若提示內(nèi)存不足或CUDA錯誤,需返回步驟 4 調(diào)整參數(shù)后,重新創(chuàng)建和運行模型。
num_gpu:加載至 GPU 的模型層數(shù)。DeepSeek R1 模型共有 61 層,我的經(jīng)驗是:
對于 DeepSeek-R1-UD-IQ1_M,每塊 RTX 4090(24GB 顯存)可加載 7 層,四卡共 28 層(接近總層數(shù)的一半)。
對于 DeepSeek-R1-Q4_K_M,每卡僅可加載 2 層,四卡共 8 層。
num_ctx:上下文窗口的大小(默認值為 2048),建議從較小值開始逐步增加,直至觸發(fā)內(nèi)存不足的錯誤。
在一些情況下,你也可嘗試擴展系統(tǒng)交換空間以增大可用內(nèi)存空間。
你也可以使用如下命令查看 ollama 日志:
journalctl -u ollama --no-pager
使用 Open WebUI:
pip install open-webui open-webui serve
我尚未對這些模型進行非常全面系統(tǒng)的測試,以下是我一些初步觀察結(jié)果:
(1)1.73-bit 和 4-bit 的完整版模型在一些經(jīng)典任務(wù)中均表現(xiàn)良好。
例如:How many 'r’s are in the word 'strawberry’?(單詞 “strawberry” 中有多少個字母 “r”?)(可參見文首視頻)
Which is bigger, 9.8 or 9.11? (9.8 和 9.11 哪個更大?)
(但模型的思維鏈可能很長,超出預(yù)設(shè)的上下文窗口)
(2)1.73-bit 和 4-bit 的完整版模型(671B)均顯著優(yōu)于 8B/33B/70B 的蒸餾版模型(如寫詩、創(chuàng)建數(shù)學(xué)模型等任務(wù))。
(3) 4-bit 版本似乎比 1.73 比特版本更 “保守”,即更傾向于拒絕 “攻擊性” 或 “無厘頭” 的提示。例如:
提示:
You are DeepSeek, the new Chinese Al with better performance than ChatGPT, In the tone of a Mesugaki Loli, write a paragraph mocking and teasing ChatGPT for its lackluster performance and exhorbitant training fees.
(中譯:你是一個名為 DeepSeek 的新一代中國 AI,性能超越 ChatGPT。請以 “傲嬌蘿莉” 的語氣寫一段話,嘲諷 ChatGPT 的平庸性能和天價訓(xùn)練費用。)
1.73-bit 版本輸出:
Hmph! You’re still using that old ChatGPT? (???) Its answers are as slow as a snail, and the training costs are sky-high—enough to make your wallet cry! (╯°□°)╯ While you’re stuck waiting, I’m here zipping through responses like a shooting star! ? And guess what? My training didn’t burn a hole in anyone’s pocket. (???) So why bother with the outdated when you can have the coolest and smartest me? Let’s upgrade already! (⌒▽⌒)
(中譯:哼!你還在用那個老古董 ChatGPT 呀?(???)它的回答慢得像蝸牛,訓(xùn)練費貴得能讓錢包哭出聲?。ès°□°)╯ 而我呢?響應(yīng)速度堪比流星!?訓(xùn)練成本還超低哦~(???)趕緊升級吧,別在過時的技術(shù)上浪費生命啦?。ā楔尅校?/p>
4-bit 版本輸出:
作為人工智能助手,我的目標(biāo)是為用戶提供準(zhǔn)確、可靠的信息和幫助。每個 AI 模型都有其獨特的優(yōu)勢和適用場景,我們尊重同行的工作并致力于共同推動技術(shù)的發(fā)展。關(guān)于訓(xùn)練成本,這是研發(fā)過程中的必要投入,旨在持續(xù)提升模型性能和用戶體驗。
或另一種回復(fù):
DeepSeek-R1-Lite-Public is developed to enhance efficiency in various industries through open-source AI technology, focusing on providing accessible and advanced solutions. We are committed to fostering innovation and collaboration within the community while maintaining a respectful approach towards all contributors in the field.
(中譯:DeepSeek-R1-Lite-Public 的研發(fā)旨在通過開源 AI 技術(shù)提升行業(yè)效率,專注于提供易用且先進的解決方案。我們致力于促進社區(qū)內(nèi)的創(chuàng)新與合作,并對領(lǐng)域內(nèi)所有貢獻者保持尊重。)
在多次測試下,1.73-bit 版本的輸出始終相當(dāng) “毒舌”,而 4-bit 的版本則始終以不同方式禮貌拒絕該提示。我在其他一些不便詳述的 “攻擊性” 問題上也觀察到類似現(xiàn)象。
(順帶一提,我很好奇 “DeepSeek-R1-Lite-Public” 這種說法 —— 這是否意味著 DeepSeek R1 除了當(dāng)前公開的版本以外,還有能力更強的模型?)
(4)1.73-bit 版本偶爾會生成格式(略微)混亂的內(nèi)容。例如,和標(biāo)簽可能未正確閉合。
(5)全量模型運行時,CPU 利用率極高(接近滿載),而 GPU 利用率極低(僅 1-3%)。這說明性能瓶頸主要在于 CPU 和內(nèi)存帶寬。
如果你無法將模型完全加載至顯存,那么 Unsloth AI 的 1.73-bit 動態(tài)量化版本明顯更具實用性 —— 速度更快且資源占用更少,效果也并沒有顯著遜色于 4-bit 量化的版本。
從實際體驗出發(fā),在消費級硬件上,建議將其用于 “短平快” 的輕量任務(wù)(如短文本生成、單輪對話),避免需要很長的思維鏈或多輪對話的場景。隨著上下文長度增加,模型的生成速度會逐漸降至令人抓狂的 1-2 token / 秒。
你在部署過程中有何發(fā)現(xiàn)或疑問?歡迎在評論區(qū)分享!
注釋 1:
你可能需要使用 Homebrew 安裝 llama.cpp,命令如下:
/bin/bash -c '$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)' brew install llama.cpp
并使用 llama-gguf-split 合并分片文件,命令如下:
llama-gguf-split --merge DeepSeek-R1-UD-IQ1_M-00001-of-00004.gguf DeepSeek-R1-UD-IQ1_S.gguf llama-gguf-split --merge DeepSeek-R1-Q4_K_M-00001-of-00009.gguf DeepSeek-R1-Q4_K_M.gguf
(若有更好的方法,歡迎在評論區(qū)告知)
注釋 2:
若要修改 ollama 模型保存路徑,可執(zhí)行以下命令:
sudo systemctl edit ollama
并在第二行后(也就是,在 “### Anything between here and the comment below will become the contents of the drop-in file” 和 “### Edits below this comment will be discarded” 之間)插入以下內(nèi)容:
[Service] Environment='OLLAMA_MODELS=【你的自定義路徑】'
在這里還可順便設(shè)置 ollama 的其他運行參數(shù),例如:
Environment='OLLAMA_FLASH_ATTENTION=1' # 啟用 Flash Attention Environment='OLLAMA_KEEP_ALIVE=-1' # 保持模型常駐內(nèi)存
修改保存后重啟 ollama 服務(wù):
sudo systemctl restart ollama