MLOps - Sukaldaritza liburua, 1. kapitulua

MLOps - Sukaldaritza liburua, 1. kapitulua

Kaixo guztioi! CROCeko CV garatzailea naiz. Orain 3 urte daramatzagu curriculumaren alorrean proiektuak ezartzen. Denbora horretan, gauza asko egin genituen, adibidez: gidariei jarraipena egin genien, gidatzen zuten bitartean ez zezaten edan, ez erretzen, ez zuten telefonoz hitz egiten, errepidera begiratzen zuten, eta ez ametsetan edo hodeietan. ; Errei dedikatuetan gidatzen duten eta hainbat aparkaleku hartzen dituzten pertsonak grabatu ditugu; langileek kaskoak, eskularruak, etab. instalaziora sartu nahi duen langile bat identifikatu; Ahal genuen guztia zenbatu genuen.

Zertarako egiten dut hau guztia?

Proiektuak ezartzeko prozesuan, kolpeak jo ditugu, kolpe asko, ezagutzen dituzun edo etorkizunean ezagutuko dituzun arazo batzuk.

Simula dezagun egoera

Imajina dezagun β€œN” enpresa gazte batean lanpostu bat lortu genuela, zeinaren jarduerak MLrekin lotuta dauden. ML (DL, CV) proiektu batean lan egiten dugu, gero arrazoiren batengatik beste lan batera aldatzen gara, orokorrean atseden bat hartzen dugu eta gure edo besteren neuronara itzultzen gara.

  1. Egiaren momentua iristen da, nolabait gogoratu behar duzu non gelditu zaren, zer hiperparametro saiatu zaren eta, batez ere, zer emaitza ekarri duten. Abiarazte guztietan informazioa gordetzeko aukera asko egon daitezke: buruan, konfigurazioak, koadernoan, hodeian lan-ingurunean. Aukera bat ikusi nuen hiperparametroak kodean komentatu diren lerro gisa gordetzen zirenean, oro har, fantasiazko hegaldia. Orain imajinatu ez zarela zure proiektura itzuli, enpresa utzi zuen pertsona baten proiektura baizik eta model_1.pb izeneko kode eta eredu bat heredatu dituzula. Irudia osatzeko eta min guztia helarazteko, pentsa dezagun hasiberri espezialista zarela ere.
  2. Segi aurrera. Kodea exekutatzeko, guk eta horrekin lan egingo dugun guztiek ingurune bat sortu behar dugu. Askotan gertatzen da arrazoiren bategatik ez zutela gure ondaretzat utzi. Hau ere zeregin ez-trivial bihur daiteke. Ez duzu pauso honetan denborarik galdu nahi, ezta?
  3. Modelo bat entrenatzen dugu (adibidez, autoen detektagailua). Oso ona bihurtzen den puntura iristen gara: emaitza gordetzeko garaia da. Dei diezaiogun car_detection_v1.pb. Ondoren, beste bat entrenatzen dugu - car_detection_v2.pb. Handik denbora batera, gure lankideek edo guk geuk gero eta gehiago irakasten dugu, arkitektura desberdinak erabiliz. Ondorioz, artefaktu mordo bat eratzen dira, eta horri buruzko informazioa arreta handiz bildu behar da (baina hori aurrerago egingo dugu, oraingoz lehentasunezko gai gehiago ditugulako).
  4. Ados, dena amaitu da orain! Badugu eredua! Hasi al gaitezke hurrengo eredua entrenatzen, arazo berri bat konpontzeko arkitektura bat garatzen edo tea hartzera joan gaitezke? Eta nork zabalduko du?

Arazoak identifikatzea

Proiektu edo produktu batean lan egitea jende askoren lana da. Eta denborarekin, jendea joan eta etorri, proiektu gehiago daude, eta proiektuak beraiek konplexuagoak dira. Modu batera edo bestera, gorago deskribatutako zikloko egoerak (eta ez bakarrik) konbinazio jakin batzuetan errepikatuko dira errepikapenez. Horrek guztiak denbora galtzea, nahasmena, nerbioak, baliteke bezeroen asegabetasuna eta, azken finean, dirua galtzea eragiten du. Gehienetan denok arrastel zahar berari jarraitzen badiogu ere, uste dut inork ez dituela momentu hauek behin eta berriro bizi nahi.

