الأخبار التكنولوجية والاستعراضات والنصائح!

قم ببناء ونشر صور Docker المخصصة للتعرف على الكائنات – نحو الذكاء الاصطناعي

ستساعدك المقالة التالية: قم ببناء ونشر صور Docker المخصصة للتعرف على الكائنات – نحو الذكاء الاصطناعي

تحفيز

تشارك العديد من المكونات في البناء والنشر. على سبيل المثال ، لديك أطر عمل ML مثل بناء النموذج الخاص بك ، لإنشاء نقاط نهاية API ، ولواجهة مستخدم الواجهة الأمامية (UI). ليس من المستغرب أنه غالبًا ما يكون استخدام كل هذه الأدوات معًا العمل محليًا على جهازك (¯ \ _ (ツ) _ / ¯) ، ولكن لا يمكن استنساخه في الآخرين. يرجع هذا إلى حد كبير إلى الإصدارات المختلفة من المكتبات ، وعدم تطابق إصدار التبعيات الأخرى ، وأنظمة التشغيل المختلفة (OS) على تلك الأجهزة.

لمعالجة هذه المشكلة والتأكد قابلية التكرار و قابلية اعادة الأنتاج عبر الأجهزة المختلفة ، يأتي Docker للإنقاذ. يمكن استخدامه لإنشاء تطبيقات محددة وتشغيلها بشكل منفصل وأيضًا توصيل تطبيقات / خدمات مختلفة. هذا مرتبط مباشرة بـ MLOps نظرًا لأنك تتجه نحو تقديم نماذج ML للمستخدمين النهائيين.

الموضوع منظم كالأتي:

  1. الأهداف
  2. مفاهيم أساسية
  3. بناء الخلفية مع PyTorch و FastAPI
  4. بناء الواجهة مع Gradio
  5. قم بتشغيل التطبيق في سطرين

الأهداف

يوضح لك هذا المقال كيفية القيام بذلك يبني و نشر تطبيق التعرف على الصور للتعلم الآلي المكدس الكامل من البداية والذي يمكنه التعرف على كائنات مختلفة من صورك الخاصة ،!

بعد إعداد التطبيق وتشغيله محليًا ، سترى كيفية وضعه في حاويات ونشر صور عامل الإرساء (على سبيل المثال ، الحاويات قيد التشغيل). تم إنشاء صورة عامل إرساء مخصصة لنموذج التعلم الآلي وواجهة برمجة تطبيقات RESTful التي تعمل كملف الخلفية. وآخر ل نهاية المقدمة باستخدام واجهة مستخدم الويب التي تقبل إدخال الصور ، تستدعي نقطة نهاية واجهة برمجة التطبيقات لإجراء توقع وعرض النتائج.

مفاهيم أساسية

التعرف على الصور

التعرف على الصور هو المهمة الأساسية في رؤية الكمبيوتر للتعرف على الكائن (الأشياء) الموجود في الصورة. يُعرف هذا أيضًا باسم تصنيف الصور ، والذي له تطبيقات تمتد من المركبات المستقلة إلى التصوير الطبي.

FastAPI

FastAPI هو إطار عمل ويب حديث يستخدم لبناء واجهات برمجة تطبيقات RESTful مع Python. إنه سريع وسهل الفهم ويتطلب الحد الأدنى من التعليمات البرمجية ويحتمل أن يكون عدد الأخطاء أقل. بينما يمكن استخدام FastAPI لتطوير الويب ، سترى كيفية استخدامه على وجه التحديد لبناء واجهات برمجة التطبيقات.

جراديو

يستخدم Gradio لإنشاء تطبيقات ML ومشاركتها. إنها طريقة سريعة لإنشاء تطبيقات ML لإثبات المفهوم (POC) مع واجهة ويب سهلة الاستخدام لأي شخص يستخدمها.

عامل ميناء

Docker هو لبناء تطبيقات معزولة. الفكرة الأساسية وراء docker هي بناء تطبيق يحتوي على كود المصدر المكتوب بالإضافة إلى المواصفات (مثل المكتبات والإصدارات ونظام التشغيل) لتشغيله. تُستخدم هذه لإنشاء صورة عامل إرساء ، يمكن تخزينها لاحقًا في Docker Hub للمشاركة مع الآخرين. من صورة عامل الإرساء ، يمكنك تشغيل التطبيق في حاوية عامل إرساء حيث يتم تحديد بيئة هذه الحاوية من خلال المواصفات عند إنشاء صورة عامل الإرساء.

دعنا نصل إلى المبنى الآن!

بناء الخلفية مع PyTorch و FastAPI

