MLOps ā€” pavārgrāmata, 1. nodaļa

MLOps ā€” pavārgrāmata, 1. nodaļa

Sveiki visiem! Esmu CV izstrādātājs uzņēmumā CROC. Jau 3 gadus Ä«stenojam projektus CV jomā. Å ajā laikā mēs darÄ«jām daudzas lietas, piemēram: uzraudzÄ«jām autovadÄ«tājus, lai viņi braukÅ”anas laikā nedzertu, nesmēķētu, nerunātu pa telefonu, neskatÄ«tos uz ceļu, nevis uz sapņiem vai mākoņiem. ; Mēs reÄ£istrējām cilvēkus, kuri brauc pa tām paredzētajām joslām un aizņem vairākas stāvvietas; nodroÅ”ināja, ka strādnieki valkā Ä·iveres, cimdus utt.; identificēja darbinieku, kurÅ” vēlas iekļūt objektā; SaskaitÄ«jām visu, ko varējām.

PriekÅ” kam es to visu daru?

ÄŖstenojot projektus, mēs saskaramies ar izciļņiem, daudz izciļņiem, dažām problēmām, ar kurām jÅ«s vai nu esat pazÄ«stami, vai arÄ« iepazÄ«sities nākotnē.

Simulēsim situāciju

Iedomāsimies, ka esam iekārtojuÅ”ies darbā jaunā uzņēmumā ā€œNā€, kura darbÄ«ba ir saistÄ«ta ar ML. Mēs strādājam pie ML (DL, CV) projekta, pēc tam kaut kādu iemeslu dēļ pārslēdzamies uz citu darbu, parasti paņemam pārtraukumu un atgriežamies pie sava vai kāda cita neirona.

  1. Pienāk patiesÄ«bas brÄ«dis, kaut kā jāatceras, kur apstājies, kādus hiperparametrus mēģinājusi un, galvenais, pie kādiem rezultātiem tie noveda. Var bÅ«t daudz iespēju, kas glabāja informāciju par visiem palaiÅ”anas gadÄ«jumiem: galvā, konfigurācijās, piezÄ«mju blokā, darba vidē mākonÄ«. Man gadÄ«jās redzēt opciju, kad hiperparametri tika saglabāti kā komentētas rindiņas kodā, kopumā tas ir izdomājums. Tagad iedomājieties, ka atgriezāties nevis pie sava projekta, bet gan pie tādas personas projekta, kura pameta uzņēmumu, un jÅ«s mantojāt kodu un modeli ar nosaukumu model_1.pb. Lai pabeigtu attēlu un nodotu visas sāpes, iedomāsimies, ka esat arÄ« iesācējs speciālists.
  2. Uz priekÅ”u. Lai palaistu kodu, mums un visiem, kas ar to strādās, ir jāizveido vide. Bieži gadās, ka kādu iemeslu dēļ viņi nav atstājuÅ”i viņu kā mÅ«su mantojumu. Tas var kļūt arÄ« par nenozÄ«mÄ«gu uzdevumu. JÅ«s nevēlaties tērēt laiku Å”im solim, vai ne?
  3. Apmācam modeli (piemēram, auto detektoru). Mēs esam nonākuÅ”i lÄ«dz vietai, kur tas kļūst ļoti labs ā€“ ir pienācis laiks saglabāt rezultātu. Sauksim to par car_detection_v1.pb. Tad apmācām vēl vienu - car_detection_v2.pb. Pēc kāda laika mÅ«su kolēģi vai mēs paÅ”i mācām arvien vairāk, izmantojot dažādas arhitektÅ«ras. Rezultātā veidojas artefaktu gÅ«zma, par kuriem informācija ir rÅ«pÄ«gi jāsavāc (bet mēs to darÄ«sim vēlāk, jo Å”obrÄ«d mums ir vairāk prioritāru lietu).
  4. Labi, tagad viss ir beidzies! Mums ir modelis! Vai mēs varam sākt apmācÄ«t nākamo modeli, izstrādāt arhitektÅ«ru, lai atrisinātu jaunu problēmu, vai arÄ« mēs varam iedzert tēju? Un kurÅ” izvietos?

Problēmu identificÄ“Å”ana

