2024/10
LLM
Ollama
(2024/10/10) 自從 ChatGPT 於 2022/11/30 橫空出世後, LLM 的風潮至今未衰, 且越演越烈. 拿公司的伺服器來實作 Open Source LLM 裡鼎鼎有名的 Ollama, 以下是實作的紀錄
內文最後有 github repository 參考
Table of Contents
Ollama 是一個開源的大型語言模型平台, 允許使用者在本地端運行各種模型. 以下表格詳細列出 Ollama 可以支援的 models, 如 Llama 3 等。它的設計目標是優化模型的設置和配置過程, 包括 GPU 的使用。
Ollama 的操作非常簡單, 從下載 Ollama 到在 CLI (Command Line Interface) 下執行以下任何一個 ollama run llama3.2
(或其他 model)的指令, 整個步驟可以在 10 分鐘內完成. Ollama 支援 macOS、Linux 和 Windows 等主流操作系統, 我的操作基本是以 Linux 為基礎.
Model | Parameters | Size | Download |
---|---|---|---|
Llama 3.2 | 3B | 2.0GB | ollama run llama3.2 |
Llama 3.2 | 1B | 1.3GB | ollama run llama3.2:1b |
Llama 3.1 | 8B | 4.7GB | ollama run llama3.1 |
Llama 3.1 | 70B | 40GB | ollama run llama3.1:70b |
Llama 3.1 | 405B | 231GB | ollama run llama3.1:405b |
Phi 3 Mini | 3.8B | 2.3GB | ollama run phi3 |
Phi 3 Medium | 14B | 7.9GB | ollama run phi3:medium |
Gemma 2 | 2B | 1.6GB | ollama run gemma2:2b |
Gemma 2 | 9B | 5.5GB | ollama run gemma2 |
Gemma 2 | 27B | 16GB | ollama run gemma2:27b |
Mistral | 7B | 4.1GB | ollama run mistral |
Moondream 2 | 1.4B | 829MB | ollama run moondream |
Neural Chat | 7B | 4.1GB | ollama run neural-chat |
Starling | 7B | 4.1GB | ollama run starling-lm |
Code Llama | 7B | 3.8GB | ollama run codellama |
Llama 2 Uncensored | 7B | 3.8GB | ollama run llama2-uncensored |
LLaVA | 7B | 4.5GB | ollama run llava |
Solar | 10.7B | 6.1GB | ollama run solar |
Source: Ollama Model List (Source: GitHub)
Note: 記憶體需求大約是如下, 要跑 7B 的模型, 需要 8GB 的 RAM. 16 GB 的 RAM 來跑 13B models, 跟 32 GB 跑 33B models.
在安裝 Ollama 之前, 必須有 GPU (NVIDIA 或 Mac 的 M 系列)以及安裝完成驅動程式, 包括 NVIDIA 的 CUDA.
到 Ollama 官網, 可以看到有 macOS, Linux, Windows 三種選擇, 根據你的作業系統選擇下載.
Ollama 官網
點選 Download 後, 出現以下螢幕, 再選取作業系統.
選擇 Linux 後, 螢幕顯示可以用以下一行指令完成下載. 打開 Terminal (如果還沒有打開的話), 輸入(或複製)以下指令, 就完成安裝程序.
curl -fsSL https://ollama.com/install.sh | sh
於 CLI 執行 Ollama 是最直接的作法, 尤其是對有 Linux 經驗的人而言. 我們就說明在 Terminal 的 Command Line Interface 下的執行方式.
安裝完成後, 就可以用以下指令同時下載 llama3.2:1b 模型 (model) 並且執行.
ollama run llama3.2:1b
這是我隨意從上面的表格選定記憶體需求比較小的模型, 當然, 功能也比較侷限.
假設這是第一次執行這個 model, ollama 會先下載 (pulling) 模型, 下載完成後, 顯示 success
, 並出現 >>>
準備接受你的提問. 先問個最簡單的問題, >>> 麻煩你做個自我介紹吧
.
以下就是 Ollama 的回覆, 你電腦上的回覆應該跟我的不同, 就像我們人類不會每次的答覆都會一模一樣.
我是一名 artificial intelligence 的程式,與人 communicating 時候我都會問「幹什麼?」或是「什麼功能有呢?」但實際上我 可以幫助你多樣的東西,從簡單的提问到複雜的問題 해결,我都能幫你做好事!
(奇怪, 怎麼有韓文 !)
如果記憶體空間夠的話, 可以試試其他更大的模型, 如以下試的 llama2 70b 的模型, 回應的內容就完全不一樣, 不過是英文的.
ollama run llama2:70b
在 >>>
後, 輸入 /bye
, 或是鍵盤組合鍵CTRL-d
就可以跳出 Ollama, 回到 Linux CLI 環境.
(可省略, 供有興趣想深入了解細節者參考)
在 Linux Terminal 下 ollama
指令, 而且後面不加任何參數時, 會顯示 Ollama 可以接受的的參數集合. 我們之前的指令 ollama run llama3.2:1b
就是其中之一的 run
參數.
進入 Ollama 後, 顯示 >>>
, 同時有淺灰色的提示 Send a message (/? for help)
表示 Ollama 等待接受指令或提問. 可以輸入 /?
看看有哪些指令可以操作
暫時知道可以用 /bye
來結束 Ollama 外, 其餘就後續再討論.
將模型從硬碟中移除以節省硬碟空間, 用的是以下的指令
ollama rm llama3
參考 ExplainThis.io 說明
什麼是 API?
API 全名為 Application Programming Interface,最簡單的理解為,我們不需要知道他實際上是如何實作的,只要知道要怎麼使用它即可。舉例來說:就像你走進一間餐廳,在菜單上畫好品項後遞給老闆,老闆就能夠提供你需要的餐點,而你不需要去在意餐點是怎麼被實做出來的。
所以比起在意它實際上怎麼被製作出來的,我們更在意怎麼獲得想要的東西,因此會更在意:「輸入的方法」以及「輸出的結果」,對應上面的例子就是:「該如何點餐」以及「餐點的結果」。
什麼是 REST?
REST 全名為 Representational State Transfer,是一種軟體架構,他最初是用來管理複雜網路上的通訊指導方針指導方針建立。而 RESTful API 意旨遵循著 REST 架構風格的 API ,而 REST 架構風格需含以下原則:
統一介面:將操作的細節作抽象,並提供統一的操作方式和規格。
無狀態:無狀態意旨伺服器獨立於所有之前的請求,所以用戶端可以按任何順序去請求資源。
分層系統:用戶端不清楚伺服器端有幾層,甚至伺服器端可以再向其他伺服器端請求資源。
可快取性:用戶端在獲得第一次回應後快取一些資訊,然後後續會直接使用快取中獲得資訊。(例如:網站中每個頁首、頁尾、LOGO 等)
隨需編碼(code on demand):Server 可以隨時擴充功能,因應 Client 的即時需求。
什麼是 RESTful API?
是一種風格,他描述了如何實現 Web API 的架構,基於 HTTP 協定,用來建立分散式系統,並支援多種程式語言,他的優點包含:
可擴展性:由於系統無需保留 Client 狀態,因此可以提高擴展效能。
靈活性:由於 Client 與 Server 完全分離,因此分層的應用程式功能可以提供靈活性。
獨立性:可以使用各種程式語言來編寫程式,不影響 API 的設計。
RESTful API 請求資源的方法
參考 Ollama API Document 的 API 使用手冊.
可以在 command line 下直接試. (一般不會是如此的用法, 而是用 web 程式去呼叫. 這裡只是示範指令及結果)
系統回復如下, 可以抓取 "response" 的內容, 就是 Llama3.2 對於天空為什麼是藍色的回覆.
參考 Run LLMs Locally using Ollama using Jupyter Python Notebook 一文的實作紀錄.
我們假定此時的 Linux 環境已經安裝好上述的 Ollama 以及 Python3 跟 pip3 的基本設置, 此處就不說明. 需要安裝 Jupyter Notebook, 來利用 Python 程式語言來執行 Ollama, 及 Longchain, 來對接到 Ollama.
安裝 Jupyter notebook
pip3 install notebook
安裝 Longchain
pip3 install langchain langchain-community langchain-core
Jupyter Notebook 已經是非常通用的格式 (副檔名為 .ipynb) , 可以執行 Python 程式, 文件說明, 以及繪圖功能的強大開發環境. 例如, Google 的 Colab 也是使用 Jupyter Notebook 的格式.
執行 Jupyter Notebook 就用以下指令.
jupyter notebook
系統執行會跑出類似下列的內容, 同時, 理應會打開系統預設的瀏覽器.
瀏覽器會顯示前的目錄內容, 類似如下的截圖.
我們需要建立一個新的 .ipynb 的檔案來執行相關 Python 程式.選擇 File - New - Notebook
來建立.
Jupyter Notebook 會建立一個新的檔案, 我們沒有修改檔案名稱的話, 系統會自訂一個名為 Untitled.ipynb
的檔案,如下圖. 我們再輸入以下的 4 行的程式, 運用上一節介紹的 Ollama API, 就可以收到 Ollama 的回應, 後面還有進階的 Ollama API 介紹.
以下為 Ollama 的回應. 其實, 也不太難.
螢幕截圖
目前的運作, 不管 Terminal, 瀏覽器等等, 都是用遠端桌面連線
連到伺服器上執行, 因為是 GUI 連線, 速度比較慢. 如果可以用 PC 端的瀏覽器直接連上 Jupyter Notebook, 會更有效率.
利用 MobaXterm 連接上伺服器.
第一個 8888 port 由 Jupyter Noteoobk 所定義, 第二個 8888 port 是 PC 端的瀏覽器需要做的設定.
MobaXterm 設定完成, 且輸入密碼, 完成連線後, 可以開啟瀏覽器, 輸入
http://localhost:8888/
再從伺服器端複製 token, 於 PC 瀏覽器上貼上, 即可執行.
執行以下 ipynb 程式後, 一樣的開啟瀏覽器, 直接輸入網址 http://localhost:7860
開啟.
見 我的 github - multiple sections
尚待完成, 可以先參考此篇文章 - 探索免費、開源、可離線使用的 AI 助手平台 Ollama AI-(安裝篇).
這標題聽起來很厲害, 實際上, 之前下的指令 ollama run llama3.2:1b
就是安裝了 Meta 的 Llama 3.2 版本的語言模型.
Llama 就是 Meta 釋出的 Open Source 模型, 截至 2024/11 為止, 已經到 Llama 3.2 版本. 這的版本有發行兩種不同的參數大小的模型: 1B 跟 3B. 其中 1B 指的是 1,000M 的數量, M 是我們常用"百萬"的單位.
較早的 Llama 3.1 版本已經有釋出更多參數 8B, 70B 跟 405B 的模型.
更多的模型可以參考 Ollama 模型列表 網頁
類似地, 要安裝跟執行 Google Deep Mind gemma 模型跟執行 Llama 模型一樣的指令
ollama run gemma:2b
Gemma 提供了 2 種參數的模型, 2b 跟 7b 大小. Ollama 模型 Gemma 也說明了, Gemma 的預設是 7b 參數模型.
ollama run gemma:7b (default)
也就是說, 如下的指令
ollama run gemma
等同於
ollama run gemma:7b
在進行之前, 先確定已經做過以上 Ollama 於 CLI (Command Line Interface) 執行 的章節.
需要先安裝 Python 及 Ollama 套件
先說結論, 以下是 Ollama_RAG.ipynb 的檔案內容.
注意: 這一行需要修改, 改成你自己的檔案
file_path = './50_Years_of_AI.pdf'
等待一段執行的時間, 會顯示以下內容, 並且開啟網頁.
我的作法是, 開啟瀏覽器, 直接輸入網址. 孰悉網路的人會比較清楚, 一般的 127.0.0.1 網址就是內網的網址, 習慣上, 我會用 localhost 的方式開啟.
這時候, 在 question
欄位內輸入提問, 按下 submit
, 就可以得出類似下方 Ollama RAG 的回應.
注意: 我的網址是 http://localhost:7865/ 而不是 7860 的原因在於我之前試過幾次失敗, 每次程式修改再執行時的位址會改變, 從 7860, 7861, 一直試到 7865 才成功
當我執行 RAG 第二次, 而第一次讀取的檔案與第二次的檔案是完全不同主題與內容時, RAG 的回答偶而會回答第一個檔案的內容. 派大的回答是 "不確定是不是 vector store 累加的結果。試試看重建 embedding 到 vector 的記憶". 再詢問 ChatGPT 後, 將上述程式的第 11 到 22 行的內容改成如下:
以下是詢問 ChatGPT 請它幫我修改 Ollama_RAG.ipynb 過程的紀錄.
https://chatgpt.com/share/6710b507-e418-8008-b4b1-4804fee19da6
從 Ollama API Documentation可以查到 Ollama API 的使用手冊. 以下為該手冊的開頭. 內容提到幾個重點:
我們輸入所選擇的 model 跟版本, model 跟版本號中間加上:
, 如 llama3.3
, llama3.3:70b
, llama3.3:latest
等.
提供的時間數據都是基於 nano second, 也就是 10-9 秒, 為單位.
Ollama 的回覆多是基於 json 格式, 且預設是分段提供. 我們希望 Ollama 一次就提供完整的回覆 (也是 json 格式), 就設定參數 {"stream": false}
利用 POST /api/generate
指令產生回覆. 可以使用此處範例中的 requests 工具程式.
我們建議至少提供三個參數到 Ollama 以便得到 model 的回覆.
5.1 model: 模型
5.2 prompt: 就是提出的問題
5.3 stream: 一次完整提供 response
我們利用 request 工具程式來產生 Ollama 需要的 POST 的參數設定.
json.get()
的補充說明一:
generated_text = response_data.get("response", "")
中的第二個參數是個 ""
空字串. 如果當 response_dat.get 找不到對應的 reponse
字串時, 程式會回覆一個 ""
空字串給 generated_test
.
補充說明二: 另一個例子中, eval_count = response_data.get("eval_count", False)
第二個參數是 False
, 而不是用 ""
空字串. 完全就是考慮程式執行中是否容易報錯的可能性. 因為預期回應的格式為數字, 因此不適合用 ""
字串. (以上兩段內容參考 ChatGPT 回覆)
完整程式見 github-llama3.3_gradio_token.
看到 Linux 大神 jserv 讚嘆 aider 協助程式寫作, 以及 comment 的撰寫, 馬上來試. 嘗試用以下 pip
方式安裝出現錯誤, 嘗試了 debug 一會兒, 無解. 以為跟 Python 版本有關, 換到另一個環境 (Python 3.9.6) 上試試, 可以安裝, 但是安裝後還是無法執行.
再查了 aider Install 說明, 嘗試另一種安裝方式 - One-liners.
安裝結束前, 出現以下警告訊息, 需要修改系統參數 $PATH
.
所以, 執行以下指令完成相關設定.
因為我們使用 Ollama 來執行 LLM 模型, 需要用 Connecting to LLM - Ollama 來連結到 Ollama. 網頁內容如下:
我的操作如下
2-1. Ollama 下載模型
2-2. 執行 Ollama, 似乎是已經執行中, 就不理會這個錯誤訊息.
2-3. 執行 airder 後, 出現 Would you like to see what's new in this version? (Y)es/(N)o [Yes]:
, 回答 n
後, 出現 >
prompt, 等著我們輸入問題, 我就輸入 write a C program to calculate pi value
, 讓它來協助寫出計算 pi 的程式.
Learn More →
Learn More →
Learn More →