قم بحساب تضمينات المقطع بسهولة وإنشاء نظام clip retrieval باستخدامها. يمكن معالجة 100 مليون تضمين نص + صورة خلال 20 ساعة باستخدام 3080.
يتيح هذا من النهاية إلى النهاية بناء نظام بحث دلالي بسيط. هل أنت مهتم بمعرفة المزيد عن البحث الدلالي بشكل عام؟ يمكنك قراءة مشاركتي المتوسطة حول هذا الموضوع.
راجع أيضًا laion5B والبحث الدلالي بمقياس المليارات لقراءة المزيد حول كيفية جعل هذا المقياس لمليارات العينات.
إذا كنت تؤمن بأهمية إنشاء أدوات قابلة لإعادة الاستخدام لجعل البيانات سهلة الاستخدام لتعلم الآلة وترغب في المساهمة، يرجى الانضمام إلى دردشة DataToML.
تثبيت نقطة استرجاع المقطع
إذا كنت مهتمًا بتشغيل فهرس laion5B، فراجع هذا المستند
يتيح ClipClient
الاستعلام عن بعد عن الواجهة الخلفية لاسترجاع المقطع عبر لغة python.
راجع ClipClient
- دفتر ملاحظات البدء للحصول على مثال دفتر ملاحظات jupyter.
أثناء التهيئة، يمكنك تحديد بعض المعلمات:
backend_url
: عنوان URL للواجهة الخلفية. (مطلوب)indice_name
: حدد اسم الفهرس الذي تريد استخدامه. (مطلوب)aesthetic_score
: النتيجة الجمالية كما تم تقييمها بواسطة المتنبئ الجمالي. الافتراضي هو 9
.use_mclip
: ما إذا كان سيتم استخدام إصدار متعدد اللغات من CLIP. الافتراضي هو False
.aesthetic_weight
: وزن الدرجة الجمالية. الافتراضي هو 0.5
modality
: البحث عبر الصورة أو النص في الفهرس، أحد Multimodal.IMAGE
أو Multimodal.TEXT
. الافتراضي هو Multimodal.IMAGE
.num_images
: عدد الصور التي سيتم إرجاعها من واجهة برمجة التطبيقات (API). الافتراضي هو 40
.deduplicate
: ما إذا كان سيتم إلغاء تكرار النتيجة عن طريق تضمين الصورة. الافتراضي صحيح.use_safety_model
: ما إذا كنت تريد إزالة الصور غير الآمنة. الافتراضي صحيح.use_violence_detector
: ما إذا كنت تريد إزالة الصور بالعنف. الافتراضي صحيح.على سبيل المثال، للاستعلام عن الواجهة الخلفية المستضافة لـ Laion5B باستخدام المعلمات الافتراضية:
from clip_retrieval . clip_client import ClipClient , Modality
client = ClipClient ( url = "https://knn.laion.ai/knn-service" , indice_name = "laion5B-L-14" )
يمكنك العثور على صور توضيحية مشابهة للنص الذي تقدمه.
results = client . query ( text = "an image of a cat" )
results [ 0 ]
> { 'url' : 'https://example.com/kitten.jpg' , 'caption' : 'an image of a kitten' , 'id' : 14 , 'similarity' : 0.2367108941078186 }
يمكنك أيضًا العثور على صور توضيحية مشابهة للصورة التي تقدمها. يمكن تمرير الصور عبر المسار المحلي أو عنوان url.
cat_results = client . query ( image = "cat.jpg" )
dog_results = client . query ( image = "https://example.com/dog.jpg" )
يمكنك أيضًا العثور على صور توضيحية مشابهة للمقطع الذي تقدمه.
cat_results = client . query ( embedding_input = cat_embedding )
لتحسين مجموعة بيانات موجودة بأزواج نص/صور متشابهة، يمكنك الاستعلام عن دليل الصور ودمج النتائج.
all_results = [ result for result in [ client . query ( image = image ) for image in os . listdir ( "my-images" )]]
with open ( "search-results.json" , "w" ) as f :
json . dump ( all_results , f )
يمكنك إنشاء مجموعة بيانات باستخدام نتائج json المحفوظة والأداة img2dataset
.
img2dataset " search-results.json "
--input_format= " json "
--output_folder= " knn_search_dataset "
--caption_col= " caption "
اختر أولاً مجموعة بيانات من عناوين URL للصور والتسميات التوضيحية (أمثلة) ثم قم بتشغيل:
قد ترغب في تشغيل export CUDA_VISIBLE_DEVICES=
لتجنب استخدام وحدة معالجة الرسومات الخاصة بك إذا لم يكن بها ما يكفي من VRAM.
wget https://github.com/rom1504/img2dataset/raw/main/tests/test_files/test_1000.parquet
clip-retrieval end2end test_1000.parquet /tmp/my_output
ثم انتقل إلى http://localhost:1234 واستمتع بالبحث بين صورك
استخدم --run_back False
إذا كنت لا تريد تشغيل الواجهة الخلفية
احصل على بعض الصور في example_folder
، على سبيل المثال عن طريق القيام بما يلي:
pip install img2dataset
echo 'https://placekitten.com/200/305' >> myimglist.txt
echo 'https://placekitten.com/200/304' >> myimglist.txt
echo 'https://placekitten.com/200/303' >> myimglist.txt
img2dataset --url_list=myimglist.txt --output_folder=image_folder --thread_count=64 --image_size=256
يمكنك أيضًا وضع ملفات نصية بنفس أسماء الصور في هذا المجلد، للحصول على تضمينات النص.
ثم قم بتشغيل clip-retrieval inference --input_dataset image_folder --output_folder embeddings_folder
سيحتوي مجلد الإخراج على:
وهذا يصل إلى مليون عينة. عند 1400 عينة/ثانية من 3080، يمكن معالجة 10 مليون عينة خلال ساعتين.
clip_inference يحول مجموعة من النص + الصورة إلى قصاصات مضمنة
"open_clip:ViT-B-32/laion2b_s34b_b79k"
لاستخدام open_clip أو "hf_clip:patrickjohncyh/fashion-clip"
لاستخدام نموذج مشبك الوجه المعانق. DeepSparse هو وقت تشغيل استدلالي لاستدلال نموذج متفرق سريع على وحدات المعالجة المركزية (CPU). تتوفر واجهة خلفية ضمن أداة استرجاع المقاطع عن طريق تثبيتها باستخدام pip install deepsparse-nightly[clip]
وتحديد clip_model
مع "nm:"
مُسبق، مثل "nm:neuralmagic/CLIP-ViT-B-32-256x256-DataComp-s34B-b86K-quant-ds"
أو "nm:mgoin/CLIP-ViT-B-32-laion2b_s34b_b79k-ds"
.
إذا كنت ترغب في الحصول على مزيد من التحكم في كيفية تشغيل الاستدلال، فيمكنك إنشاء العمال واستدعاءهم مباشرة باستخدام clip-retrieval inference.worker
مثال للاستخدام:
clip-retrieval inference.worker
--tasks= " [0] "
--input_dataset= " input/folder/{000000..000100}.tar "
--output_folder= " example/path "
--input_format= " webdataset "
--output_partition_count= " 1 "
سيؤدي القيام بذلك إلى استدعاء عامل واحد يمكن توجيهه للتركيز على مجموعة فرعية محددة من input_dataset
. سيقوم هذا العامل بمعالجة tasks
التي تم تمريرها إليه بشكل تسلسلي. هنا، tasks
عبارة عن قوائم بمعرفات partition_id
التي سيكون هذا العامل مسؤولاً عنها.
لحساب عدد المهام يدويًا، استخدم الصيغة التالية: number_samples / wds_number_file_per_input_file
.
تشبه واجهة برمجة التطبيقات (API) إلى حد كبير clip-retrieval inference
مع بعض التغييرات الطفيفة:
partition_id
الذي يكون هذا العامل مسؤولاً عن حسابه. ( مطلوب )"open_clip:ViT-B-32-quickgelu"
لاستخدام open_clip أو "hf_clip:patrickjohncyh/fashion-clip"
لاستخدام نموذج مشبك الوجه المعانق.ملحوظة : العامل لا يقبل الوسائط التالية
- write_batch_size اكتب حجم الدفعة (الافتراضي 10**6 )
- استراتيجية التوزيع اختر كيفية توزيع الوظيفة، راجع قسم التوزيع للحصول على التفاصيل ( التسلسل الافتراضي)
- تقدير wds_number_file_per_input_file لعدد العينة لكل tar في حالة استخدام wds وعدم تحديد Output_partition_count (افتراضي 10000 )
- أي من وسائط SLURM
مثال لاستعلام hdfs باستخدام تنسيق مجموعة بيانات الويب: `clip_inference --input_dataset "pipe:hdfs dfs -cat /myfolder/webdataset/{00000..00010}.tar" --output_folder "hdfs://myfolder/embeddings" --input_format webdataset
`clip_inference --input_dataset "pipe:aws s3 cp --quiet s3://myfolder/webdataset/{00000..00010}.tar -" --output_folder "s3://myfolder/embeddings" --input_format webdataset
لتشغيل هذا على عقد متعددة (ووحدات معالجة رسومات متعددة)، راجع البرنامج التعليمي على docs/distributed_clip_inference.md
يأخذ فهرس المقطع مخرجات استنتاج المقطع كمدخل ويخرج منه فهرسًا باستخدام autofaiss
clip-retrieval index --embeddings_folder embeddings_folder --index_folder index_folder
--max_index_memory_usage "16G"
بتكوين مقدار ذاكرة الوصول العشوائي التي سيستهلكها الفهرس. المزيد من ذاكرة الوصول العشوائي، واستدعاء knn أفضل (افتراضي 4G
).--current_memory_available 24G
يسمح بالتحكم في مقدار ذاكرة الوصول العشوائي المستخدمة أثناء عملية الإنشاء (الافتراضي 16G
).--image_subfolder "img_emb"
يسمح بتحديد مجلد فرعي لتضمينات الصور المرتبطة بخيار --embeddings_folder
( img_emb
الافتراضي).--text_subfolder "text_emb"
يسمح بتحديد مجلد فرعي لتضمينات النص المتصلة بخيار --embeddings_folder
(الافتراضي text_emb
).--copy_metadata True
يجعل من الممكن اختيار ما إذا كنت تريد نسخ البيانات التعريفية أم لا في نهاية العملية (Default True
).--nb_cores 8
يسمح بالتحكم في عدد سلاسل العمليات ( None
افتراضيًا، والذي سيستخدم جميع النوى).الإخراج هو مجلد يحتوي على:
وبفضل autofaiss وfaiss، يصل هذا إلى مئات الملايين من العينات في غضون ساعات قليلة.
قد ترغب في اختيار مقدار الذاكرة التي تريد استخدامها للفهرس الخاص بك بعناية من أجل زيادة استدعاء knn إلى الحد الأقصى. يمكن أن يساعد colab في اختيار فهرس autofaiss جنبًا إلى جنب مع أمر autofaiss score_index
للتحقق من استدعاء الفهرس الخاص بك. بشكل عام، المؤشرات التي تستخدم المزيد من الذاكرة تحصل على استرجاع أفضل وبالتالي فهي أقرب إلى knn الساذجة (البطيئة).
بمجرد حساب التضمينات، قد ترغب في تصفية البيانات حسب استعلام محدد. لذلك يمكنك تشغيل clip-retrieval filter --query "cat" --output_folder "cat/" --indice_folder "indice_folder"
وسيقوم بنسخ أفضل 100 صورة لهذا الاستعلام في مجلد الإخراج. قد يكون استخدام --num_results
أو --threshold
مفيدًا لتحسين عامل التصفية
بفضل مؤشر knn السريع، يمكن تشغيل هذا في الوقت الفعلي (<10 مللي ثانية) لقيم K الكبيرة (100000)، وفي دقائق لقيم K الكبيرة جدًا.
تعمل هذه البرامج النصية مع مجموعات البيانات الصغيرة. بالنسبة للأجهزة الأكبر حجمًا، يرجى مراجعة [notebook/simple_filter.ipynb].
Clip back عبارة عن واجهة خلفية بسيطة لخدمة knn. في حالة استخدام كل من تعيين ذاكرة hdf5 وfaiss، فإنه يستخدم فقط الذاكرة المستخدمة بواسطة المقطع وهي 4 جيجابايت.
تشغيل (output_folder هو ناتج فهرس المقطع)
echo ' {"example_index": "output_folder"} ' > indices_paths.json
clip-retrieval back --port 1234 --indices-paths indices_paths.json
خيارات:
--use_jit True
يستخدم jit لنموذج المقطع--clip_model "ViT-B/32"
يسمح باختيار نموذج المقطع المراد استخدامه. البادئة بـ "open_clip:"
لاستخدام نموذج open_clip.--enable_mclip_option True
بتحميل نموذج mclip، مما يجعل من الممكن البحث بأي لغة.--columns_to_return='["url", "image_path", "caption", "NSFW"]
يسمح لك بتحديد الأعمدة التي يجب جلبها من البيانات التعريفية وإعادتها بواسطة الواجهة الخلفية. من المفيد تحديد أقل في حالة التخزين المؤقت لـ hdf5 لتسريع الاستعلامات.--enable_faiss_memory_mapping=True
لاستخدام فهرس مع تعيين الذاكرة. وهذا يقلل من استخدام الذاكرة إلى الصفر.--enable_hdf5 True
لتمكين التخزين المؤقت hdf5 للبيانات التعريفية. يتيح التخزين المؤقت HDF5 إمكانية استخدام البيانات التعريفية دون استخدام الذاكرة تقريبًا.--use_arrow True
يسمح باستخدام السهم بدلاً من hdf5. يجب استخدامه مع clip_back_prepro لمجموعات البيانات الكبيرة جدًا (المليارات)--reorder_metadata_by_ivf_index True
من خاصية محلة البيانات لنتائج مؤشرات knn ivf: فهو يأمر بتجميع البيانات التعريفية بترتيب مجموعات IVF. وهذا يجعل من الممكن استرجاع البيانات التعريفية بشكل أسرع بكثير حيث تصل القراءات بعد ذلك إلى عدد قليل من الأجزاء المتسلسلة في الغالب من البيانات التعريفية بدلاً من العديد من الأجزاء غير المتسلسلة. عمليًا، هذا يعني القدرة على استرداد مليون عنصر في 1s بينما يمكن استرجاع 1000 عنصر فقط في 1s بدون هذه الطريقة. سيؤدي هذا إلى ترتيب البيانات الوصفية باستخدام فهرس الصورة الأول.--provide_safety_model True
سيقوم تلقائيًا بتنزيل نموذج الأمان وتحميله. تحتاج إلى pip install autokeras
حتى يعمل هذا.--provide_violence_detector True
سوف يقوم بتحميل ورق كاشف العنف--provide_aesthetic_embeddings True
سوف يقوم بتحميل التضمينات الجمالية ويسمح للمستخدمين بتحريك الاستعلام نحو نقطة أجمل في مساحة المقطعيمكن أيضًا توفير هذه الخيارات في ملف التكوين للحصول على خيارات مختلفة لكل فهرس. مثال:
{
"laion5B" : {
"indice_folder" : " /mnt/laion5B/prepared_data " ,
"provide_safety_model" : true ,
"enable_faiss_memory_mapping" : true ,
"use_arrow" : true ,
"enable_hdf5" : false ,
"reorder_metadata_by_ivf_index" : false ,
"columns_to_return" : [ " url " , " caption " ],
"clip_model" : " ViT-L/14 " ,
"enable_mclip_option" : false
},
"laion_400m" : {
"indice_folder" : " /mnt/laion400M/index100 " ,
"provide_safety_model" : true ,
"enable_faiss_memory_mapping" : true ,
"enable_hdf5" : true ,
"use_arrow" : false ,
"reorder_metadata_by_ivf_index" : true ,
"enable_mclip_option" : true ,
"clip_model" : " ViT-B/32 "
}
}
يعد التخزين المؤقت hdf5 أو الأسهم فكرة جيدة للاستخدام إذا:
في هذه المرحلة، لديك خادم قارورة بسيط يعمل على المنفذ 1234 ويمكنه الإجابة على هذه الاستعلامات:
/indices-list
-> إرجاع قائمة المؤشرات/knn-service
التي تأخذ كمدخل: {
"text" : "a text query" ,
"image" : "a base64 image" ,
"image_url" : "http://some-url.com/a.jpg" ,
"modality" : "image" , // image or text index to use
"num_images" : 4 , // number of output images
"indice_name" : "example_index" ,
"num_result_ids" : 4 // optional, if specified fetch this number of results in total but only num_images with metadata
}
النص والصورة وimage_url متنافيان ويعودان:
[
{
"image" : "base 64 of an image" ,
"text" : "some result text" ,
"id" : 543
} ,
{
"image" : "base 64 of an image" ,
"text" : "some result text" ,
"id" : 782
}
]
قد يحتوي كل كائن أيضًا على حقل عنوان url إذا كانت البيانات الوصفية توفره.
المعرف هو موضع العنصر في الفهرس. يمكن استخدامه للاستعلام عن البيانات الوصفية باستخدام نقطة النهاية /metadata:
{
"indice_name" : "example_index" ,
"ids" : [ 543 , 782 ]
}
الذي يعود:
{
"image" : "base 64 of an image" ,
"text" : "some result text"
// any other key available in the metadata and specified in columns_to_return cli option
}
يمكن استخدام الوسيطة num_result_ids
الخاصة بخدمة /knn-service
و /metadata
معًا لإجراء استعلامات knn كبيرة ثم جلب البيانات التعريفية فقط عند الحاجة. من المنطقي القيام بذلك نظرًا لأن بحث knn يمكن أن يكون فعالاً للغاية بفضل الموقع المرجعي القوي لمؤشر knn IVF مما يجعل إجراء knn سريعًا باستخدام حرف K كبير، في حين أن التنفيذ الحالي للبيانات الوصفية على القرص (hdf5) لا يحتوي على ذلك خاصية وبالتالي لا يمكن التعامل مع استرداد كمية كبيرة من العناصر العشوائية بسرعة. على وجه الخصوص، يمكن استخدام هذا لتنفيذ التمرير اللانهائي في الواجهة الأمامية.
بشكل افتراضي، ستعرض الواجهة الخلفية أيضًا واجهة أمامية. ستصل هذه الواجهة الأمامية افتراضيًا إلى هذه الواجهة الخلفية، ومع ذلك قد تحتاج إلى تحديد ما إذا كان هذا يحدث عبر http أو https، وفي هذه الحالة استخدم الخيار --default_backend
لتحديد عنوان URL للواجهة الخلفية. --url_column
يسمح بتحديد اسم عنوان url الخاص بالعمود في المقدمة
تتمتع هذه الواجهات الخلفية بزمن وصول يبلغ 50 مللي ثانية في حالة استخدام المؤشرات والبيانات التعريفية المعينة للذاكرة. الإنتاجية حوالي 20 استعلام / ثانية. للحصول على إنتاجية عالية، يلزم استخدام خادم grpc بالإضافة إلى وحدة معالجة الرسومات لاستدلال المقطع السريع، ويمكن أن يؤدي إيقاف تشغيل خيارات تعيين الذاكرة أيضًا إلى تسريع الطلبات، على حساب الاستخدام العالي لذاكرة الوصول العشوائي.
تكشف هذه الواجهات الخلفية أيضًا عن نقطة نهاية prometheus /metrics
بالإضافة إلى ملخص يمكن قراءته بواسطة الإنسان في /metrics-summary
. يمكن استخدام هذا (اختياريًا) لإعداد لوحة معلومات grafana للمراقبة:
يمكن أن نرى في لوحة المعلومات هذه أن أبطأ جزء في أي مكالمة هو جلب الصورة عن طريق عنوان url الخاص بها في حالة البحث عن عنوان url للصورة، وهو ما يستغرق ما يصل إلى 300 مللي ثانية. بالنسبة للاستعلامات النصية أو استعلامات الصور، يبلغ زمن الوصول حوالي 50 مللي ثانية. فيما يلي مثال على الإخراج في ملخص المقاييس:
Among 20.0 calls to the knn end point with an average latency of 0.1889s per request, the step costs are (in order):
name description calls average proportion
0 download_time Time spent downloading an url 6 0.3215s 170.2%
1 metadata_get_time Time spent retrieving metadata 20 0.0415s 21.9%
2 knn_index_time Time spent doing a knn on the index 20 0.0267s 14.1%
3 image_clip_inference_time Time spent doing a image clip inference 6 0.0206s 10.9%
4 text_clip_inference_time Time spent doing a text clip inference 14 0.0186s 9.8%
5 image_prepro_time Time spent doing the image preprocessing 6 0.0097s 5.2%
6 text_prepro_time Time spent doing the text preprocessing 14 0.0020s 1.0%
Clip front عبارة عن واجهة مستخدم بسيطة تتصل بالمقطع الخلفي وعرض النتائج. يمكنك استخدامه في واجهة المستخدم لاسترجاع المقطع
أو يمكنك تشغيله بنفسك باستخدام:
npm install -g clip-retrieval-front
clip-retrieval-front 3005
يمكنك أيضًا تشغيله باستخدام clip-retrieval front
أو خلفي من حزمة python.
لتطويره، انتقل إلى المقدمة وقم بتشغيل npm install
ثم npm start
.
إما محليًا أو في gitpod (قم export PIP_USER=false
هناك)
إعداد Virtualenv:
python3 -m venv .env
source .env/bin/activate
pip install -e .
لتشغيل الاختبارات:
pip install -r requirements-test.txt
ثم
make lint
make test
يمكنك استخدام make black
لإعادة تنسيق الكود
python -m pytest -x -s -v tests -k "test_runner"
لتشغيل اختبار محدد
إذا كنت تريد استخدام الواجهة الأمامية من خلال الواجهة الخلفية أو الواجهة الأمامية لبايثون، فقم بتشغيلها
cd front
npm install
npm run build
cd ..
pip install -e .
@misc{beaumont-2022-clip-retrieval,
author = {Romain Beaumont},
title = { clip retrieval : Easily compute clip embeddings and build a clip retrieval system with them},
year = {2022},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/rom1504/clip-retrieval}}
}