Clip-as-service هي خدمة قابلية للتكليف منخفضة التشكيل لتضمين الصور والنص. يمكن دمجها بسهولة كخدمة microservice في حلول البحث العصبي.
⚡ سريعًا : تقديم نماذج مقطع مع Tensorrt ، وقت تشغيل Onnx و Pytorch w/o JIT مع 800QPS [*] . تدفق دوبلكس غير المحظور على الطلبات والاستجابات ، المصممة للبيانات الكبيرة والمهام طويلة الأمد.
؟ مرنة : أفقيًا من أعلى وأسفل نماذج مقطع متعددة على وحدة معالجة الرسومات المفردة ، مع موازنة التحميل التلقائي.
؟ سهل الاستخدام : لا يوجد منحنى تعليمي ، تصميم الحد الأدنى على العميل والخادم. API بديهية ومتسقة للتضمين الصورة والجمل.
؟ الحديث : دعم العميل Async. التبديل بسهولة بين GRPC و HTTP وبروتوكولات WebSocket مع TLS والضغط.
؟ التكامل : التكامل السلس مع النظام الإيكولوجي للبحث العصبي بما في ذلك Jina و DocArray. بناء حلول عبر الوسائط ومتعددة الوسائط في أي وقت من الأوقات.
[*] مع التكوين الافتراضي (نسخة متماثلة واحدة ، 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) " يعطي: |
يتكون المقطع كخدمة من حزمتين من Python clip-server
و clip-client
التي يمكن تثبيتها بشكل مستقل . كلاهما يتطلب بيثون 3.7+.
Pytorch وقت التشغيل ⚡ | وقت التشغيل ONNX ⚡⚡ | Tensorrt وقت التشغيل ⚡⚡⚡ |
pip install clip-server | pip install " clip-server[onnx] " | pip install nvidia-pyindex
pip install " clip-server[tensorrt] " |
يمكنك أيضًا استضافة الخادم على Google Colab ، مع الاستفادة من GPU/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]
يمكن العثور على أدلة خادم ومستخدم عميل أكثر شمولاً في المستندات.
دعنا نبني بحثًا عن نص إلى صورة باستخدام Clip-as-Service. وهي ، يمكن للمستخدم إدخال جملة ويعيد البرنامج مطابقة الصور. سنستخدم مجموعة البيانات وحزمة DocArray تمامًا. لاحظ أن 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 )
بناءً على شبكة GPU وشبكة خادم العميل ، قد يستغرق الأمر بعض الوقت لتضمين صور 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 ()
يمكنك الآن إدخال جمل اللغة الإنجليزية التعسفية وعرض الصور المتطابقة من أفضل 9. البحث سريع وغريزي. دعونا نستمتع ببعض:
"بطاطا سعيدة" | "AI الشرير الفائق" | "رجل يستمتع برغره" |
---|---|---|
"البروفيسور كات جاد للغاية" | "مهندس الأنا يعيش مع الوالدين" | "لن يكون هناك غد ، لذلك دعنا نأكل غير صحي" |
---|---|---|
دعنا نحفظ نتيجة التضمين لمثالنا التالي:
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 مستندات صورة ، ثم ابحث عن أقرب جيران من كل منها.
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 )
وقت ممتع! لاحظ ، على عكس المثال السابق ، هنا الإدخال هو صورة والجملة هي الإخراج. جميع الجمل تأتي من كتاب "الكبرياء والتحامل".
الى جانب ذلك ، كانت هناك حقيقة في نظراته | ابتسم غاردينر | ما اسمه | في وقت الشاي ، ومع ذلك ، كانت الجرعة كافية ، والسيد | أنت لا تبدو جيدا |
"A Gamester!" بكت | إذا ذكرت اسمي في الجرس ، فسيتم الحضور إليه | لا تهتم بشعر ملكة جمال ليزي | ستكون إليزابيث قريبًا زوجة السيد | رأيتهم في الليلة السابقة |
من 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 ، يتم استدعاء المقطع لترتيب النتائج التي تم إنشاؤها من Dall · e. يحتوي على منفذي ملفوف فوق clip-client
، والذي يدعو .arank()
- إصدار Async من .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. نحن نستند بنشاط مهندسي الذكاء الاصطناعى ، ومهندسي الحلول لبناء النظام البيئي للبحث العصبي التالي في مفتوح المصدر.