MLOps - Cook book, chapter 1

MLOps - Cook book, chapter 1

Ўсім прывітанне! Я CV-распрацоўшчык у КРОК. Ужо 3 гады мы рэалізуем праекты ў вобласці CV. За гэты час чаго мы толькі не рабілі, напрыклад: маніторылі кіроўцаў, каб падчас руху яны не пілі, не палілі, па тэлефоне не размаўлялі, глядзелі на дарогу, а не сны ці ў аблокі; фіксавалі аматараў ездзіць па выдзеленых палосах і займаць некалькі месцаў на паркоўцы; сачылі за тым, каб працаўнікі насілі каскі, пальчаткі і да т.п.; ідэнтыфікавалі супрацоўніка, які хоча прайсці на аб'ект; падлічвалі ўсё, што толькі можна.

Я ўсё гэта да чаго?

У працэсе рэалізацыі праектаў мы набілі гузы, шмат гузоў, з часткай праблем вы ці знаёмыя, ці пазнаёміцеся ў будучыні.

Мадэлюем сітуацыю

Уявім, што мы ўладкаваліся ў маладую кампанію "N", дзейнасць якой звязана з ML. Працуем мы над ML (DL, CV) праектам, потым па якіх-небудзь чынніках перамыкаемся на іншую працу, увогуле які робіцца перапынак, і вяртаемся да сваёй або чужой нейроночке.

  1. Надыходзіць момант ісціны, трэба неяк успомніць на чым ты спыніўся, якія гіперпараметры спрабаваў і, самае галоўнае, да якіх вынікаў яны прывялі. Можа быць мноства варыянтаў, хто як захоўваў інфармацыю па ўсіх запусках: у галаве, канфігах, блакноце, у працоўным асяроддзі ў воблаку. Мне давялося бачыць варыянт, калі гіперпараметры захоўваліся ў выглядзе закаментаваных радкоў у кодзе, увогуле палёт фантазіі. А зараз уявіце, што вы вярнуліся не да свайго праекту, а да праекту чалавека, які пакінуў кампанію і ў спадчыну вам дастаўся код і мадэль пад назовам model_1.pb. Для паўнаты карціны і перадачы ўсяго болю, уявім, што вы яшчэ і пачатковец адмысловец.
  2. Ідзем далей. Для запуску кода нам і ўсім хто будзе з ім працаваць неабходна стварыць асяроддзе. Часта бывае, што і яго нам у спадчыну таксама з нейкіх прычын не пакінулі. Гэта таксама можа стаць нетрывіяльнай задачай. На гэты крок не хочацца марнаваць час, ці не так?
  3. Трэніруем мадэль (напрыклад, дэтэктар аўтамабіляў). Даходзім да моманту, калі яна становіцца вельмі нават нічога - самы час захаваць вынік. Назавем яе car_detection_v1.pb. Потым трэніруем яшчэ адну - car_detection_v2.pb. Праз некаторы час нашы калегі ці мы самі навучаем яшчэ і яшчэ, выкарыстоўваючы розныя архітэктуры. У выніку фарміруецца куча артэфактаў, інфармацыю аб якіх трэба старанна збіраць (але, рабіць мы гэта будзем пазней, у нас бо пакуль ёсць больш прыярытэтныя справы).
  4. Ну вось і ўсё! У нас ёсць мадэль! Мы можам прыступаць да навучання наступнай мадэлі, да распрацоўкі архітэктуры для вырашэння новай задачы ці можам пайсці папіць гарбату? А дэплоіць хто будзе?

Выяўляем праблемы

Праца над праектам або прадуктам - гэта праца многіх чалавек. А з цягам часу людзі сыходзяць і прыходзяць, праектаў становіцца больш, самі праекты становяцца больш складанымі. Так ці інакш, сітуацыі з апісанага вышэй цыклу (і не толькі) у тых ці іншых камбінацыях будуць сустракацца ад ітэрацыі да ітэрацыі. Усё гэта выліваецца ў марнаванне часу, блытаніну, нервы, магчыма - у незадаволенасць заказчыка, і ў канчатковым рахунку - у выпушчаныя грошы. Хоць усе мы звычайна ходзім па старых граблях, але мяркую, што ніхто пры гэтым не жадае штораз перажываць гэтыя моманты.

