التعلم العميق هو الآن في جاوة

لا تحب جافا؟ نعم ، أنت لا تعرف كيف تطبخ! تدعونا Mani Sarkar إلى التعرف على أداة Valohai ، والتي تتيح لك إجراء البحوث النموذجية في Java.



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

مقدمة


منذ بعض الوقت ، صادفت خدمة سحابية تسمى Valohai ، وسرني بواجهة المستخدم وبساطة التصميم والتخطيط. لقد طلبت خدمة أحد أعضاء Valohai وتلقيت نسخة تجريبية. قبل ذلك ، كتبت خط أنابيب بسيطًا باستخدام GNU Parallel و JavaScript و Python و Bash - وآخر يستخدم فقط GNU Parallel and Bash.

لقد فكرت أيضًا في استخدام أدوات إدارة سير العمل / المهام الجاهزة للاستخدام مثل Jenkins X أو Jenkins Pipeline أو Concourse أو Airflow ، لكنني قررت لأسباب مختلفة عدم القيام بذلك.

لقد لاحظت أن العديد من الأمثلة والوثائق Valohai تستند إلى Python و R والأطر والمكتبات الخاصة بكل منها. قررت عدم تفويت الفرصة وأريد تصحيح نقص الأمثلة والوثائق.

دفعني Valohai إلى تنفيذ شيء باستخدام مكتبة Java الشهيرة المسماة DL4J - Deep Learning for Java .

تركت تجربتي الأولى مع Valohai انطباعًا جيدًا عني بعد الشعور من خلال التصميم والتصميم وسير العمل. لقد أخذ المبدعون بالفعل في الاعتبار الجوانب المختلفة لكل من سير عمل المطور والبنية التحتية. في عالمنا ، يتم التحكم في عملية تطوير البنية التحتية بشكل أساسي بواسطة فرق DevOps أو SysOps ، ونعرف الفروق الدقيقة ونقاط الألم المرتبطة بها.

ماذا نحتاج وكيف؟


في أي مشروع للتعلم الآلي ، يوجد مكونان مهمان (من وجهة نظر عالية المستوى) - رمز سيعمل مع النموذج ، ورمز سيعمل مع البنية التحتية ، حيث سيتم تنفيذ دورة حياة المشروع بأكملها.

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

قانون


بالنسبة للكود ، اخترت مثالًا معقدًا باستخدام DL4J ، هذا مشروع MNist بمجموعة تدريب من 60000 صورة ومجموعة اختبار من 10000 صورة من الأرقام المكتوبة بخط اليد. تتوفر مجموعة البيانات هذه من خلال مكتبة DL4J (تمامًا مثل Keras).

قبل البدء ، يوصى بإلقاء نظرة على الكود المصدري الذي سنستخدمه. تسمى فئة Java الرئيسية org.deeplearning4j.feedforward.mnist.MLPMnistSingleLayerRunner .

البنية التحتية


قررنا تجربة مثال Java باستخدام Valohai كهيكلنا الأساسي لإجراء التجارب (التدريب وتقييم النماذج). يتعرف Valohai على مستودعات git ويتصل بها مباشرةً ، مما يسمح لنا بتنفيذ التعليمات البرمجية الخاصة بنا بغض النظر عن النظام الأساسي أو اللغة - لذلك سنرى كيف تعمل. هذا يعني أيضًا أنه إذا كنت تستخدم GitOps أو Infrastructure-As-Code ، فكل شيء سيناسبك أيضًا.

للقيام بذلك ، نحتاج فقط إلى حساب في Valohai. بعد إنشاء حساب مجاني ، يمكننا الوصول إلى العديد من مثيلات التكوينات المختلفة. بالنسبة لما نود القيام به ، فإن Free-Tier أكثر من كافية.

التعلم العميق لجاوة و Valohai


