使用 Llamafile 與 LLaVA 1.5 的粗淺實驗
我讀了Simon Willison(西蒙·威利森)的文章,內容是關於使用 Llamafile 來試驗開源聊天機器人/LLM(大型語言模型)。他把過程講得非常簡單,所以我決定自己試試看。
我長期經營的一個興趣專案是WanderJest,這是一個用來尋找現場喜劇演出的網站。這個網站面臨的挑戰之一是,即將舉行的演出其權威資訊往往就在海報上。以下是一個範例:
我一直都是手動擷取這些資訊,但這種方式既繁瑣又耗時。
西蒙·威利森提到,Llamafile 讓執行LLaVA 1.5變得很容易,而 LLaVA 1.5 能讓你針對圖片向聊天機器人提問。如果我能讓 LLaVA 從海報中告訴我所有想要的資訊,就能自動化解決 WanderJest 上的這個問題。
以 CPU 執行的 LLaVA 1.5
首先,我嘗試在一台執行 Debian Bookworm 的 Scaleway PRO2-S VM 執行個體上啟動。任何 VM 都可以,但我之所以選這個,只是因為我有現成的基礎架構可以方便地啟動 Scaleway 的伺服器。
我透過啟用通訊埠轉發的 SSH 連進伺服器,以便存取 Llamafile 的網頁介面:
ssh mike@$MY_SCALEWAY_IP -L 8080:localhost:8080按照西蒙·威利森的指示,我下載了用於執行伺服器的執行檔:
curl -LO https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4-server.llamafile && \
chmod 755 llava-v1.5-7b-q4-server.llamafile接著我啟動了伺服器:
./llava-v1.5-7b-q4-server.llamafile --nobrowser這成功了,我在瀏覽器中看到了網頁介面:
我嘗試上傳演出海報,結果什麼都沒發生。後來才發現,我必須同時上傳海報並提出問題。
所以,一開始有點不太順利。它把三個名字都弄錯了,產生了與實際姓名相近的幻覺變體。
使用者:這張海報上列出的表演者是誰?
Llama:這張海報上列出的表演者是 Ayeshah Mae、Jennifer Myskowski-Szynski 與 Ayisha Mae。
產生這個答案花了大約一分鐘。顯示的統計數據為:
每個 token 130 毫秒,每秒 7.67 個 token
我又試了另一個問題:
使用者:這場表演將在哪裡舉行?
Llama:這場喜劇表演將在位於賓夕法尼亞州拉斯梅爾的 Luthier’s Co-op 舉行。
同樣地,它有抓到一些東西,但準確率大概只有七成。
我也很好奇能否讓它以 JSON 格式提供資訊,但我很難說服 LLaVA 用 JSON 回應。我說「請用 JSON 回應下列問題」,它卻無視指示,仍用一般的英文回答。
在研究論文中,LLaVA 的作者展示了一個讓 LLaVA 以 JSON 回應的範例:

