MLOps - Kupika kitabu, sura ya 1

MLOps - Kupika kitabu, sura ya 1

Salaam wote! Mimi ni msanidi wa CV katika CROC. Tumekuwa tukitekeleza miradi katika uwanja wa CV kwa miaka 3 sasa. Wakati huu, tulifanya mambo mengi, kwa mfano: tulifuatilia madereva ili wakati wa kuendesha hawakunywa, hawakuvuta sigara, hawakuzungumza kwenye simu, waliangalia barabara, na sio kwa ndoto au mawingu. ; Tulirekodi watu wanaoendesha gari katika njia maalum na kuchukua nafasi kadhaa za maegesho; ilihakikisha kuwa wafanyikazi wamevaa helmeti, glavu, nk; kutambuliwa mfanyakazi ambaye anataka kuingia kituo; Tulihesabu kila kitu tulichoweza.

Je, ninafanya haya yote kwa ajili ya nini?

Katika mchakato wa utekelezaji wa miradi, tunapiga matuta, matuta mengi, shida zingine unazozifahamu au utafahamiana nazo katika siku zijazo.

Hebu tuige hali hiyo

Hebu fikiria kwamba tulipata kazi katika kampuni ya vijana "N", ambayo shughuli zake zinahusiana na ML. Tunafanya kazi kwenye mradi wa ML (DL, CV), kisha kwa sababu fulani tunabadilisha kazi nyingine, kwa ujumla kuchukua mapumziko, na kurudi kwa neuron yetu au ya mtu mwingine.

  1. Wakati wa ukweli unakuja, unahitaji kukumbuka kwa namna fulani mahali ulipoacha, ni hyperparameters gani ulijaribu na, muhimu zaidi, ni matokeo gani waliyoongoza. Kunaweza kuwa na chaguzi nyingi kwa nani aliyehifadhi habari juu ya uzinduzi wote: katika kichwa, configs, notepad, katika mazingira ya kazi katika wingu. Nilitokea kuona chaguo wakati hyperparameters zilihifadhiwa kama mistari ya maoni kwenye msimbo, kwa ujumla, ndege ya dhana. Sasa fikiria kuwa hukurudi kwenye mradi wako, lakini kwa mradi wa mtu aliyeacha kampuni na ukarithi msimbo na mtindo unaoitwa model_1.pb. Ili kukamilisha picha na kufikisha maumivu yote, hebu fikiria kuwa wewe pia ni mtaalamu wa mwanzo.
  2. Endelea. Ili kuendesha msimbo, sisi na kila mtu atakayefanya kazi nayo tunahitaji kuunda mazingira. Mara nyingi hutokea kwamba kwa sababu fulani hawakumwacha kama urithi wetu. Hii pia inaweza kuwa kazi isiyo ya kawaida. Hutaki kupoteza muda kwa hatua hii, sivyo?
  3. Tunafundisha mfano (kwa mfano, detector ya gari). Tunafika mahali ambapo inakuwa nzuri sana - ni wakati wa kuokoa matokeo. Hebu tuite car_detection_v1.pb. Kisha tunafundisha mwingine - car_detection_v2.pb. Wakati fulani baadaye, wenzetu au sisi wenyewe tunafundisha zaidi na zaidi, kwa kutumia usanifu tofauti. Kama matokeo, rundo la mabaki huundwa, habari juu ya ambayo lazima ikusanywe kwa uchungu (lakini tutafanya hivi baadaye, kwa sababu kwa sasa tuna mambo ya kipaumbele zaidi).
  4. Sawa yote yameisha Sasa! Tuna mfano! Je, tunaweza kuanza kufundisha mtindo unaofuata, kuendeleza usanifu wa kutatua tatizo jipya, au tunaweza kwenda kunywa chai? Na nani atapeleka?

Kutambua matatizo

Kufanya kazi kwenye mradi au bidhaa ni kazi ya watu wengi. Na baada ya muda, watu huondoka na kuja, kuna miradi zaidi, na miradi yenyewe inakuwa ngumu zaidi. Njia moja au nyingine, hali kutoka kwa mzunguko ulioelezwa hapo juu (na sio tu) katika mchanganyiko fulani utatokea kutoka kwa kurudia hadi kurudia. Haya yote husababisha kupoteza muda, kuchanganyikiwa, mishipa, uwezekano wa kutoridhika kwa wateja, na hatimaye, kupoteza pesa. Ingawa sote kwa kawaida hufuata safu ile ile ya zamani, ninaamini kwamba hakuna mtu anayetaka kukumbuka matukio haya tena na tena.

