MLOps - Matreiðslubók, kafli 1

MLOps - Matreiðslubók, kafli 1

Hæ allir! Ég er ferilskrárhönnuður hjá CROC. Við höfum verið að innleiða verkefni á sviði ferilskrár í 3 ár núna. Á þessum tíma gerðum við ýmislegt, til dæmis: við fylgdumst með ökumönnum þannig að við akstur drukku þeir ekki, reyktu ekki, töluðu ekki í síma, horfðu á veginn og ekki á drauma eða skýin. ; Við tókum upp fólk sem keyrir á þar til gerðum akreinum og tekur nokkur stæði; tryggt að starfsmenn notuðu hjálma, hanska o.s.frv.; bent á starfsmann sem vill komast inn í aðstöðuna; Við töldum allt sem við gátum.

Til hvers er ég að gera þetta allt?

Í því ferli að innleiða verkefni lendum við á hnökrum, fullt af höggum, sumum vandamálum sem þú annað hvort kannast við eða munt kynnast í framtíðinni.

Við skulum líkja eftir aðstæðum

Við skulum ímynda okkur að við höfum fengið vinnu hjá ungu fyrirtæki „N“, en starfsemi þess tengist ML. Við vinnum að ML (DL, CV) verkefni, síðan skiptum við af einhverjum ástæðum yfir í annað starf, tökum okkur almennt hlé og snúum aftur í taugafrumuna okkar eða einhvers annars.

  1. Augnablik sannleikans kemur, þú þarft einhvern veginn að muna hvar þú hættir, hvaða ofbreytur þú reyndir og, síðast en ekki síst, hvaða niðurstöður þær leiddu til. Það geta verið margir möguleikar fyrir hver geymdi upplýsingar um allar ræsingar: í hausnum, stillingum, skrifblokk, í vinnuumhverfi í skýinu. Ég sá valmöguleika fyrir tilviljun þegar ofurfæribreytur voru geymdar sem athugasemdalínur í kóðanum, almennt ímyndunarafl. Ímyndaðu þér nú að þú hafir ekki snúið aftur að verkefninu þínu, heldur verkefni einstaklings sem yfirgaf fyrirtækið og þú hefur erft kóða og líkan sem heitir model_1.pb. Til að fullkomna myndina og koma öllum sársauka á framfæri skulum við ímynda okkur að þú sért líka byrjendasérfræðingur.
  2. Gjörðu svo vel. Til að keyra kóðann þurfum við og allir sem munu vinna með hann að búa til umhverfi. Það kemur oft fyrir að þeir hafi af einhverjum ástæðum ekki skilið hann eftir sem arfleifð okkar. Þetta getur líka orðið léttvægt verkefni. Þú vilt ekki eyða tíma í þetta skref, er það?
  3. Við þjálfum líkan (til dæmis bílskynjara). Við komumst á það stig að það verður mjög gott - það er kominn tími til að vista niðurstöðuna. Við skulum kalla það car_detection_v1.pb. Síðan þjálfum við annan - car_detection_v2.pb. Nokkru síðar kennum samstarfsmenn okkar eða við sjálf meira og meira, með mismunandi arkitektúr. Fyrir vikið myndast hellingur af gripum sem þarf að safna upplýsingum um þá vandlega (en við gerum þetta síðar, því í bili höfum við fleiri forgangsmál).
  4. Allt í lagi núna! Við erum með fyrirmynd! Getum við byrjað að þjálfa næsta líkan, þróa arkitektúr til að leysa nýtt vandamál, eða getum við farið í te? Og hver mun senda út?

Að bera kennsl á vandamál

Vinna við verkefni eða vöru er vinna margra. Og með tímanum fer fólk og kemur, það eru fleiri verkefni og verkefnin sjálf verða flóknari. Á einn eða annan hátt munu aðstæður úr hringrásinni sem lýst er hér að ofan (og ekki aðeins) í ákveðnum samsetningum eiga sér stað frá endurtekningu til endurtekningar. Allt þetta hefur í för með sér sóun á tíma, rugli, taugum, hugsanlega óánægju viðskiptavina og að lokum tapað fé. Þó við fylgjumst yfirleitt öll með sömu gömlu hrífunni, þá trúi ég því að enginn vilji rifja upp þessar stundir aftur og aftur.

