مرحبًا سكان خابروفسك. كما كتبنا بالفعل، ستطلق OTUS هذا الشهر دورتين للتعلم الآلي في وقت واحد، وهما قاعدة и المتقدمة. وفي هذا الصدد، نواصل تبادل المواد المفيدة.
الغرض من هذه المقالة هو الحديث عن تجربتنا الأولى في الاستخدام MLflow.
سنبدأ المراجعة MLflow من خادم التتبع الخاص به وقم بتسجيل جميع تكرارات الدراسة. ثم سنشارك تجربتنا في توصيل Spark بـ MLflow باستخدام UDF.
السياق
نحن مشتركون صحة ألفا نحن نستخدم التعلم الآلي والذكاء الاصطناعي لتمكين الناس من تولي مسؤولية صحتهم ورفاهيتهم. ولهذا السبب تقع نماذج التعلم الآلي في قلب منتجات علوم البيانات التي نقوم بتطويرها، ولهذا السبب انجذبنا إلى MLflow، وهي منصة مفتوحة المصدر تغطي جميع جوانب دورة حياة التعلم الآلي.
MLflow
الهدف الرئيسي من MLflow هو توفير طبقة إضافية فوق التعلم الآلي والتي من شأنها أن تسمح لعلماء البيانات بالعمل مع أي مكتبة للتعلم الآلي تقريبًا (h2o, keras, com.mleap, pytorch, sklearn и tensorflow)، والارتقاء بعملها إلى المستوى التالي.
يوفر MLflow ثلاثة مكونات:
تتبع الشحنة – التسجيل وطلبات التجارب: الكود والبيانات والتكوين والنتائج. من المهم جدًا مراقبة عملية إنشاء النموذج.
المشاريع – تنسيق التعبئة والتغليف للتشغيل على أي منصة (على سبيل المثال. SageMaker)
الموديلات – تنسيق مشترك لتقديم النماذج إلى أدوات النشر المختلفة.
MLflow (في ألفا وقت كتابة هذا التقرير) عبارة عن نظام أساسي مفتوح المصدر يسمح لك بإدارة دورة حياة التعلم الآلي، بما في ذلك التجريب وإعادة الاستخدام والنشر.
إعداد MLflow
لاستخدام MLflow، عليك أولاً إعداد بيئة Python بأكملها، ولهذا سنستخدم PyEnv (لتثبيت بايثون على ماك، راجع هنا). بهذه الطريقة يمكننا إنشاء بيئة افتراضية حيث سنقوم بتثبيت جميع المكتبات اللازمة لتشغيلها.
```
pyenv install 3.7.0
pyenv global 3.7.0 # Use Python 3.7
mkvirtualenv mlflow # Create a Virtual Env with Python 3.7
workon mlflow
```
ملاحظة: نستخدم PyArrow لتشغيل نماذج مثل UDF. يلزم إصلاح إصدارات PyArrow وNumpy لأن الإصدارات الأخيرة تتعارض مع بعضها البعض.
إطلاق واجهة المستخدم للتتبع
يتيح لنا تتبع MLflow تسجيل التجارب والاستعلام عنها باستخدام Python و REST واجهة برمجة التطبيقات. بالإضافة إلى ذلك، يمكنك تحديد مكان تخزين العناصر النموذجية (المضيف المحلي، الأمازون S3, تخزين Azure Blob, جوجل سحابة التخزين أو خادم سفتب). نظرًا لأننا نستخدم AWS في Alpha Health، فسيكون تخزين العناصر لدينا هو S3.
# Running a Tracking Server
mlflow server
--file-store /tmp/mlflow/fileStore
--default-artifact-root s3://<bucket>/mlflow/artifacts/
--host localhost
--port 5000
توصي MLflow باستخدام تخزين الملفات المستمر. تخزين الملفات هو المكان الذي سيقوم الخادم بتخزين بيانات تعريف التشغيل والتجربة. عند بدء تشغيل الخادم، تأكد من أنه يشير إلى مخزن الملفات الدائمة. هنا للتجربة سوف نستخدمها ببساطة /tmp.
تذكر أنه إذا أردنا استخدام خادم mlflow لإجراء تجارب قديمة، فيجب أن تكون موجودة في مخزن الملفات. ومع ذلك، حتى بدون ذلك يمكننا استخدامها في UDF، لأننا نحتاج فقط إلى المسار إلى النموذج.
ملاحظة: ضع في اعتبارك أن واجهة مستخدم التتبع والعميل النموذجي يجب أن يكون لديهما حق الوصول إلى موقع العنصر. وهذا يعني، بغض النظر عن حقيقة وجود واجهة مستخدم التتبع في مثيل EC2، عند تشغيل MLflow محليًا، يجب أن يتمتع الجهاز بإمكانية الوصول المباشر إلى S3 لكتابة النماذج الاصطناعية.
تقوم واجهة مستخدم التتبع بتخزين العناصر في حاوية S3
نماذج الجري
بمجرد تشغيل خادم التتبع، يمكنك البدء في تدريب النماذج.
على سبيل المثال، سوف نستخدم تعديل النبيذ من مثال MLflow في سكليرن.
كما ناقشنا بالفعل، يتيح لك MLflow تسجيل معلمات النموذج والمقاييس والعناصر حتى تتمكن من تتبع كيفية تطورها عبر التكرارات. هذه الميزة مفيدة للغاية لأنه بهذه الطريقة يمكننا إعادة إنتاج أفضل نموذج عن طريق الاتصال بخادم التتبع أو فهم الكود الذي أجرى التكرار المطلوب باستخدام سجلات تجزئة git الخاصة بالالتزامات.
يحتوي خادم تتبع MLflow، الذي تم إطلاقه باستخدام أمر "mlflow server"، على واجهة برمجة تطبيقات REST لتتبع عمليات التشغيل وكتابة البيانات إلى نظام الملفات المحلي. يمكنك تحديد عنوان خادم التتبع باستخدام متغير البيئة "MLFLOW_TRACKING_URI" وستتصل واجهة برمجة تطبيقات تتبع MLflow تلقائيًا بخادم التتبع على هذا العنوان لإنشاء/تلقي معلومات الإطلاق ومقاييس السجل وما إلى ذلك.
لتزويد النموذج بخادم، نحتاج إلى خادم تتبع قيد التشغيل (انظر واجهة التشغيل) ومعرف التشغيل الخاص بالنموذج.
تشغيل معرف
# Serve a sklearn model through 127.0.0.0:5005
MLFLOW_TRACKING_URI=http://0.0.0.0:5000 mlflow sklearn serve
--port 5005
--run_id 0f8691808e914d1087cf097a08730f17
--model-path model
لخدمة النماذج باستخدام وظيفة خدمة MLflow، سنحتاج إلى الوصول إلى واجهة مستخدم التتبع لتلقي معلومات حول النموذج ببساطة عن طريق تحديد --run_id.
بمجرد اتصال النموذج بخادم التتبع، يمكننا الحصول على نقطة نهاية نموذج جديدة.
على الرغم من أن خادم التتبع قوي بما يكفي لخدمة النماذج في الوقت الفعلي وتدريبها واستخدام وظيفة الخادم (المصدر: mlflow // المستندات // النماذج # المحلية)، يعد استخدام Spark (الدفعة أو التدفق) حلاً أكثر قوة بسبب التوزيع.
تخيل أنك قمت ببساطة بالتدريب دون الاتصال بالإنترنت ثم قمت بتطبيق نموذج الإخراج على جميع بياناتك. هذا هو المكان الذي يتألق فيه Spark وMLflow.
وبعد تحديد notebook-dirيمكننا تخزين دفاتر الملاحظات الخاصة بنا في المجلد المطلوب.
إطلاق Jupyter من PySpark
نظرًا لأننا تمكنا من تكوين Jupiter كمشغل PySpark، فيمكننا الآن تشغيل دفتر Jupyter في سياق PySpark.
(mlflow) afranzi:~$ pyspark
[I 19:05:01.572 NotebookApp] sparkmagic extension enabled!
[I 19:05:01.573 NotebookApp] Serving notebooks from local directory: /Users/afranzi/Projects/notebooks
[I 19:05:01.573 NotebookApp] The Jupyter Notebook is running at:
[I 19:05:01.573 NotebookApp] http://localhost:8888/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745
[I 19:05:01.573 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 19:05:01.574 NotebookApp]
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://localhost:8888/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745
كما هو مذكور أعلاه، يوفر MLflow ميزة لتسجيل عناصر النموذج في S3. بمجرد حصولنا على النموذج المحدد بين أيدينا، لدينا الفرصة لاستيراده كـ UDF باستخدام الوحدة النمطية mlflow.pyfunc.
حتى هذه اللحظة، تحدثنا عن كيفية استخدام PySpark مع MLflow، وتشغيل تنبؤات جودة النبيذ على مجموعة بيانات النبيذ بأكملها. ولكن ماذا لو كنت بحاجة إلى استخدام وحدات Python MLflow من Scala Spark؟
لقد اختبرنا ذلك أيضًا عن طريق تقسيم سياق Spark بين Scala وPython. أي أننا سجلنا MLflow UDF في Python واستخدمناه من Scala (نعم، ربما ليس الحل الأفضل، ولكن ما لدينا).
سكالا سبارك + إم إل فلو
لهذا المثال سوف نضيف توري نواة إلى كوكب المشتري الموجود.
تثبيت سبارك + توري + Jupyter
pip install toree
jupyter toree install --spark_home=${SPARK_HOME} --sys-prefix
jupyter kernelspec list
```
```
Available kernels:
apache_toree_scala /Users/afranzi/.virtualenvs/mlflow/share/jupyter/kernels/apache_toree_scala
python3 /Users/afranzi/.virtualenvs/mlflow/share/jupyter/kernels/python3
```
كما ترون من دفتر الملاحظات المرفق، تتم مشاركة UDF بين Spark وPySpark. نأمل أن يكون هذا الجزء مفيدًا لأولئك الذين يحبون Scala ويريدون نشر نماذج التعلم الآلي في الإنتاج.
على الرغم من أن MLflow موجود في إصدار Alpha في وقت كتابة هذا التقرير، إلا أنه يبدو واعدًا جدًا. مجرد القدرة على تشغيل أطر عمل متعددة للتعلم الآلي واستهلاكها من نقطة نهاية واحدة تنقل أنظمة التوصية إلى المستوى التالي.
بالإضافة إلى ذلك، يعمل MLflow على التقريب بين مهندسي البيانات والمتخصصين في علوم البيانات، مما يضع طبقة مشتركة بينهم.
بعد هذا الاستكشاف لـ MLflow، نحن واثقون من أننا سنمضي قدمًا ونستخدمه في خطوط أنابيب Spark وأنظمة التوصية الخاصة بنا.
سيكون من الجيد مزامنة تخزين الملفات مع قاعدة البيانات بدلاً من نظام الملفات. يجب أن يمنحنا هذا نقاط نهاية متعددة يمكنها استخدام نفس مساحة تخزين الملفات. على سبيل المثال، استخدم مثيلات متعددة مقطع موسيقي سريع и أثينا مع نفس الغراء metastore.
للتلخيص، أود أن أشكر مجتمع MLFlow على جعل عملنا مع البيانات أكثر إثارة للاهتمام.
إذا كنت تتلاعب بـ MLflow، فلا تتردد في الكتابة إلينا وإخبارنا كيف تستخدمه، بل وأكثر من ذلك إذا كنت تستخدمه في الإنتاج.