MLOps - Kupika kitabu, sura ya 1

Kwa hiyo, tumepitia mzunguko mmoja wa maendeleo na tunaona kwamba kuna matatizo ambayo yanahitaji kutatuliwa. Ili kufanya hivyo unahitaji:

  • kwa urahisi kuhifadhi matokeo ya kazi;
  • fanya mchakato wa kuwashirikisha wafanyikazi wapya rahisi;
  • kurahisisha mchakato wa kupeleka mazingira ya maendeleo;
  • sanidi mchakato wa toleo la mfano;
  • kuwa na njia rahisi ya kuthibitisha mifano;
  • pata chombo cha usimamizi wa hali ya mfano;
  • kutafuta njia ya kutoa mifano kwa uzalishaji.

Inavyoonekana ni muhimu kuja na mtiririko wa kazi ambao utakuruhusu kudhibiti mzunguko huu wa maisha kwa urahisi na kwa urahisi? Zoezi hili linaitwa MLOps

MLOps, au DevOps kwa ajili ya kujifunza kwa mashine, huruhusu sayansi ya data na timu za TEHAMA kushirikiana na kuongeza kasi ya uundaji wa miundo na utumiaji kupitia ufuatiliaji, uthibitishaji na usimamizi wa miundo ya kujifunza kwa mashine.

Unaweza somaJe! Watu wa Google wana maoni gani kuhusu haya yote? Kutoka kwa kifungu ni wazi kuwa MLOps ni jambo kubwa sana.

MLOps - Kupika kitabu, sura ya 1

Zaidi katika makala yangu nitaelezea sehemu tu ya mchakato. Kwa utekelezaji, nitatumia zana ya MLflow, kwa sababu... Huu ni mradi wa chanzo-wazi, kiasi kidogo cha msimbo kinahitajika kuunganisha na kuna ushirikiano na mifumo maarufu ya ml. Unaweza kutafuta kwenye Mtandao kwa zana zingine, kama vile Kubeflow, SageMaker, Treni, n.k., na pengine kupata inayokidhi mahitaji yako vyema.

"Kujenga" MLOps kwa kutumia mfano wa kutumia zana ya MLFlow

MLFlow ni jukwaa la chanzo wazi la usimamizi wa mzunguko wa maisha wa mifano ya ml (https://mlflow.org/).

MLflow inajumuisha vipengele vinne:

  • Ufuatiliaji wa MLflow - inashughulikia masuala ya kurekodi matokeo na vigezo vilivyosababisha matokeo haya;
  • Mradi wa MLflow - hukuruhusu kufunga nambari na kuizalisha tena kwenye jukwaa lolote;
  • Mitindo ya MLflow - inayohusika na kupeleka mifano kwa uzalishaji;
  • Usajili wa MLflow - hukuruhusu kuhifadhi modeli na kudhibiti hali yao katika hazina kuu.

MLflow inafanya kazi kwenye vyombo viwili:

  • uzinduzi ni mzunguko kamili wa mafunzo, vigezo na metriki ambayo tunataka kujiandikisha;
  • Jaribio ni "mada" inayoendana.

Hatua zote za mfano zinatekelezwa kwenye mfumo wa uendeshaji wa Ubuntu 18.04.

1. Weka seva

Ili tuweze kusimamia mradi wetu kwa urahisi na kupokea taarifa zote muhimu, tutapeleka seva. Seva ya ufuatiliaji wa MLflow ina sehemu kuu mbili:

  • duka la nyuma - kuwajibika kwa kuhifadhi habari kuhusu mifano iliyosajiliwa (inasaidia 4 DBMSs: mysql, mssql, sqlite, na postgresql);
  • duka la vizalia vya programu - linalohusika na kuhifadhi mabaki (inasaidia chaguzi 7 za uhifadhi: Amazon S3, Hifadhi ya Azure Blob, Hifadhi ya Wingu la Google, seva ya FTP, Seva ya SFTP, NFS, HDFS).

Kama duka la mabaki Kwa unyenyekevu, hebu tuchukue seva ya sftp.

  • kuunda kikundi
    $ sudo groupadd sftpg
  • ongeza mtumiaji na umwekee nenosiri
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • kurekebisha mipangilio kadhaa ya ufikiaji
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • ongeza mistari michache kwa /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • anzisha upya huduma
    $ sudo systemctl restart sshd

Kama duka la nyuma Wacha tuchukue 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

Ili kuanza seva, unahitaji kusanikisha vifurushi vifuatavyo vya python (Ninapendekeza kuunda mazingira tofauti ya kawaida):

pip install mlflow
pip install pysftp

Wacha tuanze seva yetu

$ 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. Ongeza ufuatiliaji

Ili matokeo ya mafunzo yetu yasipotee, vizazi vijavyo vya watengenezaji kuelewa kinachoendelea, na kwa wandugu wakubwa na wewe kuweza kuchambua mchakato wa kujifunza kwa utulivu, tunahitaji kuongeza ufuatiliaji. Kufuatilia kunamaanisha kuokoa vigezo, vipimo, vibaki vya programu na maelezo yoyote ya ziada kuhusu kuanza kwa mafunzo, kwa upande wetu, kwenye seva.

Kwa mfano, niliunda ndogo mradi kwenye github kwenye Keras kwa kugawa kila kitu kilicho ndani Karatasi ya data ya COCO. Ili kuongeza ufuatiliaji, niliunda faili mlflow_training.py.

Hapa kuna mistari ambapo mambo ya kuvutia zaidi hufanyika:

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)