سنوفر جميع التبعيات لصورة Docker ونستخدمها لتجميع تطبيق Java الخاص بنا وتدريب النموذج وتقييمه على النظام الأساسي Valohai باستخدام ملف valohai.yaml البسيط الموجود في المجلد الجذر لمستودع المشروع.

التعلم العميق لجافا: DL4J


أبسط جزء. لا يتعين علينا فعل الكثير ، فقط جمع الجرة وتحميل مجموعة البيانات في حاوية Docker. لدينا صورة Docker تم إنشاؤها مسبقًا تحتوي على جميع التبعيات اللازمة لإنشاء تطبيق Java. نضع هذه الصورة في Docker Hub ، ويمكنك العثور عليها من خلال البحث عن طبقة واحدة من طبقة dl4j-mnist (سنستخدم علامة خاصة كما هو محدد في ملف YAML). قررنا استخدام GraalVM 19.1.1 كبيئة جافا للبناء والتشغيل لهذا المشروع ، وهي مدمجة في صورة Docker.

عندما يتم استدعاء jber jar من سطر الأوامر ، نقوم بإنشاء فئة MLPMnistSingleLayerRunner ، والتي تخبرنا بالإجراء المقصود ، اعتمادًا على المعلمات التي تم تمريرها إلى:

public static void main(String[] args) throws Exception { MLPMnistSingleLayerRunner mlpMnistRunner = new MLPMnistSingleLayerRunner(); JCommander.newBuilder() .addObject(mlpMnistRunner) .build() .parse(args); mlpMnistRunner.execute(); } 

يتم قبول المعلمات التي تم تمريرها إلى جرة uber بواسطة هذه الفئة وتتم معالجتها بواسطة طريقة execute ().

يمكننا إنشاء نموذج باستخدام معلمة القطار --action وتقييم النموذج الذي تم إنشاؤه باستخدام - المعلمة تقييم العمل التي تم تمريرها إلى تطبيق Java.

يمكن العثور على الأجزاء الرئيسية لتطبيق Java التي تقوم بهذا العمل في فئتي Java المذكورة في الأقسام أدناه.

التدريب النموذجي


دعوة

 ./runMLPMnist.sh --action train --output-dir ${VH_OUTPUTS_DIR} or java -Djava.library.path="" \ -jar target/MLPMnist-1.0.0-bin.jar \ --action train --output-dir ${VH_OUTPUTS_DIR} 

ينشئ هذا الأمر نموذجًا يسمى mlpmnist-single-layer.pb في المجلد المحدد بواسطة المعلمة - الإخراج - الإخراج التي تم تمريرها في بداية التنفيذ. من وجهة نظر Valohai ، يجب وضعه في $ {VH_OUTPUTS_DIR} ، وهو ما نقوم به (راجع ملف valohai.yaml ).

للحصول على التعليمات البرمجية المصدر ، راجع فئة MLPMNistSingleLayerTrain.java .

تقييم النموذج


دعوة

 ./runMLPMnist.sh --action evaluate --input-dir ${VH_INPUTS_DIR}/model or java -Djava.library.path="" \ -jar target/MLPMnist-1.0.0-bin.jar \ --action evaluate --input-dir ${VH_INPUTS_DIR}/model 

من المفترض أن يكون النموذج (الذي تم إنشاؤه أثناء مرحلة التدريب) باسم mlpmnist-single-layer.pb موجودًا في المجلد المحدد في المعلمة --input-dir التي تم تمريرها عند استدعاء التطبيق.

للحصول على التعليمات البرمجية المصدر ، راجع فئة MLPMNistSingleLayerEvaluate.java .

آمل أن يوضح هذا التوضيح القصير كيف يعمل تطبيق Java الذي يقوم بتدريس وتقييم نموذج العمل.

هذا هو كل ما هو مطلوب منا ، ولكن لا تتردد في اللعب مع بقية المصادر (إلى جانب README.md والبرامج النصية باش) وتلبية فضولك وفهم كيف يتم ذلك!

Valohai