Darbs pie projekta vai produkta ir daudzu cilvēku darbs. Un ar laiku cilvēki aizbrauc un nāk, projektu ir vairāk, un paÅ”i projekti kļūst sarežģītāki. Tā vai citādi situācijas no iepriekÅ” aprakstÄ«tā cikla (un ne tikai) noteiktās kombinācijās notiks no iterācijas uz iterāciju. Tas viss rada lieku laiku, apjukumu, nervus, iespējams, klientu neapmierinātÄ«bu un galu galā naudas zaudÄ“Å”anu. Lai gan mēs visi parasti sekojam vienam un tam paÅ”am vecajam grābeklim, es uzskatu, ka neviens nevēlas Å”os mirkļus izdzÄ«vot atkal un atkal.

MLOps ā€” pavārgrāmata, 1. nodaļa

Tātad esam izgājuÅ”i vienu attÄ«stÄ«bas ciklu un redzam, ka ir problēmas, kas jārisina. Lai to izdarÄ«tu, jums ir nepiecieÅ”ams:

  • ērti uzglabāt darba rezultātus;
  • vienkārÅ”ot jaunu darbinieku iesaistÄ«Å”anas procesu;
  • vienkārÅ”ot izstrādes vides izvietoÅ”anas procesu;
  • konfigurēt modeļa versiju veidoÅ”anas procesu;
  • ir ērts modeļu apstiprināŔanas veids;
  • atrast paraugvalsts pārvaldÄ«bas rÄ«ku;
  • atrast veidu, kā modeļus piegādāt ražoÅ”anā.

AcÄ«mredzot ir jāizdomā darbplÅ«sma, kas ļautu viegli un ērti pārvaldÄ«t Å”o dzÄ«ves ciklu? Å o praksi sauc par MLOps

MLOps jeb DevOps maŔīnmācībai ļauj datu zinātnes un IT komandām sadarboties un palielināt modeļu izstrādes un izvietoŔanas tempu, izmantojot maŔīnmācīŔanās modeļu uzraudzību, validāciju un pārvaldību.

Jūs varat lasītKo par to visu domā Google puiŔi? No raksta ir skaidrs, ka MLOps ir diezgan apjomīga lieta.

MLOps ā€” pavārgrāmata, 1. nodaļa

Tālāk savā rakstā es aprakstÄ«Å”u tikai daļu no procesa. IevieÅ”anai izmantoÅ”u MLflow rÄ«ku, jo... Å is ir atvērtā pirmkoda projekts, savienojuma izveidei ir nepiecieÅ”ams neliels koda daudzums un ir integrācija ar populāriem ml ietvariem. Varat meklēt internetā citus rÄ«kus, piemēram, Kubeflow, SageMaker, Trains utt., un, iespējams, atrast to, kas labāk atbilst jÅ«su vajadzÄ«bām.

MLOps ā€œveidoÅ”anaā€, izmantojot MLFlow rÄ«ka izmantoÅ”anas piemēru

MLFlow ir atvērtā koda platforma ml modeļu dzīves cikla pārvaldībai (https://mlflow.org/).

MLflow ietver četrus komponentus:

  • MLflow Tracking ā€“ aptver jautājumus par rezultātu ierakstÄ«Å”anu un parametriem, kas noveda pie Ŕī rezultāta;
  • MLflow Project - ļauj iepakot kodu un reproducēt to uz jebkuras platformas;
  • MLflow modeļi - atbild par modeļu izvietoÅ”anu ražoÅ”anā;
  • MLflow reÄ£istrs - ļauj uzglabāt modeļus un pārvaldÄ«t to stāvokli centralizētā repozitorijā.

MLflow darbojas divās entītijās:

  • palaiÅ”ana ir pilns apmācÄ«bas, parametru un metrikas cikls, pēc kura mēs vēlamies reÄ£istrēties;
  • Eksperiments ir ā€œtēmaā€, kas darbojas kopā.

Visas piemēra darbības ir ieviestas operētājsistēmā Ubuntu 18.04.

1. Izvietojiet serveri

Lai mēs varētu ērti pārvaldÄ«t savu projektu un saņemt visu nepiecieÅ”amo informāciju, mēs izvietosim serveri. MLflow izsekoÅ”anas serverim ir divas galvenās sastāvdaļas:

  • backend veikals ā€” atbild par reÄ£istrēto modeļu informācijas glabāŔanu (atbalsta 4 DBVS: mysql, mssql, sqlite un postgresql);
  • artefaktu veikals - atbild par artefaktu glabāŔanu (atbalsta 7 krātuves iespējas: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP serveris, SFTP serveris, NFS, HDFS).

Kā artefaktu veikals VienkārŔības labad ņemsim sftp serveri.

  • izveidot grupu
    $ sudo groupadd sftpg
  • pievienojiet lietotāju un iestatiet viņam paroli
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • pielāgojot 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
  • pievienojiet dažas rindiņas /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • restartējiet pakalpojumu
    $ sudo systemctl restart sshd

Kā aizmugures veikals Ņemsim 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

Lai startētu serveri, jāinstalē Ŕādas python pakotnes (iesaku izveidot atseviŔķu virtuālo vidi):

pip install mlflow
pip install pysftp

Sāksim 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. Pievienojiet izsekoŔanu

Lai mÅ«su apmācÄ«bas rezultāti nepazustu, nākamās izstrādātāju paaudzes saprastu, kas notiek, un vecāki biedri un jÅ«s varētu mierÄ«gi analizēt mācÄ«bu procesu, mums ir jāpievieno izsekoÅ”ana. IzsekoÅ”ana nozÄ«mē parametru, metrikas, artefaktu un jebkuras papildu informācijas par apmācÄ«bas sākumu saglabāŔanu serverÄ«.

Piemēram, es izveidoju mazu projekts vietnē github uz Keras, lai segmentētu visu, kas ir iekŔā COCO datu kopa. Lai pievienotu izsekoÅ”anu, es izveidoju failu mlflow_training.py.

Šeit ir rindas, kurās notiek visinteresantākās lietas:

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)