Hapa self.remote_server ni kanga ndogo juu ya mbinu za kufuatilia mlflow. MlflowClient (Niliifanya kwa urahisi), kwa msaada ambao ninaunda jaribio na kuiendesha kwenye seva. Kisha, ninaonyesha mahali ambapo matokeo ya uzinduzi yanapaswa kuunganishwa (mlflow.set_tracking_uri(self.tracking_uri)). Ninawezesha ukataji miti kiotomatiki mlflow.keras.autolog(). Kwa sasa Ufuatiliaji wa MLflow unaauni ukataji otomatiki wa TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Ikiwa hujapata mfumo au maktaba yako, basi unaweza kuingia kwa uwazi kila wakati. Tunaanza mafunzo. Sajili vitambulisho na vigezo vya ingizo kwenye seva ya mbali.

Mistari kadhaa na wewe, kama kila mtu mwingine, unaweza kufikia maelezo kuhusu uzinduzi wote. Baridi?

3. Tunachora mradi

Sasa hebu tufanye iwe rahisi kuzindua mradi. Ili kufanya hivyo, ongeza faili ya MLproject na conda.yaml kwenye mzizi wa mradi.
Mradi wa 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}"

Mradi wa MLflow una mali kadhaa:

  • Jina - jina la mradi wako;
  • Mazingira - kwa upande wangu, conda_env inaonyesha kuwa Anaconda inatumika kuendesha na maelezo ya utegemezi yako kwenye faili ya conda.yaml;
  • Pointi za Kuingia - inaonyesha ni faili gani na ni vigezo gani tunaweza kuendesha (vigezo vyote huwekwa kiotomatiki wakati wa kuanza mafunzo)

konda.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

Unaweza kutumia docker kama mazingira yako ya wakati wa kukimbia, kwa maelezo zaidi tafadhali rejelea nyaraka.

4. Hebu tuanze mafunzo

Tunatengeneza mradi na kwenda kwenye saraka ya mradi:

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

Ili kuendesha unahitaji kusakinisha maktaba

pip install mlflow
pip install pysftp

Kwa sababu katika mfano ninaotumia conda_env, Anaconda lazima iwe imewekwa kwenye kompyuta yako (lakini unaweza kuzunguka hii kwa kusanikisha vifurushi vyote muhimu mwenyewe na kucheza na vigezo vya uzinduzi).

Hatua zote za maandalizi zimekamilika na tunaweza kuanza kuzindua mafunzo. Kutoka kwa mzizi wa mradi:

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

Baada ya kuingia amri, mazingira ya conda yataundwa moja kwa moja na mafunzo yataanza.
Katika mfano hapo juu, nilipitisha idadi ya nyakati za mafunzo, kategoria ambazo tunataka kuweka sehemu (unaweza kuona orodha kamili. hapa) na anwani ya seva yetu ya mbali.
Orodha kamili ya vigezo vinavyowezekana inaweza kupatikana katika faili ya MLproject.

5. Tathmini matokeo ya kujifunza

Baada ya kumaliza mafunzo, tunaweza kwenda kwenye kivinjari kwa anwani ya seva yetu http://server_host:server_port

MLOps - Kupika kitabu, sura ya 1