MLOps - Matreiðslubók, kafli 1

Þannig að við höfum farið í gegnum eina þróunarlotu og við sjáum að það eru vandamál sem þarf að leysa. Til að gera þetta þarftu:

  • geyma vinnuárangur á þægilegan hátt;
  • gera ferlið við að taka þátt í nýjum starfsmönnum einfalt;
  • einfalda ferlið við að dreifa þróunarumhverfi;
  • stilla líkanútgáfuferlið;
  • hafa þægilega leið til að sannprófa módel;
  • finna fyrirmynd ríkisstjórnunartæki;
  • finna leið til að koma módelum til framleiðslu.

Það er greinilega nauðsynlegt að koma með verkflæði sem gerir þér kleift að stjórna þessum lífsferli á auðveldan og þægilegan hátt? Þessi æfing er kölluð MLOps

MLOps, eða DevOps fyrir vélanám, gerir gagnavísinda- og upplýsingatækniteymum kleift að vinna saman og auka hraða líkanaþróunar og dreifingar með eftirliti, staðfestingu og stjórnunaraðferðum fyrir vélanámslíkön.

Þú getur að lesaHvað finnst Google krökkunum um þetta allt saman? Af greininni er ljóst að MLOps er töluvert fyrirferðarmikill hlutur.

MLOps - Matreiðslubók, kafli 1

Nánar í grein minni mun ég aðeins lýsa hluta af ferlinu. Til innleiðingar mun ég nota MLflow tólið, vegna þess að... Þetta er opinn uppspretta verkefni, lítið magn af kóða þarf til að tengjast og það er samþætting við vinsæla ml ramma. Þú getur leitað á netinu að öðrum verkfærum eins og Kubeflow, SageMaker, Trains o.s.frv., og ef til vill fundið eitt sem hentar þínum þörfum betur.

„Byggja“ MLOps með því að nota dæmið um að nota MLFlow tólið

MLFlow er opinn uppspretta vettvangur fyrir líftímastjórnun á ml gerðum (https://mlflow.org/).

MLflow inniheldur fjóra þætti:

  • MLflow Tracking - nær yfir málefni skráningar niðurstaðna og breytur sem leiddu til þessarar niðurstöðu;
  • MLflow Project - gerir þér kleift að pakka kóða og endurskapa hann á hvaða vettvang sem er;
  • MLflow Models - ábyrgur fyrir því að dreifa gerðum til framleiðslu;
  • MLflow Registry - gerir þér kleift að geyma líkön og stjórna ástandi þeirra í miðlægri geymslu.

MLflow starfar á tveimur aðilum:

  • sjósetja er heil hringrás af þjálfun, breytum og mæligildum sem við viljum skrá okkur eftir;
  • Tilraun er „efni“ sem rennur saman.

Öll skref dæmisins eru útfærð á Ubuntu 18.04 stýrikerfinu.

1. Settu upp þjóninn

Til þess að við getum auðveldlega stjórnað verkefninu okkar og fengið allar nauðsynlegar upplýsingar munum við setja upp netþjón. MLflow rakningarþjónn hefur tvo meginþætti:

  • bakendaverslun - ábyrg fyrir að geyma upplýsingar um skráðar gerðir (styður 4 DBMS: mysql, mssql, sqlite og postgresql);
  • artifact store - ber ábyrgð á að geyma gripi (styður 7 geymsluvalkosti: Amazon S3, Azure Blob Storage, Google Cloud Storage, FTP server, SFTP Server, NFS, HDFS).

Eins og gripaverslun Til einföldunar skulum við taka sftp netþjón.

  • búa til hóp
    $ sudo groupadd sftpg
  • bæta við notanda og setja lykilorð fyrir hann
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • að stilla nokkrar aðgangsstillingar
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • bættu nokkrum línum við /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • endurræstu þjónustuna
    $ sudo systemctl restart sshd

Eins og bakenda verslun Við skulum taka 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

Til að ræsa netþjóninn þarftu að setja upp eftirfarandi python pakka (ég mæli með að búa til sérstakt sýndarumhverfi):

pip install mlflow
pip install pysftp

Byrjum netþjóninn okkar

$ 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. Bæta við mælingar

Til þess að árangur þjálfunar okkar glatist ekki, komandi kynslóðir þróunaraðila skilji hvað var að gerast og til þess að eldri félagar og þú getir greint námsferlið í rólegheitum, þurfum við að bæta við mælingar. Mæling þýðir að vista færibreytur, mælikvarða, gripi og allar viðbótarupplýsingar um upphaf þjálfunar, í okkar tilviki, á þjóninum.

Til dæmis bjó ég til litla verkefni á github á Keras fyrir að skipta öllu sem er í COCO gagnasafn. Til að bæta við mælingar bjó ég til skrá mlflow_training.py.

Hér eru línurnar þar sem áhugaverðustu hlutirnir gerast:

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)