MLOps - Cook book, chapter 1

Такім чынам, мы прайшлі па адным цыкле распрацоўкі і бачым, што ёсць праблемы, якія трэба вырашыць. Для гэтага трэба:

  • зручна захоўваць вынікі працы;
  • зрабіць простым працэс уцягвання новых супрацоўнікаў;
  • спрасціць працэс разгортвання асяроддзя распрацоўкі;
  • наладзіць працэс версіявання мадэляў;
  • мець зручны спосаб валідацыі мадэляў;
  • знайсці прыладу кіравання станам мадэляў;
  • знайсці спосаб дастаўкі мадэляў у production.

Мабыць, неабходна прыдумаць workflow, які б дазваляў лёгка і зручна кіраваць гэтым жыццёвым цыклам? У такой практыкі ёсць назва MLOps

MLOps, ці DevOps для машыннага навучання, дазваляе камандам спецыялістаў па апрацоўцы і аналізу дадзеных і ІТ-адмыслоўцаў супрацоўнічаць, а таксама павялічваць тэмпы распрацоўкі і разгортванні мадэляў з дапамогай маніторынгу, праверкі і сістэмы кіравання для мадэляў машыннага навучання.

можаце пачытаць, Што пра ўсё гэта думаюць хлопцы з Google. З артыкула зразумела, што MLOps, дастаткова, аб'ёмная штука.

MLOps - Cook book, chapter 1

Далей у сваім артыкуле я апішу толькі частку працэсу. Для рэалізацыі я скарыстаюся прыладай MLflow, т.я. гэта open-source праект, для падлучэння неабходна невялікая колькасць кода і ёсць інтэграцыя з папулярнымі ml-фрэймворкамі. Вы можаце пашукаць на абшарах інтэрнэту іншыя прылады, напрыклад Kubeflow, SageMaker, Trains і г.д., і магчыма, падабраць той, які лепш падыходзіць пад вашыя патрэбы.

"Будуем" MLOps на прыкладзе выкарыстання прылады MLFlow

