如何在隔离环境中设置 LocalAI 以实现 GPU 驱动的文本嵌入

2024-06-09 23:52

本文主要是介绍如何在隔离环境中设置 LocalAI 以实现 GPU 驱动的文本嵌入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:来自 Elastic Valeriy Khakhutskyy

你是否想在 Elasticsearch 向量数据库之上构建 RAG 应用程序?你是否需要对大量数据使用语义搜索?你是否需要在隔离环境中本地运行?本文将向你展示如何操作。

Elasticsearch 提供了多种方法来为你的数据创建嵌入以进行对称搜索。最流行的方法之一是将 Elasticsearch open inference API 与 OpenAI、Cohere 或 Hugging Face 模型结合使用。这些平台支持许多可以在 GPU 上运行的大型、强大的嵌入模型。但是,第三方嵌入服务不适用于隔离系统,或者对有隐私问题和监管要求的客户不开放。

或者,你可以使用 ELSER 和 E5 在本地计算嵌入。这些嵌入模型在 CPU 上运行,并针对速度和内存使用进行了优化。它们也适用于隔离系统,可以在云中使用。但是,这些模型的性能不如在 GPU 上运行的模型。

如果你可以在本地计算数据的嵌入,那不是很棒吗?使用 LocalAI,你就可以做到这一点。LocalAI 是一个与 OpenAI API 兼容的免费开源推理服务器。它支持使用多个后端进行模型推理,包括用于嵌入的 Sentence Transformers 和用于文本生成的 llama.cpp。LocalAI 还支持 GPU 加速,因此你可以更快地计算嵌入。

本文将向你展示如何使用 LocalAI 计算数据的嵌入。我们将引导你完成设置 LocalAI、配置它以计算数据的嵌入以及运行它以生成嵌入的过程。你可以在笔记本电脑、隔离系统或任何需要计算嵌入的地方运行它。

我引起了你的兴趣吗?让我们开始吧!

步骤 1:使用 docker-compose 设置 LocalAI

要开始使用 LocalAI,你需要在计算机上安装 Docker 和 docker-compose。根据你的操作系统,你可能还需要安装 NVIDIA Container Toolkit 以在 Docker 容器内提供 GPU 支持。

旧版本不支持 NVIDIA 运行时指令,因此请确保安装了最新版本的 docker-compose:

sudo curl -L https://github.com/docker/compose/releases/download/v2.26.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

检查 docker-compose 的版本:

docker-compose --version

你需要使用以下 docker-compose.yaml 配置文件

# file: docker-compose.yaml
services:localai:image: localai/localai:latest-aio-gpu-nvidia-cuda-12container_name: localaienvironment:- MODELS_PATH=/models- THREADS=8ports:- "8080:8080"volumes:- $HOME/models:/modelstty: truestdin_open: truerestart: alwaysdeploy:resources:reservations:devices:- driver: nvidiacount: allcapabilities: [gpu]

注意

  1. 我们将 $HOME/models 目录挂载到容器内的 /models 目录。这是模型的存储位置。你需要调整要存储模型的目录的路径。
  2. 我们指定了用于推理的线程数和要使用的 GPU 数量。你可以根据硬件配置调整这些值。

第 2 步:配置 LocalAI 以使用 Sentence Transformers 模型

在本教程中,我们将使用 mixedbread-ai/mxbai-embed-large-v1,它目前在 MTEB 排行榜上排名第 4。但是,任何可以由 sentence-transformers 库加载的嵌入模型都可以以相同的方式工作。

创建目录 $HOME/models 和配置文件 $HOME/models/mxbai-embed-large-v1.yaml,内容如下:

# file: mxbai-embed-large-v1.yaml
name: mxbai-embed-large-v1 
backend: sentencetransformers
embeddings: true
parameters:model: mixedbread-ai/mxbai-embed-large-v1

步骤 3:启动 LocalAI 服务器

通过运行以下命令以分离模式启动 Docker 容器

docker-compose up -d

从你的 $HOME 目录。

通过运行 docker-compose ps 验证容器是否已正确启动。检查 localai 容器是否处于启动状态。

你应该看到类似于以下内容的输出:

~$ docker-compose ps
WARN[0000] /home/valeriy/docker-compose.yaml: `version` is obsolete 
NAME      IMAGE                                           COMMAND                  SERVICE   CREATED              STATUS                                 PORTS
localai   localai/localai:latest-aio-gpu-nvidia-cuda-12   "/aio/entrypoint.sh"     localai   About a minute ago   Up About a minute (health: starting)   0.0.0.0:8080->8080/tcp

如果出现问题,请检查日志。你还可以使用日志来验证 localai 是否可以看到 GPU。运行

docker logs localai

应该可以看到这样的信息:

$ docker logs localai
===> LocalAI All-in-One (AIO) container starting...
NVIDIA GPU detected
Thu Mar 28 11:15:41 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.10              Driver Version: 535.86.10    CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  Tesla T4                       Off | 00000000:00:04.0 Off |                    0 |
| N/A   59C    P0              29W /  70W |      2MiB / 15360MiB |      6%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------++---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+
NVIDIA GPU detected. Attempting to find memory size...
Total GPU Memory: 15360 MiB

最后,你可以通过查询已安装模型的列表来验证推理服务器是否正常工作:

curl -k http://localhost:8080/v1/models

应该产生如下输出:

{"object":"list","data":[{"id":"tts-1","object":"model"},{"id":"text-embedding-ada-002","object":"model"},{"id":"gpt-4","object":"model"},{"id":"whisper-1","object":"model"},{"id":"stablediffusion","object":"model"},{"id":"gpt-4-vision-preview","object":"model"},{"id":"MODEL_CARD","object":"model"},{"id":"llava-v1.6-7b-mmproj-f16.gguf","object":"model"},{"id":"voice-en-us-amy-low.tar.gz","object":"model"}]}

步骤 4:创建 Elasticsearch _inference 服务

我们已经创建并配置了 LocalAI 推理服务器。由于它是 OpenAI 推理服务器的直接替代品,我们可以在 Elasticsearch 中创建一个新的 openai 推理服务。Elasticsearch 8.14 中实现了对此功能的支持。

要创建新的推理服务,请在 Kibana 中打开 Dev Tools 并运行以下命令:

PUT _inference/text_embedding/mxbai-embed-large-v1
{"service": "openai","service_settings": {"model_id": "mxbai-embed-large-v1","url": "http://localhost:8080/embeddings","api_key": "ignored"}
}

注意

  1. api_key 参数是 openai 服务所必需的,必须设置,但具体值对我们的 LocalAI 服务并不重要。
  2. 对于大型模型,如果模型首次下载到 LocalAI 服务器需要很长时间,则 PUT 请求最初可能会超时。只需在短时间内重试 PUT 请求即可。

最后,你可以验证推理服务是否正常工作:

POST _inference/text_embedding/mxbai-embed-large-v1
{"input": "It takes all the running you can do, to keep in the same place. If you want to get somewhere else, you must run at least twice as fast as that!"
}

应该产生如下输出:

{"text_embedding": [{"embedding": [-0.028375082,0.6544269,0.1583663,0.88167363,0.5215657,0.05415681,0.62085253,0.069351405,0.29407632,0.51018727,0.8183201,...]}]
}

结论

按照本文中的步骤,你可以设置 LocalAI,使用 GPU 加速计算数据的嵌入,而无需依赖第三方推理服务。借助 LocalAI,在隔离环境中或有隐私问题的 Elasticsearch 用户可以利用世界一流的向量数据库来开发他们的 RAG 应用程序,而无需牺牲计算性能或选择最适合其需求的 AI 模型的能力。

立即尝试使用 Elastic Stack 构建你自己的 RAG 应用程序:在云端、隔离环境中或在你的笔记本电脑上!

准备好自己尝试了吗?开始免费试用。
希望将 RAG 构建到你的应用程序中?想尝试使用矢量数据库的不同 LLM 吗?
查看我们在 Github 上为 LangChain、Cohere 等提供的示例笔记本,并立即加入 Elasticsearch Relevance Engine 培训。

原文:LocalAI for GPU-Powered Text Embeddings in Air-Gapped Environments — Elastic Search Labs

这篇关于如何在隔离环境中设置 LocalAI 以实现 GPU 驱动的文本嵌入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046656

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配