MLOps - Pazandachilik kitobi, 1-bob

MLOps - Pazandachilik kitobi, 1-bob

Hammaga salom! Men CROCda CV ishlab chiquvchiman. Biz 3 yildan beri CV sohasida loyihalarni amalga oshirmoqdamiz. Bu vaqt ichida biz juda ko'p ishlarni qildik, masalan: biz haydovchilarni haydash paytida ichmasliklari, chekishmasliklari, telefonda gaplashmasliklari, tushlarga yoki bulutlarga emas, balki yo'lga qarashlari uchun kuzatdik. ; Biz ishqibozlarning maxsus bo'laklarda haydashini va bir nechta to'xtash joylarini egallashini qayd etdik; ishchilarning dubulg'a, qo'lqop va boshqalar kiyishini ta'minladi; ob'ektga kirmoqchi bo'lgan xodimni aniqladi; Biz hamma narsani hisoblab chiqdik.

Bularning barchasini nima uchun qilyapman?

Loyihalarni amalga oshirish jarayonida biz to'qnashuvlarga duch keldik, juda ko'p, ba'zi muammolar sizga tanish yoki kelajakda tanish bo'ladi.

Keling, vaziyatni simulyatsiya qilaylik

Tasavvur qilaylik, biz "N" yosh kompaniyasiga ishga joylashdik, uning faoliyati ML bilan bog'liq. Biz ML (DL, CV) loyihasi ustida ishlaymiz, keyin negadir boshqa ishga o'tamiz, odatda tanaffus qilamiz va o'zimizning yoki boshqa birovning neyroniga qaytamiz.

  1. Haqiqat vaqti keladi, siz qayerda to'xtaganingizni, qanday giperparametrlarni sinab ko'rganingizni va eng muhimi, ular qanday natijalarga olib kelganligini qandaydir tarzda eslab qolishingiz kerak. Barcha ishga tushirishlarda ma'lumotni kim saqlaganligi uchun ko'plab variantlar bo'lishi mumkin: boshda, konfiguratsiyalarda, bloknotda, bulutdagi ish muhitida. Men hiperparametrlar kodda sharhlangan satrlar sifatida saqlangan variantni, umuman olganda, hayoliy parvozni ko'rdim. Endi tasavvur qiling-a, siz loyihangizga emas, balki kompaniyani tark etgan shaxsning loyihasiga qaytdingiz va model_1.pb nomli kod va modelni meros qilib oldingiz. Rasmni to'ldirish va barcha og'riqlarni etkazish uchun siz ham boshlang'ich mutaxassis ekanligingizni tasavvur qilaylik.
  2. Davom etishga ruxsat. Kodni ishga tushirish uchun biz va u bilan ishlaydigan har bir kishi muhit yaratishi kerak. Ko'pincha shunday bo'ladiki, negadir ular buni bizga meros qilib qoldirishmadi. Bu ham ahamiyatsiz vazifaga aylanishi mumkin. Siz bu qadamda vaqtni behuda sarflashni xohlamaysiz, shunday emasmi?
  3. Biz modelni o'rgatamiz (masalan, avtomobil detektori). Biz juda yaxshi bo'ladigan nuqtaga etib boramiz - natijani saqlab qolish vaqti keldi. Keling, uni car_detection_v1.pb deb ataymiz. Keyin biz boshqasini o'rgatamiz - car_detection_v2.pb. Biroz vaqt o'tgach, bizning hamkasblarimiz yoki o'zimiz turli xil arxitekturalardan foydalangan holda ko'proq va ko'proq o'rgatamiz. Natijada, ma'lumotni mashaqqatli to'plash kerak bo'lgan bir qator artefaktlar hosil bo'ladi (lekin buni keyinroq qilamiz, chunki hozirda bizda ustuvor masalalar bor).
  4. OK, endi hammasi tugadi! Bizda model bor! Keyingi modelni o'rgatish, yangi muammoni hal qilish uchun arxitekturani ishlab chiqishni boshlay olamizmi yoki choy ichishimiz mumkinmi? Va kim joylashtiradi?

Muammolarni aniqlash

Loyiha yoki mahsulot ustida ishlash ko'p odamlarning ishi. Va vaqt o'tishi bilan odamlar ketishadi va kelishadi, ko'proq loyihalar mavjud va loyihalarning o'zi murakkablashadi. Qanday bo'lmasin, yuqorida tavsiflangan tsikldagi vaziyatlar (va nafaqat) ma'lum kombinatsiyalarda iteratsiyadan iteratsiyaga qadar sodir bo'ladi. Bularning barchasi vaqtni behuda sarflashga, chalkashliklarga, asabiylashishga, ehtimol mijozlarning noroziligiga va oxir-oqibat pul yo'qotilishiga olib keladi. Garchi biz hammamiz odatda bir xil eski rakega ergashsak ham, men ishonamanki, hech kim bu daqiqalarni qayta-qayta yashashni xohlamaydi.