要求 LLaVA 以 JSON 回應的範例,取自研究論文
我照著論文中的格式重試一次,結果什麼也沒回傳:
使用者:請讀取這張圖片中的文字,並以下列 JSON 格式回傳資訊(注意 xxx 為佔位符,若圖片中沒有該資訊,請填入「N/A」)。{“title”: xxx, “date”: xxx, “time”: xxx, “performers”: xxx, “hosts”: xxx, “location”: { “address”: xxx, “city”: xxx, “state”: xxx, “zipCode”: xxx}}
從伺服器日誌可以看出它已處理完請求,但卻沒有回傳任何內容。
我又試了一次,這次它成功產生了 JSON,雖然仍幻覺了很多資訊:
使用者:請讀取這張圖片中的文字,並以下列 JSON 格式回傳資訊(注意 xxx 為佔位符,若圖片中沒有該資訊,請填入「N/A」)。{“title”: xxx, “date”: xxx, “time”: xxx, “performers”: xxx, “hosts”: xxx, “location”: { “address”: xxx, “city”: xxx, “state”: xxx, “zipCode”: xxx}}
Llama:{“title”: “Luther’s Coop Comedy Showcase”, “date”: “December 2nd”, “time”: “7:00 PM - 9:30 PM”, “performers”: [“Ayisha M. Quinn”, “Jennifer Myskowski-Szczykowski”], “hosts”: [“Molly Hyne & Matt Woodland”], “location”: { “address”: “109 Court St, Framingham, MA”, “city”: “Framingham”, “state”: “MA”, “zipCode”: “01702”}}
它有幾件事答對了:
- 它正確擷取了「Matt Woodland(麥特·伍德蘭)」這個名字
- 它正確辨識出日期為 12 月 2 日
- 它正確辨識出州別為 MA
但其他部分則是從小錯到大錯都有。有趣的是,01702 確實是麻薩諸塞州弗雷明漢的郵遞區號,所以它一定是從別處抓來這個資訊,因為海報上並沒有。而這是錯誤的,因為這場表演根本不在弗雷明漢。
使用 CUDA 執行 GPU 版 LLaVA 1.5(失敗)
我對 LLM 參數一竅不通,但我想試著調整一些設定,看看是否能得到更好的輸出。問題在於,使用 CPU 處理時,每個問題大約需要一分鐘才能回答,速度太慢,讓人難以盡興地做實驗。
我決定啟動一台 Scaleway GPU-3070-S 執行個體。它配備 NVIDIA 3070 GPU,擁有 8 GB 的 GPU VRAM,所以我認為應該會比我原本使用的 CPU 處理快得多。
為了讓 Llamafile 使用 GPU,我需要在 Linux 上安裝 CUDA,結果發現這出乎意料地困難。NVIDIA 有官方安裝說明,但內容極為繁瑣。
經過幾次失敗的嘗試後,我將 NVIDIA 的說明調整為以下步驟,並在 Scaleway 針對 GPU 最佳化的 Ubuntu 22.04 作業系統上成功安裝了 CUDA:
sudo apt-get install linux-headers-$(uname -r) && \
sudo apt-key del 7fa2af80 && \
echo "deb [signed-by=/usr/share/keyrings/cudatools.gpg] https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /" | sudo tee /etc/apt/sources.list.d/cuda-ubuntu2204-x86_64.list && \
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin && \
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \
sudo apt-get update && \
sudo apt-get install -y cuda-toolkit接著,我再次下載了 Llamafile:
curl -LO https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4-server.llamafile && \
chmod 755 llava-v1.5-7b-q4-server.llamafile然後我啟動了伺服器:
./llava-v1.5-7b-q4-server.llamafile --nobrowser一切正常,伺服器日誌顯示它正在使用 VM 的 GPU。我嘗試上傳圖片並提問,結果伺服器當掉了,並顯示這個錯誤:
CUDA error 2 at /home/mike/.llamafile/ggml-cuda.cu:6006: out of memory我改用 Scaleway 規格更強的 RENDER-S 執行個體重試,它的 GPU VRAM 多了一倍,但仍然出現同樣的當機。
有一個llama.cpp GitHub 議題看起來很類似,提到因應措施是停用「pinning」,所以我試了這個方法:
export GGML_CUDA_NO_PINNED=1
./llava-v1.5-7b-q4-server.llamafile --nobrowser還是當掉了。
我看到一篇 StackOverflow 討論串提到,CUDA 可能因為批次大小太大而耗盡 RAM,所以我試著這樣重新執行:
./llava-v1.5-7b-q4-server.llamafile --nobrowser --batch-size 1但結果還是一樣。
成功以 CUDA 執行 GPU 版 LLaVA 1.5
更新(2023-12-04):我終於讓它跑起來了。
我必須向 Scaleway 提交支援工單,才能取得更高階的 GPU 存取權限。當我改用 Scaleway 的 H100-1-80G 執行個體(擁有 240 GB RAM 與 80 GB VRAM)時,一切都正常運作了,效能比用 CPU 執行時快了 10.6 倍。

在 GPU 上執行 LLaVA 比使用 CPU 快了 10.6 倍
總結
看起來使用預設設定的 LLaMA 1.5 並無法解決我從表演海報中解析資訊的問題。
我只試驗了幾個小時,或許有些設定可以讓它正常運作。
我期待開源 AI 模型在未來一年能持續進步,並變得更加容易取得。
隨機一篇部落格


