منذ وقت ليس ببعيد ، في مجرة بعيدة إلى حد ما ، على كوكب إقليمي ، كان هناك أحفاد مشهور من القرود الذين كانوا كسولين للغاية لدرجة أنهم قرروا اختراع الذكاء الاصطناعي. "حسنا ، ماذا؟" كانوا يعتقدون. من الجيد أن يكون لدى المستشارين "العقل
المدبر " العقل الذي سوف يفكر فيك عند الضرورة ، ويمكن حل مشاكلك بسرعة ، بل إنه أفضل من المخلوق الحي الذي يمكن أن يفعله ... وبدون التفكير في العواقب ، بدأوا قرودهم عكس العقول والعملية المعرفية على بناء كتل تفكيك. لقد فكروا وفكروا وفكروا ، فلن تصدق ذلك - نموذج عصبي ، خوارزمية تعلم رياضيات ، ثم تم سحب الشبكات العصبية ذات الطبولوجيا المختلفة. بالطبع ، هذا لم ينجح في القول بشكل جيد للغاية. كان هناك الكثير من أوجه القصور ، مقارنةً بالذكاء الطبيعي ، لكن مع وجود مجموعة معينة من المشكلات ، سمحت لنا هذه النماذج بحلها بدقة معقولة. وببطء ، بدأت المهارات الرقمية والمسلسلة تظهر في شكل نماذج للشبكات العصبية. اليوم ، عشاق تاريخ الكون ، سوف نتطرق إلى تنظيم وتنفيذ مهارات الذكاء الاصطناعي المختلفة.