MLOps - Pazandachilik kitobi, 1-bob

Shunday qilib, biz bir rivojlanish tsiklidan o'tdik va hal qilinishi kerak bo'lgan muammolar mavjudligini ko'ramiz. Buni amalga oshirish uchun sizga kerak:

  • ish natijalarini qulay saqlash;
  • yangi xodimlarni jalb qilish jarayonini soddalashtirish;
  • ishlab chiqish muhitini joylashtirish jarayonini soddalashtirish;
  • model versiyasini yaratish jarayonini sozlash;
  • modellarni tekshirishning qulay usuliga ega bo'lish;
  • davlat boshqaruvining namunaviy vositasini topish;
  • modellarni ishlab chiqarishga etkazish yo'lini topish.

Ko'rinib turibdiki, ushbu hayot aylanishini oson va qulay boshqarishga imkon beradigan ish jarayonini o'ylab topish kerakmi? Ushbu amaliyot MLOps deb ataladi

MLOps yoki DevOps mashinani o'rganish uchun ma'lumotlar fanlari va IT guruhlariga hamkorlik qilish va mashinani o'rganish modellarini monitoring qilish, tekshirish va boshqarish orqali modelni ishlab chiqish va joylashtirish tezligini oshirish imkonini beradi.

Mumkin hurmat qilmoqGoogle yigitlari bularning barchasi haqida qanday fikrda? Maqolada ko'rinib turibdiki, MLOps juda katta hajmli narsa.

MLOps - Pazandachilik kitobi, 1-bob

Keyingi maqolamda men jarayonning faqat bir qismini tasvirlab beraman. Amalga oshirish uchun men MLflow vositasidan foydalanaman, chunki... Bu ochiq manbali loyiha, ulanish uchun oz miqdorda kod talab qilinadi va mashhur ml ramkalar bilan integratsiya mavjud. Siz Internetda Kubeflow, SageMaker, Trains va boshqalar kabi boshqa vositalarni qidirishingiz mumkin va ehtimol sizning ehtiyojlaringizga mos keladiganini topishingiz mumkin.

MLFlow vositasidan foydalanish misolidan foydalanib, MLOplarni "qurish"

MLFlow - ml modellarining hayot aylanishini boshqarish uchun ochiq manba platformasi (https://mlflow.org/).

MLflow to'rtta komponentni o'z ichiga oladi:

  • MLflow Tracking - bu natijaga olib kelgan natijalar va parametrlarni qayd etish masalalarini qamrab oladi;
  • MLflow loyihasi - kodni paketlash va uni istalgan platformada ko'paytirish imkonini beradi;
  • MLflow modellari - ishlab chiqarishga modellarni qo'llash uchun javobgardir;
  • MLflow Registry - markazlashtirilgan omborda modellarni saqlash va ularning holatini boshqarish imkonini beradi.

MLflow ikkita ob'ektda ishlaydi:

  • ishga tushirish - biz ro'yxatdan o'tmoqchi bo'lgan trening, parametrlar va ko'rsatkichlarning to'liq tsikli;
  • Tajriba - bu birgalikda ishlaydigan "mavzu".

Misolning barcha bosqichlari Ubuntu 18.04 operatsion tizimida amalga oshiriladi.

1. Serverni ishga tushiring

Loyihamizni osongina boshqarishimiz va barcha kerakli ma'lumotlarni olishimiz uchun biz serverni joylashtiramiz. MLflow kuzatuv serveri ikkita asosiy komponentga ega:

  • backend do'koni - ro'yxatdan o'tgan modellar haqidagi ma'lumotlarni saqlash uchun javob beradi (4 ta DBMSni qo'llab-quvvatlaydi: mysql, mssql, sqlite va postgresql);
  • artefaktlar do'koni - artefaktlarni saqlash uchun javob beradi (7 saqlash variantini qo'llab-quvvatlaydi: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP server, SFTP Server, NFS, HDFS).

Sifatda artefaktlar do'koni Oddiylik uchun sftp serverini olaylik.

  • guruh yaratish
    $ sudo groupadd sftpg
  • foydalanuvchi qo'shing va unga parol o'rnating
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • bir nechta kirish sozlamalarini sozlash
    $ 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.-ga bir necha qator qo'shing
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • xizmatni qayta ishga tushiring
    $ sudo systemctl restart sshd

Sifatda backend do'koni Keling, postgresql ni olaylik.

$ 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

Serverni ishga tushirish uchun quyidagi python paketlarini o'rnatishingiz kerak (alohida virtual muhit yaratishni tavsiya qilaman):

pip install mlflow
pip install pysftp

Serverimizni ishga tushiramiz

$ 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. Kuzatuvni qo'shing

Mashg'ulotlarimiz natijalari yo'qolmasligi, ishlab chiquvchilarning kelajak avlodlari nima bo'layotganini tushunishlari va katta o'rtoqlar va siz o'quv jarayonini xotirjam tahlil qila olishlari uchun biz kuzatuvni qo'shishimiz kerak. Kuzatuv parametrlarni, ko'rsatkichlarni, artefaktlarni va trening boshlanishi haqidagi qo'shimcha ma'lumotlarni, bizning holatlarimizda, serverda saqlashni anglatadi.

Misol uchun, men kichik yaratdim github-dagi loyiha Keras-da mavjud bo'lgan hamma narsani segmentlash uchun COCO ma'lumotlar to'plami. Kuzatuvni qo'shish uchun mlflow_training.py faylini yaratdim.

Mana eng qiziqarli voqealar sodir bo'lgan satrlar:

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)

