
Clip-as-Service adalah layanan skalabilitas tinggi latensi rendah untuk menanamkan gambar dan teks. Ini dapat dengan mudah diintegrasikan sebagai layanan mikro ke dalam solusi pencarian saraf.
⚡ Cepat : Sajikan model klip dengan Tensorrt, Onnx Runtime dan Pytorch w/o jit dengan 800qps [*] . Streaming dupleks non-blocking atas permintaan dan tanggapan, dirancang untuk data besar dan tugas yang sudah berjalan lama.
? Elastic : Skala horizontal naik dan turun beberapa model klip pada GPU tunggal, dengan penyeimbangan beban otomatis.
? Mudah digunakan : Tidak ada kurva belajar, desain minimalis pada klien dan server. API intuitif dan konsisten untuk embedding gambar dan kalimat.
? Modern : Dukungan Klien Async. Beralih dengan mudah antara GRPC, HTTP, protokol WebSocket dengan TLS dan kompresi.
? Integrasi : Integrasi lancar dengan ekosistem pencarian saraf termasuk Jina dan Docarray. Bangun solusi lintas-modal dan multi-modal dalam waktu singkat.
[*] dengan konfigurasi default (replika tunggal, pytorch no jit) di geforce rtx 3090.
| melalui https? | melalui 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 ) |
Ada empat keterampilan penalaran visual dasar: pengenalan objek, penghitungan objek, pengenalan warna, dan pemahaman hubungan spasial. Mari kita coba beberapa:
Anda perlu menginstal
jq(prosesor JSON) untuk melakukan pretifikasi hasilnya.
| Gambar | melalui 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) "memberi: | |
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) "memberi: | |
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) "memberi: |
Klip-as-service terdiri dari dua paket Python clip-server dan clip-client yang dapat diinstal secara mandiri . Keduanya membutuhkan Python 3.7+.
| Pytorch Runtime ⚡ | Onnx Runtime ⚡⚡ | Tensorrt Runtime ⚡⚡⚡ |
pip install clip-server | pip install " clip-server[onnx] " | pip install nvidia-pyindex
pip install " clip-server[tensorrt] " |
Anda juga dapat meng -host server di Google Colab, memanfaatkan GPU/TPU gratis.
pip install clip-clientAnda dapat menjalankan pemeriksaan konektivitas sederhana setelah pemasangan.
| C/s | Memerintah | Harapkan output |
|---|---|---|
| Server | python -m clip_server | ![]() |
| Klien | from clip_client import Client
c = Client ( 'grpc://0.0.0.0:23456' )
c . profile () | ![]() |
Anda dapat mengubah 0.0.0.0 ke alamat IP intranet atau publik untuk menguji konektivitas melalui jaringan pribadi dan publik.
python -m clip_server . Ingat alamat dan portnya. 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]Panduan pengguna server dan klien yang lebih komprehensif dapat ditemukan di dokumen.
Mari kita bangun pencarian teks-ke-gambar menggunakan clip-as-service. Yaitu, pengguna dapat memasukkan kalimat dan program mengembalikan gambar yang cocok. Kami akan menggunakan paket Dataset dan DocArray yang benar -benar terlihat. Perhatikan bahwa DocArray termasuk dalam clip-client sebagai ketergantungan hulu, jadi Anda tidak perlu menginstalnya secara terpisah.
Pertama kami memuat gambar. Anda bisa menariknya dari Jina Cloud:
from docarray import DocumentArray
da = DocumentArray . pull ( 'ttl-original' , show_progress = True , local_cache = True )Atau, Anda dapat benar -benar terlihat seperti situs web resmi, unzip dan memuat gambar:
from docarray import DocumentArray
da = DocumentArray . from_files ([ 'left/*.jpg' , 'right/*.jpg' ])Dataset berisi 12.032 gambar, sehingga mungkin perlu waktu untuk menarik. Setelah selesai, Anda dapat memvisualisasikannya dan mendapatkan rasa pertama dari gambar -gambar itu:
da . plot_image_sprites ()
Mulai server dengan python -m clip_server . Katakanlah itu di 0.0.0.0:51000 dengan protokol GRPC (Anda akan mendapatkan informasi ini setelah menjalankan server).
Buat skrip klien Python:
from clip_client import Client
c = Client ( server = 'grpc://0.0.0.0:51000' )
da = c . encode ( da , show_progress = True )Bergantung pada GPU Anda dan jaringan klien-server, mungkin perlu beberapa saat untuk menanamkan gambar 12K. Dalam kasus saya, butuh sekitar dua menit.
Jika Anda tidak sabar atau tidak memiliki GPU, menunggu bisa menjadi neraka. Dalam hal ini, Anda dapat dengan mudah menarik dataset gambar kami yang telah dikodekan:
from docarray import DocumentArray
da = DocumentArray . pull ( 'ttl-embedding' , show_progress = True , local_cache = True )Mari Bangun Prompt Sederhana untuk Mengizinkan Pengguna Mengetik Kalimat:
while True :
vec = c . encode ([ input ( 'sentence> ' )])
r = da . find ( query = vec , limit = 9 )
r [ 0 ]. plot_image_sprites ()Sekarang Anda dapat memasukkan kalimat bahasa Inggris yang sewenang-wenang dan melihat gambar yang cocok-9 teratas. Pencarian cepat dan naluriah. Mari bersenang -senang:
| "kentang bahagia" | "A Super Evil AI" | "Seorang pria yang menikmati burgernya" |
|---|---|---|
|
|
|
| "Profesor Cat sangat serius" | "Seorang insinyur ego tinggal bersama orang tua" | "Tidak akan ada hari esok jadi mari kita makan tidak sehat" |
|---|---|---|
|
|
|
Mari simpan hasil embedding untuk contoh kita berikutnya:
da . save_binary ( 'ttl-image' )Kami juga dapat mengganti input dan output dari program terakhir untuk mencapai pencarian gambar-ke-teks. Tepatnya, diberi gambar kueri menemukan kalimat yang paling menggambarkan gambar.
Mari kita gunakan semua kalimat dari buku "Pride and Prejudice".
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 ()
)Mari kita lihat apa yang kita dapatkan:
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
Sekarang mengkode 6.403 kalimat ini, mungkin butuh 10 detik atau kurang tergantung pada GPU dan jaringan Anda:
from clip_client import Client
c = Client ( 'grpc://0.0.0.0:51000' )
r = c . encode ( da , show_progress = True )Sekali lagi, untuk orang-orang yang tidak sabar atau tidak memiliki GPU, kami telah menyiapkan dataset teks yang telah dikodekan:
from docarray import DocumentArray
da = DocumentArray . pull ( 'ttl-textual' , show_progress = True , local_cache = True )Mari kita muat embedding gambar kami yang sebelumnya disimpan, sampel 10 dokumen gambar secara acak, lalu temukan tetangga terdekat teratas masing-masing.
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 )Waktu yang menyenangkan! Catatan, tidak seperti contoh sebelumnya, di sini inputnya adalah gambar dan kalimat adalah output. Semua kalimat berasal dari buku "Pride and Prejudice".
|
|
|
|
|
| Selain itu, ada kebenaran dalam penampilannya | Gardiner tersenyum | Siapa namanya | Namun, pada waktu teh, dosisnya sudah cukup, dan MR | Anda tidak terlihat baik |
|
|
|
|
|
| “Seorang gamester!” dia menangis | Jika Anda menyebutkan nama saya di bel, Anda akan dirawat | Tidak masalah rambut Miss Lizzy | Elizabeth akan segera menjadi istri Tuan | Saya melihat mereka malam sebelumnya |
Dari 0.3.0 Clip-as-Service menambahkan titik akhir baru /rank yang menilai ulang kecocokan lintas-modal sesuai dengan kemungkinan bersama mereka dalam model klip. Misalnya, diberi dokumen gambar dengan beberapa pertandingan kalimat yang telah ditentukan seperti di bawah ini:
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]]
Orang sekarang dapat melihat a photo of a television studio berada di peringkat ke atas dengan skor clip_score di 0.992 . Dalam praktiknya, seseorang dapat menggunakan titik akhir ini untuk menata ulang hasil pencocokan dari sistem pencarian lain, untuk meningkatkan kualitas pencarian lintas-modal.
![]() | ![]() |
Dalam proyek aliran Dall · E, klip dipanggil untuk memberi peringkat hasil yang dihasilkan dari dall · e. Ia memiliki pelaksana yang dibungkus di atas clip-client , yang memanggil .arank() - versi async dari .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 )
Penasaran? Itu hanya menggaruk permukaan apa yang mampu dilakukan oleh klip-as-service. Baca dokumen kami untuk mempelajari lebih lanjut.
Clip-as-Service didukung oleh Jina AI dan dilisensikan di bawah Apache-2.0. Kami secara aktif mempekerjakan insinyur AI, insinyur solusi untuk membangun ekosistem pencarian saraf berikutnya dalam sumber terbuka.