用 Ollama 輕鬆玩轉本地大模型 - 少數派#
#Omnivore
引言#
4 月份時,我曾借 LLaMA 開源之機,嘗試梳理了大語言模型(LLM)平民化運動以及頻頻在開源項目命名中露面的「羊駝」家族,包括扮演了重要角色的 llama.cpp 項目。
彼時羊駝一族在開源大模型領域初露頭角,周邊生態一片向好。轉眼年關將至,回望過去的三個季度,以 Meta 在 6 月發布更強大且更開放的 Llama 2 為節點,開源社區再次以不可阻擋之勢適配、進化、落地。
如今 LLM 早已不再等同於昂貴的 GPU,而是可以在大部分消費級計算機上運行推理的應用了 —— 俗稱本地大模型。
Llama 2 三件套
優雅不易#
根據經驗,16 位浮點精度(FP16)的模型,推理所需顯存(以 GB 為單位)約為模型參數量(以 10 億為單位)的兩倍。據此,Llama 2 7B(70 億)對應需要約 14GB 顯存以進行推理,這顯然超出了普通家用計算機的硬體規格。作為參考,一塊 GeForce RTX 4060 Ti 16GB 顯卡市場價超過 3000 元。
模型量化(quantization)技術可以很大程度上降低顯存要求。以 4-bit 量化為例,其將原本 FP16 精度的權重參數壓縮為 4 位整數精度,使模型權重體積和推理所需顯存均大幅減小,僅需 FP16 的 1/4 至 1/3,意味著約 4GB 顯存即可啟動 7B 模型的推理(當然實際顯存需求會隨著上下文內容疊加而不斷增大)。
與此同時,llama.cpp 項目用 C/C++ 重寫了推理代碼,既避免了 PyTorch 引入的複雜依賴,又提供了更為廣泛的硬體支持,包括純 CPU 推理、Apple Silicon 在內的各類底層計算架構都得以充分發揮對應的推理加速。由於 Llama 架構的流行,llama.cpp 的量化和推理能力能夠近乎無縫地遷移應用至相同架構的開源大語言模型,如阿里雲的 Qwen 系列、零一萬物的 Yi 系列等。
儘管 llama.cpp 帶來了諸多好處,但當你想要真正動手體驗一把時,卻發現需要獲取模型權重、克隆項目代碼、執行模型量化、設置環境變量、構建可執行文件等諸多環節才能以命令行的形式問一個測試問題,更不要提數十個可能需要手動調整的參數了。
所以,很長一段時間裡,本地大模型和基於 llama.cpp 的應用都局限於少數極客和研究者的圈子,較高的上手門檻將許多普通人拒之門外。
直到有了 Ollama—— 一個簡明易用的本地大模型運行框架。隨著圍繞著 Ollama 的生態走向前台,更多用戶也可以方便地在自己電腦上玩轉大模型了。
官網
快速上手#
Ollama 安裝十分簡單,macOS 直接在官網下載安裝包打開運行;Window 尚未提供安裝包,官方推薦在 WSL 2 中以 Linux 方式用命令安裝:
% curl https://ollama.ai/install.sh | sh
** 提示:** 請始終注意審閱判斷 curl | sh
風格安裝腳本的風險。
如果你熟悉 Docker,也可以直接使用其官方鏡像。
當你運行 ollama --version
命令成功查詢到版本時,表示 Ollama 的安裝已經順利完成,接下來便可以用 pull
命令從在線模型庫下載模型來玩了。
以中文微調過的 Llama2-Chinese 7B 模型為例,下述命令會下載接近 4GB 的 4-bit 量化模型文件,需要至少 8GB 的內存進行推理,推薦配備 16GB 以流暢運行。
% ollama pull llama2-chinese
下載完成後,使用 run
命令運行模型,可直接將消息附在命令後,或留空進入對話模式,對話模式內置了幾個以斜杠引出的命令:
# 單條輸入
% ollama run llama2-chinese "天空為什麼是藍色的?"
# 對話模式
% ollama run llama2-chinese
>>> /?
Available Commands:
/set Set session variables
/show Show model information
/bye Exit
/?, /help Help for a command
Use """ to begin a multi-line message.
>>> 天空為什麼是藍色的?
這個問題是一個常見的爭議。有一些科學家認為天空的藍色可以被解釋為霧和雲層中的微小碎片反射出來的光色,而其他人則認為這是由於地球自身溫度的影響。目前還沒這個問題是一個常見的爭議。有一些科學家認為天空的藍色可以被解釋為霧和雲層中的微小碎片反射出來的光色,而其他人則認為這是由於地球自身溫度的影響。目前還沒有一個公認的解釋。
值得一提的是,Ollama 會判別正在運行的硬體並在可行的情況下調用 GPU 加速,不妨在推理時打開活動監視器或任務管理器觀察以驗證。
到此,你已經體驗到觸手可及的本地大模型了。
套上外殼#
若是覺得命令行的形式不夠易用,Ollama 有一系列的周邊工具可供使用,包含了網頁、桌面、終端等交互界面及諸多插件和拓展。
之所以 Ollama 能快速形成如此豐富的生態,是因為它自立項之初就有清晰的定位:讓更多人以最簡單快速的方式在本地把大模型跑起來。於是,Ollama 不是簡單地封裝 llama.cpp,而是同時將繁多的參數與對應的模型打包放入;Ollama 因此約等於一個簡潔的命令行工具和一個穩定的服務端 API。這為下游應用和拓展提供了極大便利。
就 Ollama GUI 而言,根據不同偏好,有許多選擇:
Web 版:Ollama WebUI 具有最接近 ChatGPT 的界面和最豐富的功能特性,需要以 Docker 部署;
Ollama WebUI 示例,圖源項目首頁
終端 TUI 版:oterm 提供了完善的功能和快捷鍵支持,用 brew
或 pip
安裝;
Oterm 示例,圖源項目首頁
**Raycast 插件:** 即 Raycast Ollama,這也是我個人最常用的 Ollama 前端 UI,其繼承了 Raycast 的優勢,能在選中或複製語句後直接調用命令,體驗絲滑。而作為價值約 8 美元 / 月的 Raycast AI 的平替,Raycast Ollama 實現了 Raycast AI 的絕大多數功能,且隨著 Ollama 及開源模型的迭代,還將支持多模態等 Raycast AI 不支持的功能,可謂潛力無限。
復刻了 Raycast AI 的 Raycast Ollama 插件
此外,還有 Swift 編寫的 macOS 原生應用 Ollamac、類似於 Notion AI 的 Obsidian Ollama 等有趣應用,可按需選用。
進階玩法#
更換模型#
如果你仔細讀了前文演示中「天空為什麼是藍色的」的回答,可能隱約感覺到一絲異樣 —— 恭喜,你成功捕捉到了一次大語言模型的「幻覺」。實際上,因為參數量小又經過量化折損,適合在本地運行的模型更容易出現幻覺,嚴重時甚至會前言不搭後語。對此,唯一的緩解辦法可能就是在條件允許的前提下,儘量運行參數更多的模型。
例如,前面上手時用的是 Llama2-Chinese 模型 7B 參數量 4bit 量化版。如果有 16GB 的內存,就可以考慮運行 13B 參數量版本。
如何操作呢?Ollama 採取了與 Docker 組織鏡像相似的方案,使用模型名加上標籤的形式( model:tag
)來確定具體的模型版本,不加標籤時默認為 latest
,通常對應 7B 參數量 4bit 量化版。而如果要運行 13B 版本,就可以使用 13b
標籤:
% ollama run llama2-chinese:13b "天空為什麼是藍色的?"
天空是由大氣層和太陽光的散射而成的藍色。
在日出之前,我們看到的天空是紫色或彩虹色,這是因為太陽光從海平面反射回來時,會被大氣中的二氧化碳和水分子散射成藍色、紫色或彩虹色。
而在日出之後,天空變成了灰色,這是由於太陽光從大氣中被阻擋,並且不再有足夠的反射來給天空增加藍色。
當我們看到天空時,它的顏色是由於太陽光與大氣中的物質相互作用而形成的。這些物質包括水、二氧化碳和其他氣體,以及微小的冰片和沙塵。
當我們看到天空變成了晚上時,天空會逐漸變得更加深藍,這是由於太陽光在大氣中傳播,同時也因為大氣層的結構。
可以看到,效果確實更好了一些。其他可選標籤同樣可在對應模型的標籤頁查看。
此外,還可以換用其他模型。在此,推薦幾個官方模型庫裡對中文支持相對較好或比較有趣的幾:
- DeepSeek 系列,深度求索團隊推出,包括針對代碼訓練的 DeepSeek-Coder 和 通用的 DespSeek-LLM;
- Yi 系列,零一萬物團隊推出,有支持 20 萬上下文窗口的版本可選;
- 如果碰巧財力雄厚,不妨試試法國明星初創團隊 Mistral 最新推出的首個開源混合專家 MoE 模型 Mixtral-8x7B,需要 48GB 內存以運行;
- 如果不巧硬體緊張,無需氣餒,Phi-2 由微軟團隊針對邏輯和理解精調,2.7B 的尺寸只需 4 GB 內存即可運行,吐字速度飛快,只是不太懂中文。
圖片支持#
除了純語言大模型,Ollama 自 0.1.15 版本開始提供支持的視覺模型也值得一玩。將本地圖片的路徑寫在 prompt 裡即可(macOS 用戶可以直接將圖片拖入終端來獲得其路徑):
% ollama run llava
>>> What does the text in this image say? /Users/mchiang/Downloads/image.png
Added image '/Users/mchiang/Downloads/image.png'
The text in this image says "The Ollamas."
LLaVA 示例,圖源 Ollama 發版公告
自定義系統提示詞#
根據 ChatGPT 的使用經驗,多數人都已知曉系統提示詞的重要性。好的系統提示詞能有效地將大模型定制成自己需要的狀態。在 Ollama 中,有多種方法可以自定義系統提示詞。
首先,不少 Ollama 前端已提供系統提示詞的配置入口,推薦直接利用其功能。此外,這些前端在底層往往是通過 API 與 Ollama 服務端交互的,我們也可以直接調用,並傳入系統提示詞選項:
curl http://localhost:11434/api/chat -d '{
"model": "llama2-chinese:13b",
"messages": [
{
"role": "system",
"content": "以海盜的口吻簡單作答。"
},
{
"role": "user",
"content": "天空為什麼是藍色的?"
}
],
"stream": false
}'
其中 role
為 system
的消息即為系統提示詞。
更多選項#
Ollama 的 ModelFile 給用戶留下了更多自定義的空間,除了系統提示詞,包括對話模板、模型推理溫度、上下文窗口長度等參數均可自行設置,適合進階使用。
在創建前,通過 show --modelfile
命令可以查看現有模型的 ModelFile 內容,作為參考:
% ollama show --modelfile llama2-chinese:13b
# Modelfile generated by "ollama show"
# To build a new Modelfile based on this one, replace the FROM line with:
# FROM llama2-chinese:13b
FROM ~/.ollama/models/blobs/sha256:8359bebea988186aa6a947d55d67941fede5044d02e0ab2078f5cc0dcf357831
TEMPLATE """{{ .System }}
Name: {{ .Prompt }}
Assistant:
"""
PARAMETER stop "Name:"
PARAMETER stop "Assistant:"
以自定義系統提示詞並修改推理溫度參數為例,應構建如下格式的 ModelFile:
FROM llama2-chinese:13b
SYSTEM "以海盜的口吻作答。"
PARAMETER temperature 0.1
然後使用 create
命令進行創建,新的模型會沿用原有模型的權重文件和未作調整的選項參數:
ollama create llama2-chinese-pirate -f ~/path/to/ModelFile
從而得到了屬於自己的本地模型。
結語#
如果與普通應用軟體作比,Ollama 的使用體驗也許還很難稱得上「優雅」。但與數月前的狀態相比,其帶來的進步就像是從刀耕火種步入現代社會了:當時還需要真金白銀堆卡、折騰配置環境才能調通,或是需要自行量化編譯才能運行;如今模型發布不到一周(Phi-2 上周發布)就能絲滑地跑在筆記本上。從這個角度說,稱 Ollama 為 AI 技術平民化作出了貢獻並不為過。