MLOps - کتاب آشپزی، فصل 1

MLOps - کتاب آشپزی، فصل 1

سلام به همه! من یک توسعه دهنده CV در CROC هستم. الان 3 سال است که پروژه هایی در زمینه CV اجرا می کنیم. در این مدت، ما کارهای زیادی انجام دادیم، به عنوان مثال: رانندگان را زیر نظر گرفتیم تا در حین رانندگی مشروب ننوشند، سیگار نکشند، با تلفن صحبت نکنند، به جاده نگاه کنند و به رویاها یا ابرها نگاه نکنند. ; ما افرادی را ثبت کردیم که در خطوط اختصاصی رانندگی می‌کنند و چندین جای پارک را اشغال می‌کنند. اطمینان حاصل شود که کارگران از کلاه ایمنی، دستکش و غیره استفاده می کنند. کارمندی را شناسایی کرد که می خواهد وارد مرکز شود. هر چه می توانستیم شمردیم.

این همه کار را برای چه انجام می دهم؟

در روند اجرای پروژه ها دست اندازها زدیم، دست اندازها زیاد، برخی از مشکلاتی که شما یا با آن آشنا هستید یا در آینده با آنها آشنا خواهید شد.

مدل سازی موقعیت

بیایید تصور کنیم که ما در یک شرکت جوان "N" شغلی پیدا کردیم که فعالیت های آن مربوط به ML است. ما روی یک پروژه 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 و غیره را در اینترنت جستجو کنید و شاید ابزاری را پیدا کنید که با نیازهای شما سازگارتر باشد.

"ساختن" MLO با استفاده از مثال استفاده از ابزار MLFlow

