CLIP-as-service简介
CLIP-as-service是一个基于CLIP(Contrastive Language-Image Pre-Training)模型的高效可扩展服务,用于生成图像和文本的嵌入向量表示。它具有以下主要特点:
-
⚡ 快速:使用TensorRT、ONNX运行时和PyTorch无JIT方式提供CLIP模型服务,单GPU可达800QPS。采用非阻塞双工流式处理请求和响应,适用于大数据和长时间运行的任务。
-
🫐 弹性:可在单个GPU上水平扩展多个CLIP模型,自动负载均衡。
-
🐥 易用:客户端和服务器端设计简约,无学习成本。为图像和句子嵌入提供直观一致的API。
-
👒 现代化:支持异步客户端。可轻松在gRPC、HTTP、WebSocket协议之间切换,支持TLS和压缩。
-
🍱 集成:与Jina和DocArray等神经搜索生态系统无缝集成。可快速构建跨模态和多模态解决方案。
CLIP-as-service采用客户端-服务器架构设计,包含clip-server
和clip-client
两个独立的Python包。服务器端负责加载CLIP模型并提供推理服务,客户端负责发送请求和接收结果。这种设计使得系统具有很好的灵活性和可扩展性。
安装与快速入门
安装
CLIP-as-service支持Python 3.7+环境。服务器端和客户端可以独立安装:
服务器端安装(PyTorch版):
pip install clip-server
客户端安装:
pip install clip-client
快速入门
- 启动服务器:
python -m clip_server
- 创建客户端连接:
from clip_client import Client
c = Client('grpc://0.0.0.0:51000')
- 获取句子嵌入:
r = c.encode(['First do it', 'then do it right', 'then do it better'])
print(r.shape) # [3, 512]
- 获取图像嵌入:
r = c.encode(['apple.png', # 本地图像
'https://clip-as-service.jina.ai/_static/favicon.png', # 远程图像
'data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7']) # 图像URI
print(r.shape) # [3, 512]
主要功能
CLIP-as-service提供了以下主要功能:
1. 文本和图像嵌入
可以对文本和图像进行嵌入,生成512维的向量表示。支持批量处理,可以一次性对多个文本或图像进行编码。
2. 跨模态搜索
基于CLIP模型的语义理解能力,可以实现文本到图像、图像到文本的跨模态搜索。例如,输入一段文字描述,找到最匹配的图像;或者输入一张图片,找到最贴切的文字描述。
3. 视觉推理
CLIP模型具有强大的视觉推理能力,可以对图像内容进行分析和理解。例如,可以判断图像中物体的数量、颜色、空间关系等。
4. 排序
提供了/rank
端点,可以对跨模态匹配结果进行重新排序,提高搜索质量。
5. 索引和搜索
支持对大规模数据集进行索引和搜索,可以快速找到最相似的结果。
应用示例
文本到图像搜索
以下是一个简单的文本到图像搜索示例,使用Totally Looks Like数据集:
from docarray import DocumentArray
from clip_client import Client
# 加载图像数据集
da = DocumentArray.pull('ttl-original', show_progress=True, local_cache=True)
# 创建客户端连接
c = Client('grpc://0.0.0.0:51000')
# 对图像进行编码
da = c.encode(da, show_progress=True)
# 交互式搜索
while True:
vec = c.encode([input('sentence> ')])
r = da.find(query=vec, limit=9)
r[0].plot_image_sprites()
这个例子展示了如何通过输入文本描述来搜索匹配的图像。
图像到文本搜索
我们还可以实现图像到文本的搜索,以下是一个使用《傲慢与偏见》全文作为文本数据集的示例:
from docarray import Document, DocumentArray
from clip_client import Client
# 加载文本数据集
d = Document(uri='https://www.gutenberg.org/files/1342/1342-0.txt').load_uri_to_text()
da = DocumentArray(
Document(text=s.strip()) for s in d.text.replace('\r\n', '').split('.') if s.strip()
)
# 创建客户端连接
c = Client('grpc://0.0.0.0:51000')
# 对文本进行编码
r = c.encode(da, show_progress=True)
# 加载图像嵌入
img_da = DocumentArray.load_binary('ttl-image')
# 随机选择图像并搜索匹配的文本
for d in img_da.sample(10):
print(da.find(d.embedding, limit=1)[0].text)
这个例子展示了如何通过输入图像来搜索最匹配的文本描述。
性能与扩展性
CLIP-as-service在设计上注重性能和可扩展性:
-
支持TensorRT、ONNX等高性能推理引擎,单GPU可达800QPS。
-
采用非阻塞双工流式处理,可以高效处理大规模数据。
-
支持在单GPU上水平扩展多个CLIP模型,自动负载均衡。
-
客户端支持异步接口,易于集成到其他异步系统中。
-
支持批处理和预取,可以根据实际需求调整参数以获得最佳性能。
总结
CLIP-as-service为构建跨模态AI应用提供了强大而灵活的工具。它将CLIP模型的强大能力封装成易用的服务,使开发者可以专注于应用逻辑,而不必关心底层细节。无论是构建智能搜索引擎、内容推荐系统,还是视觉问答系统,CLIP-as-service都能提供关键的支持。
随着多模态AI技术的不断发展,CLIP-as-service也在持续优化和扩展其功能。未来,它有望在更多领域发挥重要作用,推动AI应用的创新与落地。