Infinity ♾️
Infinity是一个高吞吐量、低延迟的REST API,用于提供向量嵌入,支持所有sentence-transformer模型和框架。Infinity是在MIT许可证下开发的。
为什么选择Infinity
- 部署任何MTEB模型:部署任何来自SentenceTransformers的嵌入模型
- 快速推理后端:推理服务器基于torch、optimum(onnx/tensorrt)和CTranslate2构建,使用FlashAttention最大限度地利用您的NVIDIA CUDA、AMD ROCM、CPU、AWS INF2或APPLE MPS加速器。
- 动态批处理:新嵌入请求在GPU忙于处理前一个请求时排队。一旦准备就绪,新请求将尽快加入您的设备。
- 正确且经过测试的实现:单元测试和端到端测试。通过Infinity生成的嵌入是正确嵌入的。让API用户创建嵌入直到无限及更远的地方。
- 易于使用:API基于FastAPI构建,Swagger使其完全文档化。API与OpenAI的嵌入规范对齐。查看文档以了解如何开始:https:///michaelfeil.github.io/infinity。
最新消息 🔥
- [2024/07] 通过Modal和免费GPU部署进行推理部署示例
- [2024/06] 支持多模态:clip、文本分类&从环境变量启动所有参数
- [2024/05] 使用
v2
cli启动多个模型,包括--api-key
- [2024/03] Infinity支持实验性的int8(cpu/cuda)和fp8(H100/MI300)支持
- [2024/03] 文档已上线:https://michaelfeil.github.io/infinity/latest/
- [2024/02] 在Run:AI Infra Club社区见面会
- [2024/01] TensorRT / ONNX推理
- [2023/10] 首次发布
Infinity演示
在这个演示中,部署了sentence-transformers/all-MiniLM-L6-v2,批处理大小为2。初始化后,从第二个终端通过cURL发送3个请求(1个、1个和5个句子)。
入门指南
通过pip install启动CLI
pip install infinity-emb[all]
在pip安装后,激活虚拟环境,可以直接运行CLI。
infinity_emb v2 --model-id BAAI/bge-small-en-v1.5
查看v2 --help
命令以获取所有参数的描述。
infinity_emb v2 --help
使用预构建的docker容器启动CLI(推荐)
除了通过pip安装CLI,还可以使用docker运行michaelf34/infinity
。
确保挂载您的加速器(即安装nvidia-docker
并通过--gpus all
激活)。
port=7997
model1=michaelfeil/bge-small-en-v1.5
model2=mixedbread-ai/mxbai-rerank-xsmall-v1
volume=$PWD/data
docker run -it --gpus all \
-v $volume:/app/.cache \
-p $port:$port \
michaelf34/infinity:latest \
v2 \
--model-id $model1 \
--model-id $model2 \
--port $port
在docker容器内的缓存路径由环境变量HF_HOME
设置。
通过Python API启动
除了cli & RestAPI,你还可以通过Python API使用Infinity的接口。
这为你提供了最大的灵活性。Python API基于asyncio
及其await/async
特性,以允许请求的并发处理。CLI的参数也可以通过Python使用。
import asyncio
from infinity_emb import AsyncEngineArray, EngineArgs, AsyncEmbeddingEngine
sentences = ["通过Infinity嵌入此句子。", "巴黎在法国。"]
array = AsyncEngineArray.from_args([
EngineArgs(model_name_or_path = "BAAI/bge-small-en-v1.5", engine="torch", embedding_dtype="float32", dtype="auto")
])
async def embed_text(engine: AsyncEmbeddingEngine):
async with engine:
embeddings, usage = await engine.embed(sentences=sentences)
# 或自行处理异步启动/停止。
await engine.astart()
embeddings, usage = await engine.embed(sentences=sentences)
await engine.astop()
asyncio.run(embed_text(array[0]))
示例嵌入模型:
- 支持任何热门的嵌入/重排序模型:https://huggingface.co/models?other=text-embeddings-inference&sort=trending
- mixedbread-ai/mxbai-embed-large-v1
- WhereIsAI/UAE-Large-V1
- BAAI/bge-base-en-v1.5
- Alibaba-NLP/gte-large-en-v1.5
- jinaai/jina-embeddings-v2-base-code
- intfloat/multilingual-e5-large-instruct
通过dstack在云端启动
dstack允许你在选择的云上配置一个虚拟机实例。编写如下服务配置文件以部署Infinity封装的BAAI/bge-small-en-v1.5
模型。
type: service
image: michaelf34/infinity:latest
env:
- INFINITY_MODEL_ID=BAAI/bge-small-en-v1.5;BAAI/bge-reranker-base;
- INFINITY_PORT=80
commands:
- infinity_emb v2
port: 80
然后,只需运行以下dstack命令。之后,会出现提示让你选择在哪个虚拟机实例上部署Infinity。
dstack run . -f infinity/serve.dstack.yml --gpu 16GB
有关更详细的教程和dstack的一般信息,请访问官方文档。
重排序
重排序为查询和多个文档之间的相似性提供一个分数。 可与VectorDB+Embeddings结合使用,也可以单独用于少量文档。 请选择一个来自huggingface的AutoModelForSequenceClassification模型,并且是单分类模型。
import asyncio
from infinity_emb import AsyncEngineArray, EngineArgs, AsyncEmbeddingEngine
query = "什么是python包infinity_emb?"
docs = ["这是一篇与
```xml
<SOURCE_TEXT>
async def classifier():
async with engine:
predictions, usage = await engine.classify(sentences=sentences)
# 或者自行处理异步的启动/停止。
await engine.astart()
predictions, usage = await engine.classify(sentences=sentences)
await engine.astop()
asyncio.run(classifier(array["SamLowe/roberta-base-go_emotions"]))
示例模型:
集成:
- Runpod上的无服务器部署
- Truefoundry Cognita
- Langchain示例
- imitater - 一个基于vllm和infinity构建的统一语言模型服务器。
- Dwarves Foundation: 使用Modal.com的部署示例
- infiniflow/Ragflow
- SAP Core AI
启动常见问题:
什么是嵌入模型?
嵌入模型可以将任何文本映射到一个低维密集向量,该向量可用于检索、分类、聚类或语义搜索等任务。 它还可以用于LLM的向量数据库中。最著名的架构是仅编码器Transformer,如BERT,最流行的实现包括SentenceTransformers。
支持哪些模型?
支持所有Sentence Transformers组织的模型 https://huggingface.co/sentence-transformers / sbert.net。 像LLAMA2-7B这样的LLM不打算用于部署。
使用命令--engine torch
时,模型必须兼容https://github.com/UKPLab/sentence-transformers/和AutoModel。
使用命令--engine optimum
时,必须有一个onnx文件。建议使用来自https://huggingface.co/Xenova的模型。
使用命令--engine ctranslate2
- 仅支持BERT
模型。
欲了解最新趋势,可以查看以下模型之一。 https://huggingface.co/spaces/mteb/leaderboard
启动多个模型
从infinity_emb>=0.0.34开始,您可以使用CLI v2
方法同时启动多个模型。
查看infinity_emb v2 --help
了解所有参数。
使用Langchain与Infinity
Infinity已正式集成到pip install langchain>=0.342
中。可以在这里找到更多文档:
https://python.langchain.com/docs/integrations/text_embedding/infinity
from langchain.embeddings.infinity import InfinityEmbeddings
from langchain.docstore.document import Document
documents = [Document(page_content="Hello world!", metadata={"source": "unknown"})]
emb_model = InfinityEmbeddings(model="BAAI/bge-small", infinity_api_url="http://localhost:7997/v1")
print(emb_model.embed_documents([doc.page_content for doc in docs]))
文档
在https:///michaelfeil.github.io/infinity上查看入门指南。
启动后,Swagger Ui将会在{url}:{port}/docs
下可用,在此案例中为http://localhost:7997/docs
。您还可以在此处找到交互式预览:https://infinity.modal.michaelfeil.eu/docs(以及https://michaelfeil-infinity.hf.space/docs)
贡献和开发
在Ubuntu 22.04上通过Poetry 1.7.1和Python3.11安装
cd libs/infinity_emb
poetry install --extras all --with test
通过CI:
cd libs/infinity_emb
make format
make lint
poetry run pytest ./tests
所有贡献必须以与本库的MIT许可证兼容的方式进行。
引用
@software{feil_2023_11630143,
author = {Feil, Michael},
title = {Infinity - To Embeddings and Beyond},
month = oct,
year = 2023,
publisher = {Zenodo},
doi = {10.5281/zenodo.11630143},
url = {https://doi.org/10.5281/zenodo.11630143}
}
💚 当前贡献者
</SOURCE_TEXT>