تسمح لنا Valohai بالربط بحرية بين وقت التشغيل والرمز ومجموعة البيانات الخاصة بنا ، كما ترون من بنية ملف YAML أدناه. وبالتالي ، يمكن تطوير المكونات المختلفة بشكل مستقل عن بعضها البعض. وبالتالي ، يتم تجميع مكونات التجميع ووقت التشغيل فقط في حاوية Docker الخاصة بنا.

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

valohai.yaml
يتمثل الجزء الرئيسي من دمج مشروع Java الخاص بنا مع بنية Valohai الأساسية في تحديد ترتيب خطوات التنفيذ في ملف valohai.yaml الموجود في جذر مجلد المشروع. لدينا valohai.yaml يشبه هذا:

 --- - step: name: Build-dl4j-mnist-single-layer-java-app image: neomatrix369/dl4j-mnist-single-layer:v0.5 command: - cd ${VH_REPOSITORY_DIR} - ./buildUberJar.sh - echo "~~~ Copying the build jar file into ${VH_OUTPUTS_DIR}" - cp target/MLPMnist-1.0.0-bin.jar ${VH_OUTPUTS_DIR}/MLPMnist-1.0.0.jar - ls -lash ${VH_OUTPUTS_DIR} environment: aws-eu-west-1-g2-2xlarge - step: name: Run-dl4j-mnist-single-layer-train-model image: neomatrix369/dl4j-mnist-single-layer:v0.5 command: - echo "~~~ Unpack the MNist dataset into ${HOME} folder" - tar xvzf ${VH_INPUTS_DIR}/dataset/mlp-mnist-dataset.tgz -C ${HOME} - cd ${VH_REPOSITORY_DIR} - echo "~~~ Copying the build jar file from ${VH_INPUTS_DIR} to current location" - cp ${VH_INPUTS_DIR}/dl4j-java-app/MLPMnist-1.0.0.jar . - echo "~~~ Run the DL4J app to train model based on the the MNist dataset" - ./runMLPMnist.sh {parameters} inputs: - name: dl4j-java-app description: DL4J Java app file (jar) generated in the previous step 'Build-dl4j-mnist-single-layer-java-app' - name: dataset default: https://github.com/neomatrix369/awesome-ai-ml-dl/releases/download/mnist-dataset-v0.1/mlp-mnist-dataset.tgz description: MNist dataset needed to train the model parameters: - name: --action pass-as: '--action {v}' type: string default: train description: Action to perform ie train or evaluate - name: --output-dir pass-as: '--output-dir {v}' type: string default: /valohai/outputs/ description: Output directory where the model will be created, best to pick the Valohai output directory environment: aws-eu-west-1-g2-2xlarge - step: name: Run-dl4j-mnist-single-layer-evaluate-model image: neomatrix369/dl4j-mnist-single-layer:v0.5 command: - cd ${VH_REPOSITORY_DIR} - echo "~~~ Copying the build jar file from ${VH_INPUTS_DIR} to current location" - cp ${VH_INPUTS_DIR}/dl4j-java-app/MLPMnist-1.0.0.jar . - echo "~~~ Run the DL4J app to evaluate the trained MNist model" - ./runMLPMnist.sh {parameters} inputs: - name: dl4j-java-app description: DL4J Java app file (jar) generated in the previous step 'Build-dl4j-mnist-single-layer-java-app' - name: model description: Model file generated in the previous step 'Run-dl4j-mnist-single-layer-train-model' parameters: - name: --action pass-as: '--action {v}' type: string default: evaluate description: Action to perform ie train or evaluate - name: --input-dir pass-as: '--input-dir {v}' type: string default: /valohai/inputs/model description: Input directory where the model created by the previous step can be found created environment: aws-eu-west-1-g2-2xlarge 

كيف يعمل تطبيق Build-dl4j-mnist-single-layer-java