MLOps - Sukaldaritza liburua, 1. kapitulua

Beraz, garapen ziklo bat igaro dugu eta konpondu beharreko arazoak daudela ikusten dugu. Horretarako behar duzu:

  • lanaren emaitzak eroso gordetzea;
  • langile berriak inplikatzeko prozesua erraztu;
  • garapen-ingurune bat zabaltzeko prozesua sinplifikatu;
  • konfiguratu ereduaren bertsio-prozesua;
  • ereduak baliozkotzeko modu erosoa izatea;
  • estatua kudeatzeko tresna eredu bat aurkitzea;
  • ereduak ekoizpenera emateko modu bat aurkitu.

Dirudienez, beharrezkoa al da bizi-ziklo hau erraz eta eroso kudeatzea ahalbidetuko duen lan-fluxu bat egitea? Praktika honi MLOps deitzen zaio

MLOps-ek edo DevOps-ek ikaskuntza automatikorako datu-zientzietako eta informatikako taldeek lankidetzan jarduten dute eta ereduen garapen eta hedapen-erritmoa areagotu dezakete ikaskuntza automatikoko ereduen monitorizazio, baliozkotze eta gobernuaren bidez.

Ezin duzu irakurriZer uste dute Google-koek guzti honetaz? Artikulutik argi dago MLOps gauza nahiko bolumentsua dela.

MLOps - Sukaldaritza liburua, 1. kapitulua

Aurrerago nire artikuluan prozesuaren zati bat bakarrik deskribatuko dut. Ezartzeko, MLflow tresna erabiliko dut, zeren... Kode irekiko proiektu bat da, kode kopuru txiki bat behar da konektatzeko eta ml esparru ezagunekin integrazioa dago. Interneten beste tresna batzuk bilatu ditzakezu, hala nola Kubeflow, SageMaker, Trains, etab., eta agian zure beharretara hobeto egokitzen den bat aurki dezakezu.

MLOak "eraikitzen" MLFlow tresna erabiltzearen adibidea erabiliz

MLFlow kode irekiko plataforma bat da ml ereduen bizi-zikloa kudeatzeko (https://mlflow.org/).

MLflow-ek lau osagai ditu:

  • MLflow Tracking - emaitza hori ekarri duten emaitzak eta parametroak erregistratzeko gaiak biltzen ditu;
  • MLflow Project - kodea paketatzeko eta edozein plataformatan erreproduzitzeko aukera ematen du;
  • MLflow Models - ereduak ekoizpenera zabaltzeaz arduratzen da;
  • MLflow Registry - ereduak gordetzeko eta haien egoera kudeatzeko aukera ematen du biltegi zentralizatu batean.

MLflow-ek bi entitatetan funtzionatzen du:

  • abian jarri nahi dugun prestakuntza, parametro eta metrika ziklo oso bat da;
  • Esperimentu bat elkarrekin ibiltzen den "gai" bat da.

Adibideko urrats guztiak Ubuntu 18.04 sistema eragilean ezartzen dira.

1. Inplementatu zerbitzaria

Gure proiektua erraz kudeatzeko eta beharrezko informazio guztia jasotzeko, zerbitzari bat zabalduko dugu. MLflow jarraipen zerbitzariak bi osagai nagusi ditu:

  • backend denda - erregistratutako ereduei buruzko informazioa gordetzeaz arduratzen da (4 DBMS onartzen ditu: mysql, mssql, sqlite eta postgresql);
  • artefaktuen denda - artefaktuak gordetzeaz arduratzen da (7 biltegiratze aukera onartzen ditu: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP zerbitzaria, SFTP zerbitzaria, NFS, HDFS).

Den bezala artefaktu denda Sinpletasuna lortzeko, har dezagun sftp zerbitzari bat.

  • talde bat sortu
    $ sudo groupadd sftpg
  • gehitu erabiltzaile bat eta ezarri hari pasahitza
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • sarbide-ezarpen pare bat doitzea
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • gehitu lerro batzuk /etc/ssh/sshd_config-era
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • berrabiarazi zerbitzua
    $ sudo systemctl restart sshd

Den bezala backend denda Har dezagun 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

Zerbitzaria abiarazteko, python pakete hauek instalatu behar dituzu (ingurune birtual bereizia sortzea gomendatzen dut):

pip install mlflow
pip install pysftp

Hasi dezagun gure zerbitzaria

$ 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. Gehitu jarraipena

Gure prestakuntzaren emaitzak ez galtzeko, etorkizuneko garatzaileen belaunaldiek gertatzen ari zena ulertzeko, eta adineko kideek eta zuek ikaskuntza prozesua lasaitasunez aztertu ahal izateko, jarraipena gehitu behar dugu. Jarraipena egiteak esan nahi du parametroak, metrikak, artefaktuak eta prestakuntzaren hasierari buruzko informazio osagarria gordetzea, gure kasuan, zerbitzarian.

Adibidez, txiki bat sortu nuen proiektua github-en Keras-en dagoen guztia segmentatzeko COCO datu multzoa. Jarraipena gehitzeko, mlflow_training.py fitxategi bat sortu dut.

Hona hemen gauza interesgarrienak gertatzen diren lerroak:

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)