Hér er self.remote_server lítill vefur yfir mlflow.tracking aðferðirnar. MlflowClient (ég gerði það til þæginda), með hjálp sem ég bý til tilraun og keyri hana á þjóninum. Næst gef ég til kynna hvar ræsingarniðurstöðurnar ættu að vera sameinaðar (mlflow.set_tracking_uri(self.tracking_uri)). Ég virkja sjálfvirka skógarhögg mlflow.keras.autolog(). Eins og er styður MLflow Tracking sjálfvirka skógarhögg fyrir TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Ef þú hefur ekki fundið ramma þinn eða bókasafn, þá geturðu alltaf skráð þig beint. Við erum að hefja æfingar. Skráðu merki og innsláttarfæribreytur á ytri þjóninum.

Nokkrar línur og þú, eins og allir aðrir, hefur aðgang að upplýsingum um allar sjósetningar. Flott?

3. Við drögum verkefnið upp

Nú skulum við gera það auðvelt að koma verkefninu af stað. Til að gera þetta skaltu bæta MLproject og conda.yaml skránni við verkefnisrótina.
MLverkefni

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 Project hefur nokkra eiginleika:

  • Nafn - heiti verkefnisins þíns;
  • Umhverfi - í mínu tilviki gefur conda_env til kynna að Anaconda sé notað til að keyra og lýsingin á ósjálfstæði er í conda.yaml skránni;
  • Aðgangspunktar - gefur til kynna hvaða skrár og með hvaða færibreytum við getum keyrt (allar breytur eru sjálfkrafa skráðar þegar þjálfun hefst)

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

Þú getur notað docker sem keyrsluumhverfi þitt, fyrir frekari upplýsingar vinsamlegast skoðaðu skjöl.

4. Byrjum að æfa

Við klónum verkefnið og förum í verkefnaskrána:

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

Til að keyra þarftu að setja upp bókasöfn

pip install mlflow
pip install pysftp

Vegna þess að í dæminu sem ég nota conda_env verður Anaconda að vera uppsett á tölvunni þinni (en þú getur komist í kringum þetta með því að setja upp alla nauðsynlega pakka sjálfur og leika þér með launch parameters).

Öllum undirbúningsskrefum er lokið og við getum byrjað að hefja þjálfunina. Frá verkefnarótinni:

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

Eftir að skipunin hefur verið slegin inn verður sjálfkrafa búið til conda umhverfi og þjálfunin hefst.
Í dæminu hér að ofan fór ég yfir fjölda tímabila fyrir þjálfun, flokkana sem við viljum skipta í (þú getur séð allan listann hér) og heimilisfang ytri netþjónsins okkar.
Heildarlisti yfir mögulegar færibreytur er að finna í MLproject skránni.

5. Metið námsárangur

Eftir að hafa lokið þjálfuninni getum við farið í vafranum á netfang netþjónsins okkar http://server_host:server_port

MLOps - Matreiðslubók, kafli 1

Hér sjáum við lista yfir allar tilraunir (efst til vinstri), auk upplýsinga um keyrslur (í miðju). Við getum skoðað ítarlegri upplýsingar (færibreytur, mæligildi, gripir og nokkrar viðbótarupplýsingar) fyrir hverja sjósetningu.