MLFlow یک پلت فرم منبع باز برای مدیریت چرخه عمر مدل های ml است (https://mlflow.org/).

MLflow شامل چهار جزء است:

  • ردیابی MLflow - مسائل مربوط به ثبت نتایج و پارامترهایی که منجر به این نتیجه شده است را پوشش می دهد.
  • پروژه MLflow - به شما امکان می دهد کد را بسته بندی کنید و آن را در هر پلتفرمی بازتولید کنید.
  • مدل های MLflow - مسئول استقرار مدل ها در تولید است.
  • MLflow Registry - به شما امکان می دهد مدل ها را ذخیره کرده و وضعیت آنها را در یک مخزن متمرکز مدیریت کنید.

MLflow روی دو موجودیت عمل می کند:

  • راه اندازی یک چرخه کامل از آموزش، پارامترها و معیارهایی است که می خواهیم با آن ثبت نام کنیم.
  • آزمایش یک "موضوع" است که با هم اجرا می شود.

تمام مراحل مثال بر روی سیستم عامل اوبونتو 18.04 پیاده سازی شده است.

1. سرور را مستقر کنید

برای اینکه بتوانیم پروژه خود را به راحتی مدیریت کنیم و تمام اطلاعات لازم را دریافت کنیم، یک سرور مستقر خواهیم کرد. سرور ردیابی MLflow دارای دو جزء اصلی است:

  • فروشگاه پشتیبان - مسئول ذخیره اطلاعات در مورد مدل های ثبت شده (از 4 DBMS پشتیبانی می کند: 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. ردیابی را اضافه کنید

برای اینکه نتایج آموزش ما از بین نرود، نسل های آینده توسعه دهندگان متوجه شوند که چه اتفاقی در حال رخ دادن است، و برای اینکه رفقای قدیمی و شما بتوانید با آرامش روند یادگیری را تجزیه و تحلیل کنید، باید ردیابی را اضافه کنیم. ردیابی به معنای ذخیره پارامترها، معیارها، مصنوعات و هرگونه اطلاعات اضافی در مورد شروع آموزش، در مورد ما، در سرور است.

به عنوان مثال، من یک کوچک ایجاد کردم پروژه در github در 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 Tracking از ثبت خودکار برای TensorFlow، Keras، Gluon XGBoost، LightGBM، Spark پشتیبانی می کند. اگر چارچوب یا کتابخانه خود را پیدا نکرده‌اید، همیشه می‌توانید به طور صریح وارد سیستم شوید. تمرین را شروع می کنیم. برچسب ها و پارامترهای ورودی را در سرور راه دور ثبت کنید.

چند خط و شما، مانند هر کس دیگری، به اطلاعات مربوط به همه راه اندازی ها دسترسی دارید. سرد؟

3. ما پروژه را ترسیم می کنیم

حالا اجازه دهید راه اندازی پروژه را آسان کنیم. برای این کار فایل MLproject و conda.yaml را به ریشه پروژه اضافه کنید.
پروژه ML

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

می توانید از docker به عنوان محیط زمان اجرا خود استفاده کنید، برای جزئیات بیشتر لطفاً به ادامه مطلب مراجعه کنید مستندات.

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

آن ها در حال حاضر می‌توانیم نتایج را در حالت «دستی» تجزیه و تحلیل کنیم و همچنین می‌توانید اعتبارسنجی خودکار را با استفاده از API MLflow تنظیم کنید.

6. مدل را ثبت کنید

پس از اینکه مدل خود را تجزیه و تحلیل کردیم و به این نتیجه رسیدیم که برای نبرد آماده است، آن را ثبت می کنیم، برای این کار پرتاب مورد نیاز خود را انتخاب می کنیم (همانطور که در پاراگراف قبلی نشان داده شده است) و به پایین می رویم.

MLOps - کتاب آشپزی، فصل 1

بعد از اینکه مدل خود را نام گذاری کردیم، یک نسخه دارد. اگر مدل دیگری را با همین نام ذخیره کنید، نسخه به طور خودکار ارتقا می یابد.

MLOps - کتاب آشپزی، فصل 1

برای هر مدل، می‌توانیم یک توضیح اضافه کنیم و یکی از سه حالت (Staging، Production، Archived) را انتخاب کنیم؛ سپس با استفاده از API، می‌توانیم به این حالت‌ها دسترسی داشته باشیم که در کنار نسخه‌سازی، انعطاف‌پذیری بیشتری را فراهم می‌کند.

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) می سازم. اکنون می توانیم از مدل خود استفاده کنیم. توسعه دهندگان CV (ML) می توانند به راحتی مدل را بهبود بخشند و نسخه های جدید را منتشر کنند.

در نتیجه

من سیستمی را ارائه کردم که اجازه می دهد:

  • به طور متمرکز اطلاعات مربوط به مدل های ML، پیشرفت آموزش و نتایج را ذخیره کنید.
  • استقرار سریع یک محیط توسعه؛
  • نظارت و تجزیه و تحلیل پیشرفت کار بر روی مدل ها؛
  • نسخه و مدیریت وضعیت مدل ها راحت است.
  • استقرار مدل های به دست آمده آسان است.

این مثال یک اسباب بازی است و به عنوان نقطه شروعی برای ساختن سیستم خود عمل می کند، که ممکن است شامل خودکارسازی ارزیابی نتایج و ثبت مدل ها باشد (به ترتیب نکات 5 و 6) یا شما نسخه سازی مجموعه داده ها را اضافه کنید، یا شاید چیز دیگری؟ نکته ای که من سعی کردم به آن اشاره کنم این است که شما به طور کلی به MLO ها نیاز دارید، MLflow فقط وسیله ای برای رسیدن به هدف است.

بنویسید با چه مشکلاتی مواجه شدید که نمایش ندادم؟
چه چیزی به سیستم اضافه می کنید تا نیازهای شما را برآورده کند؟
برای حل همه یا بخشی از مشکلات از چه ابزارها و رویکردهایی استفاده می کنید؟

PS من چند لینک می گذارم:
پروژه github - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
ایمیل کاری من برای سوالات - [ایمیل محافظت شده]

شرکت ما به طور دوره ای رویدادهای مختلفی را برای متخصصان فناوری اطلاعات میزبانی می کند، به عنوان مثال: در 8 ژوئیه در ساعت 19:00 به وقت مسکو یک جلسه CV در قالب آنلاین برگزار می شود، اگر علاقه مند هستید، می توانید شرکت کنید، ثبت نام کنید. اینجا .

منبع: www.habr.com

اضافه کردن نظر