Hemen self.remote_server mlflow.tracking metodoen bilgarri txiki bat da. MlflowClient (erosotasunerako egin dut), eta horren laguntzaz esperimentu bat sortu eta zerbitzarian exekutatzen dut. Ondoren, abiaraztearen emaitzak non batu behar diren adierazten dut (mlflow.set_tracking_uri(self.tracking_uri)). Erregistro automatikoa gaitzen dut mlflow.keras.autolog(). Gaur egun MLflow Tracking-ek TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark-en erregistro automatikoa onartzen du. Zure markoa edo liburutegia aurkitu ez baduzu, beti esplizituki saioa hasi dezakezu. Entrenatzen hasten gara. Erregistratu etiketak eta sarrera-parametroak urruneko zerbitzarian.

Lerro pare bat eta zuk, beste guztiek bezala, abiarazte guztiei buruzko informazioa eskura dezakezu. Hotza?

3. Proiektua egiten dugu

Orain erraz dezagun proiektua martxan jartzea. Horretarako, gehitu MLproject eta conda.yaml fitxategia proiektuaren errora.
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 proiektuak hainbat propietate ditu:

  • Izena - zure proiektuaren izena;
  • Ingurumena - nire kasuan, conda_env-ek Anaconda exekutatzeko erabiltzen dela adierazten du eta menpekotasunaren deskribapena conda.yaml fitxategian dagoela;
  • Sarrera puntuak - zein fitxategi eta zein parametrorekin exekutatu dezakegun adierazten du (parametro guztiak automatikoki erregistratzen dira entrenamendua hastean)

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 erabil dezakezu zure exekuzio-ingurune gisa, xehetasun gehiago lortzeko, kontsultatu dokumentazioa.

4. Has gaitezen entrenatzen

Proiektua klonatu eta proiektuaren direktoriora joaten gara:

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

Exekutatzeko liburutegiak instalatu behar dituzu

pip install mlflow
pip install pysftp

Zeren conda_env erabiltzen dudan adibidean, Anaconda zure ordenagailuan instalatu behar da (baina horri aurre egin dezakezu beharrezko pakete guztiak zuk zeuk instalatuz eta abiarazteko parametroekin jolastuz).

Prestaketa-urrats guztiak amaitu dira eta prestakuntza martxan jartzen has gaitezke. Proiektuaren errotik:

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

Komandoa sartu ondoren, automatikoki conda ingurune bat sortuko da eta prestakuntza hasiko da.
Goiko adibidean, entrenamendurako aro kopurua gainditu dut, zein kategoriatan banatu nahi ditugun (zerrenda osoa ikus dezakezu Hemen) eta gure urruneko zerbitzariaren helbidea.
Parametro posibleen zerrenda osoa MLproject fitxategian aurki daiteke.

5. Ikaskuntzaren emaitzak ebaluatzea

Prestakuntza amaitu ondoren, nabigatzailean joan gaitezke gure zerbitzariaren helbidera http://server_host:server_port

MLOps - Sukaldaritza liburua, 1. kapitulua

Hemen esperimentu guztien zerrenda bat ikusten dugu (goian ezkerrean), baita exekuzioei buruzko informazioa (erdian). Informazio zehatzagoa ikus dezakegu (parametroak, metrikak, artefaktuak eta informazio gehigarri batzuk) abiarazte bakoitzeko.