Å eit self.remote_server ir neliels mlflow.tracking metožu iesaiņojums. MlflowClient (izgatavoju ērtÄ«bas labad), ar kura palÄ«dzÄ«bu izveidoju eksperimentu un palaistu to serverÄ«. Tālāk es norādu, kur palaiÅ”anas rezultāti ir jāapvieno (mlflow.set_tracking_uri(self.tracking_uri)). Es iespējoju automātisko reÄ£istrÄ“Å”anu mlflow.keras.autolog(). PaÅ”laik MLflow Tracking atbalsta automātisku reÄ£istrÄ“Å”anu TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Ja neesat atradis savu sistēmu vai bibliotēku, vienmēr varat skaidri reÄ£istrēties. Sākam treniņus. ReÄ£istrējiet tagus un ievades parametrus attālajā serverÄ«.

Pāris rindiņas, un jÅ«s, tāpat kā visi pārējie, varēsit piekļūt informācijai par visiem palaiÅ”anas gadÄ«jumiem. ForÅ”i?

3. Izstrādājam projektu

Tagad atvieglosim projekta uzsākŔanu. Lai to izdarītu, pievienojiet MLproject un conda.yaml failu projekta saknei.
MLprojekts

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 projektam ir vairākas īpaŔības:

  • Name - jÅ«su projekta nosaukums;
  • Vide ā€” manā gadÄ«jumā conda_env norāda, ka palaiÅ”anai tiek izmantota Anaconda un atkarÄ«bas apraksts ir failā conda.yaml;
  • Entry Points - norāda, kurus failus un ar kādiem parametriem varam palaist (visi parametri tiek automātiski reÄ£istrēti, uzsākot treniņu)

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

Varat izmantot docker kā savu izpildlaika vidi. PlaŔāku informāciju skatiet Ŕeit dokumentācija.

4. Sāksim trenēties

Mēs klonējam projektu un dodamies uz projekta direktoriju:

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

Lai palaistu, ir jāinstalē bibliotēkas

pip install mlflow
pip install pysftp

Jo piemērā es izmantoju conda_env, Anaconda ir jāinstalē datorā (bet to var apiet, pats instalējot visas nepiecieÅ”amās pakotnes un spēlējoties ar palaiÅ”anas parametriem).

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 izveidota conda vide un sāksies apmācÄ«ba.
IepriekÅ” minētajā piemērā es nokārtoju apmācÄ«bas periodu skaitu, kategorijas, kurās mēs vēlamies segmentēt (jÅ«s varat redzēt pilnu sarakstu Å”eit) un mÅ«su attālā servera adrese.
Pilns iespējamo parametru saraksts ir atrodams MLproject failā.

5. Novērtēt mācību rezultātus

Pēc apmācÄ«bas pabeigÅ”anas mēs varam pārlÅ«kprogrammā doties uz mÅ«su servera adresi http://server_host:server_port

MLOps ā€” pavārgrāmata, 1. nodaļa

Å eit mēs redzam visu eksperimentu sarakstu (augŔējā kreisajā pusē), kā arÄ« informāciju par izpildēm (vidÅ«). Mēs varam skatÄ«t detalizētāku informāciju (parametrus, metriku, artefaktus un papildu informāciju) par katru palaiÅ”anu.

MLOps ā€” pavārgrāmata, 1. nodaļa

Katram rādītājam mēs varam novērot izmaiņu vēsturi

MLOps ā€” pavārgrāmata, 1. nodaļa

Tie. Å obrÄ«d rezultātus varam analizēt ā€œmanuālāā€ režīmā, kā arÄ« varat iestatÄ«t automātisku validāciju, izmantojot MLflow API.

6. Reģistrējiet modeli

Pēc tam, kad esam analizējuÅ”i savu modeli un nolēmuÅ”i, ka tas ir gatavs kaujai, mēs turpinām to reÄ£istrēt, Å”im nolÅ«kam mēs atlasām vajadzÄ«go palaiÅ”anu (kā parādÄ«ts iepriekŔējā punktā) un dodamies uz leju.

MLOps ā€” pavārgrāmata, 1. nodaļa

Pēc tam, kad esam pieŔķīruÅ”i modelim nosaukumu, tam ir versija. Ja saglabājat citu modeli ar tādu paÅ”u nosaukumu, versija tiks automātiski jaunināta.

MLOps ā€” pavārgrāmata, 1. nodaļa

Katram modelim mēs varam pievienot aprakstu un atlasÄ«t vienu no trim stāvokļiem (Iestudējums, RažoÅ”ana, Arhivēts); pēc tam, izmantojot API, mēs varam piekļūt Å”iem stāvokļiem, kas kopā ar versiju veidoÅ”anu nodroÅ”ina papildu elastÄ«bu.

MLOps ā€” pavārgrāmata, 1. nodaļa

Mums ir arī viegla piekļuve visiem modeļiem

MLOps ā€” pavārgrāmata, 1. nodaļa

un to versijas

MLOps ā€” pavārgrāmata, 1. nodaļa

Tāpat kā iepriekŔējā rindkopā, visas darbÄ«bas var veikt, izmantojot API.

7. Izvietojiet 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 atkal ir neliels iesaiņojums virs mlflow.tracking.MlflowClient ērtÄ«bai. Lieta tāda, ka es piekļūstu attālajam serverim un meklēju tur modeli ar norādÄ«to nosaukumu un jaunāko ražoÅ”anas versiju. Pēc tam es lejupielādēju artefaktu lokāli mapē ./model un izveido modeli no Ŕī direktorija mlflow.keras.load_model(local_path). Tagad mēs varam izmantot mÅ«su modeli. CV (ML) izstrādātāji var viegli uzlabot modeli un publicēt jaunas versijas.

Noslēgumā

Es prezentēju sistēmu, kas ļauj:

  • centralizēti glabā informāciju par ML modeļiem, treniņu gaitu un rezultātiem;
  • ātri izvietot izstrādes vidi;
  • uzraudzÄ«t un analizēt darba gaitu pie modeļiem;
  • ir ērti versēt un pārvaldÄ«t modeļu stāvokli;
  • IegÅ«tos modeļus ir viegli izvietot.

Å is piemērs ir rotaļlieta un kalpo kā sākumpunkts savas sistēmas izveidei, kas var ietvert rezultātu novērtÄ“Å”anas un modeļu reÄ£istrÄ“Å”anas automatizāciju (attiecÄ«gi 5. un 6. punkts), vai arÄ« pievienosiet datu kopu versijas, vai varbÅ«t kaut ko citu? Es centos uzsvērt, ka jums ir nepiecieÅ”ams MLOps kopumā, MLflow ir tikai lÄ«dzeklis mērÄ·a sasniegÅ”anai.

Uzrakstiet, ar kādām problēmām saskārāties, kuras es neparādīju?
Ko jūs pievienotu sistēmai, lai tā atbilstu jūsu vajadzībām?
Kādus rīkus un pieejas izmantojat, lai atrisinātu visas problēmas vai daļu no tām?

PS atstāŔu pāris saites:
github projekts - https://github.com/simbakot/mlflow_example
MLflow ā€” https://mlflow.org/
Mans darba e-pasts jautājumiem - [e-pasts aizsargāts]

MÅ«su uzņēmumā periodiski notiek dažādi pasākumi IT speciālistiem, piemēram: 8. jÅ«lijā 19:00 pēc Maskavas laika notiks CV tikÅ”anās online formātā, ja ir interese, var piedalÄ«ties, reÄ£istrācija Å”eit .

Avots: www.habr.com

Pievieno komentāru