تتكون الواجهة الخلفية من مكونين: نموذج التعلم الآلي لـ PyTorch وواجهة برمجة تطبيقات RESTful.

نموذج التعلم الآلي: يمكن للنموذج الذي تم اختباره مسبقًا التنبؤ بـ 1000 كائن مختلف. يمكنك العثور على قائمة 1000 عنصر هنا. على وجه التحديد ، النموذج عبارة عن شبكة عصبية تلافيفية (CNN) تُعرف باسم ResNet-18 [1] تم تدريبه على شبكة ImageNet [2] مجموعة البيانات. يمكنك بسهولة تحميل هذا النموذج باستخدام:

نموذج شعلة الاستيراد = torch.hub.load (‘pytorch / vision: v0.10.0’، ‘resnet18’، prerained = True)

لإجراء تنبؤات بشأن صور الإدخال الخاصة بك ، ستحتاج إلى معالجة الصورة مسبقًا إلى الحجم المطلوب بالإضافة إلى تطبيع الإدخال وفقًا لكيفية تدريب نموذج ResNet-18. يتم ذلك عن طريق:

def preprocess (input_image): preprocess = transforms.Compose ([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406]، الأمراض المنقولة جنسياً =[0.229, 0.224, 0.225])،]) input_tensor = preprocess (input_image) input_batch = input_tensor.unsqueeze (0) # قم بإنشاء دفعة مصغرة كما هو متوقع من خلال نموذج إرجاع input_batch

بمجرد معالجة صورة الإدخال مسبقًا ، تصبح جاهزة للنموذج لإجراء تنبؤ. وظيفة التنبؤ المحددة أدناه تأخذ صورة ونموذج ResNet-18 كمدخل. يقوم النموذج بعد ذلك بعمل توقع ويعيد أعلى خمس تسميات (مثل أسماء الكائنات / الفئات) بالإضافة إلى درجات الاحتمال.

توقع def (input_image ، model): # انقل المدخلات والنموذج إلى GPU للسرعة إذا كان متاحًا إذا كان torch.cuda.is_available (): input_image = input_image.to (‘cuda’) model.to (‘cuda’)

مع torch.no_grad ():
الإخراج = النموذج (input_image)
# الناتج لديه درجات غير طبيعية. للحصول على الاحتمالات ، يمكنك تشغيل softmax عليها.
الاحتمالات = torch.nn.functional.softmax (output[0]قاتمة = 0)

النتائج = {“النجاح”: خطأ}
نتائج[“predictions”] = []
# اقرأ الفئات
مع open (“imagenet_classes.txt”، “r”) كـ f:
الفئات = [s.strip() for s in f.readlines()]
# إظهار أعلى الفئات لكل صورة
top5_prob ، top5_catid = torch.topk (الاحتمالات ، 5)
لأني في النطاق (top5_prob.size (0)):
r = {“التسمية”: الفئات[top5_catid[i]]، “الاحتمال”: float (top5_prob[i].غرض())}
نتائج[“predictions”].append (r)
نتائج[“success”] = صحيح
نتائج العودة

الآن ، لديك إعداد النموذج. يتضمن المكون التالي في الواجهة الخلفية بناء نقطة نهاية API حول وظيفة التنبؤ هذه.

RESTful API: لإنشاء نقطة نهاية API ، يتم تقديم وظيفة التنبؤ باستخدام. يتضمن ذلك تحميل النموذج (أي تنزيل ملف النموذج وإنشاء مثيل له) وأخيراً إنشاء وظيفة تقبل طلبات POST. هذا بسيط مثل:

@ app.post (“/ api / Forecast”) غير متزامن def Forecast_image (image: bytes = File (…)): # Read image image = read_image (image) # Preprocess image image = preprocess (image) # التنبؤ بالتنبؤات = توقع (صورة ، نموذج) عودة التوقعات

عندما يكون الخادم قيد التشغيل ، يمكنك إرسال طلبات POST مع صورة إلى نقطة نهاية واجهة برمجة التطبيقات ، وستقوم بإرجاع أعلى خمس تسميات ودرجات احتمالية. يمكنك أيضًا العثور على صفحة التوثيق على `http: //127.0.0.1: 8000 / docs` والتي تبدو كالتالي:

لديك الواجهة الخلفية قيد التشغيل ، والتي تقبل الصور كمدخلات وتخرج التسميات / الكائنات المتوقعة. حان الوقت لترسيخ الواجهة الخلفية بأكملها.

