MLOps — Recepte, 1. nodaļa

MLOps — Recepte, 1. nodaļa

Sveiki visiem! Es esmu CV izstrādātājs uzņēmumā KROK. Jau trÄ«s gadus mēs Ä«stenojam projektus CV jomā. Å ajā laikā mēs esam paveikuÅ”i daudz, piemēram: uzraudzÄ«jām autovadÄ«tājus, lai ceļojuma laikā viņi nedzertu, nesmēķētu, nerunātu pa telefonu, skatÄ«tos uz ceļu, nevis sapņos vai mākoņos; reÄ£istrējām tos, kuri mÄ«l braukt pa atseviŔķām joslām un ieņemt vairākas stāvvietas; kontrolējām, lai darbinieki valkātu Ä·iveres, cimdus utt.; identificējām darbinieku, kurÅ” vēlas iekļūt objektā; saskaitÄ«jām visu, ko vien varēja.

Kāpēc es par to runāju?

Projektu realizācijas procesā mēs esam saskāruÅ”ies ar grÅ«tÄ«bām, daudzām grÅ«tÄ«bām, ar daļu no problēmām jÅ«s varat bÅ«t pazÄ«stami vai arÄ« iepazÄ«sieties nākotnē.

Modelēsim situāciju

Iedomāsimies, ka mēs esam sākuÅ”i strādāt jaunā uzņēmumā ā€œNā€, kura darbÄ«ba saistÄ«ta ar ML. Mēs strādājam pie ML (DL, CV) projekta, pēc tam kādu iemeslu dēļ mēs pārslēdzam uzmanÄ«bu uz citu darbu, kopumā veicam pārtraukumu un atgriežamies pie savas vai citas neironu sistēmas.

  1. Nāk brÄ«dis patiesÄ«bai, ir jāatceras, pie kā tu esi apstājies, kādus hiperparametrus esi izmēģinājis un, pats galvenais, kādi rezultāti tie ir devuÅ”i. Var bÅ«t daudz variantu, kā cilvēki ir glabājuÅ”i informāciju par visiem palaiÅ”anas darbiem: galvā, konfigurācijās, piezÄ«mju grāmatiņā, darba vidē mākoņos. Man ir bijusi iespēja redzēt variantu, kad hiperparametri tika glabāti kā komentētas rindas kodā, vispār - radoÅ”uma lidojums. Un tagad iedomājieties, ka jÅ«s atgriezāties nevis pie sava projekta, bet pie cilvēka projekta, kurÅ” pameta uzņēmumu, un jums mantojuma veidā palika kods un modelis ar nosaukumu model_1.pb. Lai pilnÄ«bā izprastu situāciju un nodotu visas cieÅ”anas, iedomāsimies, ka esat arÄ« sākuma lÄ«meņa speciālists.
  2. Turpināsim. Lai palaistu kodu, mums un visiem, kas ar to strādās, ir nepiecieÅ”ams izveidot vidi. Bieži vien izrādās, ka Ŕī vide mums arÄ« par kādiem iemesliem nav atstāta. Tas arÄ« var bÅ«t ne vienkārÅ”s uzdevums. Å im solim negribas tērēt laiku, vai ne?
  3. Mēs apmācām modeli (piemēram, automaŔīnu detektoru). Nonākam lÄ«dz brÄ«dim, kad tas ir diezgan labs — ir Ä«stais laiks saglabāt rezultātu. Nosauksim to par car_detection_v1.pb. Pēc tam apmācām vēl vienu — car_detection_v2.pb. Pēc kādā laika mÅ«su kolēģi vai mēs paÅ”i apmācam vēl un vēl, izmantojot dažādas arhitektÅ«ras. Galu galā veidojas kaudze artefaktu, kuru informāciju jākrāj (bet to darÄ«sim vēlāk, jo mums ir prioritārāki darbi).
  4. Nu, lÅ«k, viss ir gatavs! Mums ir modelis! Mēs varam sākt nākamā modeļa apmācÄ«bu, izstrādāt arhitektÅ«ru jaunai uzdevuma risināŔanai vai varbÅ«t doties dzert tēju? Bet kurÅ” veiks izvietoÅ”anu?

