🆕🖧 分布式推理
🆕🖧 分布式推理
LocalAI 的这个功能能够使其将推理请求分发到多个工作节点,提高效率和性能。节点自动发现并通过 p2p 连接,使用共享令牌确保网络中节点间的通信安全且私密。
LocalAI 通过 p2p 支持两种分布式推理模式:
- 联邦模式:请求在集群之间共享,并根据负载均衡器的决策路由到网络中的单个工作节点。
- 工作节点模式(又名“模型分片”或“权重分割”):所有工作节点处理请求,共同贡献最终推理结果(通过共享模型权重)。
使用方法
使用 --p2p 启动 LocalAI 会生成一个用于连接多个实例的共享令牌:这就是创建 AI 集群所需的一切,无需复杂网络设置。
只需导航到 WebUI 的“Swarm”部分并按照屏幕上的指示操作。
对于完全共享的实例,启动 LocalAI 时使用 --p2p --federated 并遵循 Swarm 部分的指导。此功能虽然仍为实验性,但已提供技术预览质量体验。
联邦模式
联邦模式允许启动多个 LocalAI 实例并将它们连接在一起形成联邦网络。当您想将推理负载分布在多个节点上,但希望 API 有一个单一入口点时,此模式很有用。在 WebUI 的 Swarm 部分中,您可以查看连接多个实例的指示。
要启动联邦模式下的 LocalAI 服务器,运行:
local-ai run --p2p --federated这将生成一个令牌,您可以用它来连接其他 LocalAI 实例到网络,或者其他人可以用它加入网络。如果您已经有了令牌,可以通过 TOKEN 环境变量来指定它。
要启动一个负载均衡服务器,将请求路由到网络,请使用 TOKEN 运行:
local-ai federated要查看所有可用选项,运行 local-ai federated --help。
指示将在 WebUI 的“Swarm”部分显示,引导您完成连接多个实例的过程。
工作节点模式
此功能仅适用于与 llama-cpp 兼容的模型。
此功能在 LocalAI pull request #2324 中引入,基于 llama.cpp pull request #6829 的上游工作。
要将多个工作节点连接到单个 LocalAI 实例,首先以 p2p 模式启动服务器:
local-ai run --p2p然后导航到 WebUI 的“Swarm”部分,查看连接多个工作节点到网络的指示。
不使用 P2P
要启动工作节点以分配计算负载,运行:
local-ai worker llama-cpp-rpc --llama-cpp-args="-H <listening_address> -p <listening_port> -m <memory>"启动 LocalAI 时,您可以通过 LLAMACPP_GRPC_SERVERS 环境变量指定工作节点的地址:
LLAMACPP_GRPC_SERVERS="address1:port,address2:port" local-ai run然后 LocalAI 服务器的负载将在指定的节点间分配。
或者,您可以按照 llama.cpp README 构建 RPC 工作节点/服务器,这与 LocalAI 兼容。
手动示例(工作节点)
使用 WebUI 指导您启动新工作节点的过程。以下示例展示了手动步骤以突出显示过程。
- 使用
--p2p启动服务器:
./local-ai run --p2p
# 在 WebUI 的 Swarm 部分获取令牌从 WebUI 或通过 API 调用(例如 curl http://localhost:8000/p2p/token)复制令牌,并保存以供稍后使用。
要稍后重用相同令牌,重新启动服务器时使用 --p2ptoken 或 P2P_TOKEN。
- 启动工作节点。将
local-ai二进制文件复制到其他主机,并使用令牌运行所需数量的工作节点:
TOKEN=XXX ./local-ai worker p2p-llama-cpp-rpc --llama-cpp-args="-m <memory>"
# 1:06AM INF 从文件 envFile=.env 加载环境变量
# 1:06AM INF 设置日志级别为 info
# {"level":"INFO","time":"2024-05-19T01:06:01.794+0200","caller":"config/config.go:288","message":"connmanager 禁用\n"}
# {"level":"INFO","time":"2024-05-19T01:06:01.794+0200","caller":"config/config.go:295","message":" go-libp2p 资源管理器保护启用"}
# {"level":"INFO","time":"2024-05-19T01:06:01.794+0200","caller":"config/config.go:409","message":"最大连接数:100\n"}
# 1:06AM INF 在 '127.0.0.1:34371' 上启动 llama-cpp-rpc-server
# {"level":"INFO","time":"2024-05-19T01:06:01.794+0200","caller":"node/node.go:118","message":" 启动 EdgeVPN 网络"}
# create_backend: 使用 CPU 后端
# 在 127.0.0.1:34371 上启动 RPC 服务器,后端内存:31913 MB
# 2024/05/19 01:06:01 无法足够增加接收缓冲区大小(原本:208 kiB,期望:2048 kiB,得到:416 kiB)。# 参见 https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes 了解详细信息。
# {"level":"INFO","time":"2024-05-19T01:06:01.805+0200","caller":"node/node.go:172","message":" 节点 ID: 12D3KooWJ7WQAbCWKfJgjw2oMMGGss9diw3Sov5hVWi8t4DMgx92"}
# {"level":"INFO","time":"2024-05-19T01:06:01.806+0200","caller":"node/node.go:173","message":" 节点地址:[/ip4/127.0.0.1/tcp/44931 /ip4/127.0.0.1/udp/33251/quic-v1/webtransport/certhash/uEiAWAhZ-W9yx2ZHnKQm3BE_ft5jjoc468z5-Rgr9XdfjeQ/certhash/uEiB8Uwn0M2TQBELaV2m4lqypIAY2S-2ZMf7lt_N5LS6ojw /ip4/127.0.0.1/udp/35660/quic-v1 /ip4/192.168.68.110/tcp/44931 /ip4/192.168.68.110/udp/33251/quic-v1/webtransport/certhash/uEiAWAhZ-W9yx2ZHnKQm3BE_ft5jjoc468z5-Rgr9XdfjeQ/certhash/uEiB8Uwn0M2TQBELaV2m4lqypIAY2S-2ZMf7lt_N5LS6ojw /ip4/192.168.68.110/udp/35660/quic-v1 /ip6/::1/tcp/41289 /ip6/::1/udp/33160/quic-v1/webtransport/certhash/uEiAWAhZ-W9yx2ZHnKQm3BE_ft5jjoc468z5-Rgr9XdfjeQ/certhash/uEiB8Uwn0M2TQBELaV2m4lqypIAY2S-2ZMf7lt_N5LS6ojw /ip6/::1/udp/35701/quic-v1]"}
# {"level":"INFO","time":"2024-05-19T01:06:01.806+0200","caller":"discovery/dht.go:104","message":" 引导 DHT"}(注意:您也可以通过命令行参数提供令牌)
服务器日志应指示新工作节点正在被发现。
- 在步骤 1 中启动的服务器上像往常一样启动推理。
环境变量
可以使用环境变量来调整选项或设置参数
| 环境变量 | 描述 |
|---|---|
| LOCALAI_P2P | 设置为 "true" 以启用 p2p |
| LOCALAI_FEDERATED | 设置为 "true" 以启用联邦模式 |
| FEDERATED_SERVER | 设置为 "true" 以启用联邦服务器 |
| LOCALAI_P2P_DISABLE_DHT | 设置为 "true" 以禁用 DHT 并启用仅限本地的 p2p 层(mDNS) |
| LOCALAI_P2P_ENABLE_LIMITS | 设置为 "true" 以启用连接限制和资源管理(在连接性差或希望限制资源消耗时很有用) |
| LOCALAI_P2P_LISTEN_MADDRS | 设置为逗号分隔的多地址列表以覆盖默认的 libp2p 0.0.0.0 多地址 |
| LOCALAI_P2P_DHT_ANNOUNCE_MADDRS | 设置为逗号分隔的多地址列表以覆盖宣布的监听多地址(在外部地址:端口重映射时很有用) |
| LOCALAI_P2P_BOOTSTRAP_PEERS_MADDRS | 设置为逗号分隔的多地址列表以指定自定义 DHT 引导节点 |
| LOCALAI_P2P_TOKEN | 设置 p2p 网络的令牌 |
| LOCALAI_P2P_LOGLEVEL | 设置 LocalAI p2p 堆栈的日志级别(默认:info) |
| LOCALAI_P2P_LIB_LOGLEVEL | 设置底层 libp2p 堆栈的日志级别(默认:fatal) |
架构
LocalAI 在底层使用 https://github.com/libp2p/go-libp2p,与驱动 IPFS 的同一项目。与其他框架不同,LocalAI 使用 peer2peer 而没有单一的主服务器,而是使用子/广播和账本功能在不同节点间达成共识。
EdgeVPN 被用作库来建立网络并在共享令牌下暴露账本功能,以简化自动发现并拥有分离的、私有的 peer2peer 网络。
在工作节点模式下,权重按内存比例分割;在联邦模式下,每个请求都会被分割到每个节点,每个节点都需要完全加载模型。
注意事项
- 如果在容器镜像中以 p2p 模式运行,请确保以
--net host或network_mode: host在 docker-compose 文件中启动容器。 - 当前仅支持单个模型。
- 确保服务器在开始推理前检测到新工作节点。目前,一旦推理开始,无法添加额外的工作节点。
- 更多关于实现的详细信息,请参考 LocalAI pull request #2343。