Bu erda self.remote_server - mlflow.tracking usullari ustidagi kichik o'ram. MlflowClient (men buni qulaylik uchun qildim), uning yordamida men tajriba yarataman va uni serverda ishga tushiraman. Keyinchalik, ishga tushirish natijalari qayerda birlashtirilishi kerakligini ko'rsataman (mlflow.set_tracking_uri(self.tracking_uri)). Men mlflow.keras.autolog() ni avtomatik yozishni yoqaman. Hozirda MLflow Tracking TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark uchun avtomatik jurnalni qo'llab-quvvatlaydi. Agar siz o'zingizning ramka yoki kutubxonangizni topmagan bo'lsangiz, har doim aniq tizimga kirishingiz mumkin. Biz mashg'ulotlarni boshlaymiz. Masofaviy serverda teglar va kiritish parametrlarini ro'yxatdan o'tkazing.

Bir nechta satr va siz, boshqalar kabi, barcha ishga tushirishlar haqida ma'lumotga egasiz. Ajoyibmi?

3. Biz loyihani tuzamiz

Endi loyihani ishga tushirishni osonlashtiramiz. Buning uchun loyiha ildiziga MLproject va conda.yaml faylini qo'shing.
MLloyiha

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 loyihasi bir nechta xususiyatlarga ega:

  • Ism - loyihangizning nomi;
  • Muhit - mening holatimda, conda_env Anaconda ishga tushirish uchun ishlatilganligini va qaramlik tavsifi conda.yaml faylida ekanligini ko'rsatadi;
  • Kirish nuqtalari - qaysi fayllar va qaysi parametrlar bilan ishlashimiz mumkinligini ko'rsatadi (ta'lim boshlanganda barcha parametrlar avtomatik ravishda qayd etiladi)

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

Ish vaqti muhiti sifatida docker dan foydalanishingiz mumkin, batafsil ma'lumot uchun qarang hujjatlar.

4. Keling, mashg'ulotlarni boshlaylik

Biz loyihani klonlaymiz va loyiha katalogiga o'tamiz:

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

Ishga tushirish uchun kutubxonalarni o'rnatishingiz kerak

pip install mlflow
pip install pysftp

Chunki conda_env ishlatadigan misolda, Anaconda sizning kompyuteringizga o'rnatilgan bo'lishi kerak (lekin siz barcha kerakli paketlarni o'zingiz o'rnatish va ishga tushirish parametrlari bilan o'ynash orqali buni hal qilishingiz mumkin).

Barcha tayyorgarlik bosqichlari tugallandi va biz treningni boshlashimiz mumkin. Loyiha ildizidan:

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

Buyruqni kiritgandan so'ng, avtomatik ravishda konda muhiti yaratiladi va trening boshlanadi.
Yuqoridagi misolda men o'qitish uchun davrlar sonini, biz ajratmoqchi bo'lgan toifalarni o'tkazdim (to'liq ro'yxatni ko'rishingiz mumkin) shu yerda) va masofaviy serverimiz manzili.
Mumkin bo'lgan parametrlarning to'liq ro'yxatini MLproject faylida topish mumkin.

5. O'quv natijalarini baholash

Treningni tugatgandan so'ng biz brauzerda serverimiz manziliga o'tishimiz mumkin http://server_host:server_port

MLOps - Pazandachilik kitobi, 1-bob

