MLOps - Llyfr coginio, pennod 1

MLOps - Llyfr coginio, pennod 1

Helo pawb! Rwy'n ddatblygwr CV yn CROC. Rydym wedi bod yn gweithredu prosiectau ym maes CV ers 3 blynedd bellach. Yn ystod yr amser hwn, gwnaethom lawer o bethau, er enghraifft: gwnaethom fonitro gyrwyr fel nad oeddent yn yfed, nid oeddent yn ysmygu, nid oeddent yn siarad ar y ffôn, yn edrych ar y ffordd, ac nid yn breuddwydion nac yn y cymylau wrth yrru. ; Fe wnaethom gofnodi pobl sy'n gyrru ar lonydd pwrpasol ac yn cymryd nifer o leoedd parcio; sicrhau bod gweithwyr yn gwisgo helmedau, menig, ac ati; nodi cyflogai sydd am fynd i mewn i'r cyfleuster; Rydym yn cyfrif popeth a allwn.

Ar gyfer beth ydw i'n gwneud hyn i gyd?

Yn y broses o weithredu prosiectau, rydym yn taro bumps, llawer o bumps, rhai o'r problemau rydych naill ai'n gyfarwydd â nhw neu y byddwch yn dod yn gyfarwydd â nhw yn y dyfodol.

Gadewch i ni efelychu'r sefyllfa

Gadewch i ni ddychmygu ein bod wedi cael swydd mewn cwmni ifanc “N”, y mae ei weithgareddau yn gysylltiedig ag ML. Rydyn ni'n gweithio ar brosiect ML (DL, CV), yna am ryw reswm rydyn ni'n newid i swydd arall, fel arfer yn cymryd seibiant, ac yn dychwelyd i'n niwron ni neu rywun arall.

  1. Daw'r eiliad o wirionedd, mae angen i chi gofio rhywsut ble wnaethoch chi stopio, pa hyperparamedrau y gwnaethoch chi roi cynnig arnyn nhw ac, yn bwysicaf oll, pa ganlyniadau y gwnaethon nhw arwain atynt. Gall fod llawer o opsiynau ar gyfer pwy storio gwybodaeth ar bob lansiad: yn y pen, configs, notepad, mewn amgylchedd gwaith yn y cwmwl. Digwyddais weld opsiwn pan oedd hyperparameters yn cael eu storio fel llinellau y dywedwyd amdanynt yn y cod, yn gyffredinol, cyfres o ffansi. Nawr dychmygwch eich bod wedi dychwelyd nid i'ch prosiect, ond i brosiect person a adawodd y cwmni a'ch bod wedi etifeddu cod a model o'r enw model_1.pb. I gwblhau'r llun a chyfleu'r holl boen, gadewch i ni ddychmygu eich bod hefyd yn arbenigwr dechreuwyr.
  2. Cer ymlaen. Er mwyn rhedeg y cod, mae angen i ni a phawb a fydd yn gweithio gydag ef greu amgylchedd. Mae'n digwydd yn aml nad ydyn nhw am ryw reswm yn ei adael fel ein hetifeddiaeth. Gall hyn hefyd ddod yn dasg nad yw'n ddibwys. Nid ydych chi eisiau gwastraffu amser ar y cam hwn, ydych chi?
  3. Rydym yn hyfforddi model (er enghraifft, synhwyrydd car). Rydyn ni'n cyrraedd y pwynt lle mae'n dod yn dda iawn - mae'n bryd achub y canlyniad. Gadewch i ni ei alw car_detection_v1.pb. Yna rydym yn hyfforddi un arall - car_detection_v2.pb. Beth amser yn ddiweddarach, mae ein cydweithwyr neu ni ein hunain yn addysgu mwy a mwy, gan ddefnyddio gwahanol bensaernïaeth. O ganlyniad, mae criw o arteffactau yn cael eu ffurfio, y mae'n rhaid casglu gwybodaeth amdanynt yn ofalus (ond byddwn yn gwneud hyn yn nes ymlaen, oherwydd am y tro mae gennym fwy o faterion blaenoriaeth).
  4. Iawn mae'r cyfan drosodd Nawr! Mae gennym fodel! A allwn ni ddechrau hyfforddi'r model nesaf, datblygu pensaernïaeth i ddatrys problem newydd, neu a allwn ni fynd i gael rhywfaint o de? A phwy fydd yn defnyddio?

Adnabod problemau