MLOps - Matreiðslubók, kafli 1

Fyrir hvern mælikvarða getum við fylgst með sögu breytinga

MLOps - Matreiðslubók, kafli 1

Þeir. Í augnablikinu getum við greint niðurstöðurnar í „handvirkum“ ham og þú getur líka sett upp sjálfvirka staðfestingu með því að nota MLflow API.

6. Skráðu líkanið

Eftir að við höfum greint líkanið okkar og ákveðið að það sé tilbúið fyrir bardaga, höldum við áfram að skrá það, til þess veljum við sjósetninguna sem við þurfum (eins og sýnt er í fyrri málsgrein) og förum niður.

MLOps - Matreiðslubók, kafli 1

Eftir að við höfum gefið fyrirmyndinni okkar nafn hefur það útgáfu. Ef þú vistar aðra gerð með sama nafni verður útgáfan sjálfkrafa uppfærð.

MLOps - Matreiðslubók, kafli 1

Fyrir hverja gerð getum við bætt við lýsingu og valið eitt af þremur ríkjum (sviðsetning, framleiðsla, geymslu); í kjölfarið, með því að nota API, getum við fengið aðgang að þessum ríkjum, sem ásamt útgáfu útgáfu veitir aukinn sveigjanleika.

MLOps - Matreiðslubók, kafli 1

Við höfum einnig greiðan aðgang að öllum gerðum

MLOps - Matreiðslubók, kafli 1

og útgáfur þeirra

MLOps - Matreiðslubók, kafli 1

Eins og í fyrri málsgrein er hægt að gera allar aðgerðir með API.

7. Settu líkanið í notkun

Á þessu stigi erum við nú þegar með þjálfað (keras) líkan. Dæmi um hvernig þú getur notað það:

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

Hér er self.registry aftur lítið umbúðir yfir mlflow.tracking.MlflowClient, til þæginda. Málið er að ég fer inn á fjarþjón og leita að gerð þar með tilgreindu nafni og nýjustu framleiðsluútgáfu. Næst hleð ég gripnum niður á staðnum í ./model möppuna og byggi líkanið úr þessari möppu mlflow.keras.load_model(local_path). Nú getum við notað líkanið okkar. CV (ML) forritarar geta auðveldlega bætt líkanið og birt nýjar útgáfur.

Að lokum

Ég kynnti kerfi sem gerir:

  • geyma miðlægt upplýsingar um ML módel, þjálfunarframvindu og árangur;
  • dreifa fljótt þróunarumhverfi;
  • fylgjast með og greina framvindu vinnu við gerð líkana;
  • það er þægilegt að útgáfa og stjórna ástandi líkana;
  • Það er auðvelt að dreifa módelunum sem myndast.

Þetta dæmi er leikfang og þjónar sem upphafspunktur fyrir að byggja upp þitt eigið kerfi, sem getur falið í sér sjálfvirkni í mati á niðurstöðum og skráningu líkana (liður 5 og 6, í sömu röð) eða þú munt bæta við útgáfu gagnasetta, eða kannski eitthvað annað? Punkturinn sem ég var að reyna að koma með er að þú þarft MLOps í heild sinni, MLflow er bara leið að markmiði.

Skrifaðu hvaða vandamál þú lentir í sem ég sýndi ekki?
Hvað myndir þú bæta við kerfið til að það uppfylli þarfir þínar?
Hvaða verkfæri og nálganir notar þú til að leysa öll vandamálin eða hluta þeirra?

PS ég skil eftir nokkra tengla:
github verkefni - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
Vinnupósturinn minn fyrir spurningar - [netvarið]

Fyrirtækið okkar hýsir reglulega ýmsa viðburði fyrir upplýsingatæknisérfræðinga, til dæmis: þann 8. júlí klukkan 19:00 að Moskvutíma verður haldinn ferilskrárfundur á netinu, ef þú hefur áhuga geturðu tekið þátt, skráning hér .

Heimild: www.habr.com

Bæta við athugasemd