我们研究了一种开源方法,用于在本地运行大型语言模型。LocalAI 是私有公司 Ollama 的替代品。
译自 How to Run a Local LLM via LocalAI, an Open Source Project,作者 David Eastman。
今年早些时候,我写了一篇关于 如何使用 Ollama 和 Llama 2 设置并运行本地 LLM 的文章。在本文中,我将探讨在本地运行大型语言模型的另一种选择。虽然 Ollama 是一家私营公司,但 LocalAI 是一个社区维护的开源项目。
从表面上看,它们各自为用户提供了一些略有不同的东西。从 Ollama,我实际上得到了一个带有 LLM 的平台供我使用。但是,LocalAI 提供了对 OpenAI 的 API 的替代方案。实际上,这意味着我可以使用 OpenAI URI,但只需指向容器即可。
另一个不同之处在于这两个产品如何处理容器。LocalAI 利用 Docker——这是它的主要方法——但它还允许你手动构建容器或二进制文件。Ollama 建议使用 Docker 来获得 GPU 加速,但除此之外还可以不使用它。
让我们开始吧。请注意,我在我的 Mac 上安装了 Docker Desktop。
LocalAI 提供了一个类似于 Ollama 提供的全包 (AIO) 设置。这是明智的,因为我可以在需要的时候进行专门化,同时从一个完整的设置开始。
我打开了我的 Warp 命令行,并从文档中运行了下面的 docker 提示。我将以适中的速度进行本教程,但我确实假设读者 熟悉 Docker。我让它去拉取,正如你所看到的,它花了一个小时左右:
完成后,你可以看到它通过 AIO 包提供的模型服务:
更明确地说,对 curl http://localhost:8080/v1/models 的响应如下:
{"object":"list","data":[
{"id":"text-embedding-ada-002","object":"model"},
{"id":"whisper-1","object":"model"},
{"id":"stablediffusion","object":"model"},
{"id":"gpt-4-vision-preview","object":"model"},
{"id":"tts-1","object":"model"},{"id":"gpt-4","object":"model"},
{"id":"MODEL_CARD","object":"model"},
{"id":"bakllava-mmproj.gguf","object":"model"},
{"id":"voice-en-us-amy-low.tar.gz","object":"model"}]}
模型卡是一个元数据容器。
在 Docker 桌面中转动控制杆使我们开始运行:
这个文档确实让你在这里有点独立行动的空间,但幸运的是,随着镜像通过了验证,最终消息中的测试 curl 提供了第一步的指引。
值得注意的是,我停止并启动了安装几次,并且在我在 Docker 桌面中重新启动容器时捕获了上述消息。Docker Desktop 和 Warp 都具有足够好的日志处理功能,允许你稍后仔细查看这些消息。文档中还有类似的测试。
这是我尝试过的测试,因为正如我提到的,LocalAI 是 OpenAI 的替代方案。我们知道 温度意味着什么,并且我在第一次查看 AI 包装器 时使用 JSON 有效负载执行了类似的 curl。请注意,模型名称与聊天界面模型不同。
由于错误,我无法让聊天客户端工作(稍后会详细介绍),但我使用 Docker 消息中给我的类似 curl 示例测试了镜像识别服务:
curl http://localhost:8080/v1/chat/completions -H "Content-Type: application/json"
-d '{
"model": "gpt-4-vision-preview",
"messages": [
{"role":"user",
"content": [
{ "type":"text",
"text": "What is in the image?"
},
{ "type": "image_url",
"image_url": {"url":"https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"}
}
],
"temperature": 0.9
}
]
}'
>>response
{
"created":1711995490,
"object":"chat.completion",
"id":"f78380ca-fbcd-455f-9834-ddffcefd6b03",
"model":"gpt-4-vision-preview",
"choices":
[
{"index":0,
"finish_reason":"stop",
"message":
{"role":"assistant",
"content":"The image features a wooden walkway or boardwalk that is surrounded by lush grass and green foliage, creating a serene and picturesque scene."
}
}
],
"usage":{"prompt_tokens":0,"completion_tokens":0,"total_tokens":0}}%
容器日志证实一切正常:
2024-04-02 14:16:53 1:16PM INF 加载模型 'bakllava.gguf',后端为 llama-cpp
在我的 Apple Silicon 2015 MacBook Pro 之前,这花了 12 分钟。
“The image features a wooden walkway or boardwalk that is surrounded by lush grass and green foliage, creating a serene and picturesque scene.” Here is the test image being described:
响应文本需要相当高的温度 (0.9) 才能产生叙事质量(即使用“繁茂”、“宁静”、“风景如画”)。大型语言模型的优势在于它们显然能够“智能地”根据主题进行发挥,并使用其他来源。但结果是好的。
为了测试模型和理论,让我们将温度改成 (0.1) 来确认我们得到了更简洁的描述。我们做到了:“图像中有一条木制小径或木板路,周围环绕着高草、鲜花和杂草。这条木板路似乎位于一个大田野或大草原的中央”。
完美,只陈述了事实。这花了 26 分钟!
虽然它不能很好地用于复制,但我还尝试了转录服务接口,而且它运行很快。我下载了一段著名的庄严演讲:
随后我把请求发送给该模型,并得到了冗长的回复:
在 Docker 内部,我们可以看到启动了哪些操作:
2024-04-02 15:39:51 2:39PM INF Loading model 'ggml-whisper-base.bin' with backend whisper
全文按照末尾片段结合:
我对算法知之甚少,所以我无法评论少数未分离的词语,但文本中使用引号来表示引文给我留下了深刻的印象。但是,我们不是在这里详细考虑模型本身。
LocalAI并没有为用户提供一个真正的平台,这在错误出现时需要完全的开发者正确性来跟进反映出来。因为有更多的选项(一体机、GPU 处理等)以及像我这样使用旧规格机器的人,维护者全力确保用户体验质量的同时也有很多事要做。如果出现错误,有手动构建模型的说明 - 如果你期望长期使用这个项目,这是一条合理的路径。
我试图将本文的一部分作为 Ollama 和 LocalAI 在我低规格 MacBook 上并肩比较的一部分,但随着该领域的扩展,用户可以期待更多样化的选择。虽然现在有点粗糙,但 LocalAI 提供了更直接的途径来构建模型,并让你更接近系统。对于那些需要一次性、更简单体验的人来说,Ollama 可能更适合你。当你深入研究在工作流程中放置模型时,LocalAI 将提供更透明的选项来使用——前提是错误处理更有效。