ارساء الواجهة الخلفية: لتشغيل نقطة نهاية API هذه داخل حاوية عامل إرساء ، يجب إنشاء صورة عامل إرساء. يتطلب هذا المتطلبات .txt وملف Dockerfile. أولاً ، تم إعداد المتطلبات .txt لتعريف جميع الوحدات المطلوبة لكي يعمل التطبيق.

torch torchvision وسادة gunicorn fastapi == 0.61.1 uvicorn == 0.11.8 طلبات بيثون متعددة الأجزاء == 2.24.0

ثانيًا ، يتم إنشاء Dockerfile لإعداد التبعيات الضرورية. هذا ما يبدو عليه:

# استخدم وقت تشغيل Python الرسمي كصورة رئيسية من python: 3.6-slim

# انسخ ملف المتطلبات في الصورة
نسخ ./requirements.txt /app/requirements.txt

# اضبط دليل العمل على / app
WORKDIR / التطبيق

# قم بتثبيت أي حزم مطلوبة محددة في requirements.txt
RUN pip install- متطلبات rtxt

# انسخ كل محتوى من المجلد المحلي إلى الصورة
ينسخ . .

# تشغيل الخادم
CMD [“uvicorn”, “main:app”, “–host=0.0.0.0”, “–port=80”]

الآن بعد أن تم إعداد ملف المتطلبات و Docker ، يمكنك إنشاء صورة باستخدام هذه المواصفات. بعد ذلك ، يمكنك تشغيل مثيل من هذه الصورة في حاوية عامل إرساء باستخدام:

# بناء عامل بناء بناء -t تصنيف_نموذج_خدمة. # run docker run -p 8000: 80 – name cls-serve rating_model_serving

يتم نشر النموذج كنقطة نهاية API من خلال حاوية عامل إرساء في جهازك المحلي. لتقديم طلب ، قم بتشغيل:

curl -X POST -F [email protected] “http://0.0.0.0:8000/api/predict”

إذا كان كل شيء يعمل بشكل صحيح ، فسترى ناتجًا مثل:

{“النجاح”: صحيح ، “التوقعات”:
[
{
“label”: “king penguin”,
“probability”: 0.999931812286377
},
{
“label”: “guenon”,
“probability”: 9.768833479029126e-06
},
{
“label”: “megalith”,
“probability”: 8.01052556198556e-06
},
{
“label”: “cliff”,
“probability”: 7.119778274500277e-06
},
{
“label”: “toucan”,
“probability”: 6.5011186052288394e-06
}
]
}

الواجهة الخلفية هي الآن مرسى. يمكنك إرسال طلب إلى نقطة نهاية واجهة برمجة التطبيقات مع صورة ، وتقوم بإرجاع التصنيفات ودرجات الاحتمالات. دعنا الآن نرى كيف يمكنك بناء الواجهة الأمامية.

تأكد من تشغيل حاوية عامل الإرساء الخلفية عند تشغيل حاوية عامل الإرساء الأمامية لأول مرة في القسم التالي.

بناء الواجهة مع Gradio

تتمثل مهمة الواجهة الأمامية في قبول الصور المدخلة من المستخدم ، وإجراء مكالمة إلى نقطة نهاية واجهة برمجة التطبيقات (وهي الواجهة الخلفية لدينا والتي تعمل بالفعل) مع الصورة التي تُرجع التنبؤات ، وأخيراً إظهار النتائج للمستخدم. تقوم وظيفة الاستدلال 1) بتحميل الصورة (سواء تم تحميلها بواسطة المستخدم أو مثال) 2) تقديم طلب POST إلى نقطة نهاية API 3) تنسيقات نتائج التصور ، ويبدو كالتالي:

def الاستدلال (image_path): # تحميل صورة الإدخال وإنشاء الحمولة لصورة الطلب = فتح (image_path، “rb”). read () payload = {“image”: image}

# تقديم الطلب
r = request.post (REST_API_URL، files = payload) .json ()

# تأكد من أن الطلب كان ناجحًا ، تنسيق الإخراج للتصور
الإخراج = {}
إذا ص[“success”]:
# حلقة فوق التوقعات وعرضها
لـ (i ، نتيجة) في تعداد (r[“predictions”]):
انتاج[result[“label”]]= نتيجة[“probability”]
طباعة (“{}. {}: {: .4f}”. تنسيق (i + 1 ، نتيجة[“label”]و
نتيجة[“probability”]))
آخر:
طباعة (“فشل الطلب”)
عودة الإخراج

ويتم تحديد تخطيط واجهة مستخدم الويب من خلال:

title = “Image Recognition Demo” description = “هذا تطبيق نموذج أولي يوضح كيف يمكن للأنظمة القائمة على الذكاء الاصطناعي التعرف على الكائن (الكائنات) الموجود في الصورة. هذه المهمة الأساسية في رؤية الكمبيوتر المعروفة باسم” تصنيف الصور “لها تطبيقات تمتد من المركبات ذاتية القيادة إلى التصوير الطبي. لاستخدامه ، ما عليك سوى تحميل صورتك ، أو النقر فوق أحد أمثلة الصور لتحميلها ، والتي التقطتها في مونتريال بيودوم ! اقرأ المزيد على الروابط أدناه. ” article = “

التعلم المتبقي العميق للتعرف على الصور | < a href = "https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py" target = "_ blank"> Github Repo

# تشغيل الاستدلال
الواجهة الأمامية = الواجهة الأمامية (الاستدلال ،
المدخلات
النواتج
أمثلة =[“test1.jpeg”, “test2.jpeg”]و
العنوان = العنوان ،
الوصف = الوصف ،
مقال = مقال ،
analytics_enabled = خطأ)

# إطلاق التطبيق وتعيين PORT
frontend.launch (server_name = ”0.0.0.0 ″ ، server_port = 7860)

عند تشغيل واجهة مستخدم الويب ، ستبدو كما يلي:

ارساء الواجهة الأمامية: الآن ، تريد أيضًا تشغيل تطبيق الواجهة الأمامية داخل حاوية عامل إرساء أخرى.

هذا لأنك لنفترض أنك تريد استخدام نقطة نهاية واجهة برمجة التطبيقات لحالات استخدام مختلفة مثل الهاتف المحمول أو تطبيق سطح المكتب وما إلى ذلك. لن تفشل الواجهة الخلفية معها والعكس صحيح. Note أنه ستكون هناك سيناريوهات تريد تشغيلها في نفس الحاوية.

على غرار الواجهة الخلفية ، ستحتاج إلى إنشاء شرط آخر يحتوي على وحدات نمطية مطلوبة لكي تعمل الواجهة الأمامية.

طلبات التخرج

وملف Dockerfile آخر لإعداد التبعيات الضرورية.

# استخدم وقت تشغيل Python الرسمي كصورة رئيسية من python: 3.9-slim

# انسخ ملف المتطلبات في الصورة
نسخ ./requirements.txt /app/requirements.txt

# اضبط دليل العمل على / app
WORKDIR / التطبيق

# قم بتثبيت أي حزم مطلوبة محددة في requirements.txt
RUN pip install- متطلبات rtxt

# انسخ كل محتوى من المجلد المحلي إلى الصورة
ينسخ . .

# تشغيل الخادم ، عنوان url التدرج الصماء هو http://127.0.0.1:7860
CMD [ “python3”, “-u”, “/app/main.py” ]

بعد ذلك ، يمكنك إنشاء الحاوية وتشغيلها باستخدام:

# بناء عامل بناء -t frontend_serving. # run container docker run -p 7860: 7860 –add-host host.docker.internal: host-gateway –name frnt-serve frontend_serving

تطبيق الواجهة الأمامية نشط في http://0.0.0.0:7860/ على جهازك المحلي. هذا كل شيء. يمكنك الآن اللعب بالتطبيق وإعطائه صورك الخاصة ومعرفة ما يقوله.

قم بتشغيل التطبيق في سطرين

إذا كنت تريد ببساطة اللعب مع التطبيق ، فقد جعلت صور عامل الإرساء عامة على Docker Hub، ويمكنك تشغيل التطبيق باستخدام سطرين من التعليمات البرمجية. أولا ، لنسخ الأمر. ثانيًا ، اضغط على إدخال!

git clone https://github.com/hasibzunair/imagercg-waiter cd imagercg-waiter / backend # هذا الخط لا يحتسب! sh نشر

التطبيق متاح في http://0.0.0.0:7860/ على جهازك المحلي. أو ، إذا كنت تريد ببساطة اللعب باستخدام التطبيق من متصفحك ، فانتقل هنا.

خاتمة

في هذا المنشور ، تعلمت كيفية إنشاء وتشغيل تطبيق ML كامل المكدس باستخدام PyTorchو FastAPI، و جراديو مع ضمان إمكانية التكرار والتكرار باستخدام عامل ميناء. لقد أنشأت صورًا مخصصة لرسو السفن للواجهة الأمامية والخلفية ، وأنشأت رابط اتصال بينهما باستخدام نقطة نهاية API. أخيرًا ، كمستخدم ، تقوم بتحميل صورك إلى التطبيق الذي يستدعي نقطة نهاية واجهة برمجة التطبيقات لإجراء توقع ثم إظهار النتائج.