Identificējam problēmas

Darbs pie projekta vai produkta ir daudzu cilvēku darbs. Laika gaitā cilvēki nāk un iet, projektu paliek arvien vairāk, paÅ”i projekti kļūst sarežģītāki. Tā vai citādi situācijas no iepriekÅ” minētā cikla (un ne tikai) dažādās kombinācijās atkārtosies katrā iterācijā. Viss tas noved pie laika zuduma, neskaidrÄ«bām, nervu spriedzes, iespējams — klienta neapmierinātÄ«bas un, galu galā — pie zaudētiem ienākumiem. Lai arÄ« mēs parasti staigājam pa vecām grābļiem, tomēr neviens nevēlas atkal un atkal pārdzÄ«vot Å”os brīžus.

MLOps — Recepte, 1. nodaļa

Tātad, mēs esam izgājuÅ”i cauri vienam izstrādes ciklam un redzam, ka ir problēmas, kuras jārisina. Lai to izdarÄ«tu, ir nepiecieÅ”ams:

  • ērti glabāt darba rezultātus;
  • padarÄ«t darbinieku iesaisti vieglu;
  • vienkārÅ”ot izstrādes vides izvietoÅ”anas procesu;
  • iestatÄ«t modeļu versiju pārvaldÄ«bas procesu;
  • iegÅ«t ērtu veidu modeļu validēŔanai;
  • atrast instrumentu modeļu stāvokļa pārvaldÄ«bai;
  • atrast veidu, kā piegādāt modeļus ražoÅ”anā.

AcÄ«mredzot ir jāizdomā darba plÅ«sma, kas ļautu viegli un ērti pārvaldÄ«t Å”o dzÄ«ves ciklu? Å ai praksei ir nosaukums MLOps.

MLOps, vai DevOps maŔīnmācÄ«bai, ļauj datu apstrādes un analÄ«zes speciālistu un IT speciālistu komandām sadarboties, kā arÄ« paātrināt modeļu izstrādes un izvietoÅ”anas tempu, izmantojot uzraudzÄ«bas, pārbaudes un vadÄ«bas sistēmu maŔīnmācÄ«bas modeļiem.

JÅ«s varat izlasÄ«t, ko par to domā puiÅ”i no Google. No raksta skaidrs, ka MLOps ir diezgan plaÅ”a tēma.

MLOps — Recepte, 1. nodaļa

Tālāk savā rakstā aprakstīŔu tikai daļu no procesa. Realizācijai es izmantoÅ”u rÄ«ku MLflow, jo tas ir open-source projekts, tāpēc, lai to pieslēgtu, nepiecieÅ”ams neliels kods un ir integrācija ar populāriem ML ietvariem. JÅ«s varat meklēt citus rÄ«kus internetā, piemēram, Kubeflow, SageMaker, Trains utt., un, iespējams, atrast to, kas vislabāk atbilst jÅ«su vajadzÄ«bām.

"Veidojam" MLOps piemēra izmantoÅ”anā rÄ«ka MLFlow.

