Clip-As Service-это услуга с низкой задержкой высокой масштабируемости для встраивания изображений и текста. Он может быть легко интегрирован как микросервис в растворы для нейронного поиска.
⚡ Быстро : подайте модели клипов с Tensorrt, Onnx Runtime и Pytorch без JIT с 800QP [*] . Неблокирующая дуплексная потоковая передача по запросам и ответам, разработанным для больших данных и длительных задач.
? Elastic : горизонтально масштабируйте несколько моделей с несколькими зажимами на отдельном графическом процессоре, с автоматической балансировкой нагрузки.
? Простая в использовании : без кривой обучения, минималистский дизайн на клиенте и сервере. Интуитивно понятный и последовательный API для встраивания изображения и предложений.
? Современный : асинхронная поддержка клиентов. Легко переключаться между GRPC, HTTP, протоколами WebSocket с TLS и сжатием.
? Интеграция : плавная интеграция с экосистемой по нейтральной поиске, включая Джину и Докаррея. Создайте кросс-модальные и мультимодальные решения в кратчайшие сроки.
[*] С конфигурацией по умолчанию (одиночная реплика, pytorch no jit) на GeForce RTX 3090.
через https? | через grpc? ⚡⚡ |
curl
-X POST https:// < your-inference-address > -http.wolf.jina.ai/post
-H ' Content-Type: application/json '
-H ' Authorization: <your access token> '
-d ' {"data":[{"text": "First do it"},
{"text": "then do it right"},
{"text": "then do it better"},
{"uri": "https://picsum.photos/200"}],
"execEndpoint":"/"} ' | # pip install clip-client
from clip_client import Client
c = Client (
'grpcs://<your-inference-address>-grpc.wolf.jina.ai' ,
credential = { 'Authorization' : '<your access token>' },
)
r = c . encode (
[
'First do it' ,
'then do it right' ,
'then do it better' ,
'https://picsum.photos/200' ,
]
)
print ( r ) |
Существует четыре основных навыков визуальной рассуждения: распознавание объектов, подсчет объектов, распознавание цвета и понимание пространственных отношений. Попробуем немного:
Вам необходимо установить
jq
(процессор JSON), чтобы приточить результаты.
Изображение | через https? |
curl
-X POST https:// < your-inference-address > -http.wolf.jina.ai/post
-H ' Content-Type: application/json '
-H ' Authorization: <your access token> '
-d ' {"data":[{"uri": "https://picsum.photos/id/1/300/300",
"matches": [{"text": "there is a woman in the photo"},
{"text": "there is a man in the photo"}]}],
"execEndpoint":"/rank"} '
| jq " .data[].matches[] | (.text, .scores.clip_score.value) " дает: | |
curl
-X POST https:// < your-inference-address > -http.wolf.jina.ai/post
-H ' Content-Type: application/json '
-H ' Authorization: <your access token> '
-d ' {"data":[{"uri": "https://picsum.photos/id/133/300/300",
"matches": [
{"text": "the blue car is on the left, the red car is on the right"},
{"text": "the blue car is on the right, the red car is on the left"},
{"text": "the blue car is on top of the red car"},
{"text": "the blue car is below the red car"}]}],
"execEndpoint":"/rank"} '
| jq " .data[].matches[] | (.text, .scores.clip_score.value) " дает: | |
curl
-X POST https:// < your-inference-address > -http.wolf.jina.ai/post
-H ' Content-Type: application/json '
-H ' Authorization: <your access token> '
-d ' {"data":[{"uri": "https://picsum.photos/id/102/300/300",
"matches": [{"text": "this is a photo of one berry"},
{"text": "this is a photo of two berries"},
{"text": "this is a photo of three berries"},
{"text": "this is a photo of four berries"},
{"text": "this is a photo of five berries"},
{"text": "this is a photo of six berries"}]}],
"execEndpoint":"/rank"} '
| jq " .data[].matches[] | (.text, .scores.clip_score.value) " дает: |
Clip-AS-Service состоит из двух зажимах Python clip-server
и clip-client
, которые могут быть установлены независимо . Оба требуют Python 3.7+.
Pytorch Runtime ⚡ | Onnx Runtime ⚡⚡ | Время выполнения Tensorrt ⚡⚡⚡ |
pip install clip-server | pip install " clip-server[onnx] " | pip install nvidia-pyindex
pip install " clip-server[tensorrt] " |
Вы также можете разместить сервер в Google Colab, используя его бесплатный графический процессор/TPU.
pip install clip-client
Вы можете запустить простую проверку подключения после установки.
С/с | Командование | Ожидайте вывода |
---|---|---|
Сервер | python -m clip_server | ![]() |
Клиент | from clip_client import Client
c = Client ( 'grpc://0.0.0.0:23456' )
c . profile () | ![]() |
Вы можете изменить 0.0.0.0
на интрасети или публичный IP -адрес для проверки подключения к частной и публичной сети.
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' , # local image
'https://clip-as-service.jina.ai/_static/favicon.png' , # remote image
'data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7' ]) # in image URI
print ( r . shape ) # [3, 512]
Более полные серверы и клиентских руководств по пользователям можно найти в документах.
Давайте создадим поиск текста до изображения, используя клип как услуги. А именно, пользователь может ввести предложение, а программа возвращает соответствующие изображения. Мы используем Allular Like Data DataSet и Docarray Package. Обратите внимание, что Docarray включен в clip-client
в качестве зависимости вверх по течению, поэтому вам не нужно устанавливать его отдельно.
Сначала мы загружаем изображения. Вы можете просто вытащить их из Джины Клауд:
from docarray import DocumentArray
da = DocumentArray . pull ( 'ttl-original' , show_progress = True , local_cache = True )
В качестве альтернативы, вы можете полностью выглядеть как официальный веб -сайт, расстегнуть и загружать изображения:
from docarray import DocumentArray
da = DocumentArray . from_files ([ 'left/*.jpg' , 'right/*.jpg' ])
Набор данных содержит 12 032 изображения, поэтому может потребоваться некоторое время, чтобы потянуть. После этого вы можете визуализировать его и получить первый вкус этих изображений:
da . plot_image_sprites ()
Запустите сервер с python -m clip_server
. Допустим, это на 0.0.0.0:51000
с протоколом GRPC
(вы получите эту информацию после запуска сервера).
Создайте сценарий клиента Python:
from clip_client import Client
c = Client ( server = 'grpc://0.0.0.0:51000' )
da = c . encode ( da , show_progress = True )
В зависимости от вашей графической сети и сети клиента, может потребоваться некоторое время, чтобы внедрить 12K изображений. В моем случае это заняло около двух минут.
Если вы нетерпеливы или у вас нет графического процессора, ожидание может быть адом. В этом случае вы можете просто потянуть наш набор данных изображения с предварительно кодированным:
from docarray import DocumentArray
da = DocumentArray . pull ( 'ttl-embedding' , show_progress = True , local_cache = True )
Давайте создадим простую подсказку, чтобы позволить пользователю вводить предложение:
while True :
vec = c . encode ([ input ( 'sentence> ' )])
r = da . find ( query = vec , limit = 9 )
r [ 0 ]. plot_image_sprites ()
Теперь вы можете ввести произвольные английские предложения и просмотреть соответствующие изображения Top-9. Поиск быстрый и инстинктивный. Давай повеселимся:
"Счастливый картофель" | "Супер злой ИИ" | "Парень, наслаждающийся своим бургером" |
---|---|---|
«Профессор Кот очень серьезный» | «Инженер эго живет с родителем» | «Завтра не будет, так что давайте съесть нездоровое» |
---|---|---|
Давайте сохраним результат встраивания для нашего следующего примера:
da . save_binary ( 'ttl-image' )
Мы также можем переключить ввод и вывод последней программы для достижения поиска в образе в тексте. Именно, учитывая изображение запроса, найдите предложение, которое лучше всего описывает изображение.
Давайте использовать все предложения из книги «Гордость и предубеждение».
from docarray import Document , DocumentArray
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 ()
)
Давайте посмотрим на то, что у нас есть:
da . summary ()
Documents Summary
Length 6403
Homogenous Documents True
Common Attributes ('id', 'text')
Attributes Summary
Attribute Data type #Unique values Has empty value
──────────────────────────────────────────────────────────
id ('str',) 6403 False
text ('str',) 6030 False
Теперь кодируйте эти 6 403 предложения, это может занять 10 секунд или меньше в зависимости от вашего графического процессора и сети:
from clip_client import Client
c = Client ( 'grpc://0.0.0.0:51000' )
r = c . encode ( da , show_progress = True )
Опять же, для людей, которым нетерпелива или нет графического процессора, мы подготовили предварительно кодированный текстовый набор данных:
from docarray import DocumentArray
da = DocumentArray . pull ( 'ttl-textual' , show_progress = True , local_cache = True )
Давайте загрузим наше ранее хранимое встраиваемое изображение, случайным образом образец 10 документов изображения, а затем найдем ближайшего соседа TOP-1 каждого.
from docarray import DocumentArray
img_da = DocumentArray . load_binary ( 'ttl-image' )
for d in img_da . sample ( 10 ):
print ( da . find ( d . embedding , limit = 1 )[ 0 ]. text )
Веселье! Примечание, в отличие от предыдущего примера, здесь вход является изображением, а предложение - вывод. Все предложения поступают из книги «Гордость и предрассудки».
Кроме того, в его внешности была правда | Гардинер улыбнулся | Как его зовут | Однако по чае было достаточно дозы, и г -н | Ты плохо выглядишь |
«Гейместер!» она плакала | Если вы упомяните мое имя в колоколе, вас примут | Не говоря уже о мисс Лиззи, волосы | Элизабет скоро станет женой мистера | Я видел их накануне вечером |
Из 0.3.0
Clip-As Service добавляет новую /rank
конечную точку, которая повторно оценивает кросс-модальные матчи в соответствии с их совместной вероятностью в модели клипа. Например, приведенный документ изображения с некоторыми предопределенными соответствиями предложения, как показано ниже:
from clip_client import Client
from docarray import Document
c = Client ( server = 'grpc://0.0.0.0:51000' )
r = c . rank (
[
Document (
uri = '.github/README-img/rerank.png' ,
matches = [
Document ( text = f'a photo of a { p } ' )
for p in (
'control room' ,
'lecture room' ,
'conference room' ,
'podium indoor' ,
'television studio' ,
)
],
)
]
)
print ( r [ '@m' , [ 'text' , 'scores__clip_score__value' ]])
[['a photo of a television studio', 'a photo of a conference room', 'a photo of a lecture room', 'a photo of a control room', 'a photo of a podium indoor'],
[0.9920725226402283, 0.006038925610482693, 0.0009973491542041302, 0.00078492151806131, 0.00010626466246321797]]
Теперь можно увидеть a photo of a television studio
оценивается до вершины с результатом clip_score
на 0.992
. На практике можно использовать эту конечную точку для повторного оценки результата сопоставления другой системы поиска для улучшения качества кросс-модального поиска.
![]() | ![]() |
В проекте Dall · E Flow Clip требуется для ранжирования сгенерированных результатов Dall · e. У него есть исполнитель, завернутый на вершину clip-client
, который вызывает .arank()
- асинхронная версия .rank()
:
from clip_client import Client
from jina import Executor , requests , DocumentArray
class ReRank ( Executor ):
def __init__ ( self , clip_server : str , ** kwargs ):
super (). __init__ ( ** kwargs )
self . _client = Client ( server = clip_server )
@ requests ( on = '/' )
async def rerank ( self , docs : DocumentArray , ** kwargs ):
return await self . _client . arank ( docs )
Заинтриговано? Это только царапает поверхность того, на что способен клип-сервис. Прочитайте наши документы, чтобы узнать больше.
Clip-As Service поддерживается Jina AI и лицензирован в соответствии с Apache-2.0. Мы активно нанимаем инженеров ИИ, инженеров из решений для создания следующей нейронной поисковой экосистемы в открытом исходном коде.