حول إنشاء وتدريب نماذج من الشبكات العصبية (المهارات) على Habré هو مكتوب كثيرا ، وبالتالي فإننا لن نتحدث عن ذلك اليوم. بعد التدريب أو تلقي مهارات AI التسلسلية ، نتوقع أن نستخدمها في أنظمة المعلومات المستهدفة الخاصة بنا ، وهنا تنشأ مشكلة. لا يمكن نقل ما يصل إلى المنصة المختبرية إلى الإنتاج في شكله الأصلي ، فمن الضروري تنفيذ رصة التكنولوجيا المرتبطة بأكملها وحتى إجراء تعديلات كبيرة على النظام الأساسي المستهدف (هناك ، بالطبع ، استثناءات في شكل CoreML ، ولكن هذه حالة خاصة وفقط لأجهزة Apple). بالإضافة إلى ذلك ، هناك العديد من الأدوات الرائعة لتطوير النماذج وتسلسلها ، هل من الضروري حقًا لكل شخص تطوير حل تكامل منفصل؟ بالإضافة إلى ذلك ، حتى في المختبر ، غالبًا ما يكون من الضروري الحصول على استنتاج سريع من النموذج ، دون انتظار تحميل مكدس التطوير المرتبط بالكامل.
كاقتراح لحل هذه المشكلات ، أود أن أخبركم عن أداة مفتوحة المصدر جديدة نسبيًا ، والتي ، ربما ، ستكون مفيدة لك عند تطوير المشاريع المتعلقة بمنظمة العفو الدولية.
0Mind (اقرأ ZeroMind) هو خادم مهارة مجاني. الحل هو خادم تطبيق معياري وعالمي وسهل الاستخدام مع عناصر إطارية لتقديم نماذج تعلم الآلة غير المتجانسة (قابلة للوصول للغاية). الخادم قبيح في Python 3 ويستخدم Tornado لمعالجة الطلبات غير المتزامنة. بغض النظر عن إطار تعلم الآلة الذي تم استخدامه لإعداد وتسلسل النموذج ، فإن 0Mind يجعل من السهل استخدام مهارة أو مجموعة من المهارات باستخدام REST API العالمي. في الواقع ، الحل هو خادم ويب غير متزامن مع واجهة برمجة تطبيقات REST ، موحد للعمل مع نماذج مهارات AI ، ومجموعة من المحولات لمختلف أطر تعلم الآلة. ربما تكون قد عملت مع خدمة tensorflow - وهذا حل مشابه ، لكن 0Mind غير مكدسة ويمكن أن تخدم عدة طرز مختلفة من الأطر على نفس المنفذ. وبالتالي ، بدلاً من تطبيق رصة التكنولوجيا بأكملها لاشتقاق نماذج AI في نظام المعلومات الهدف ، يمكنك استخدام واجهة برمجة تطبيقات REST بسيطة ومألوفة لمهارة الاهتمام ، بالإضافة إلى ذلك ، يبقى النموذج المُعد على الخادم ولا ينتهي في توزيع البرامج. حتى لا نخلط بين المصطلحات المعقدة مرة أخرى ، دعنا ننتقل إلى أمثلة الاستخدام ونبدأ في إلقاء تعويذات تعزية.
التثبيت
كل شيء بسيط هنا:
git clone git@github.com:MisteryX/0Mind.git 0Mind
الآن لدينا مثيل خادم العمل. تثبيت التبعيات:
cd 0Mind pip3 install -r requirements.txt
أو إذا كنت تستخدم كوندا:
conda install --yes --file requirements.txt
التحذير المهم هو أن
الخادم يدعم العديد من أطر عمل تعلم الآلة ، ولكي لا تضيفها جميعًا اعتمادًا عليها وليس للتثبيت ، عليك أن تقرر بنفسك إطارات العمل التي ستقوم بتحميلها على المضيف باستخدام مثيل 0Mind ، وقم بتثبيت هذه الأدوات وتكوينها بشكل مستقل.
التخصيص
نقطة الدخول أو الخادم الرئيسي القابل للتنفيذ هي
model_pool.py .
خيارات بدء التشغيل المحتملة هي
-c أو
- التكوين مع المسار إلى ملف التكوين. افتراضيًا ، يستخدم
0Mind ملف
configs / model_pool_config.json كملف التكوين. يستخدم الخادم أيضًا
ملف config / logger.json للتحكم في التسجيل القياسي لوحدة تسجيل Python.
لغرض توضيح القدرات ، يمكننا ترك ملف التكوين الافتراضي كما هو. اقرأ المزيد عن التكوين في
الوثائق الرسمية .
إعدادات الخادم الرئيسية هي: id ، host ، port ، مهام.
المعرف - (الرقم) المعرف الفريد لتجمع النماذج (يستخدم لتحقيق التوازن والعنونة في شبكة موزعة من التجمعات)
المضيف - (سلسلة) عنوان الشبكة أو اسم المجال لهذا المضيف
port - (number) على أي منفذ تريد استضافة خدمة 0Mind (يجب أن تكون مجانية على هذا المضيف)
المهام - (قائمة الكائنات) قائمة المهام المحملة بالخدمة (قد تكون فارغة). في التكوين الافتراضي ، يتم تحميل نموذج العرض التوضيحي CNN_MNIST الذي أعدته Keras ، وسوف نستخدمه لإظهار القدرات.
معلمات التكوين (اختياري) إضافية:
model_types - (قائمة السلاسل) يمكنك
قصر أنواع الطرز المحملة على هذا التجمع من خلال تحديدها في هذه القائمة. إذا كانت القائمة فارغة ، فلا توجد قيود.
debug - (نوع Boolean) هو المسؤول عن تمكين أو تعطيل وضع تصحيح Tornado. في وضع التصحيح ، في حالة وجود أخطاء ، يتم إرجاع معلومات الخطأ الموسعة إلى stdout ، وهو أمر مفيد عند تطوير الملحقات.
الاحتمالات
الشيء الرئيسي في 0Mind هو
قائمة الأطر المعتمدة وميزات REST API .
يمكن تنفيذ طلبات واجهة برمجة تطبيقات REST باستخدام متصفح أو أدوات مساعدة http. في هذا الدليل ، وكذلك في وثائق الخادم ، سوف نستخدم cURL كأداة بسيطة وبأسعار معقولة للأنظمة المفتوحة.
حاليًا ، لدى 0Mind API ما مجموعه 10 طلبات:
1. http: // $ HOST: PORT / info - معلومات عامة حول مثيل 0Mind
2. http: // $ HOST: $ PORT / info / system - معلومات النظام حول المضيف الذي يعمل عليه 0Mind
3. http: // $ HOST: PORT / info / task - معلومات حول المهمة المحددة
4. http: // $ HOST: $ PORT / info / مهام - قائمة مهام مثيل 0Mind
5. http: // $ HOST: $ PORT / model / list - قائمة معرفات النماذج التي تم تحميلها في التجمع
6. http: // $ HOST: PORT / model / info - يعرض معلومات واجهة حول النموذج
7. http: // $ HOST: $ PORT / model / load - يقوم بتحميل نموذج جديد إلى التجمع
8. http: // $ HOST: PORT / model / drop - يقوم بتفريغ نموذج تم تحميله مسبقًا من التجمع
9. http: // $ HOST: $ PORT / model / توقع - طلبات الإخراج من النموذج
10.http: // $ HOST: $ PORT / command / stop - توقف خدمة 0Mind وتنهي عمليتها
معلومات
يمكنك بدء مثيل الخادم ، على سبيل المثال ، مثل هذا:
python3 model_pool.py
على سبيل المثال ، سوف نحصل على معلومات عامة حول مثيل خادم قيد التشغيل:
curl http://127.0.0.1:5885/info
{"service": "ModelPool", "id": 1, "options": {"debug": false}, "version": [1, 1, 4]}
حسنًا ، اكتشفنا الآن الطرز التي يتم تحميلها في المجموعة:
curl http://127.0.0.1:5885/model/list
{"id": 1, "check_sum": "4d8a15e3cc35750f016ce15a43937620", "models": ["1"]}
الآن ، دعونا نوضح واجهة النموذج المحمّل بالمعرف "1":
curl http://127.0.0.1:5885/model/info?id=1
{"inputs": {"0": {"name": "conv2d_1_input:0", "type": "float32", "shape": [null, 28, 28, 1]}}, "outputs": {"0": {"name": "dense_2/Softmax:0", "type": "float32", "shape": [null, 10]}}, "tool": "keras"}
يبقى لمعرفة أي المرشحات يتم تحميل النموذج. للقيام بذلك ، نوضح تفاصيل مهمة تحميل النموذج بالمعرف "1":
curl http://127.0.0.1:5885/info/task?id=1
{"id": "1", "model_file": "ML/models/mnist_cnn_model.keras", "model_type": "keras", "input_filters": {"conv2d_1_input:0": ["i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter"]}, "output_filters": {}}
كما ترون ، يحتوي نموذجنا على مرشح إدخال واحد - i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter ويقوم بتصفية الإدخال بالاسم - conv2d_1_input: 0. يقوم هذا المرشح ببساطة بتحويل ملف الصورة المحدد إلى موتر وقياسه وفقًا لإدخال النموذج.
المرشحات هي أداة تعميم 0Mind كبيرة أخرى. نظرًا لأن المعالجة المسبقة للمعالجة اللاحقة للبيانات للنماذج هي نفسها ، فيمكنك ببساطة تجميع هذه المرشحات للاستخدام السريع في العمل الإضافي مع الطرز الأخرى ، مع الإشارة إلى المهمة المطلوبة كسمة لتحميل النموذج.
إخراج البيانات من النموذج (الاستدلال)
حسنًا ، لدينا الآن جميع المعلومات اللازمة للاستدلال ، يمكننا الحصول على استنتاج من النموذج. كمدخلات ، نستخدم الصورة من مجموعة الاختبار المضمنة في توزيع 0Mind
samples / image5.png :
curl -d '{"conv2d_1_input:0": [{"image_file": "samples/image5.png"}]}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/predict?id=1
الإدخال الوحيد لنموذج conv2d_1_input: 0 مع i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter هو البيانات بالتنسيق الذي يقبله المرشح - [{"image_file": "samples / image5.png"}]. استجابة من 0Mind ، نحصل على إخراج النموذج:
{"result": {"dense_2/Softmax:0": [[2.190017217283827e-21, 1.6761866200587505e-11, 2.2447325167271673e-14, 0.00011080023978138342, 1.881280855367115e-17, 0.9998891353607178, 1.6690393796396863e-16, 9.67975005705668e-12, 1.1265206161566871e-13, 2.086113400079359e-13]]}, "model_time": 0.002135753631591797}
لذا ، فإن المخرج الوحيد لنموذج "dense_2 / Softmax: 0" (راجع المعلومات حول النموذج أعلاه) قد أعطانا متجه الثقة في النموذج في تصنيف هذه الصورة. كما ترون ، فإن أعلى الاحتمالات هو 0.99 لفئة ذات فهرس 6 (الفصول هي الأرقام من 0 إلى 9) ، والتي تتوافق مع الرقم
5 . وهكذا ، تعامل النموذج بنجاح مع التعرف على المخطوطة وقدم خاتمة بثقة عالية. وقت الاستنتاج للنموذج على مضيف 0Mind كان 0.002135753631591797 ثانية ، لأن كان الإخراج على وحدة المعالجة المركزية إلى x86 العادية.
التحميل الديناميكي وتفريغ النماذج
الآن قم بإفراغ نموذجنا من المجموعة:
curl http://127.0.0.1:5885/model/drop?id=1
{"result": true, "unload_time": 0.000152587890625, "memory_released": 0, "model_id": "1"}
نقوم بتحميل نفس النموذج مرة أخرى ، ولكن الآن بمعرف مختلف ("جديد") ومرشح إخراج من طراز io_argmax.ArgMaxFilter ، والذي من المرجح أن يستمد الفهرس من متجه ثقة النموذج. سيتعين علينا تغيير مؤشرات مدخلات ومخرجات النموذج - وهذا بسبب ميزات Keras:
curl -d '{"id": "new", "output_filters": {"dense_2_1/Softmax:0": ["io_argmax.ArgMaxFilter"]}, "model_file": "ML/models/mnist_cnn_model.keras", "input_filters": {"conv2d_1_input_1:0": ["i_img_file_to_ns_arr.ImageFileToNormAndScaledNPArrayFilter"]}, "model_type": "keras"}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/load
{"result": true, "load_time": 0.45618462562561035, "memory_consumed": 16183296, "model_id": "new"}
والآن نطلب من النموذج أن يتعرف علينا على صورتين مرة واحدة في طلب واحد
العينات / image5.png والعينات / image1.png :
curl -d '{"conv2d_1_input:0": [{"image_file": "samples/image5.png"}, {"image_file": "samples/image1.png"}]}' -H "Content-Type:application/json" -X POST http://127.0.0.1:5885/model/predict?id=new
{"result": {"dense_2_1/Softmax:0": [5, 1]}, "model_time": 0.003907206535339355}
النموذج التجريبي لم يكن مخطئا مرة أخرى.
تمديد
إن توسيع قدرات 0Mind ليس بالأمر الصعب ، وذلك بفضل بنيته المعيارية ، واستخدام الأدوات الشائعة والاتفاقيات البرمجية الجيدة في المشروع. ناقلات التمديد الرئيسية يمكن أن تكون:
- المحولات عبارة عن فصول بينية للعمل مع أطر جديدة للتعلم الآلي والشبكات العصبية.
- المرشحات عبارة عن معالجات بيانات لإدخال نماذج المهارات وتركها.
- طلب معالجات - تتيح لك إضافة وظائف جديدة إلى طلبات واستجابات واجهة برمجة تطبيقات 0Mind.