MLFlow — tas ir atvērtā koda platforma maŔīnmācīŔanās modeļu dzÄ«ves cikla pārvaldÄ«bai (https://mlflow.org/).

MLflow ietver četrus komponentus:

  • MLflow Tracking — risina jautājumus par rezultātu un parametru fiksēŔanu, kas noveda pie Å”iem rezultātiem;
  • MLflow Project — ļauj iepakot kodu un atkārtoti to izmantot jebkurā platformā;
  • MLflow Models — atbild par modeļu izvietoÅ”anu ražoÅ”anā;
  • MLflow Registry — ļauj glabāt modeļus un pārvaldÄ«t to stāvokli centralizētā krātuvē.

MLflow strādā ar divām entītēm:

  • skrējiens — tas ir pilns mācÄ«bu cikls, parametri un metrikas, kuras mēs vēlamies reÄ£istrēt;
  • eksperiments — tā ir ā€œtematikaā€, kas apvieno skrējienus.

Visi piemēra soļi ir īstenoti operētājsistēmā Ubuntu 18.04.

1. Uzliekam serveri.

Lai mēs varētu viegli pārvaldÄ«t mÅ«su projektu un saņemt visu nepiecieÅ”amo informāciju, uzliksim serveri. MLflow tracking serverim ir divi galvenie komponenti:

  • backend store — atbild par reÄ£istrēto modeļu informācijas glabāŔanu (atbalsta 4 DBMS: mysql, mssql, sqlite un postgresql);
  • artifact store — atbild par ar teiktajiem artefaktiem (atbalsta 7 glabāŔanas varianti: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP serveris, SFTP serveris, NFS, HDFS).

Kā artifact store vienkārŔības labad ņemsim sftp serveri.

  • izveidojam grupu
    $ sudo groupadd sftpg
  • pievienojam lietotāju un uzstādām viņam paroli
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • pielāgojam pāris piekļuves iestatÄ«jumus
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • pievienojam dažas rindas failā /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • pārstartējam pakalpojumu
    $ sudo systemctl restart sshd

Kā backend store ņemam 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
# Izveido jaunu lietotāju: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Ievadiet lomu nosaukumu, ko pievienot: mlflow_user
Ievadiet paroli jaunajai lomai: mlflow
Ievadiet to vēlreiz: mlflow
Vai jaunajai lomai jābūt superlietotājam? (y/n) n
Vai jaunajai lomai jāļauj izveidot datu bāzes? (y/n) n
Vai jaunajai lomai jāļauj izveidot nākamās jaunās lomas? (y/n) n
# Izveidojam datu bāzi mlflow_bd, kas pieder mlflow_user
$ createdb -O mlflow_user mlflow_db

Lai uzsāktu serveri, nepiecieÅ”ams instalēt Ŕādus Python paketus (iesaku izveidot atseviŔķu virtuālo vidi):

pip install mlflow
pip install pysftp

Uzsākam mūsu serveri

$ 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. Pievienojam sekoŔanu

Lai nodroÅ”inātu, ka mÅ«su apmācÄ«bu rezultāti netiek zaudēti, nākamajām izstrādātāju paaudzēm saprastu, kas vispār notika, un vecākie kolēģi un jÅ«s varētu mierÄ«gi analizēt mācÄ«bu procesu, mums ir nepiecieÅ”ams pievienot sekoÅ”anu. SekoÅ”ana nozÄ«mē parametru, metrikas, artefaktu un jebkādas papildu informācijas par mācÄ«bu uzsākÅ”anu saglabāŔanu, mÅ«su gadÄ«jumā, serverÄ«.

Piemēram, es izveidoju nelielu projektu github uz Keras visam, kas ir pieejams COCO datu kopā. Lai pievienotu sekoÅ”anu, es izveidoju failu mlflow_training.py.

Šeit ir rindiņas, kurās notiek viss interesantais:

def run(self, epochs, lr, experiment_name):
        # iegūstam eksperimenta id, izveidojam eksperimentu tā neesamības gadījumā
        remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
        # izveidojam "run" un iegūstam tā id
        remote_run_id = self.remote_server.get_run_id(remote_experiment_id)

        # norādām, ka vēlamies rezultātus saglabāt attālinātajā 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)

Å eit self.remote_server ir neliela saite uz mlflow.tracking metodes MlflowClient (es to izveidoju ērtÄ«bai), ar kurām es izveidoju eksperimentu un palaiÅ”anu serverÄ«. Tālāk es norādu, kur jāiesniedz palaiÅ”anas rezultāti (mlflow.set_tracking_uri(self.tracking_uri)). Pievienoju automātisko mlflow.keras.autologēŔanu. Å obrÄ«d MLflow Tracking atbalsta automātisko logu veidoÅ”anu Ŕādiem rÄ«kiem: TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Ja jÅ«s neatradāt savu ietvaru vai bibliotēku, jÅ«s vienmēr varat logu reÄ£istrēt manuāli. Sāksim apmācÄ«bu. ReÄ£istrējam tagus un ieejas parametrus attālinātajā serverÄ«.

Dažas rindas, un jums, tāpat kā visiem interesentiem, ir piekļuve visai informācijai par visiem palaiŔanas procesiem. Ai, forŔi?

3. Projekta izveide

Tagad padarÄ«sim tā, lai projekta palaiÅ”ana bÅ«tu vienkārÅ”a. Å im nolÅ«kam pievienosim MLproject un conda.yaml failus projekts saknē.
MLproject

name: flow_segmentation
conda_env: conda.yaml

entry_points:
  main:
    parameters:
        categories: {help: 'kategoriju saraksts no coco datu kopas'}
        epochs: {type: int, help: 'apmācības epoch skaits'}

        lr: {type: float, default: 0.001, help: 'mācību ātrums'}
        batch_size: {type: int, default: 8}
        model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
        backbone_name: {type: str, default: 'resnet18', help: 'piemērs: resnet18, resnet50, mobilenetv2 ...'}

        tracking_uri: {type: str, help: 'servera adrese'}
        experiment_name: {type: str, default: 'My_experiment', help: 'attālinātā un vietējā eksperimenta nosaukums'}
    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 projekts ir ar vairākām īpaŔībām:

  • Name — jÅ«su projekta nosaukums;
  • Environment — manā gadÄ«jumā conda_env norāda, ka palaiÅ”anai tiek izmantota Anaconda, un atkarÄ«bas apraksts atrodas conda.yaml failā;
  • Entry Points — norādÄ«ts, kādus failus un ar kādiem parametriem mēs varam palaist (visi parametri apmācÄ«bas laikā automātiski tiek logēti)

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

Kā izpildes vidi jūs varat izmantot docker, par sīkāku informāciju skatieties dokumentācijā.

4. Uzsākam apmācību

Klonējam projektu un pārejam uz projekta direktoriju:

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

Lai palaiÅ”anas process darbotos, jums ir jāsagatavo bibliotēkas

pip install mlflow
pip install pysftp

Tā kā piemērā es izmantoju conda_env, jÅ«su datorā ir jābÅ«t uzstādÄ«tai Anaconda (taču to var apiet, pats uzstādot visus nepiecieÅ”amos pakotnes un nedaudz pielāgojot palaiÅ”anas parametrus).

Visas sagatavoÅ”anās darbÄ«bas ir pabeigtas, un mēs varam sākt apmācÄ«bu. No projekta saknes:

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

Pēc komandas ievadīŔanas automātiski tiks izveidots conda vide un uzsāksies apmācÄ«ba.
IepriekŔējā piemērā es norādÄ«ju apmācÄ«bu epoch skaitu, kategorijas, uz kurām mēs vēlamies segmentēt (pilnu sarakstu var skatÄ«t Å”eit) un mÅ«su attālinātā servera adresi.
Pilnu iespējamo parametru sarakstu var apskatīt MLproject failā.

5. Novērtējam apmācības rezultātus

Pēc apmācības beigām mēs varam pāriet pārlūkā uz mūsu servera adresi http://server_host:server_port

MLOps — Recepte, 1. nodaļa

Å eit mēs redzam visu eksperimentu sarakstu (pa kreisi augŔējā stÅ«rÄ«), kā arÄ« informāciju par palaiÅ”anām (vidÅ«). Mēs varam skatÄ«t detalizētāku informāciju (parametri, metriÄ·i, artefakti un kāda papildu informācija) par katru palaiÅ”anu.

MLOps — Recepte, 1. nodaļa

Par katru metriķi mēs varam novērot mainīgo vēsturi.

MLOps — Recepte, 1. nodaļa

Tātad Å”obrÄ«d mēs varam analizēt rezultātus "roku" režīmā, arÄ« jÅ«s varat konfigurēt automātisko validāciju, izmantojot MLflow API.

6. Reģistrējam modeli

Pēc tam, kad mēs esam analizējuÅ”i mÅ«su modeli un nolēmuÅ”i, ka tas ir gatavs, mēs reÄ£istrējam to, izvēloties nepiecieÅ”amo palaiÅ”anu (kā parādÄ«ts iepriekŔējā punktā) un dodamies lejup.

MLOps — Recepte, 1. nodaļa

Pēc tam, kad mēs esam devuÅ”i savai modelim nosaukumu, tas iegÅ«st versiju. Saglabājot citu modeli ar to paÅ”u nosaukumu, versija automātiski paaugstinās.

MLOps — Recepte, 1. nodaļa

Katram modelim mēs varam pievienot aprakstu un izvēlēties vienu no trim stāvokļiem (Staging, Production, Archived), turpmāk mēs varam piekļūt Å”iem stāvokļiem, izmantojot API, kas kopā ar versiju pārvaldÄ«bu nodroÅ”ina papildu elastÄ«bu.

MLOps — Recepte, 1. nodaļa

Mums arī ir ērta piekļuve visiem modeļiem

MLOps — Recepte, 1. nodaļa

un to versijām.

MLOps — Recepte, 1. nodaļa

Kā iepriekŔējā punktā, visas darbÄ«bas var veikt, izmantojot API.

7. IevieŔam modeli

Šajā posmā mums jau ir apmācīts (keras) modelis. Piemērs, kā to var izmantot:

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

Å eit self.registry ir atkārtota vienkārÅ”a saskarne ar mlflow.tracking.MlflowClient, lai bÅ«tu ērtāk. SvarÄ«gi ir tas, ka es piekļuÅ”u attālinātajam serverim un meklēŔu tur modeli ar norādÄ«to nosaukumu, proti, pēdējo produkcijas versiju. Pēc tam lejupielādēju artefaktu vietējā mapē .\/model un uztveru modeli no Ŕīs direktorijas mlflow.keras.load_model(local_path). Tagad varam izmantot mÅ«su modeli. CV (ML) izstrādātāji var mierÄ«gi strādāt pie modeļa uzlaboÅ”anas un publicēt jaunas versijas.

Noslēgumā

Es piedāvāju sistēmu, kas ļauj:

  • centralizēti uzglabāt informāciju par ML modeļiem, to apmācÄ«bas gaitu un rezultātiem;
  • ātri izvērst izstrādes vidi;
  • sekot lÄ«dzi un analizēt darbu pie modeļiem;
  • ērti veidot versiju un pārvaldÄ«t modeļu stāvokli;
  • vieglāk izvietot iegÅ«tos modeļus.

Å is piemērs ir izglÄ«tojoÅ”s un kalpo kā sākumpunkts jÅ«su paÅ”u sistēmas izveidei, kas, iespējams, ietver automātisku rezultātu novērtēŔanu un modeļu reÄ£istrāciju (5. un 6. punkts attiecÄ«gi), vai jÅ«s pievienosiet datu kopu versiju veidoÅ”anu, vai varbÅ«t vēl ko citu? Es gribēju sniegt priekÅ”statu, ka jums ir nepiecieÅ”ams MLOps kopumā, MLflow ir vienkārÅ”i lÄ«dzeklis mērÄ·u sasniegÅ”anai.

Uzrakstiet, kādas problēmas jūs saskārāties, es tās neparādīju?
Ko jūs pievienotu sistēmai, lai tā apmierinātu jūsu vajadzības?
Kurus rīkus un pieejas jūs izmantojat, lai risinātu visas vai daļu problēmu?

P.S. AtstāŔu dažas saites:
github projekts — https://github.com/simbakot/mlflow_example
MLflow — https://mlflow.org/
Mana darba e-pasta adrese, ja ir jautājumi — ikryakin@croc.ru

MÅ«su uzņēmumā periodiski tiek rÄ«koti dažādi pasākumi IT speciālistiem, piemēram: 8. jÅ«lijā plkst. 19:00 pēc MGS notiks tieÅ”saistes tikÅ”anās par CV, ja interesē, varat piedalÄ«ties, reÄ£istrācija Å”eit .

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster