前言
TEI就是text-embeddings-inference,github地址是github.com/huggingface…
TEI 是一个用于部署和提供开源文本嵌入和序列分类模型的工具,该工具主要是以部署 Embedding 模型为主,但是也支持 Rerank 和其他类型的模型的部署,同时它还支持部署兼容 OpenAI API 的 API 服务。
TEI是HuggingFace推出的,官网地址是huggingface.co/ 。
Docker部署
TEI支持Docker直接部署模型,命令如下:
docker run --gpus all -p 8080:80 -v $volume:/data --pull always ghcr.io/huggingface/text-embeddings-inference:1.5 --model-id $model
这里$volume
是本机上的一个地址,是给docker容器用于存储下载的文件,比如可以是~/data
。
$model
就是要部署的模型ID,比如我们打算部署一个rerank模型,就可以是BAAI/bge-reranker-large
注意命令中的text-embeddings-inference:1.5
是TEI的Image,但是它提供了几个Image,分别对应不同的GPU系列,所以要选择自己适合的Image。
模型
TEI支持的模型如下
Text Embeddings
MTEB Rank | Model Size | Model Type | Model ID |
---|---|---|---|
1 | 7B (Very Expensive) | Mistral | Salesforce/SFR-Embedding-2_R |
2 | 7B (Very Expensive) | Qwen2 | Alibaba-NLP/gte-Qwen2-7B-instruct |
9 | 1.5B (Expensive) | Qwen2 | Alibaba-NLP/gte-Qwen2-1.5B-instruct |
15 | 0.4B | Alibaba GTE | Alibaba-NLP/gte-large-en-v1.5 |
20 | 0.3B | Bert | WhereIsAI/UAE-Large-V1 |
24 | 0.5B | XLM-RoBERTa | intfloat/multilingual-e5-large-instruct |
N/A | 0.1B | NomicBert | nomic-ai/nomic-embed-text-v1 |
N/A | 0.1B | NomicBert | nomic-ai/nomic-embed-text-v1.5 |
N/A | 0.1B | JinaBERT | jinaai/jina-embeddings-v2-base-en |
N/A | 0.1B | JinaBERT | jinaai/jina-embeddings-v2-base-code |
Rerank
Task | Model Type | Model ID |
---|---|---|
Re-Ranking | XLM-RoBERTa | BAAI/bge-reranker-large |
Re-Ranking | XLM-RoBERTa | BAAI/bge-reranker-base |
Sentiment Analysis | RoBERTa | SamLowe/roberta-base-go_emotions |
Docker Image
TEI提供的Image如下:
Architecture | Image |
---|---|
CPU | ghcr.io/huggingface/text-embeddings-inference:cpu-1.5 |
Volta | NOT SUPPORTED |
Turing (T4, RTX 2000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:turing-1.5 (experimental) |
Ampere 80 (A100, A30) | ghcr.io/huggingface/text-embeddings-inference:1.5 |
Ampere 86 (A10, A40, ...) | ghcr.io/huggingface/text-embeddings-inference:86-1.5 |
Ada Lovelace (RTX 4000 series, ...) | ghcr.io/huggingface/text-embeddings-inference:89-1.5 |
Hopper (H100) | ghcr.io/huggingface/text-embeddings-inference:hopper-1.5 (experimental) |
对应自己的GPU系列来选择合适的Image,如果GPU太低就选择CPU版本的即可。
实例
以测试电脑为例,GPU太低所以只能用text-embeddings-inference:cpu-1.5
,所以部署BAAI/bge-reranker-large这个模型的命令是
docker run -p 8080:80 -v ~/data:/data --pull always ghcr.io/huggingface/text-embeddings-inference:cpu-1.5 --model-id BAAI/bge-reranker-large
注意因为我们不使用GPU,所以命令中的--gpus all
可以去掉,如果使用就需要根据自己的需要添加上。
部署中需要下载,最好有个代理,以免下载失败。
部署需要一定时间,完成后会看到如下信息:
INFO text_embeddings_router::http::server: router/src/http/server.rs:1778: Starting HTTP server: 0.0.0.0:80
INFO text_embeddings_router::http::server: router/src/http/server.rs:1779: Ready
这时候才是部署完成,可以正常使用。
模型下载失败
在部署的过程中发现报错
Error: Could not create backend
Caused by:
Could not start backend: Failed to create ONNX Runtime session: Deserialize tensor roberta.encoder.layer.20.attention.self.value.bias failed.GetFileLength for /data/models--BAAI--bge-reranker-large/snapshots/55611d7bca2a7133960a6d3b71e083071bbfc312/onnx/model.onnx_data failed:Invalid fd was supplied: -1
向上查看详细日志可以知道是模型的model.onnx和model.onnx_data这两个文件下载失败,日志中看地址是huggingface.co/BAAI/bge-re…
访问这个地址已经404了,其他模型也是同样的问题,不知道是不是官方的Image太旧了而且地址换了。
我在官网上手动下载了这两个文件,在huggingface.co/models 搜索该模型并点进去,然后点击Files and versions
,在下面目录中进入onnx,地址是huggingface.co/BAAI/bge-re… 。这样就可以看到这两个文件了,手动下载到本地。
下载完成后将这两个文件拷贝到$volume/models--BAAI--bge-reranker-large/snapshots/55611d7bca2a7133960a6d3b71e083071bbfc312/onnx/
下,这里$volume
就是我们在命令里配置的地址,models--BAAI--bge-reranker-large
就是模型名称,进去看一下就知道了。55611d7bca2a7133960a6d3b71e083071bbfc312
是快照名称,同样进去目录看一下就知道了。
然后重新执行命令就可以了。
后台运行
上面的命令会阻塞终端,停止终端docker容器也会停止。如果想后台运行容器,可以添加-d,如下:
docker run -d -p 8080:80 --name TEI -v ~/data:/data --pull always ghcr.io/huggingface/text-embeddings-inference:cpu-1.5 --model-id BAAI/bge-reranker-large
我们这里同时也为容器命名为TEI,如果不命名就会随机名字,有了这个名字我们后续停止重启都方便。
停止容器docker stop TEI
重启容器docker start TEI
注意在后台运行就无法看到运行日志,这样是否完成或者有问题也不容易看出来,如果是windows上使用docker desktop可以直接点击容器看到日志。也可以使用docker logs TEI
命令来查看某个容器的日志
使用
部署成功后可以通过http://localhost:8080/docs 来查看服务的API文档
测试
比如我们部署的是rerank模型,可以展开/rerank
,这里可以进行测试
点击 try it out,下面就会自动生成一个请求内容的示例,如下
在点击 Execute 就会发送这个测试请求,然后下面可以看到返回结果和curl等内容。
注意:rerank这里的示例有问题,最后一个truncation_direction
的值应该是Left
或者Right
,不能小写,所以执行示例的话会报错
Failed to deserialize the JSON body into the target type: truncation_direction: unknown variant `right`, expected `Left` or `Right` at line 9 column 33
改正确即可。
请求
测试通过我们就使用这个接口了,比如rerank接口地址http://localhost:8080/rerank
然后需要在header中添加
accept: application/json
Content-Type: application/json
请求body如下:
{
"query": "What is Deep Learning?",
"raw_scores": false,
"return_text": false,
"texts": [
"Deep Learning is ..."
],
"truncate": false,
"truncation_direction": "Right"
}
得到的结果如下:
[ { "index": 0, "score": 0.9972958 }]
对比query给texts中的列表重新评分,然后通过这个score就可以重新进行排序了。