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

Инак, мо як давраи тараккиётро аз cap гузаронидем ва мебинем, ки проблемахое хастанд, ки бояд хал шаванд. Барои ин ба шумо лозим аст:

  • ба таври қулай нигоҳ доштани натиҷаҳои кор;
  • раванди ҷалби кормандони навро содда гардонад;
  • содда кардани раванди ҷойгиркунии муҳити рушд;
  • раванди версияи моделро танзим кунед;
  • роҳи қулай барои тасдиқи моделҳо дошта бошед;
  • воситаи намунавии идоракунии давлатиро пайдо кунед;
  • роххои ба истехсолот расондани модельхоро пайдо кунанд.

Эҳтимол, зарур аст, ки ҷараёни кореро таҳия кунед, ки ба шумо имкон диҳад, ки ин давраи ҳаётро ба осонӣ ва бароҳат идора кунед? Ин амал MLOps номида мешавад

MLOps ё DevOps барои омӯзиши мошинсозӣ ба гурӯҳҳои илмии маълумот ва IT имкон медиҳад, ки тавассути мониторинг, тасдиқ ва идоракунӣ барои моделҳои омӯзиши мошин ҳамкорӣ кунанд ва суръати таҳия ва ҷобаҷогузории моделҳоро афзоиш диҳанд.

Шумо метавонед хонедБачаҳои Google дар бораи ин ҳама чӣ фикр мекунанд? Аз мақола маълум мешавад, ки MLOps як чизи хеле ҳаҷм аст.

MLOps - Китоби пухтупаз, боби 1

Минбаъд дар мақолаи худ ман танҳо як қисми равандро тавсиф мекунам. Барои татбиқ, ман асбоби MLflow -ро истифода хоҳам кард, зеро... Ин як лоиҳаи кушодаасос аст, барои пайвастшавӣ миқдори ками код лозим аст ва ҳамгироӣ бо чаҳорчӯбаҳои маъмули ml мавҷуд аст. Шумо метавонед дар Интернет асбобҳои дигар, аз қабили Kubeflow, SageMaker, Trains ва ғайраро ҷустуҷӯ кунед ва шояд якееро пайдо кунед, ки ба ниёзҳои шумо мувофиқтар бошад.

"Сохтани" MLOps бо истифода аз мисоли истифодаи абзори MLFlow

