HomeLab迷你小主机(x86):Docker部署开源OpenAI替代方案LocalAI

NO.1
LocalAI简介

github地址

https://github.com/go-skynet/LocalAI

docker images地址

注意是非docker官网,而是自部署的docker镜像地址

https://quay.io/repository/go-skynet/local-ai?tab=info

🤖 免费、开源的 OpenAI 替代方案。自托管、社区驱动、本地优先。在消费级硬件上运行的 OpenAI 的直接替代品。无需 GPU。运行 ggml、gguf、GPTQ、onnx、TF 兼容模型:llama、llama2、rwkv、whisper、vicuna、koala、cerebras、falcon、dolly、starcoder 等

简而言之:

  1. 本地 OpenAI 替代 REST API。拥有自己的数据。

  2. 无需 GPU。也不需要互联网接入

  3. 可选,GPU 加速可在llama.cpp兼容的 LLM 中使用。另请参阅构建部分。

  4. 支持多种型号

  5. 🏃 第一次加载后,它会将模型加载到内存中以加快推理速度

  6. ⚡ 不进行 shell-out,而是使用 C++ 绑定来实现更快的推理和更好的性能

img

本文理解

  • 可以本地离线自部署的替代OpenAI的方案(也就是ChatGpt的本地替代方案)

  • 无需要GPU,在消费级的设备上也可以尝试和使用(显卡GPU是大多数AI项目的基本前提)(本文就是在没有GPUI的零刻小主机上测试)

  • 支持多种第三方AI大模型,选用最适合自己的,也可以进行开发和测试自己的大型语言模型应用

可以用来创建自己的聊天机器人等

NO.2
LocalAI安装

重要说明

下载并运行需要网络下载10GB以上的依赖,请确保有足够的空间和流量

使用git拉取项目

因为需要它的docker-compose.yml文件和.env配置文件

git clone https://github.com/go-skynet/LocalAI.git

进入到项目文件夹

本文修改端口为3052

version: '3.6'

services:
api:
image: quay.io/go-skynet/local-ai:latest
build:
context: .
dockerfile: Dockerfile
ports:
- 3052:8080
env_file:
- ./.env
volumes:
- ./models:/models:cached
- ./images/:/tmp/generated/images/
command: ["/usr/bin/local-ai" ]

开放端口

sudo ufw allow 3052

拉取镜像并启动服务

docker-compose up

img

看下下图提示后说明成功

img

NO.3
LocalAI使用

官网使用文档

https://localai.io/basics/getting_started/index.html

访问IP:端口

因为LocalAI提供的是REST API不是WEB UI,所以会报错

要么使用API方式请求,要么结合其他WEB UI来使用

img

如何使用web ui

https://localai.io/faq/

示例部分提供了 localai-webui 和 chatbot-ui,可以按照说明进行设置。然而,由于 LocalAI 是一个 API,您已经可以将其插入到为 OpenAI API 提供 UI 接口的现有项目中。github 上已经有几个,并且应该已经与 LocalAI 兼容(因为它模仿 OpenAI API)

img

这里我尝试使用ChatGPT-Next-Web

因为它的描述里也写明可以使用LocalAI

img

参考文章

HomeLab迷你小主机(x86):Docker部署开源跨平台ChatGPT应用Next-Web

本文再次部署第二个next-web

填写内网ip地址

img

一直报错

{
"error": true,
"message": "Failed to fetch"
}

查看控制台才发现是跨域

不同端口导致的跨域

img

设置frp域名代理

设置nginx跨域配置

     # 允许请求地址跨域 * 做为通配符
add_header 'Access-Control-Allow-Origin' '*';
# 设置请求方法跨域
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
# 设置是否允许 cookie 传输
add_header 'Access-Control-Allow-Credentials' 'true';
# 设置请求头 这里为什么不设置通配符 * 因为不支持
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With,X-Data-Type,X-Auth-Token';

但是还是不行

因为post请求会发送一个预检请求

对于预检请求要单独做处理,预检成功后才会真正开始post请求数据

nginx需要加上

这样跨域问题就解决了

# 设置 options 请求处理
if ( $request_method = 'OPTIONS' ) {
return 200;
}

发起请求,遇到错误

localai rpc error: code = unavailable desc = connection error: desc = "transport: error while dialing: dial tcp 127.0.0.1:33425: connect: connection refused"

img

参考文章

https://github.com/go-skynet/LocalAI/issues/771

可能是因为内存不足,也可能是没有模型

https://localai.io/basics/getting_started/

官方示例luna-ai-llama2模型使用

img

模型约3.6GB

img

下载模型到文件夹

wget https://huggingface.co/TheBloke/Luna-AI-Llama2-Uncensored-GGUF/resolve/main/luna-ai-llama2-uncensored.Q4_0.gguf -O models/luna-ai-llama2

把配置文件移动到指定文件夹

cp -rf prompt-templates/getting_started.tmpl models/luna-ai-llama2.tmpl

img

最终的文件

img

测试请求

curl http://localhost:3052/v1/models

img

结果

{"object":"list","data":[{"id":"luna-ai-llama2","object":"model"}]}(base) root@dsx2016:/home/dsx2016#

发起实际请求

curl http://localhost:3052/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "luna-ai-llama2",
"messages": [{"role": "user", "content": "How are you?"}],
"temperature": 0.9
}

img

依然报错

rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp 127.0.0.1:46571: connect: connection refused"

img

下载ggml-gp4all-j模型

wget https://gpt4all.io/models/ggml-gpt4all-j.bin -O models/ggml-gpt4all-j

执行命令

cp -rf prompt-templates/ggml-gpt4all-j.tmpl models/

测试模型

curl http://localhost:3052/v1/models

img

测试效果

curl http://localhost:3052/v1/chat/completions -H "Content-Type: application/json" -d '{ "model": "ggml-gpt4all-j", "messages": [{"role": "user", "content": "How are you?"}], "temperature": 0.9 }'

img

放弃治疗

NO.4
Tips

改天换个大内存标配x86服务器试试

避免总是内存不足或者没有GPU导致各种奇奇怪怪的报错

END.

觉得本文还行,不妨顺手点赞收藏,下期见。

推荐阅读

HomeLab迷你小主机(x86):Docker部署开源机器翻译LibreTranslate

HomeLab迷你小主机(x86):Docker部署开源AI相册应用PhotoPrism(支持树莓派部署)

HomeLab迷你小主机(x86):Docker部署开源跨平台ChatGPT应用Next-Web

☕ 朋友,都看到这了,确定不关注一下么? 👇