Bu erda biz barcha tajribalar ro'yxatini (yuqori chap), shuningdek, yugurishlar haqidagi ma'lumotlarni (o'rtada) ko'ramiz. Biz har bir ishga tushirish uchun batafsil ma'lumotni (parametrlar, ko'rsatkichlar, artefaktlar va ba'zi qo'shimcha ma'lumotlar) ko'rishimiz mumkin.

MLOps - Pazandachilik kitobi, 1-bob

Har bir ko'rsatkich uchun biz o'zgarishlar tarixini kuzatishimiz mumkin

MLOps - Pazandachilik kitobi, 1-bob

Bular. Ayni paytda biz natijalarni "qo'lda" rejimda tahlil qilishimiz mumkin va siz MLflow API yordamida avtomatik tekshirishni ham o'rnatishingiz mumkin.

6. Modelni ro'yxatdan o'tkazing

Modelimizni tahlil qilib, u jangga tayyor deb qaror qilganimizdan so'ng, biz uni ro'yxatdan o'tkazishni davom ettiramiz, buning uchun biz kerakli ishga tushirishni tanlaymiz (oldingi xatboshida ko'rsatilganidek) va pastga tushamiz.

MLOps - Pazandachilik kitobi, 1-bob

Modelimizga nom berganimizdan so'ng, uning versiyasi mavjud. Agar siz xuddi shu nomdagi boshqa modelni saqlasangiz, versiya avtomatik ravishda yangilanadi.

MLOps - Pazandachilik kitobi, 1-bob

Har bir model uchun tavsif qo'shishimiz va uchta holatdan birini tanlashimiz mumkin (Staging, Production, Archived); Keyinchalik, API yordamida biz ushbu holatlarga kirishimiz mumkin, bu versiyalar bilan bir qatorda qo'shimcha moslashuvchanlikni ta'minlaydi.

MLOps - Pazandachilik kitobi, 1-bob

Shuningdek, bizda barcha modellarga oson kirish imkoniyati mavjud

MLOps - Pazandachilik kitobi, 1-bob

va ularning versiyalari

MLOps - Pazandachilik kitobi, 1-bob

Oldingi paragrafda bo'lgani kabi, barcha operatsiyalar API yordamida amalga oshirilishi mumkin.

7. Modelni ishga tushiring

Ushbu bosqichda bizda allaqachon o'qitilgan (keras) model mavjud. Undan qanday foydalanishingiz mumkinligiga misol:

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

Bu yerda self.registry yana mlflow.tracking.MlflowClient ustidagi kichik o'ram bo'lib, qulaylik uchun. Gap shundaki, men uzoq serverga kiraman va u erda ko'rsatilgan nomga ega modelni va eng so'nggi ishlab chiqarish versiyasini qidiraman. Keyin artefaktni mahalliy sifatida ./model jildiga yuklab olaman va mlflow.keras.load_model(local_path) katalogidan modelni yarataman. Endi biz modelimizdan foydalanishimiz mumkin. CV (ML) ishlab chiquvchilari modelni osongina yaxshilashlari va yangi versiyalarini nashr etishlari mumkin.

Xulosa

Men quyidagilarga imkon beradigan tizimni taqdim etdim:

  • ML modellari, mashg'ulotlarning borishi va natijalari haqidagi ma'lumotlarni markazlashtirilgan holda saqlash;
  • rivojlanish muhitini tezda joylashtirish;
  • modellar bo'yicha ishlarning borishini kuzatish va tahlil qilish;
  • modellarning holatini versiyalash va boshqarish qulay;
  • Olingan modellarni joylashtirish oson.

Ushbu misol o'yinchoq bo'lib, natijalarni baholashni avtomatlashtirish va modellarni ro'yxatdan o'tkazishni o'z ichiga olishi mumkin bo'lgan o'z tizimingizni yaratish uchun boshlang'ich nuqta bo'lib xizmat qiladi (mos ravishda 5 va 6-bandlar) yoki siz ma'lumotlar to'plamining versiyalarini qo'shasiz yoki boshqa biror narsa? Men aytmoqchi bo'lgan narsa shundaki, sizga umuman MLOp kerak, MLflow - bu shunchaki maqsadga erishish vositasi.

Men ko'rsatmagan qanday muammolarga duch kelganingizni yozing?
Sizning ehtiyojlaringizni qondirish uchun tizimga nima qo'shgan bo'lardingiz?
Muammolarning barchasini yoki bir qismini hal qilish uchun qanday vositalar va yondashuvlardan foydalanasiz?

PS Men bir nechta havolalarni qoldiraman:
github loyihasi - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
Savollar uchun mening ish elektron pochtam - [elektron pochta bilan himoyalangan]

Bizning kompaniyamiz vaqti-vaqti bilan IT-mutaxassislari uchun turli tadbirlarni o'tkazadi, masalan: 8-iyul kuni Moskva vaqti bilan soat 19:00 da onlayn formatda CV uchrashuvi bo'lib o'tadi, agar qiziqsangiz, ishtirok etishingiz mumkin, ro'yxatdan o'tish. shu yerda .

Manba: www.habr.com

a Izoh qo'shish