MLOps - Sukaldaritza liburua, 1. kapitulua

Metrika bakoitzeko aldaketen historia beha dezakegu

MLOps - Sukaldaritza liburua, 1. kapitulua

Horiek. Momentuz emaitzak "eskuzko" moduan aztertu ditzakegu, eta baliozkotze automatikoa ere konfigura dezakezu MLflow APIa erabiliz.

6. Erregistratu eredua

Gure eredua aztertu eta borrokarako prest dagoela erabaki ondoren, erregistratzeari ekingo diogu, horretarako behar dugun abiarazte hautatzen dugu (aurreko paragrafoan erakusten den moduan) eta behera egiten dugu.

MLOps - Sukaldaritza liburua, 1. kapitulua

Gure ereduari izena eman ondoren, bertsio bat du. Izen bereko beste modelo bat gordetzen baduzu, bertsioa automatikoki berrituko da.

MLOps - Sukaldaritza liburua, 1. kapitulua

Eredu bakoitzerako, deskribapen bat gehitu eta hiru egoera hauetako bat hauta dezakegu (Eszenaratzea, Ekoizpena, Artxibatua); ondoren, APIa erabiliz, egoera horietara sar gaitezke eta horrek, bertsioarekin batera, malgutasun gehigarria ematen du.

MLOps - Sukaldaritza liburua, 1. kapitulua

Gainera, eredu guztietarako sarbide erraza dugu

MLOps - Sukaldaritza liburua, 1. kapitulua

eta haien bertsioak

MLOps - Sukaldaritza liburua, 1. kapitulua

Aurreko paragrafoan bezala, eragiketa guztiak APIa erabiliz egin daitezke.

7. Eredua zabaldu

Fase honetan, dagoeneko trebatu (keras) eredu bat dugu. Erabili dezakezun adibide bat:

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

Hemen self.registry berriro mlflow.tracking.MlflowClient-en bilgarri txiki bat da, erosotasunerako. Kontua da urruneko zerbitzari batera sartzen naizela eta bertan eredu bat bilatzen dudala zehaztutako izenarekin, eta azken ekoizpen-bertsioarekin. Ondoren, artefaktua lokalean deskargatzen dut ./model karpetara eta eredua direktorio honetatik eraikitzen dut mlflow.keras.load_model(local_path). Orain gure eredua erabil dezakegu. CV (ML) garatzaileek erraz hobetu dezakete eredua eta bertsio berriak argitaratu.

Ondorioz

Hau ahalbidetzen duen sistema aurkeztu nuen:

  • ML ereduei, prestakuntza-aurrerapenari eta emaitzei buruzko informazioa zentralki gordetzea;
  • garapen-ingurune bat azkar zabaldu;
  • ereduen lanen aurrerapena kontrolatzea eta aztertzea;
  • ereduen egoera bertsionatu eta kudeatzea komeni da;
  • Erraza da ondoriozko ereduak zabaltzea.

Adibide hau jostailu bat da eta zure sistema eraikitzeko abiapuntu gisa balio du, emaitzen ebaluazioaren automatizazioa eta ereduen erregistroa (5. eta 6. puntuak, hurrenez hurren) izan ditzakeen edo datu-multzoen bertsioak gehituko dituzu, edo agian beste zerbait? Adierazten saiatzen ari nintzen puntua da MLOps-ak bere osotasunean behar dituzula, MLflow helburua lortzeko bitarteko bat besterik ez da.

Idatzi erakutsi ez ditudan arazoak aurkitu dituzun?
Zer gehituko zenioke sistemari zure beharrei erantzuteko?
Zein tresna eta planteamendu erabiltzen dituzu arazo guztiak edo zati bat konpontzeko?

PS Esteka pare bat utziko ditut:
github proiektua - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
Nire laneko posta elektronikoa galderak egiteko - [posta elektroniko bidez babestua]

Gure enpresak aldian-aldian hainbat ekitaldi antolatzen ditu informatika espezialistentzat, adibidez: uztailaren 8an Moskuko 19:00etan CV topaketa bat egingo da lineako formatuan, interesa baduzu, parte hartu dezakezu, izena ematea. Hemen .

Iturria: www.habr.com

Gehitu iruzkin berria