MLFlow платформаи кушодаасос барои идоракунии давраи ҳаёти моделҳои ml мебошад (https://mlflow.org/).

MLflow чор ҷузъро дар бар мегирад:

  • MLflow Tracking - масъалаҳои сабти натиҷаҳо ва параметрҳоеро, ки ба ин натиҷа овардаанд, фаро мегирад;
  • Лоиҳаи MLflow - ба шумо имкон медиҳад, ки кодро бастабандӣ кунед ва онро дар ҳама гуна платформа дубора тавлид кунед;
  • Моделҳои MLflow - барои ҷойгиркунии моделҳо дар истеҳсолот масъуланд;
  • Реестри MLflow - ба шумо имкон медиҳад, ки моделҳоро нигоҳ доред ва ҳолати онҳоро дар як анбори мутамарказ идора кунед.

MLflow дар ду объект амал мекунад:

  • оғоз як давраи пурраи омӯзиш, параметрҳо ва ченакҳо мебошад, ки мо мехоҳем ба қайд гирем;
  • Таҷриба "мавзӯъ"ест, ки якҷоя кор мекунад.

Ҳамаи қадамҳои мисол дар системаи оператсионии Ubuntu 18.04 амалӣ карда мешаванд.

1. Серверро ҷойгир кунед

Барои он ки мо лоиҳаи худро ба осонӣ идора кунем ва ҳама маълумоти заруриро гирем, мо серверро ҷойгир мекунем. Сервери пайгирии MLflow ду ҷузъи асосӣ дорад:

  • мағозаи backend - барои нигоҳ доштани маълумот дар бораи моделҳои сабтшуда масъул аст (4 DBMS-ро дастгирӣ мекунад: mysql, mssql, sqlite ва postgresql);
  • Дӯкони артефакт - барои нигоҳдории артефактҳо масъул аст (7 имконоти нигоҳдории онро дастгирӣ мекунад: Amazon S3, Azure Blob Storage, Google Cloud Storage, сервери FTP, Server SFTP, 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

Барои оғоз кардани сервер, шумо бояд бастаҳои зерини 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 дар Керас барои тақсим кардани ҳама чизест, ки дар он аст Маҷмӯи маълумоти 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-ро истифода мебарам, Анаконда бояд дар компютери шумо насб карда шавад (аммо шумо метавонед бо насб кардани ҳама бастаҳои заруриро худатон ва бозӣ бо параметрҳои оғозёбӣ аз ин мушкилот даст кашед).

Ҳама марҳилаҳои омодагӣ ба анҷом расиданд ва мо метавонем ба оғози омӯзиш шурӯъ кунем. Аз решаи лоиҳа:

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

Пас аз ворид кардани фармон, муҳити конда ба таври худкор эҷод карда мешавад ва омӯзиш оғоз мешавад.
Дар мисоли дар боло овардашуда, ман шумораи давраҳоро барои омӯзиш, категорияҳоеро, ки мо мехоҳем ба онҳо тақсим кунем (шумо метавонед рӯйхати пурраро бубинед) гузаштам. дар ин ҷо) ва суроғаи сервери дурдасти мо.
Рӯйхати пурраи параметрҳои имконпазирро дар файли MLproject пайдо кардан мумкин аст.

5. Баҳодиҳии натиҷаҳои омӯзиш

Пас аз ба итмом расонидани омӯзиш, мо метавонем дар браузер ба суроғаи сервери худ равем http://server_host:server_port

MLOps - Китоби пухтупаз, боби 1

Дар ин ҷо мо рӯйхати ҳама таҷрибаҳоро мебинем (аз тарафи чап), инчунин маълумот дар бораи давидан (мобайн). Мо метавонем маълумоти муфассалро (параметрҳо, ченакҳо, артефактҳо ва баъзе маълумоти иловагӣ) барои ҳар як оғозёбӣ бубинем.

MLOps - Китоби пухтупаз, боби 1

Барои ҳар як метрика мо метавонем таърихи тағиротро мушоҳида кунем

MLOps - Китоби пухтупаз, боби 1

Онхое. Дар айни замон, мо метавонем натиҷаҳоро дар ҳолати "дастӣ" таҳлил кунем ва шумо инчунин метавонед бо истифода аз MLflow API тасдиқи автоматиро танзим кунед.

6. Моделро ба қайд гиред

Пас аз он ки мо модели худро таҳлил кардем ва қарор додем, ки он ба ҷанг омода аст, мо онро ба қайд мегирем, барои ин мо оғози лозимаро интихоб мекунем (тавре ки дар параграфи қаблӣ нишон дода шудааст) ва поён меравем.

MLOps - Китоби пухтупаз, боби 1

Пас аз он ки мо модели худро ном медиҳем, он версия дорад. Агар шумо модели дигареро бо ҳамон ном захира кунед, версия ба таври худкор такмил дода мешавад.

MLOps - Китоби пухтупаз, боби 1

Барои ҳар як модел, мо метавонем тавсифро илова кунем ва яке аз се ҳолатро интихоб кунем (Staging, Production, Archived); баъдан, бо истифода аз API, мо метавонем ба ин ҳолат дастрасӣ пайдо кунем, ки дар баробари версиясозӣ чандирии иловагиро таъмин мекунад.

MLOps - Китоби пухтупаз, боби 1

Мо инчунин ба ҳама моделҳо дастрасии осон дорем

MLOps - Китоби пухтупаз, боби 1

ва версияҳои онҳо

MLOps - Китоби пухтупаз, боби 1

Тавре ки дар параграфи қаблӣ, ҳама амалҳоро метавон бо истифода аз API анҷом дод.

7. Моделро ҷойгир кунед

Дар ин марҳила, мо аллакай модели омӯзонидашуда (керас) дорем. Намунаи он, ки чӣ тавр шумо метавонед онро истифода баред:

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) ё шумо версияи маҷмӯи додаҳоро илова мекунед ё шояд чизи дигар? Нуктае, ки ман мехостам баён кунам, ин аст, ки ба шумо дар маҷмӯъ MLOps лозим аст, MLflow танҳо як воситаи ба ҳадаф расидан аст.

Нависед, ки шумо бо кадом мушкилот дучор шудаед, ки ман нишон надодаам?
Шумо ба система барои қонеъ кардани ниёзҳои шумо чӣ илова мекардед?
Шумо барои ҳалли ҳама ё як қисми мушкилот кадом воситаҳо ва равишҳоро истифода мебаред?

PS Ман якчанд истинод мегузорам:
лоиҳаи github - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
почтаи кории ман барои саволҳо - [почтаи электронӣ ҳифз карда шудааст]

Ширкати мо давра ба давра чорабиниҳои гуногунро барои мутахассисони IT баргузор мекунад, масалан: 8 июл соати 19:00 бо вақти Маскав вохӯрии резюме дар формати онлайн баргузор мешавад, агар таваҷҷӯҳ дошта бошед, метавонед иштирок кунед, бақайдгирӣ дар ин ҷо .

Манбаъ: will.com

Илова Эзоҳ