من ملف YAML ، نرى أننا نحدد هذه الخطوة ، أولاً باستخدام صورة Docker ، ثم تشغيل البرنامج النصي لإنشاء Uber JAR. تحتوي صورة عامل الميناء الخاص بنا على تخصيصات تبعيات بيئة الإنشاء (مثل GraalVM JDK و Maven وما إلى ذلك) لإنشاء تطبيق Java. نحن لا نقدم أي مدخلات أو معلمات ، لأن هذه هي مرحلة التجميع. بمجرد نجاح الإنشاء ، نقوم بنسخ جرة uber المسمى MLPMnist-1.0.0-bin.jar (الاسم الأصلي) إلى مجلد / valohai / outputs (يمثل $ {VH_OUTPUTS_DIR}). يتم حفظ كل شيء في هذا المجلد تلقائيًا في مخزن المشروع ، على سبيل المثال ، في سلة المحذوفات AWS S3. أخيرًا ، نحدد عملنا لـ AWS.

تعليق
لا يتمتع حساب Valohai المجاني بإمكانية الوصول إلى الشبكة من حاوية Docker (يتم تعطيل هذا بشكل افتراضي) ، يرجى الاتصال بالدعم لتمكين هذا الخيار (كان علي أن أفعل نفس الشيء) ، وإلا فلن نتمكن من تنزيل Maven والتبعيات الأخرى أثناء التجميع.

كيف يعمل Run-dl4j-mnist-single-train-train-model


تتشابه دلالات التعريف مع الخطوة السابقة ، فيما عدا أننا نحدد إدخالين: أحدهما لـ uber jar (MLPMnist-1.0.0.jar) والآخر لمجموعة البيانات (تم فك حزمه في المجلد $ {HOME} /. Deeplearning4j). سنمر معلمتين - - قطار العمل و - الإخراج دير / valohai / المخرجات. تم إنشاء النموذج الذي تم إنشاؤه في هذه الخطوة في / valohai / outputs / model (يمثل $ {VH_OUTPUTS_DIR} / model).

تعليق
في حقول الإدخال في علامة التبويب "تشغيل" بواجهة Valohai على الويب ، يمكننا تحديد الإخراج من التشغيلات السابقة باستخدام رقم التشغيل ، أي # 1 أو # 2 ، بالإضافة إلى استخدام البيانات: // أو http: / URLs / ، إدخال بضعة أحرف من اسم الملف يساعد أيضًا في البحث في القائمة بأكملها.

كيف يعمل Run-dl4j-mnist-single-layer -valu-model


مرة أخرى ، تشبه هذه الخطوة الخطوة السابقة ، فيما عدا أننا سنجتاز معلمتين - تقييم العمل و-إدخال-dir / valohai / المدخلات / النموذج. بالإضافة إلى ذلك ، أشرنا مرة أخرى في الإدخال: المقاطع المحددة في ملف YAML باسم dl4j-java-app والطراز بدون الافتراضي لكل منهما. سيتيح لنا ذلك تحديد جرة uber والطراز الذي نريد تقييمه - والذي تم إنشاؤه باستخدام خطوة نموذج Run-dl4j-mnist-single-layer-train باستخدام واجهة الويب.

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

واجهة الويب Valohai


بعد تلقي الحساب ، يمكننا تسجيل الدخول ومواصلة إنشاء المشروع باسم mlpmnist-single-layer and git repo github.com/valohai/mlpmnist-dl4j-example مع المشروع وحفظ المشروع.

الآن يمكنك إكمال الخطوة ومعرفة كيف اتضح!

بناء تطبيق جافا DL4J


انتقل إلى علامة التبويب "Execution" في واجهة الويب وقم إما بنسخ التنفيذ الحالي أو إنشاء تطبيق جديد باستخدام زر [Createecute]. سيتم ملء جميع المعلمات الافتراضية اللازمة. حدد Step Build-dl4j-mnist-single-layer-java-app.