Hapa tunaona orodha ya majaribio yote (juu kushoto), pamoja na taarifa juu ya kukimbia (katikati). Tunaweza kuona maelezo ya kina zaidi (vigezo, vipimo, vizalia vya programu na baadhi ya maelezo ya ziada) kwa kila uzinduzi.

MLOps - Kupika kitabu, sura ya 1

Kwa kila kipimo tunaweza kuona historia ya mabadiliko

MLOps - Kupika kitabu, sura ya 1

Wale. Kwa sasa tunaweza kuchanganua matokeo katika hali ya "mwongozo", na unaweza pia kusanidi uthibitishaji wa kiotomatiki kwa kutumia API ya MLflow.

6. Sajili mfano

Baada ya kuchambua mfano wetu na kuamua kuwa iko tayari kwa vita, tunaendelea kuiandikisha, kwa hili tunachagua uzinduzi tunaohitaji (kama inavyoonekana katika aya iliyotangulia) na kwenda chini.

MLOps - Kupika kitabu, sura ya 1

Baada ya kutoa mfano wetu jina, ina toleo. Ukihifadhi muundo mwingine kwa jina sawa, toleo litasasishwa kiotomatiki.

MLOps - Kupika kitabu, sura ya 1

Kwa kila muundo, tunaweza kuongeza maelezo na kuchagua mojawapo ya majimbo matatu (Staging, Production, Archived); baadaye, kwa kutumia API, tunaweza kufikia majimbo haya, ambayo, pamoja na matoleo, hutoa unyumbufu zaidi.

MLOps - Kupika kitabu, sura ya 1

Pia tuna ufikiaji rahisi wa mifano yote

MLOps - Kupika kitabu, sura ya 1

na matoleo yao

MLOps - Kupika kitabu, sura ya 1

Kama katika aya iliyotangulia, shughuli zote zinaweza kufanywa kwa kutumia API.

7. Weka mfano

Katika hatua hii, tayari tunayo mfano wa mafunzo (keras). Mfano wa jinsi unavyoweza kuitumia:

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

Hapa kujiandikisha binafsi ni kanga ndogo tena juu ya mlflow.tracking.MlflowClient, kwa urahisi. Jambo ni kwamba ninapata seva ya mbali na kutafuta mfano hapo na jina maalum, na toleo la hivi karibuni la uzalishaji. Ifuatayo, ninapakua vizalia vya programu kwenye folda ya ./model na kuunda kielelezo kutoka kwa saraka hii mlflow.keras.load_model(local_path). Sasa tunaweza kutumia mfano wetu. Wasanidi wa CV (ML) wanaweza kuboresha muundo na kuchapisha matoleo mapya kwa urahisi.

Kwa kumalizia

Niliwasilisha mfumo unaoruhusu:

  • hifadhi ya kati habari kuhusu mifano ya ML, maendeleo ya mafunzo na matokeo;
  • haraka kupeleka mazingira ya maendeleo;
  • kufuatilia na kuchambua maendeleo ya kazi kwenye mifano;
  • ni rahisi kwa toleo na kusimamia hali ya mifano;
  • Ni rahisi kupeleka mifano inayotokana.

Mfano huu ni toy na hutumika kama kianzio cha kuunda mfumo wako mwenyewe, ambao unaweza kujumuisha otomatiki ya tathmini ya matokeo na usajili wa mifano (alama 5 na 6, mtawaliwa) au utaongeza toleo la hifadhidata, au labda kitu kingine? Jambo ambalo nilikuwa najaribu kusema ni kwamba unahitaji MLOps kwa ujumla, MLflow ni njia tu ya kumaliza.

Andika ni matatizo gani uliyokumbana nayo ambayo sikuyaonyesha?
Je, unaweza kuongeza nini kwenye mfumo ili kukidhi mahitaji yako?
Je, unatumia zana na mbinu gani kutatua matatizo yote au sehemu yake?

PS nitaacha viungo kadhaa:
mradi wa github - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
Barua pepe yangu ya kazi kwa maswali - [barua pepe inalindwa]

Kampuni yetu mara kwa mara huwa na matukio mbalimbali kwa wataalamu wa IT, kwa mfano: Julai 8 saa 19:00 wakati wa Moscow kutakuwa na mkutano wa CV katika muundo wa mtandaoni, ikiwa una nia, unaweza kushiriki, usajili. hapa .

Chanzo: mapenzi.com

Kuongeza maoni