MLOps - كتاب الطبخ، الفصل 1

MLOps - كتاب الطبخ، الفصل 1

أهلاً بكم! أنا مطور سيرة ذاتية في CROC. لقد قمنا بتنفيذ مشاريع في مجال السيرة الذاتية لمدة 3 سنوات حتى الآن. خلال هذا الوقت قمنا بأشياء كثيرة، على سبيل المثال: قمنا بمراقبة السائقين حتى لا يشربوا أو يدخنوا أو يتحدثوا على الهاتف أو ينظروا إلى الطريق أثناء القيادة، وليس إلى الأحلام أو إلى السحب. ; قمنا بتسجيل الأشخاص الذين يقودون سياراتهم في ممرات مخصصة ويشغلون عدة أماكن لوقوف السيارات؛ التأكد من أن العمال يرتدون الخوذات والقفازات وما إلى ذلك؛ تحديد الموظف الذي يريد دخول المنشأة؛ لقد أحصينا كل ما في وسعنا.

لماذا أفعل كل هذا؟

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

دعونا نحاكي الوضع

لنتخيل أننا حصلنا على وظيفة في شركة شابة "N"، ترتبط أنشطتها بتعلم الآلة. نحن نعمل في مشروع ML (DL، CV)، ثم ننتقل لسبب ما إلى وظيفة أخرى، ونأخذ عمومًا قسطًا من الراحة، ونعود إلى عصبونتنا أو عصبون شخص آخر.

  1. تأتي لحظة الحقيقة، عليك أن تتذكر بطريقة أو بأخرى أين توقفت، وما هي المعلمات الفائقة التي جربتها، والأهم من ذلك، ما هي النتائج التي أدت إليها. يمكن أن يكون هناك العديد من الخيارات لمن قام بتخزين المعلومات في جميع عمليات الإطلاق: في الرأس، والتكوينات، والمفكرة، وفي بيئة العمل في السحابة. لقد حدث أن رأيت خيارًا عندما يتم تخزين المعلمات الفائقة كأسطر معلقة في الكود، بشكل عام، رحلة خيالية. تخيل الآن أنك لم تعد إلى مشروعك، بل إلى مشروع شخص ترك الشركة ورثت كودًا ونموذجًا يسمى model_1.pb. لتكتمل الصورة وتنقل كل الألم، لنتخيل أنك أيضًا متخصص مبتدئ.
  2. تفضل. لتشغيل الكود، نحتاج نحن وكل من سيعمل معه إلى تهيئة بيئة مناسبة. غالبًا ما يحدث أنهم لسبب ما لم يتركوه كميراث لنا. يمكن أن تصبح هذه أيضًا مهمة غير تافهة. أنت لا تريد إضاعة الوقت في هذه الخطوة، أليس كذلك؟
  3. نقوم بتدريب نموذج (على سبيل المثال، كاشف السيارة). وصلنا إلى النقطة التي أصبح فيها الأمر جيدًا جدًا – حان الوقت لحفظ النتيجة. دعنا نسميها car_detection_v1.pb. ثم نقوم بتدريب واحد آخر - car_detection_v2.pb. وبعد مرور بعض الوقت، أصبح زملاؤنا أو نحن أنفسنا نقوم بتدريس المزيد والمزيد باستخدام بنيات مختلفة. نتيجة لذلك، يتم تشكيل مجموعة من القطع الأثرية، والمعلومات التي يجب جمعها بشق الأنفس (لكننا سنفعل ذلك لاحقا، لأنه في الوقت الحالي لدينا المزيد من الأمور ذات الأولوية).
  4. حسنًا، لقد انتهى كل شيء الآن! لدينا نموذج! هل يمكننا البدء بتدريب النموذج التالي، أو تطوير بنية لحل مشكلة جديدة، أو هل يمكننا الذهاب لتناول بعض الشاي؟ ومن سينشر؟

تحديد المشاكل

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

MLOps - كتاب الطبخ، الفصل 1

لذلك، مررنا بدورة تطوير واحدة ونرى أن هناك مشكلات تحتاج إلى حل. للقيام بذلك تحتاج:

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

هل يبدو أنه من الضروري التوصل إلى سير عمل يسمح لك بإدارة دورة الحياة هذه بسهولة ويسر؟ هذه الممارسة تسمى MLOps

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