من أجل البيئة ، اخترت AWS eu-west-1 g2.2xlarge وانقرت فوق الزر [إنشاء تنفيذ] في أسفل الصفحة لرؤية بداية التنفيذ.



التدريب النموذجي


انتقل إلى علامة التبويب "Execution" في واجهة الويب وقم بالشيء نفسه كما في الخطوة السابقة ، واختر Run-dl4j-mnist-single-layer-model-model. ستحتاج إلى تحديد تطبيق Java (فقط أدخل jar في الحقل) الذي تم إنشاؤه في الخطوة السابقة. تم بالفعل تعبئة مجموعة البيانات مسبقًا باستخدام ملف valohai.yaml:



انقر فوق [إنشاء تنفيذ] للبدء.



سترى النتيجة في وحدة التحكم:

 [<--- snipped --->] 11:17:05 ======================================================================= 11:17:05 LayerName (LayerType) nIn,nOut TotalParams ParamsShape 11:17:05 ======================================================================= 11:17:05 layer0 (DenseLayer) 784,1000 785000 W:{784,1000}, b:{1,1000} 11:17:05 layer1 (OutputLayer) 1000,10 10010 W:{1000,10}, b:{1,10} 11:17:05 ----------------------------------------------------------------------- 11:17:05 Total Parameters: 795010 11:17:05 Trainable Parameters: 795010 11:17:05 Frozen Parameters: 0 11:17:05 ======================================================================= [<--- snipped --->] 

يمكن العثور على النماذج التي تم إنشاؤها في علامة التبويب "المخرجات" في علامة التبويب "التنفيذ" الرئيسية أثناء التنفيذ وبعده:



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

 [<--- snipped --->] 11:17:14 odolCheckpointListener - Model checkpoint saved: epoch 0, iteration 469, path: /valohai/outputs/checkpoint_0_MultiLayerNetwork.zip [<--- snipped --->] 

تحتوي نقطة التفتيش على حالة النموذج في ثلاثة ملفات:

 configuration.json coefficients.bin updaterState.bin 

التدريب النموذجي. الفوقية


ربما لاحظت هذه الإدخالات في سجلات التنفيذ:

 [<--- snipped --->] 11:17:05 {"epoch": 0, "iteration": 0, "score (loss function)": 2.410047} 11:17:07 {"epoch": 0, "iteration": 100, "score (loss function)": 0.613774} 11:17:09 {"epoch": 0, "iteration": 200, "score (loss function)": 0.528494} 11:17:11 {"epoch": 0, "iteration": 300, "score (loss function)": 0.400291} 11:17:13 {"epoch": 0, "iteration": 400, "score (loss function)": 0.357800} 11:17:14 odolCheckpointListener - Model checkpoint saved: epoch 0, iteration 469, path: /valohai/outputs/checkpoint_0_MultiLayerNetwork.zip [<--- snipped --->] 

تتيح هذه البيانات لشركة Valohai الحصول على هذه القيم (بتنسيق JSON) ، والتي سيتم استخدامها لإنشاء المقاييس التي يمكن رؤيتها أثناء وبعد التنفيذ في علامة تبويب Metadata الإضافية في علامة التبويب Executions الرئيسية:



تمكنا من القيام بذلك عن طريق توصيل فئة ValohaiMetadataCreator بالنموذج ، بحيث يشير Valohai إلى هذه الفئة أثناء التدريب. في حالة هذه الفئة ، نشتق عدة عصور ، وعدد التكرارات والنتيجة (قيمة وظيفة الخسارة). فيما يلي مقتطف شفرة من الفصل:

 public void iterationDone(Model model, int iteration, int epoch) { if (printIterations <= 0) printIterations = 1; if (iteration % printIterations == 0) { double score = model.score(); System.out.println(String.format( "{\"epoch\": %d, \"iteration\": %d, \"score (loss function)\": %f}", epoch, iteration, score) ); } } 

تقييم النموذج