Mae gweithio ar brosiect neu gynnyrch yn waith llawer o bobl. A thros amser, mae pobl yn gadael ac yn dod, mae mwy o brosiectau, ac mae'r prosiectau eu hunain yn dod yn fwy cymhleth. Un ffordd neu'r llall, bydd sefyllfaoedd o'r cylch a ddisgrifir uchod (ac nid yn unig) mewn rhai cyfuniadau yn digwydd o iteriad i iteriad. Mae hyn i gyd yn arwain at wastraffu amser, dryswch, nerfau, anfodlonrwydd cwsmeriaid o bosibl, ac yn y pen draw, colli arian. Er ein bod ni i gyd fel arfer yn dilyn yr un hen gribin, dwi’n credu nad oes neb eisiau ail-fyw’r eiliadau hyn drosodd a throsodd.

MLOps - Llyfr coginio, pennod 1

Felly, rydym wedi mynd drwy un cylch datblygu a gwelwn fod problemau y mae angen eu datrys. I wneud hyn mae angen:

  • storio canlyniadau gwaith yn gyfleus;
  • gwneud y broses o gynnwys gweithwyr newydd yn syml;
  • symleiddio'r broses o leoli amgylchedd datblygu;
  • ffurfweddu'r broses fersiynu model;
  • cael ffordd gyfleus o ddilysu modelau;
  • dod o hyd i offeryn rheoli cyflwr enghreifftiol;
  • dod o hyd i ffordd i gyflwyno modelau i gynhyrchu.

Mae'n debyg bod angen creu llif gwaith a fyddai'n caniatáu ichi reoli'r cylch bywyd hwn yn hawdd ac yn gyfleus? Gelwir yr arfer hwn yn MLOps

Mae MLOps, neu DevOps ar gyfer dysgu peiriannau, yn caniatáu i dimau gwyddor data a TG gydweithio a chynyddu cyflymder datblygu a defnyddio modelau trwy fonitro, dilysu a llywodraethu ar gyfer modelau dysgu peiriannau.

Gallwch chi darllenBeth yw barn y bois Google am hyn i gyd? O'r erthygl mae'n amlwg bod MLOps yn beth eithaf swmpus.

MLOps - Llyfr coginio, pennod 1

Ymhellach yn fy erthygl byddaf yn disgrifio rhan yn unig o'r broses. Ar gyfer gweithredu, byddaf yn defnyddio'r offeryn MLflow, oherwydd ... Mae hwn yn brosiect ffynhonnell agored, mae angen ychydig bach o god i gysylltu ac mae integreiddio â fframweithiau ml poblogaidd. Gallwch chwilio'r Rhyngrwyd am offer eraill, fel Kubeflow, SageMaker, Trains, ac ati, ac efallai dod o hyd i un sy'n gweddu'n well i'ch anghenion.

MLOps “Adeiladu” gan ddefnyddio'r enghraifft o ddefnyddio'r offeryn MLFlow