علبة لقراءةما رأي رجال جوجل في كل هذا؟ يتضح من المقال أن MLOps شيء ضخم جدًا.

MLOps - كتاب الطبخ، الفصل 1

علاوة على ذلك، سأصف في مقالتي جزءًا فقط من العملية. للتنفيذ، سأستخدم أداة MLflow، لأن... هذا مشروع مفتوح المصدر، ويلزم كمية صغيرة من التعليمات البرمجية للاتصال وهناك تكامل مع أطر عمل ml الشائعة. يمكنك البحث في الإنترنت عن أدوات أخرى، مثل Kubeflow، وSageMaker، وTrains، وما إلى ذلك، وربما تجد الأداة التي تناسب احتياجاتك بشكل أفضل.

"بناء" MLOps باستخدام مثال استخدام أداة MLFlow

MLFlow عبارة عن منصة مفتوحة المصدر لإدارة دورة حياة نماذج ml (https://mlflow.org/).

يتضمن MLflow أربعة مكونات:

  • تتبع MLflow - يغطي مشكلات تسجيل النتائج والمعلمات التي أدت إلى هذه النتيجة؛
  • مشروع MLflow - يسمح لك بحزم التعليمات البرمجية وإعادة إنتاجها على أي نظام أساسي؛
  • نماذج MLflow - المسؤولة عن نشر النماذج في الإنتاج؛
  • سجل MLflow - يسمح لك بتخزين النماذج وإدارة حالتها في مستودع مركزي.

يعمل MLflow على كيانين:

  • الإطلاق عبارة عن دورة كاملة من التدريب والمعلمات والمقاييس التي نريد التسجيل من خلالها؛
  • التجربة هي "موضوع" يعمل معًا.

يتم تنفيذ جميع خطوات المثال على نظام التشغيل Ubuntu 18.04.

1. نشر الخادم

لكي نتمكن من إدارة مشروعنا بسهولة والحصول على جميع المعلومات اللازمة، سنقوم بنشر خادم. يحتوي خادم تتبع MLflow على مكونين رئيسيين:

  • متجر الواجهة الخلفية - مسؤول عن تخزين المعلومات حول النماذج المسجلة (يدعم 4 أنظمة إدارة قواعد بيانات: mysql، وmssql، وsqlite، وpostgresql)؛
  • متجر القطع الأثرية - مسؤول عن تخزين القطع الأثرية (يدعم 7 خيارات تخزين: Amazon S3، Azure Blob Storage، Google Cloud Storage، خادم FTP، SFTP Server، NFS، HDFS).

كما متجر القطع الأثرية للتبسيط، لنأخذ خادم sftp.

  • إنشاء مجموعة
    $ sudo groupadd sftpg
  • إضافة مستخدم وتعيين كلمة مرور له
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • ضبط اثنين من إعدادات الوصول
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • أضف بضعة أسطر إلى /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • أعد تشغيل الخدمة
    $ sudo systemctl restart sshd

كما متجر الخلفية لنأخذ postgresql.

$ sudo apt update
$ sudo apt-get install -y postgresql postgresql-contrib postgresql-server-dev-all
$ sudo apt install gcc
$ pip install psycopg2
$ sudo -u postgres -i
# Create new user: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Enter name of role to add: mlflow_user
Enter password for new role: mlflow
Enter it again: mlflow
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
# Create database mlflow_bd owned by mlflow_user
$ createdb -O mlflow_user mlflow_db

لبدء الخادم، تحتاج إلى تثبيت حزم بايثون التالية (أوصي بإنشاء بيئة افتراضية منفصلة):

pip install mlflow
pip install pysftp

لنبدأ الخادم الخاص بنا

$ mlflow server  
                 --backend-store-uri postgresql://mlflow_user:mlflow@localhost/mlflow_db 
                 --default-artifact-root sftp://mlflowsftp:mlflow@sftp_host/upload  
                --host server_host 
                --port server_port

2. إضافة تتبع

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

على سبيل المثال، قمت بإنشاء صغيرة المشروع على جيثب على Keras لتقسيم كل ما هو موجود مجموعة بيانات COCO. لإضافة التتبع، قمت بإنشاء ملف mlflow_training.py.

فيما يلي السطور التي تحدث فيها الأشياء الأكثر إثارة للاهتمام:

def run(self, epochs, lr, experiment_name):
        # getting the id of the experiment, creating an experiment in its absence
        remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
        # creating a "run" and getting its id
        remote_run_id = self.remote_server.get_run_id(remote_experiment_id)

        # indicate that we want to save the results on a remote server
        mlflow.set_tracking_uri(self.tracking_uri)
        mlflow.set_experiment(experiment_name)

        with mlflow.start_run(run_id=remote_run_id, nested=False):
            mlflow.keras.autolog()
            self.train_pipeline.train(lr=lr, epochs=epochs)

        try:
            self.log_tags_and_params(remote_run_id)
        except mlflow.exceptions.RestException as e:
            print(e)

هنا self.remote_server عبارة عن غلاف صغير فوق أساليب mlflow.tracking. MlflowClient (لقد صنعته من أجل الراحة)، وبمساعدته أقوم بإنشاء تجربة وتشغيلها على الخادم. بعد ذلك، أشير إلى المكان الذي يجب دمج نتائج الإطلاق فيه (mlflow.set_tracking_uri(self.tracking_uri)). أقوم بتمكين التسجيل التلقائي mlflow.keras.autolog(). يدعم تتبع MLflow حاليًا التسجيل التلقائي لـ TensorFlow وKeras وGluon XGBoost وLightGBM وSpark. إذا لم تجد إطار العمل أو المكتبة الخاصة بك، فيمكنك دائمًا تسجيل الدخول بشكل صريح. لقد بدأنا التدريب. تسجيل العلامات ومعلمات الإدخال على الخادم البعيد.

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

3. نقوم بإعداد المشروع

الآن دعونا نجعل من السهل إطلاق المشروع. للقيام بذلك، قم بإضافة ملف MLproject وconda.yaml إلى جذر المشروع.
MLproject

name: flow_segmentation
conda_env: conda.yaml

entry_points:
  main:
    parameters:
        categories: {help: 'list of categories from coco dataset'}
        epochs: {type: int, help: 'number of epochs in training'}

        lr: {type: float, default: 0.001, help: 'learning rate'}
        batch_size: {type: int, default: 8}
        model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
        backbone_name: {type: str, default: 'resnet18', help: 'exampe resnet18, resnet50, mobilenetv2 ...'}

        tracking_uri: {type: str, help: 'the server address'}
        experiment_name: {type: str, default: 'My_experiment', help: 'remote and local experiment name'}
    command: "python mlflow_training.py 
            --epochs={epochs}
            --categories={categories}
            --lr={lr}
            --tracking_uri={tracking_uri}
            --model_name={model_name}
            --backbone_name={backbone_name}
            --batch_size={batch_size}
            --experiment_name={experiment_name}"

يتمتع مشروع MLflow بعدة خصائص:

  • الاسم - اسم مشروعك؛
  • البيئة - في حالتي، يشير conda_env إلى أنه يتم استخدام Anaconda للتشغيل وأن وصف التبعية موجود في ملف conda.yaml؛
  • نقاط الإدخال - تشير إلى الملفات والمعلمات التي يمكننا تشغيلها (يتم تسجيل جميع المعلمات تلقائيًا عند بدء التدريب)

conda.yaml

name: flow_segmentation
channels:
  - defaults
  - anaconda
dependencies:
  - python==3.7
  - pip:
    - mlflow==1.8.0
    - pysftp==0.2.9
    - Cython==0.29.19
    - numpy==1.18.4
    - pycocotools==2.0.0
    - requests==2.23.0
    - matplotlib==3.2.1
    - segmentation-models==1.0.1
    - Keras==2.3.1
    - imgaug==0.4.0
    - tqdm==4.46.0
    - tensorflow-gpu==1.14.0

يمكنك استخدام عامل الإرساء كبيئة تشغيل خاصة بك، لمزيد من التفاصيل يرجى الرجوع إلى توثيق.

4. لنبدأ التدريب

نقوم باستنساخ المشروع والانتقال إلى دليل المشروع:

git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/

للتشغيل تحتاج إلى تثبيت المكتبات

pip install mlflow
pip install pysftp

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

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

$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .

بعد إدخال الأمر، سيتم إنشاء بيئة conda تلقائيًا وسيبدأ التدريب.
في المثال أعلاه، قمت بتمرير عدد فترات التدريب، والفئات التي نريد التقسيم إليها (يمكنك الاطلاع على القائمة الكاملة هنا) وعنوان خادمنا البعيد.
يمكن العثور على قائمة كاملة بالمعلمات المحتملة في ملف MLproject.

5. تقييم نتائج التعلم

بعد الانتهاء من التدريب، يمكننا الانتقال في المتصفح إلى عنوان الخادم الخاص بنا http://server_host:server_port

MLOps - كتاب الطبخ، الفصل 1

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

MLOps - كتاب الطبخ، الفصل 1

لكل مقياس يمكننا ملاحظة تاريخ التغييرات

MLOps - كتاب الطبخ، الفصل 1

أولئك. في الوقت الحالي، يمكننا تحليل النتائج في الوضع "اليدوي"، ويمكنك أيضًا إعداد التحقق التلقائي باستخدام واجهة برمجة تطبيقات MLflow.

6. قم بتسجيل النموذج

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

MLOps - كتاب الطبخ، الفصل 1

بعد أن نعطي نموذجنا اسمًا، يصبح له إصدار. إذا قمت بحفظ نموذج آخر بنفس الاسم، فسيتم ترقية الإصدار تلقائيًا.

MLOps - كتاب الطبخ، الفصل 1

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

MLOps - كتاب الطبخ، الفصل 1

لدينا أيضًا سهولة الوصول إلى جميع الموديلات

MLOps - كتاب الطبخ، الفصل 1

وإصداراتهم

MLOps - كتاب الطبخ، الفصل 1

كما في الفقرة السابقة، يمكن إجراء جميع العمليات باستخدام واجهة برمجة التطبيقات (API).

7. نشر النموذج

في هذه المرحلة، لدينا بالفعل نموذج (keras) مدرب. مثال لكيفية استخدامه:

class SegmentationModel:
    def __init__(self, tracking_uri, model_name):

        self.registry = RemoteRegistry(tracking_uri=tracking_uri)
        self.model_name = model_name
        self.model = self.build_model(model_name)

    def get_latest_model(self, model_name):
        registered_models = self.registry.get_registered_model(model_name)
        last_model = self.registry.get_last_model(registered_models)
        local_path = self.registry.download_artifact(last_model.run_id, 'model', './')
        return local_path

    def build_model(self, model_name):
        local_path = self.get_latest_model(model_name)

        return mlflow.keras.load_model(local_path)

    def predict(self, image):
        image = self.preprocess(image)
        result = self.model.predict(image)
        return self.postprocess(result)

    def preprocess(self, image):
        image = cv2.resize(image, (256, 256))
        image = image / 255.
        image = np.expand_dims(image, 0)
        return image

    def postprocess(self, result):
        return result

هنا self.registry هو مرة أخرى غلاف صغير فوق mlflow.tracking.MlflowClient، للراحة. النقطة المهمة هي أنني أقوم بالوصول إلى خادم بعيد وأبحث عن نموذج هناك بالاسم المحدد وأحدث إصدار إنتاج. بعد ذلك، أقوم بتنزيل القطعة الأثرية محليًا إلى المجلد ./model وإنشاء النموذج من هذا الدليل mlflow.keras.load_model(local_path). الآن يمكننا استخدام نموذجنا. يمكن لمطوري السيرة الذاتية (ML) تحسين النموذج بسهولة ونشر إصدارات جديدة.

في الختام

لقد قدمت نظامًا يسمح بما يلي:

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

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

اكتب ما هي المشاكل التي واجهتك ولم أعرضها؟
ما الذي ستضيفه إلى النظام ليلبي احتياجاتك؟
ما الأدوات والأساليب التي تستخدمها لحل كل المشكلات أو جزء منها؟

ملحوظة: سأترك رابطين:
مشروع جيثب - https://github.com/simbakot/mlflow_example
ملفلو - https://mlflow.org/
بريدي الإلكتروني الخاص بالعمل للأسئلة - [البريد الإلكتروني محمي]

تستضيف شركتنا بشكل دوري أحداثًا مختلفة لمتخصصي تكنولوجيا المعلومات، على سبيل المثال: في 8 يوليو الساعة 19:00 بتوقيت موسكو، سيكون هناك لقاء للسيرة الذاتية بتنسيق عبر الإنترنت، إذا كنت مهتمًا، يمكنك المشاركة والتسجيل هنا .

المصدر: www.habr.com

إضافة تعليق