بمجرد إنشاء النموذج بنجاح في الخطوة السابقة ، يجب تقييمه. نقوم بإنشاء تنفيذ جديد بالطريقة نفسها كما كان من قبل ، ولكن هذه المرة حدد نموذج نموذج Run-dl4j-mnist-single-layer -valu. سنحتاج إلى تحديد تطبيق Java (MLPMnist-1.0.0.jar) والنموذج الذي تم إنشاؤه (mlpmnist-single-layer.pb) مرة أخرى قبل البدء في التنفيذ (كما هو موضح أدناه):



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



نرى أن "عالم الترحيب" أدى إلى نموذج تبلغ دقته حوالي 97٪ استنادًا إلى مجموعة بيانات الاختبار. تساعد مصفوفة الارتباك في العثور على الحالات التي تم فيها التنبؤ بالرقم بشكل غير صحيح كرقم آخر.

يبقى السؤال (وخارج نطاق هذا المنشور) - ما مدى جودة النموذج عند مواجهة بيانات حقيقية؟

لاستنساخ مستودع بوابة ، إليك ما عليك القيام به:

  $ git clone https://github.com/valohai/mlpmnist-dl4j-example 

بعد ذلك ، نحتاج إلى ربط مشروع Valohai ، الذي تم إنشاؤه من خلال واجهة الويب في القسم أعلاه ، بالمشروع المخزن على الجهاز المحلي لدينا (المشروع الذي استنسخناه للتو). قم بتشغيل الأوامر التالية للقيام بذلك:

 $ cd mlpmnist-dl4j-example $ vh project --help ### to see all the project-specific options we have for Valohai $ vh project link 

سيظهر لك شيء مثل هذا:

 [ 1] mlpmnist-single-layer ... Which project would you like to link with /path/to/mlpmnist-dl4j-example? Enter [n] to create a new project.: 

اختر 1 (أو الذي يناسبك) وسترى هذه الرسالة:

 Success! Linked /path/to/mlpmnist-dl4j-example to mlpmnist-single-layer. 

شيء واحد آخر ، قبل الانتقال ، تأكد من أن مشروع Valohai الخاص بك متزامن مع أحدث مشروع git من خلال القيام بذلك:

  $ vh project fetch 



الآن يمكننا إكمال الخطوات من CLI مع:

  $ vh exec run Build-dl4j-mnist-single-layer-java-app 

بعد الانتهاء من التنفيذ ، يمكننا التحقق من ذلك باستخدام:

 $ vh exec info $ vh exec logs $ vh exec watch 

استنتاج


كما رأينا ، من المريح للغاية العمل مع DL4J و Valohai معًا. بالإضافة إلى ذلك ، يمكننا تطوير المكونات المختلفة التي تتكون منها تجاربنا (البحث) ، أي بيئة الإنشاء / التشغيل ، الشفرة ومجموعة البيانات ، ودمجها في مشروعنا.

نماذج النماذج المستخدمة في هذا المنشور هي طريقة جيدة لبدء إنشاء مشاريع أكثر تعقيدًا. ويمكنك استخدام الويب أو واجهة سطر الأوامر للقيام بعملك مع Valohai. مع CLI ، يمكنك أيضًا دمجها مع التركيبات والبرامج النصية (أو حتى مع وظائف CRON أو CI / CD).

بالإضافة إلى ذلك ، من الواضح أنه إذا كنت أعمل في مشروع يتعلق بـ AI / ML / DL ، فلا داعي للقلق بشأن إنشاء وصيانة خط أنابيب من البداية إلى النهاية (وهو ما كان يتعين على العديد من الآخرين القيام به في الماضي).

مراجع

  1. مشروع mlpmnist-dl4j- أمثلة على جيثب
  2. رهيبة AI / ML / DL الموارد
  3. موارد جافا AI / ML / DL
  4. التعلم العميق والموارد DL4J

شكرا لاهتمامكم!

Source: https://habr.com/ru/post/ar469405/


All Articles