前言
我之前已經寫了幾篇關於AI大語言模型基礎方面的文章,包括本地大語言模型UI和API供應商的介紹(參看文章:開啟AI之旅:本地大語言模型UI與大語言模型API供應商的入門詳解),本地大語言模型UI:Lobechat的安裝部署教學(參考文章:docker系列基於開源大語言模型UI框架:Lobechat的詳細部署教學)及詳細設定及使用教學(參看文章:家庭資料中心系列解鎖Lobechat的全部潛能:從設定到實戰的完整攻略)。不過,在寫這些內容時涉及的API供應商,基本上還是商業化的著名API供應商,例如OpenAI(GPT系列)、Google(Gemini系列)、Anthropic(Claude系列)等。
但是,除了商業化的API供應商之外,還有能本地自建的開源大語言模型框架,例如著名的Ollama,本文就以Ollama框架下部署大語言模型為例演示如何在本地構建自己的開源大語言模型。
註:本地自建開源大語言模型對硬體的要求不低,運行較大的參數規模的模型對內存有不低的要求,並且如果要求大語言模型的響應速度,需要Nvidia顯示卡的支持,所以還是有不低的門檻的。我因為是安裝在inter CPU的mini主機上,沒有獨顯,所以只能靠CPU,那反應速度一言難盡~。
基於Ollama搭建自己的開源大語言模型
Ollama簡介
Ollama 是一個專注於在本地運行和管理大型語言模型(LLM)的框架(官網位址:https://ollama.com/),提供使用者友善的介面和工具,用於方便地載入、管理、運行多種大語言模型。在不依賴雲端伺服器的情況下,Ollama讓使用者可以直接在自己的電腦上有效運作LLM,同時具備豐富的擴充功能,Ollama 的核心特點如下:
- 本地運行:Ollama 支援直接在本地硬體上運行大語言模型,這對於資料隱私敏感的使用者尤其有吸引力,因為資料完全保存在本地。
- 模型支持:Ollama相容於多種流行的模型,使用者可以選擇載入合適的模型,根據不同任務需求進行調整。模型範圍包括開源的LLM,以及與GPT-4 類似的高品質模型。
- 介面友善:提供直覺的UI 和CLI(命令列介面),使用者可以透過圖形化介面與模型交互,也能在終端機中執行模型命令。
- 輕鬆安裝與管理:Ollama允許使用者方便地下載、安裝和更新模型,管理多個模型實例,提高了本地模型的易用性和靈活性。
- 客製化與擴展:支援多種模型的微調和參數調節,使用者可根據特定任務優化模型效果。此外,Ollama允許將本地模型用於個性化的應用程式開發,使其可以無縫融入不同專案。
Ollama的應用場景包括但不限於:
• 資料隱私保護:在需要高隱私性和資料在地化的環境下,Ollama適合在企業、組織和個人開發環境中使用。
• 開發和測試:Ollama是研究和測試LLM 的理想工具,可幫助開發者在本地調試模型表現。
• 資源最佳化:可以在不依賴雲端服務的情況下運行複雜模型,適合需要本地運算的專案。
整體而言,Ollama 適合那些希望在本地私有化環境中使用大語言模型,並且想要對模型的選擇和參數進行靈活管理的使用者。
Ollama支援的本地大語言模型
Ollama 支援多種開源和最佳化版的大語言模型,方便在本地運行,無需依賴網路連接,且這些模型在功能和表現上可以取代市面上的商用大語言模型。以下是Ollama 支援的一些常見本地可運行模型及其應用:
1. LLaMA (Large Language Model Meta AI)
• 簡介:Meta推出的開源模型家族,提供不同規模的模型(如LLaMA-7B、LLaMA-13B、LLaMA-30B等),擁有良好的性能並且可以在本地運行,LLaMA的模型架構在多任務下表現出色,適合文本生成、問答等常見的語言任務。其中,Llama 3是Meta AI開源的第三代Llama系列模型,其新的8B 和70B 參數Llama 3 模型在Llama 2的基礎上,實現了更大性能的提升,由於預訓練和訓練後的技術改進,其Llama 3模型是當今8B 和70B 參數規模的最佳模型。 Llama 3模型的改進大大降低了錯誤拒絕率,改善了一致性,並增加了模型反應的多樣性。 Llama 3模型在推理、程式碼產生和指令追蹤等功能也得到了極大的改善。
• 替代商用模型:類似OpenAI 的GPT-3 和GPT-3.5,尤其適合小型專案和開發者個人使用。
2. Mistral
• 簡介:Mistral是一款效能最佳化的開源模型,以較少的運算量實現優異的效能,能夠在資源受限的裝置上高效運作。其結構特別適合在多工處理上取得良好的平衡。
• 替代商用模型:可以取代類似GPT-3 等級的商用模型,特別適合需要小模型部署、低運算資源的應用。
3. Falcon
• 簡介:Falcon模型是TII (Technology Innovation Institute) 推出的強大開源模型,具有強大的自然語言生成和理解能力。 Falcon 40B在多種基準上表現優異,適合各種複雜文字任務。
• 替代商用模型:可以取代GPT-3.5 和GPT-4 等級的商用模型,在某些情境下效能接近ChatGPT,並在複雜任務處理上有很好的表現。
4. Vicuna
• 簡介:這是基於LLaMA進行指令微調的模型,特別優化了在指令跟隨任務下的表現。 Vicuna 的訓練資料來自大規模的使用者指令數據,使其更適合對話場景。
• 替代商用模型:適合替代類似ChatGPT或Anthropic的Claude系列模型,尤其在對話、問答和客戶支援等互動式任務上表現良好。
5. Code LLaMA
• 簡介:Meta針對程式碼產生任務專門最佳化的LLaMA變體模型,支援多種程式語言的程式碼補全、生成和解釋。專為開發人員設計,提升了程式碼產生任務的準確性。
• 替代商用模型:適合取代GitHub Copilot 或OpenAI 的Codex,在程式碼補全和程式支援上有相似的能力。
6. GPT-J & GPT-NeoX
• 簡介:EleutherAI開發的開源模型家族,具有不同參數規模(如GPT-J-6B和GPT-NeoX-20B等),專為支援各種自然語言生成任務設計,表現優異。
• 替代商用模型:GPT-J和GPT-NeoX可以用來取代GPT-3等級的商用模型,適用於日常對話、生成式任務。
7. Dolly
• 簡介:Databricks推出的開源模型,支援在地化和客製化的微調,擅長處理簡單的對話任務和問答。
• 替代商用模型:適合取代類似Bard或GPT-3等級的模型,尤其在需要個人化微調的小型專案中表現出色。
8. Bloom
• 簡介:由BigScience協作專案推出的大型開源模型,支援多語言處理,擅長長文本生成任務,在多語言應用中表現優異。
• 替代商用模型:可以用來取代GPT-3.5或Claude 2等商用模型,特別適合多語言支援需求的任務。
總結
還有一些其他的模型,我就不一一列舉了,這些模型在Ollama 的支持下可以在本地運行,提供商用模型的平替方案,特別適合需要數據隱私、安全性高、需要自定義或對成本敏感的應用場景。這些模型在資源消耗上通常比商用模型小一些,適合需要特定任務或自訂需求的使用者。
Ollama部署
部署方式與差異
Ollama既可以採用docker方式部署,也可以採用源碼方式部署,在效能方面,Ollama 的源碼部署和Docker 部署通常不會有顯著差異,因為底層的模型推理依賴硬體而非運行環境本身。但在具體場景中,以下幾點可能會產生一些小差異:
- 資源分配:Docker 容器有時會限制對硬體資源的直接訪問,尤其是在預設配置下。儘管可以調整Docker 設定以提供更高的資源存取權限,但相較於直接在主機上執行原始碼,Docker 部署的資源管理稍顯間接。
- 系統開銷:Docker 容器會增加少量的系統開銷(如儲存層和網路層),這些開銷通常較小,但在高效能運算場景下可能會累積成微小的延遲。
- 驅動相容性:如果使用GPU,原始碼部署可以直接存取本地GPU 驅動,而Docker 則需要GPU 支援的專用容器和驅動配置。 NVIDIA 提供了nvidia-docker 工具來最佳化Docker 的GPU 支持,因此通常能達到與原始碼部署接近的效能。
簡單總結:在沒有GPU的環境,源碼方式部署和docker方式部署基本上沒區別,這時候更推薦docker方式部署;如果有GPU,更推薦源碼方式部署。
docker方式部署
僅CPU
docker run --name ollama -d --restart=always --net=public-net \
-v /docker/ollama:/root/.ollama \
-p 11434:11434 \
-e OLLAMA_ORIGINS="*" \
ollama/ollama
參數註解:
-v /docker/ollama:/root/.ollama:映射宿主機上”/docker/ollama”到容器內部”/root/.ollama”
-e OLLAMA_ORIGINS=”*
“:允許跨網域存取的域名,預設是”本地存取”,按需配置
Nvidia GPU
安裝NVIDIA 容器工具包(在宿主機配置)
使用Apt安裝
- 配置倉庫
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
| sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
| sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
- 安裝NVIDIA 容器工具包
sudo apt-get install -y nvidia-container-toolkit
使用Yum或Dnf安裝
- 配置倉庫
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo \
| sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
- 安裝NVIDIA 容器工具包
sudo yum install -y nvidia-container-toolkit
配置Docker使用Nvidia驅動
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
建立並運行容器
docker run --name ollama -d --restart=always --net=public-net \
--gpus=all \
-v ollama:/root/.ollama \
-p 11434:11434 \
-e OLLAMA_KEEP_ALIVE="10m" \
-e OLLAMA_ORIGINS="*" \
ollama/ollama
參數註解:
–gpus=all:允許Docker 容器存取宿主機的所有Nvidia GPU。啟用了NVIDIA GPU 支持,指示Docker 將宿主機上可用的所有GPU 分配給該容器。如果主機上有多張GPU,這個選項會讓容器存取所有GPU 裝置。此選項依賴安裝”nvidia-container-toolkit”,並要求宿主機支援NVIDIA 驅動程式。如果沒有GPU 或未安裝NVIDIA 支援庫,–gpus=all 不會起作用,指令也會忽略GPU 支援。
-e OLLAMA_KEEP_ALIVE=”10m”:模型在顯存中保持載入的持續時間,預設”5m”,按需修改
AMD GPU
要使用Docker 透過AMD GPU 運行Ollama,使用 rocm
標籤和以下命令:
docker run -d --device /dev/kfd --device /dev/dri -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama:rocm
源碼方式部署
對於部署的作業系統,在Ollama官方預設的源碼安裝預設支援3種:macos、Linux、Windows,macos和Windows都是傳統應用的安裝方式,Linux就是一條安裝指令:
curl -fsSL https://ollama.com/install.sh | sh
安裝步驟很簡單,這裡就不浪費篇幅介紹了。
原始碼安裝和docker安裝方式不同,會多一些環境參數變數的指定,例如”OLLAMA_HOST”:綁定的主機和端口,預設是”127.0.0.1:11434″,按需配置,如果本地大語言模型UI和Ollama在同一台裝置上,使用預設值即可;如果不在同一台裝置上,且遠端存取有問題,可以嘗試設定此參數。
安裝現成的模型版本
接下來,就是在本地運行你需要的大模型版本,大模型最新的模型版本和模型參數規模數量以及模型大小可以參考github官方頁面的參數(https://github.com/ollama/ollama):
註:這裡的單位」B」指的是模型的參數規模數量,以「Billion」(十億)為單位。換句話說,1B表示模型有10 億個參數,7B 則表示有70 億個參數。模型參數的數量通常反映了模型的複雜性和能力——參數越多,模型可以捕捉和表達的語言特徵也越豐富,但同時需要更多計算資源和記憶體。在大語言模型中,參數代表了模型中的權重和偏壓等學習到的值。這些參數決定了模型如何處理和產生文字數據,參數量越大,一般來說模型的表現越好,但需要更高的硬體效能支援才能高效運作。
不同的模型規則對宿主機記憶體有要求:
上圖雖然只說了7B,13B,33B,但通常可以根據模型參數規模的線性比例來粗略推算所需的記憶體。例如,假設7B 模型需要8 GB 內存,模型參數和內存需求之間大致呈線性關係,可以推算出:
• 1B 模型:約1.1 – 1.2 GB 內存
• 2B 模型:約2 – 2.3 GB 內存
• 3B 模型:約3 – 3.5 GB 內存
• 8B 模型:約9 – 9.5 GB 內存
這些只是粗略估計,具體需求可能會因模型架構、最佳化方法或載入模式而有所變化。實際記憶體需求可以根據模型的實際分佈和分段載入情況稍有不同,但整體的計算思路可以作為參考。
自訂模型
附加知識:GGUF模型文件格式
「GGUF」指的是一種專門為本地使用最佳化的模型檔案格式,尤其適用於在資源有限的裝置上執行LLM(大語言模型)。它是一種二進位格式,具有跨平台和模型相容性優勢,因此載入和推理速度更快。這種格式在開源大語言模型社群中(Reddit、Discord 以及其他AI社群論壇)越來越受歡迎,因為它可以在不依賴雲端資源的情況下提升本地效能。
一些開源模型庫也提供了大量支援GGUF格式的開源模型,以」Hugging Face」(目前最受歡迎的平台之一)為例,透過Hugging Face 模型庫,可以搜尋並下載許多社群和機構分享的預訓練模型,有時直接包含GGUF格式或對應的轉換工具。
另外,一些支援GGUF 格式的模型(如LLaMA 等開源模型)會由開發團隊直接發佈在GitHub 等平台上,官方倉庫或發布頁面通常會列出支援的格式,並提供下載連結。
自訂模型
Ollama可以透過在Modefile檔案中匯入GGUF格式的模型檔案來建立自訂模型,步驟如下。
- 先建立一個名為」Modelfile」的文件,在檔案中加入以下FROM指令指定要匯入模型的本機檔案路徑:
FROM ./vicuna-33b.Q4_0.gguf
- 在Ollama中創建名為example的模型(模型名稱隨意設置,看你喜歡):
ollama create example -f Modelfile
- 運行自訂模型
ollama run example
註:Modelfile 是一個配置文件,包含了模型的核心設定和超參數。常見的配置選項包括模型的基礎來源路徑(透過FROM 指定)、層數、隱藏單元和注意力頭數等超參數。還可以定義訓練資料的位置、學習率、批次大小和優化器等訓練參數。 Modelfile 中的其他設定包括輸入格式、輸出類型、裝置類型(如CPU 或GPU)、記憶體限制以及作者、版本和描述等模型元資料。這些參數組合提供了靈活的自定義,使模型的加載、訓練和運行更有效率並適應不同的應用需求,由於內容較多,而我又暫時涉及不到,所以這裡不多說了,需要的朋友可以自行研究下。
Ollama中安裝模型llama3.2及常規使用
安裝llama3.2
以”llama3.2 3B”模型為例,由於我是透過僅CPU的docker方式部署,所以運行該模型的命令為:
docker exec -it ollama ollama run llama3.2
然後就是一段時間的等待,具體等待時間跟你選擇的模型大小以及網路速度有關:
和docker run
命令類似,ollama run
命令其實也包括先進行pull
操作拉取模型,然後再run
,所以其實也可以單獨先拉取鏡像,需要的時候再運行ollama run
命令:
docker exec -it ollama ollama pull llama3.2
然後可以使用ollama list
指令查看已經下載的大語言模型:
docker exec -it ollama ollama list
使用ollama ps
命令查看正在運行的大語言模型:
docker exec -it ollama ollama ps
使用ollama stop
命令和looama rm
命令搭配可以刪除一個正在運行的大語言模型:
docker exec -it ollama ollama stop 模型ID docker exec -it ollama ollama rm 模型ID
也可以透過以下命令看看ollama -h
命令支援哪些參數:
docker exec -it ollama ollama -h
如果是源碼方式安裝Ollama,則直接在shell裡執行對應的模型下載安裝指令即可:
ollama run llama3.2
其他指令和docker下的是一樣的,不同的是均是直接運作即可。
也可以嘗試其他不同的模型,具體模型對應的指令可以參考上面的圖片。
其實,運行命令ollama run llama3.2
時,容器內部已經進入了和llama3.2的互動介面:
只不過,這種互動方式並不實用,頂多用來做測試,要真正實用還是要依賴本地大語言模型UI,例如Lobechat。
在Lobechat中加入ollama中的llama 3.2模型
方式一、自建llama 3.2模型(不推薦,折騰)
在我寫文章的時候,Lobechat還未內建支援llama 3.2模型,所以可以透過自建模型的方式來使用:
按照我之前文章描述(家庭資料中心系列解鎖Lobechat的全部潛能:從設定到實戰的完整攻略),可以自己新建一個llama 3.2 3B模型版本:
然後就多出了Llama 3.2 3B的模型版本:
點選上圖紅框中的”Llama 3.2 3B”,進入具體模型設定頁面,按需配置後點選”確定”儲存:
方式二、直接從Ollama取得已下載的模型清單(推薦)
這種方式最簡單,如果和ollama通訊正常,通過了檢查,可以直接點擊”獲取模型列表”按鈕來獲取ollama上已經下載的模型,比如我就下載了2個,llama3.2和gemma2:2b,所以點選取得模型清單直接就出現了,如下圖:
註:唯一需要關注的問題,就是我在上圖中註釋的,假如Ollama和Lobechat在同一台設備上,而”Ollama服務地址”框部分又是留空(表示使用系統默認的http://127.0.0.1:11434
地址)的時候,明明Ollama是正常的也使用了ollama run
命令啟用了對應的大模型,卻死活通不過檢查。
如果遇到這種問題,可以試著把位址從127.0.0.1改成設備網路卡的真實IP位址,估計是個bug。
在Lobechat”會話”介面選擇ollama 3.2模型
直接在Lobechat的」會話」介面右邊聊天部分,助手的頭像右邊選擇對應的模型,我這裡選擇Llama 3.2 3B,如下圖:
那就試試簡單的對話:
直接幫我把docker專用虛擬機器的cpu乾到了78%:
寫個最簡單的shell腳本:
docker專用虛擬機器的cpu乾到了90%~:
僅CPU部署還是夠嗆,我又嘗試了下規模更小的模型”llama3.2:1b”,相比3B,1B需要的資源更少,速度理論上會更快,但是嘛,只是感覺輸出速度快了那麼一點點:
CPU利用率略低一點,其實也沒太大差異:
想來,應該是因為瓶頸是在於我的CPU,我這垃圾CPU,不管是對於1B,還是3B,其實都沒啥區別~。
註:github上也有不少llama3的中文微調版,經過優化之後,相同配置下,響應速度和對中文的支援都有不小的提高,大家感興趣可以去找找,直接在github上搜尋」llama3 ″即可,前面提到的一些平台和社群也是一個查找管道。
後話
本來,我還想研究一下使用inter核顯能不能實現加速,不過,研究了一下,似乎意義不大的樣子,因為Ollama 的部署主要支援NVIDIA GPU,是因為需要CUDA支援來進行深度學習任務加速( CUDA 是NVIDIA 專有的GPU 計算平台,廣泛用於AI 模型的訓練和推理加速)。而Intel 核顯缺乏對CUDA 的支持,雖然Intel 也在開發適用於AI 推理的GPU 解決方案(如Intel Arc 獨顯及其OneAPI 框架),但Ollama 尚未宣布對這些硬體和框架的支持,更別說是Inter的核顯了~,就算是折騰出來,意義也不大。
不過,在Apple M 系列(如M3 Pro)上運行Ollama,卻可以獲得較好的性能,尤其是對於小型或中型的大語言模型(如7B 參數以下的模型):蘋果的M 系列晶片(包括M1 、M2、M3 及其Pro、Max、Ultra變體)內建了強大的神經網路引擎和GPU,專門針對機器學習任務進行了優化,因此在本地運行大語言模型時性能表現”不俗”,但是具體如何個”不俗”就不清楚了,我macbook pro只是M1的,實在沒有啥測試的慾望。
決定了,明年買個M4 pro的mac mini來測試下,為了做研究我也是拼了,這是為科學獻身,可不是亂花錢~。
另,附上Apple M 系列(以M3 Pro為例)與NVIDIA GPU 跑ollama的簡單比較:
• 推理速度
對於不太大的機型(如7B 或更小的機型),M3 Pro 的效能可以接近入門級NVIDIA 顯示卡,甚至比一些低階GPU 更快。但是,對於大規模模型(如13B 或更大),NVIDIA 專業GPU(如A100、H100、RTX 4090 等)的CUDA 核心和Tensor 核心可以提供顯著加速,尤其在顯存和平行處理能力方面更勝一籌,因此會更快。
• 記憶體限制
M3 Pro 通常內存容量較大(16GB 至36GB),可以支援中小型模型在內存中運行,但超大模型(如33B、65B)會受到內存限制,可能無法完整加載到內存,導致運行失敗或需要分批加載資料。而專業NVIDIA GPU 的顯存更大(如A100 有40GB 顯存),可以處理更大的模型。
• 電源效率與靜音性
M3 Pro 等M 系列晶片在電源效率和靜音表現上非常出色,發熱量低、功耗小,適合長時間運作。相較之下,NVIDIA 專業顯示卡的功耗和發熱量更大,通常需要主動散熱。
總結:在M3 Pro上運行Ollama 能夠獲得很好的CPU 和神經網路引擎加速,適合日常使用和小型模型推理(門檻也不低啊,M3(Pro)的機器也不便宜~,M2(Pro)應該也能一戰,總之性能越好體驗越好)。如果追求更高的推理速度和大型車型的流暢運行,NVIDIA 的專業顯示卡仍然是更強的選擇。