MLFlow - гэта платформа з адкрытым зыходным кодам для кіравання жыццёвым цыклам ml мадэляў (https://mlflow.org/).

MLflow уключае чатыры кампаненты:

  • MLflow Tracking - закрывае пытанні фіксацыі вынікаў і параметраў, якія да гэтага выніку прывялі;
  • MLflow Project - дазваляе пакаваць код і прайграць яго на любой платформе;
  • MLflow Models - адказвае за дэплой мадэляў у прод;
  • MLflow Registry - дазваляе захоўваць мадэлі і кіраваць іх станам у цэнтралізаваным сховішчы.

MLflow аперуе двума сутнасцямі:

  • запуск - гэта поўны цыкл навучання, параметры і метрыкі па якіх мы хочам рэгістраваць;
  • эксперымент - гэта "тэма" якой аб'яднаны запускі.

Усе крокі прыкладу рэалізаваны на аперацыйнай сістэме Ubuntu 18.04/XNUMX.

1. Разгортваем сервер

Для таго, каб мы маглі лёгка кіраваць нашым праектам і атрымліваць усю неабходную інфармацыю, разгорнем сервер. MLflow tracking server мае два асноўныя кампаненты:

  • backend store - адказвае за захоўванне інфармацыі аб зарэгістраваных мадэлях (падтрымлівае 4 СКБД: mysql, mssql, sqlite, and postgresql);
  • artifact store - адказвае за захоўванне артэфактаў (падтрымлівае 7 варыянтаў захоўвання: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP Server, SFTP Server, NFS, HDFS).

У якасці artifact store для прастаты возьмем 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

У якасці backend store возьмем 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

Для запуску сервера неабходна ўсталяваць наступныя python пакеты (раю стварыць асобнае віртуальнае асяроддзе):

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.
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 Project мае некалькі ўласцівасцяў:

  • Name - імя вашага праекта;
  • Environment - у маім выпадку conda_env паказвае на тое, што для запуску выкарыстоўваецца Anaconda і апісанне залежнасцяў знаходзіцца ў файле conda.yaml;
  • Entry Points - паказвае якія файлы і з якімі параметрамі мы можам запусціць (усе параметры пры запуску навучання аўтаматычна лагуюцца)

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 - Cook book, chapter 1

Тут мы бачым спіс усіх эксперыментаў (злева уверсе), а таксама інфармацыю па запускам (пасярэдзіне). Мы можам паглядзець больш падрабязную інфармацыю (параметры, метрыкі, артэфакты і нейкую дадатковую інфармацыю) па кожным запуску.

MLOps - Cook book, chapter 1

Па кожнай метрыцы мы можам назіраць гісторыю змены

MLOps - Cook book, chapter 1

Г.зн. на дадзены момант мы можам аналізаваць вынікі ў "ручным" рэжыме, таксама вы можаце наладзіць і аўтаматычную валідацыю пры дапамозе MLflow API.

6. Рэгіструем мадэль

Пасля таго як мы прааналізавалі нашу мадэль і вырашылі, што яна гатова да бою, прыступаем да яе рэгістрацыі для гэтага выбіраемы патрэбны нам запуск (як паказана ў папярэднім пункце) і ідзем уніз.

MLOps - Cook book, chapter 1

Пасля таго як мы далечы імя нашай мадэлі, у яе з'яўляецца версія. Пры захаванні іншай мадэлі з гэтым жа імем, версія аўтаматычна павысіцца.

MLOps - Cook book, chapter 1

Для кожнай мадэлі мы можам дадаць апісанне і абраць адно з трох станаў (Staging, Production, Archived), пасля мы пры дапамозе api можам звяртацца да гэтых станаў, што побач з версіяваннем дае дадатковую гнуткасць.

MLOps - Cook book, chapter 1

У нас таксама маецца зручны доступ да ўсіх мадэляў.

MLOps - Cook book, chapter 1

і іх версіям

MLOps - Cook book, chapter 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, для зручнасці. Сутнасць у тым, што я звяртаюся да выдаленага сервера і шукаю тамака мадэль з паказаным імем, прычым, самую апошнюю production версію. Далей спампоўваю артэфакт лакальна ў тэчку ./model і збіраю мадэль з гэтай дырэкторыі mlflow.keras.load_model(local_path). Усё зараз мы можам выкарыстоўваць нашу мадэль. CV (ML) распрацоўшчыкі могуць спакойна займацца паляпшэннем мадэлі і публікаваць новыя версіі.

У заключэнне

Я прадставіў сістэму якая дазваляе:

  • цэнтралізавана захоўваць інфармацыю аб ML мадэлях, ходзе і выніках навучання;
  • хутка разгортваць асяроддзе распрацоўкі;
  • сачыць і аналізаваць ход працы над мадэлямі;
  • зручна весці версіяванне і кіраваць станам мадэляў;
  • лёгка дэплоіць атрыманыя мадэлі.

Дадзены прыклад з'яўляецца цацачным і служыць кропкай старту для выбудоўвання вашай уласнай сістэмы, якая, магчыма, будзе складацца з аўтаматызацыю адзнакі вынікаў і рэгістрацыі мадэляў (п.5 і п.6 адпаведна) ці вы дадасце версіяванне датасетаў, ці можа яшчэ нешта ? Я спрабаваў данесці думку, што вам патрэбен MLOps у цэлым, MLflow толькі сродак дасягнення мэты.

Напішыце якія праблемы, з якімі вы сутыкаліся, я не адлюстраваў?
Што б вы дадалі ў сістэму, каб яна закрывала вашыя патрэбы?
Якія інструменты і падыходы карыстаецеся вы, каб закрыць усе ці частка праблем?

PS Пакіну пару спасылак:
github праект - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
Мая працоўная пошта, для пытанняў - [электронная пошта абаронена]

У нас у кампаніі перыядычна праводзяцца розныя мерапрыемствы для ІТ-спецыялістаў, напрыклад: 8-га ліпеня ў 19:00 па МСК будзе праходзіць мітап па CV у анлайн-фармаце, калі цікава, то можаце прыняць удзел, рэгістрацыя тут .

Крыніца: habr.com

Дадаць каментар