Llamafile 与 LLaVA 1.5 的粗略实验
我读了Simon Willison(西蒙·威利森)的博文,讲的是用 Llamafile 来试用开源聊天机器人 / LLM。他把过程说得非常简单,于是我决定亲自试一试。
我的一个长期业余项目是 WanderJest,一个用于查找线下喜剧演出的网站。这个网站的难点之一是,关于即将上演的演出的权威信息往往就在演出海报上。举个例子:
我一直靠手工抄录这些信息,但这既枯燥又耗时。
Simon 提到 Llamafile 可以轻松运行 LLaVA 1.5,它能让你就一张图片向聊天机器人提问。如果我能让 LLaVA 从海报中告诉我所有我想要的信息,那就能把我在 WanderJest 上的这个问题自动化掉。
基于 CPU 的 LLaVA 1.5
首先,我试着启动了一台运行 Debian Bookworm 的 Scaleway PRO2-S 虚拟机实例。任何虚拟机都可以,我只是选了这个,因为我有现成的基础设施可以方便地启动 Scaleway 服务器。
我通过 SSH 登录服务器并开启了端口转发,以便访问 Llamafile 的网页界面:
ssh mike@$MY_SCALEWAY_IP -L 8080:localhost:8080按照 Simon 的说明,我下载了用于运行服务器的二进制文件:
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成功了,我在浏览器里看到了网页界面:
我尝试上传演出海报,结果什么都没发生。原来我必须在上传海报的同时还要问它一个问题。
所以,开局有点不顺。它把三个名字全弄错了,对真实姓名产生了各种变体的幻觉(hallucination,幻觉输出)。
User:这张海报上列出的表演者是谁?
Llama:这张海报上列出的表演者是 Ayeshah Mae、Jennifer Myskowski-Szynski 和 Ayisha Mae。
生成这个答案花了大约一分钟。统计数据显示为:
每 token 130 毫秒,每秒 7.67 个 token
我又试了另一个问题:
User:这场演出将在哪里举行?
Llama:这场喜剧展演将在宾夕法尼亚州 Rathmell 的 Luthier’s Co-op 举行。
同样,它答出了一些内容,但准确率只有大约 70%。
我还好奇能不能让它以 JSON 格式返回信息,但我很难说服 LLaVA 说 JSON。我说“请用 JSON 回答以下问题”,它会无视这条指令,用普通英语回答。
在研究论文中,LLaVA 的作者展示了一个让 LLaVA 用 JSON 回复的例子:

来自研究论文的让 LLaVA 以 JSON 格式回复的示例
我照着论文里的格式试了一遍,结果它什么都没返回:
User:Please read the text in this image and return the information in the following JSON format (note xxx is placeholder, if the information is not available in the image, put “N/A” instead). {“title”: xxx, “date”: xxx, “time”: xxx, “performers”: xxx, “hosts”: xxx, “location”: { “address”: xxx, “city”: xxx, “state”: xxx, “zipCode”: xxx}}
我从服务器日志可以看出它已经处理完了请求,但什么都没有返回。
我再试了一次,这次它成功生成了 JSON,不过仍然幻觉出了大量信息:
User:Please read the text in this image and return the information in the following JSON format (note xxx is placeholder, if the information is not available in the image, put “N/A” instead). {“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 确实是马萨诸塞州 Framingham 的一个邮政编码,所以它一定是从别处拉取了这条信息,因为海报上并没有。可问题是,这场演出根本不在 Framingham。
使用 CUDA 实现 GPU 版 LLaVA 1.5 的失败尝试
我对 LLM 的参数一无所知,但我想试着调整一些设置,看看能否得到更好的输出。问题在于,基于 CPU 的处理方式下,每个问题要花大约一分钟才能回答完,太慢了,做实验都没什么意思。
我决定启动一台 Scaleway GPU-3070-S 实例。它配备一块 8 GB 显存的 NVIDIA 3070 GPU,我想它应该比我之前用的 CPU 处理快得多。
要让 Llamafile 使用 GPU,我需要在 Linux 上安装 CUDA,结果这出乎意料地困难。NVIDIA 有官方指南,但极其繁琐。
经过几次失败的尝试后,我把 NVIDIA 的步骤调整成了下面这样,成功在 Scaleway 的 Ubuntu 22.04 GPU 优化版操作系统上安装了 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一切正常,服务器日志显示它在用虚拟机的 GPU。我试着上传一张图片并提问,结果服务器崩溃了,报了这个错误:
CUDA error 2 at /home/mike/.llamafile/ggml-cuda.cu:6006: out of memory我换用 Scaleway 更强的 RENDER-S 实例又试了一次,它的 GPU 显存翻了一倍,但还是同样的崩溃。
有一个看起来类似的 llama.cpp GitHub issue 说解决办法是禁用“pinning”(内存锁定),于是我就试了:
export GGML_CUDA_NO_PINNED=1
./llava-v1.5-7b-q4-server.llamafile --nobrowser还是崩溃。
我读了一个 StackOverflow 帖子,说当 batch size 过大时 CUDA 可能会耗尽内存,所以我试着这样重新运行:
./llava-v1.5-7b-q4-server.llamafile --nobrowser --batch-size 1但结果还是一样。
使用 CUDA 成功实现 GPU 版 LLaVA 1.5
更新(2023-12-04):我终于把它跑通了。
我不得不向 Scaleway 提交工单以获得更高规格的 GPU 访问权限。当我换用 Scaleway 配备 240 GB 内存和 80 GB 显存的 H100-1-80G 实例时,一切正常,性能比在 CPU 上运行快了 10.6 倍。

在 GPU 上运行 LLaVA 比 CPU 快 10.6 倍
总结
看起来使用默认设置的 LLaMA 1.5 并不能解决我从演出海报解析信息的问题。
我只实验了几个小时,所以也许有一些设置能让它奏效。
我希望开源 AI 模型在未来一年里能继续改进,变得更加易用。
随机一篇博客