Mae MLFlow yn blatfform ffynhonnell agored ar gyfer rheoli cylch bywyd modelau ml (https://mlflow.org/).

Mae MLflow yn cynnwys pedair cydran:

  • Olrhain MLflow - yn ymdrin â materion cofnodi canlyniadau a pharamedrau a arweiniodd at y canlyniad hwn;
  • Prosiect MLflow - yn eich galluogi i becynnu cod a'i atgynhyrchu ar unrhyw lwyfan;
  • Modelau MLflow - yn gyfrifol am ddefnyddio modelau i gynhyrchu;
  • Cofrestrfa MLflow - yn caniatáu ichi storio modelau a rheoli eu cyflwr mewn ystorfa ganolog.

Mae MLflow yn gweithredu ar ddau endid:

  • mae'r lansiad yn gylch llawn o hyfforddiant, paramedrau a metrigau yr ydym am gofrestru yn eu herbyn;
  • Mae arbrawf yn “destun” sy’n cydredeg.

Gweithredir pob cam o'r enghraifft ar system weithredu Ubuntu 18.04.

1. Defnyddio'r gweinydd

Er mwyn i ni allu rheoli ein prosiect yn hawdd a derbyn yr holl wybodaeth angenrheidiol, byddwn yn defnyddio gweinydd. Mae gan weinydd olrhain llif ML ddwy brif gydran:

  • storfa backend - yn gyfrifol am storio gwybodaeth am fodelau cofrestredig (yn cefnogi 4 DBMSs: mysql, mssql, sqlite, a postgresql);
  • storfa arteffactau - sy'n gyfrifol am storio arteffactau (yn cefnogi 7 opsiwn storio: Amazon S3, Azure Blob Storage, Google Cloud Storage, gweinydd FTP, Gweinydd SFTP, NFS, HDFS).

Gan fod y storfa arteffactau Er mwyn symlrwydd, gadewch i ni gymryd gweinydd sftp.

  • creu grŵp
    $ sudo groupadd sftpg
  • ychwanegu defnyddiwr a gosod cyfrinair iddo
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • addasu cwpl o osodiadau mynediad
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • ychwanegu ychydig o linellau i /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • ailgychwyn y gwasanaeth
    $ sudo systemctl restart sshd

Gan fod y siop backend Gadewch i ni gymryd 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

I gychwyn y gweinydd, mae angen i chi osod y pecynnau python canlynol (rwy'n argymell creu amgylchedd rhithwir ar wahân):

pip install mlflow
pip install pysftp

Gadewch i ni ddechrau ein gweinydd

$ 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. Ychwanegu olrhain

Er mwyn i ganlyniadau ein hyfforddiant beidio â chael eu colli, cenedlaethau o ddatblygwyr yn y dyfodol i ddeall beth oedd yn digwydd, ac i gymrodyr hŷn a chi allu dadansoddi'r broses ddysgu yn bwyllog, mae angen inni ychwanegu olrhain. Mae olrhain yn golygu arbed paramedrau, metrigau, arteffactau ac unrhyw wybodaeth ychwanegol am ddechrau'r hyfforddiant, yn ein hachos ni, ar y gweinydd.

Er enghraifft, fe wnes i greu bach prosiect ar github ar Keras am segmentu popeth sydd ynddo Set ddata COCO. I ychwanegu olrhain, creais ffeil mlflow_training.py.

Dyma'r llinellau lle mae'r pethau mwyaf diddorol yn digwydd:

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)

Yma mae self.remote_server yn lapio bach dros y dulliau mlflow.tracking. MlflowClient (fe'i gwnes er hwylustod), gyda chymorth yr wyf yn creu arbrawf a'i redeg ar y gweinydd. Nesaf, rwy'n nodi lle dylid uno'r canlyniadau lansio (mlflow.set_tracking_uri (self.tracking_uri)). Rwy'n galluogi logio awtomatig mlflow.keras.autolog(). Ar hyn o bryd mae MLflow Tracking yn cefnogi logio awtomatig ar gyfer TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Os nad ydych wedi dod o hyd i'ch fframwaith neu lyfrgell, yna gallwch chi bob amser logio'n benodol. Rydym yn dechrau hyfforddi. Cofrestru tagiau a pharamedrau mewnbwn ar y gweinydd pell.

Mae cwpl o linellau ac mae gennych chi, fel pawb arall, fynediad at wybodaeth am bob lansiad. Cwl?

3. Rydym yn llunio'r prosiect

Nawr, gadewch i ni ei gwneud hi'n hawdd lansio'r prosiect. I wneud hyn, ychwanegwch y ffeil MLproject a conda.yaml at wraidd y prosiect.
Prosiect 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}"

Mae gan Brosiect MLflow sawl priodwedd:

  • Enw - enw eich prosiect;
  • Amgylchedd - yn fy achos i, mae conda_env yn nodi bod Anaconda yn cael ei ddefnyddio i redeg ac mae'r disgrifiad dibyniaeth yn y ffeil conda.yaml;
  • Pwyntiau Mynediad - yn nodi pa ffeiliau a pha baramedrau y gallwn eu rhedeg (mae'r holl baramedrau'n cael eu cofnodi'n awtomatig wrth ddechrau hyfforddiant)

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

Gallwch ddefnyddio docwr fel eich amgylchedd amser rhedeg, cyfeiriwch at fwy o fanylion dogfennaeth.

4. Gadewch i ni ddechrau hyfforddi

Rydyn ni'n clonio'r prosiect ac yn mynd i gyfeiriadur y prosiect:

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

I redeg mae angen i chi osod llyfrgelloedd

pip install mlflow
pip install pysftp

Achos yn yr enghraifft rwy'n defnyddio conda_env, rhaid gosod Anaconda ar eich cyfrifiadur (ond gallwch chi fynd o gwmpas hyn trwy osod yr holl becynnau angenrheidiol eich hun a chwarae gyda'r paramedrau lansio).

Mae'r holl gamau paratoi wedi'u cwblhau a gallwn ddechrau lansio'r hyfforddiant. O wreiddyn y prosiect:

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

Ar ôl mynd i mewn i'r gorchymyn, bydd amgylchedd conda yn cael ei greu yn awtomatig a bydd yr hyfforddiant yn cychwyn.
Yn yr enghraifft uchod, fe wnes i basio'r nifer o gyfnodau ar gyfer hyfforddiant, y categorïau yr ydym am rannu ynddynt (gallwch weld y rhestr lawn yma) a chyfeiriad ein gweinydd pell.
Mae rhestr gyflawn o baramedrau posibl i'w gweld yn y ffeil MLproject.

5. Gwerthuso canlyniadau dysgu

Ar ôl cwblhau'r hyfforddiant, gallwn fynd yn y porwr i gyfeiriad ein gweinydd http://server_host:server_port

MLOps - Llyfr coginio, pennod 1

Yma gwelwn restr o'r holl arbrofion (chwith uchaf), yn ogystal â gwybodaeth am rediadau (canol). Gallwn weld gwybodaeth fanylach (paramedrau, metrigau, arteffactau a rhywfaint o wybodaeth ychwanegol) ar gyfer pob lansiad.

MLOps - Llyfr coginio, pennod 1

Ar gyfer pob metrig gallwn arsylwi ar hanes y newidiadau

MLOps - Llyfr coginio, pennod 1

Y rhai. Ar hyn o bryd, gallwn ddadansoddi'r canlyniadau mewn modd “â llaw”, a gallwch hefyd sefydlu dilysiad awtomatig gan ddefnyddio'r API MLflow.

6. Cofrestrwch y model

Ar ôl i ni ddadansoddi ein model a phenderfynu ei fod yn barod ar gyfer brwydr, rydym yn symud ymlaen i'w gofrestru, ar gyfer hyn rydym yn dewis y lansiad sydd ei angen arnom (fel y dangosir yn y paragraff blaenorol) ac yn mynd i lawr.

MLOps - Llyfr coginio, pennod 1

Ar ôl i ni roi enw i'n model, mae ganddo fersiwn. Os byddwch chi'n cadw model arall gyda'r un enw, bydd y fersiwn yn cael ei huwchraddio'n awtomatig.

MLOps - Llyfr coginio, pennod 1

Ar gyfer pob model, gallwn ychwanegu disgrifiad a dewis un o dri chyflwr (Llwyfannu, Cynhyrchu, Archifo); wedi hynny, gan ddefnyddio'r API, gallwn gyrchu'r cyflyrau hyn, sydd, ynghyd â fersiynau, yn darparu hyblygrwydd ychwanegol.

MLOps - Llyfr coginio, pennod 1

Mae gennym hefyd fynediad hawdd i bob model

MLOps - Llyfr coginio, pennod 1

a'u fersiynau

MLOps - Llyfr coginio, pennod 1

Fel yn y paragraff blaenorol, gellir gwneud yr holl weithrediadau gan ddefnyddio'r API.

7. Defnyddio'r model

Ar hyn o bryd, mae gennym eisoes fodel hyfforddedig (keras). Enghraifft o sut y gallwch ei ddefnyddio:

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

Yma mae self.registry eto yn ddeunydd lapio bach dros mlflow.tracking.MlflowClient, er hwylustod. Y pwynt yw fy mod yn cyrchu gweinydd pell ac yn edrych am fodel yno gyda'r enw penodedig, a'r fersiwn gynhyrchu ddiweddaraf. Nesaf, rwy'n lawrlwytho'r arteffact yn lleol i'r ffolder ./model ac yn adeiladu'r model o'r cyfeiriadur hwn mlflow.keras.load_model(local_path). Nawr gallwn ddefnyddio ein model. Gall datblygwyr CV (ML) wella'r model yn hawdd a chyhoeddi fersiynau newydd.

I gloi

Cyflwynais system sy'n caniatáu:

  • storio gwybodaeth yn ganolog am fodelau ML, cynnydd a chanlyniadau hyfforddiant;
  • defnyddio amgylchedd datblygu yn gyflym;
  • monitro a dadansoddi cynnydd y gwaith ar fodelau;
  • mae'n gyfleus i fersiwn a rheoli cyflwr modelau;
  • Mae'n hawdd defnyddio'r modelau canlyniadol.

Tegan yw'r enghraifft hon ac mae'n fan cychwyn ar gyfer adeiladu'ch system eich hun, a all gynnwys awtomeiddio gwerthuso canlyniadau a chofrestru modelau (pwyntiau 5 a 6, yn y drefn honno) neu a fyddwch chi'n ychwanegu fersiynau o setiau data, neu efallai rhywbeth arall? Y pwynt yr oeddwn yn ceisio ei wneud yw bod angen MLOps yn ei gyfanrwydd, MLflow yn unig yw ffordd i ben.

Ysgrifennwch pa broblemau ddaethoch chi ar eu traws na wnes i eu harddangos?
Beth fyddech chi'n ei ychwanegu at y system i'w gwneud yn diwallu eich anghenion?
Pa offer a dulliau ydych chi'n eu defnyddio i ddatrys y cyfan neu ran o'r problemau?

PS Byddaf yn gadael cwpl o ddolenni:
prosiect github - https://github.com/simbakot/mlflow_example
MLlif - https://mlflow.org/
E-bost fy ngwaith ar gyfer cwestiynau - [e-bost wedi'i warchod]

O bryd i'w gilydd mae ein cwmni'n cynnal digwyddiadau amrywiol ar gyfer arbenigwyr TG, er enghraifft: ar Orffennaf 8 am 19:00 amser Moscow bydd cyfarfod CV mewn fformat ar-lein, os oes gennych ddiddordeb, gallwch gymryd rhan, cofrestru yma .

Ffynhonnell: hab.com

Ychwanegu sylw