MLOps - Buku masakan, bab 1

MLOps - Buku masakan, bab 1

Hai semua! Saya seorang pembangun CV di CROC. Kami telah melaksanakan projek dalam bidang CV selama 3 tahun sekarang. Pada masa ini, kami melakukan banyak perkara, contohnya: kami memantau pemandu supaya semasa memandu mereka tidak minum, tidak merokok, tidak bercakap di telefon, melihat jalan raya, dan bukan pada mimpi atau awan. ; Kami merekodkan orang yang memandu di lorong khusus dan mengambil beberapa tempat letak kereta; memastikan bahawa pekerja memakai topi keledar, sarung tangan, dsb.; mengenal pasti pekerja yang ingin memasuki kemudahan itu; Kami mengira semua yang kami boleh.

Untuk apa saya lakukan semua ini?

Dalam proses melaksanakan projek, kami mengalami masalah, banyak masalah, beberapa masalah yang anda biasa atau akan kenali pada masa hadapan.

Mari kita simulasi keadaan

Bayangkan kita mendapat pekerjaan di sebuah syarikat muda "N", yang aktivitinya berkaitan dengan ML. Kami mengusahakan projek ML (DL, CV), kemudian atas sebab tertentu kami bertukar kepada kerja lain, secara amnya berehat dan kembali ke neuron kami sendiri atau orang lain.

  1. Saat kebenaran tiba, anda perlu ingat di mana anda berhenti, apakah hiperparameter yang anda cuba dan, yang paling penting, apakah keputusan yang mereka bawa. Terdapat banyak pilihan untuk siapa yang menyimpan maklumat pada semua pelancaran: di kepala, konfigurasi, pad nota, dalam persekitaran kerja di awan. Saya kebetulan melihat pilihan apabila hiperparameter disimpan sebagai baris komen dalam kod, secara umum, penerbangan mewah. Sekarang bayangkan bahawa anda tidak kembali kepada projek anda, tetapi kepada projek seseorang yang meninggalkan syarikat dan anda mewarisi kod dan model yang dipanggil model_1.pb. Untuk melengkapkan gambar dan menyampaikan semua kesakitan, mari bayangkan bahawa anda juga seorang pakar pemula.
  2. Teruskan. Untuk menjalankan kod, kami dan semua orang yang akan bekerja dengannya perlu mencipta persekitaran. Ia sering berlaku bahawa atas sebab tertentu mereka tidak meninggalkannya sebagai warisan kita. Ini juga boleh menjadi tugas yang tidak remeh. Anda tidak mahu membuang masa pada langkah ini, bukan?
  3. Kami melatih model (contohnya, pengesan kereta). Kami sampai ke tahap di mana ia menjadi sangat baik - sudah tiba masanya untuk menyelamatkan hasilnya. Mari kita panggil ia car_detection_v1.pb. Kemudian kami melatih satu lagi - car_detection_v2.pb. Beberapa ketika kemudian, rakan sekerja kami atau kami sendiri mengajar lebih banyak lagi, menggunakan seni bina yang berbeza. Akibatnya, sekumpulan artifak terbentuk, maklumat mengenainya mesti dikumpulkan dengan susah payah (tetapi kami akan melakukannya kemudian, kerana buat masa ini kami mempunyai lebih banyak perkara keutamaan).
  4. OK semuanya sudah berakhir Sekarang! Kami mempunyai model! Bolehkah kita mula melatih model seterusnya, membangunkan seni bina untuk menyelesaikan masalah baharu, atau bolehkah kita pergi minum teh? Dan siapa yang akan mengerahkan?

Mengenal pasti masalah

Mengusahakan projek atau produk adalah kerja ramai orang. Dan dari masa ke masa, orang pergi dan datang, terdapat lebih banyak projek, dan projek itu sendiri menjadi lebih kompleks. Satu cara atau yang lain, situasi daripada kitaran yang diterangkan di atas (dan bukan sahaja) dalam kombinasi tertentu akan berlaku dari lelaran ke lelaran. Semua ini mengakibatkan pembaziran masa, kekeliruan, saraf, mungkin ketidakpuasan hati pelanggan, dan akhirnya, kehilangan wang. Walaupun kita semua biasanya mengikuti rake lama yang sama, saya percaya bahawa tiada siapa yang mahu menghidupkan kembali detik-detik ini berulang kali.

MLOps - Buku masakan, bab 1

Jadi, kita telah melalui satu kitaran pembangunan dan kita lihat ada masalah yang perlu diselesaikan. Untuk melakukan ini, anda memerlukan:

  • menyimpan hasil kerja dengan mudah;
  • memudahkan proses melibatkan pekerja baharu;
  • memudahkan proses menggunakan persekitaran pembangunan;
  • konfigurasikan proses versi model;
  • mempunyai cara yang mudah untuk mengesahkan model;
  • cari alat pengurusan negeri model;
  • cari cara untuk menghantar model kepada pengeluaran.

Nampaknya adalah perlu untuk menghasilkan aliran kerja yang membolehkan anda menguruskan kitaran hayat ini dengan mudah dan mudah? Amalan ini dipanggil MLOps

MLOps, atau DevOps untuk pembelajaran mesin, membolehkan sains data dan pasukan IT bekerjasama dan meningkatkan kadar pembangunan dan penggunaan model melalui pemantauan, pengesahan dan tadbir urus untuk model pembelajaran mesin.

Anda boleh untuk membacaApakah pendapat orang Google tentang semua ini? Daripada artikel itu jelas bahawa MLOps adalah perkara yang agak besar.

MLOps - Buku masakan, bab 1

Selanjutnya dalam artikel saya, saya akan menerangkan hanya sebahagian daripada proses itu. Untuk pelaksanaan, saya akan menggunakan alat MLflow, kerana... Ini adalah projek sumber terbuka, sejumlah kecil kod diperlukan untuk menyambung dan terdapat penyepaduan dengan rangka kerja ml yang popular. Anda boleh mencari di Internet untuk alatan lain, seperti Kubeflow, SageMaker, Trains, dll., dan mungkin mencari alat yang lebih sesuai dengan keperluan anda.

MLOp "Membina" menggunakan contoh menggunakan alat MLFlow

MLFlow ialah platform sumber terbuka untuk pengurusan kitaran hayat model ml (https://mlflow.org/).

MLflow merangkumi empat komponen:

  • Penjejakan Aliran ML - merangkumi isu keputusan rakaman dan parameter yang membawa kepada keputusan ini;
  • Projek MLflow - membolehkan anda membungkus kod dan mengeluarkannya semula pada mana-mana platform;
  • Model MLflow - bertanggungjawab untuk menggunakan model kepada pengeluaran;
  • MLflow Registry - membolehkan anda menyimpan model dan mengurus keadaannya dalam repositori berpusat.

MLflow beroperasi pada dua entiti:

  • pelancaran ialah kitaran penuh latihan, parameter dan metrik yang kami mahu mendaftar;
  • Percubaan ialah "topik" yang berjalan bersama.

Semua langkah contoh dilaksanakan pada sistem pengendalian Ubuntu 18.04.

1. Sebarkan pelayan

Untuk memudahkan kami mengurus projek kami dan menerima semua maklumat yang diperlukan, kami akan menggunakan pelayan. Pelayan penjejakan MLflow mempunyai dua komponen utama:

  • kedai belakang - bertanggungjawab untuk menyimpan maklumat tentang model berdaftar (menyokong 4 DBMS: mysql, mssql, sqlite, dan postgresql);
  • kedai artifak - bertanggungjawab untuk menyimpan artifak (menyokong 7 pilihan storan: Amazon S3, Storan Blob Azure, Storan Awan Google, pelayan FTP, Pelayan SFTP, NFS, HDFS).

Sebagai kedai artifak Untuk memudahkan, mari ambil pelayan sftp.

  • buat kumpulan
    $ sudo groupadd sftpg
  • tambah pengguna dan tetapkan kata laluan untuknya
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • melaraskan beberapa tetapan akses
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • tambah beberapa baris ke /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • mulakan semula perkhidmatan
    $ sudo systemctl restart sshd

Sebagai kedai bahagian belakang Mari ambil 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

Untuk memulakan pelayan, anda perlu memasang pakej python berikut (saya cadangkan mencipta persekitaran maya yang berasingan):

pip install mlflow
pip install pysftp

Mari mulakan pelayan kami

$ 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. Tambah penjejakan

Agar hasil latihan kami tidak hilang, generasi masa depan pembangun memahami apa yang berlaku, dan untuk rakan-rakan yang lebih tua dan anda dapat menganalisis proses pembelajaran dengan tenang, kami perlu menambah penjejakan. Penjejakan bermaksud menyimpan parameter, metrik, artifak dan sebarang maklumat tambahan tentang permulaan latihan, dalam kes kami, pada pelayan.

Sebagai contoh, saya mencipta kecil projek di github pada Keras untuk membahagikan semua yang ada dataset COCO. Untuk menambah penjejakan, saya mencipta fail mlflow_training.py.

Berikut ialah baris di mana perkara paling menarik berlaku:

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)

Di sini self.remote_server ialah pembungkus kecil di atas kaedah mlflow.tracking. MlflowClient (saya membuatnya untuk kemudahan), dengan bantuannya saya membuat percubaan dan menjalankannya pada pelayan. Seterusnya, saya nyatakan tempat hasil pelancaran harus digabungkan (mlflow.set_tracking_uri(self.tracking_uri)). Saya mendayakan pengelogan automatik mlflow.keras.autolog(). Pada masa ini MLflow Tracking menyokong pengelogan automatik untuk TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Jika anda tidak menemui rangka kerja atau pustaka anda, maka anda sentiasa boleh log secara eksplisit. Kami memulakan latihan. Daftar teg dan parameter input pada pelayan jauh.

Beberapa baris dan anda, seperti orang lain, mempunyai akses kepada maklumat tentang semua pelancaran. Sejuk?

3. Kami merangka projek

Sekarang mari kita permudahkan untuk melancarkan projek. Untuk melakukan ini, tambahkan fail MLproject dan conda.yaml pada akar projek.
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}"

Projek MLflow mempunyai beberapa sifat:

  • Nama - nama projek anda;
  • Persekitaran - dalam kes saya, conda_env menunjukkan bahawa Anaconda digunakan untuk dijalankan dan perihalan kebergantungan berada dalam fail conda.yaml;
  • Mata Masuk - menunjukkan fail yang mana dan dengan parameter yang boleh kita jalankan (semua parameter dilog secara automatik apabila memulakan latihan)

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

Anda boleh menggunakan docker sebagai persekitaran masa jalan anda, untuk butiran lanjut sila rujuk dokumentasi.

4. Mari mulakan latihan

Kami mengklon projek dan pergi ke direktori projek:

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

Untuk menjalankan anda perlu memasang perpustakaan

pip install mlflow
pip install pysftp

Kerana dalam contoh yang saya gunakan conda_env, Anaconda mesti dipasang pada komputer anda (tetapi anda boleh mengatasinya dengan memasang sendiri semua pakej yang diperlukan dan bermain dengan parameter pelancaran).

Semua langkah persediaan telah selesai dan kita boleh mula melancarkan latihan. Daripada akar projek:

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

Selepas memasukkan arahan, persekitaran konda akan dibuat secara automatik dan latihan akan bermula.
Dalam contoh di atas, saya melepasi bilangan zaman untuk latihan, kategori yang kami ingin bahagikan (anda boleh melihat senarai penuh di sini) dan alamat pelayan jauh kami.
Senarai lengkap kemungkinan parameter boleh didapati dalam fail MLproject.

5. Menilai hasil pembelajaran

Selepas menamatkan latihan, kami boleh pergi dalam pelayar ke alamat pelayan kami http://server_host:server_port

MLOps - Buku masakan, bab 1

Di sini kita melihat senarai semua percubaan (kiri atas), serta maklumat tentang larian (tengah). Kami boleh melihat maklumat yang lebih terperinci (parameter, metrik, artifak dan beberapa maklumat tambahan) untuk setiap pelancaran.

MLOps - Buku masakan, bab 1

Untuk setiap metrik kita boleh memerhati sejarah perubahan

MLOps - Buku masakan, bab 1

Itu. Pada masa ini, kami boleh menganalisis keputusan dalam mod "manual", dan anda juga boleh menyediakan pengesahan automatik menggunakan API MLflow.

6. Daftar model

Selepas kami menganalisis model kami dan memutuskan bahawa ia bersedia untuk pertempuran, kami meneruskan untuk mendaftarkannya, untuk ini kami memilih pelancaran yang kami perlukan (seperti yang ditunjukkan dalam perenggan sebelumnya) dan turun.

MLOps - Buku masakan, bab 1

Selepas kami memberi nama model kami, ia mempunyai versi. Jika anda menyimpan model lain dengan nama yang sama, versi akan dinaik taraf secara automatik.

MLOps - Buku masakan, bab 1

Untuk setiap model, kami boleh menambah penerangan dan memilih satu daripada tiga keadaan (Pementasan, Pengeluaran, Arkib); selepas itu, menggunakan API, kami boleh mengakses keadaan ini, yang, bersama-sama dengan versi, memberikan fleksibiliti tambahan.

MLOps - Buku masakan, bab 1

Kami juga mempunyai akses mudah kepada semua model

MLOps - Buku masakan, bab 1

dan versi mereka

MLOps - Buku masakan, bab 1

Seperti dalam perenggan sebelumnya, semua operasi boleh dilakukan menggunakan API.

7. Sebarkan model

Pada peringkat ini, kita sudah mempunyai model (keras) terlatih. Contoh bagaimana anda boleh menggunakannya:

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

Di sini self.registry sekali lagi merupakan pembungkus kecil di atas mlflow.tracking.MlflowClient, untuk kemudahan. Intinya ialah saya mengakses pelayan jauh dan mencari model di sana dengan nama yang ditentukan, dan versi pengeluaran terkini. Seterusnya, saya memuat turun artifak secara setempat ke folder ./model dan membina model daripada direktori ini mlflow.keras.load_model(local_path). Sekarang kita boleh menggunakan model kita. Pembangun CV (ML) boleh menambah baik model dan menerbitkan versi baharu dengan mudah.

Kesimpulannya

Saya membentangkan sistem yang membolehkan:

  • menyimpan maklumat secara berpusat tentang model ML, kemajuan latihan dan keputusan;
  • menggunakan persekitaran pembangunan dengan cepat;
  • memantau dan menganalisis kemajuan kerja pada model;
  • ia adalah mudah untuk versi dan menguruskan keadaan model;
  • Mudah untuk menggunakan model yang dihasilkan.

Contoh ini adalah mainan dan berfungsi sebagai titik permulaan untuk membina sistem anda sendiri, yang mungkin termasuk automasi penilaian keputusan dan pendaftaran model (masing-masing mata 5 dan 6) atau anda akan menambah versi set data, atau mungkin sesuatu yang lain ? Perkara yang saya cuba sampaikan ialah anda memerlukan MLOps secara keseluruhan, MLflow hanyalah satu cara untuk mencapai matlamat.

Tulis masalah yang anda hadapi yang tidak saya paparkan?
Apakah yang akan anda tambahkan pada sistem untuk memenuhi keperluan anda?
Apakah alat dan pendekatan yang anda gunakan untuk menyelesaikan semua atau sebahagian daripada masalah?

PS Saya akan meninggalkan beberapa pautan:
projek github - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
E-mel kerja saya untuk pertanyaan - [e-mel dilindungi]

Syarikat kami secara berkala menganjurkan pelbagai acara untuk pakar IT, contohnya: pada 8 Julai pukul 19:00 waktu Moscow akan ada pertemuan CV dalam format dalam talian, jika anda berminat, anda boleh mengambil bahagian, pendaftaran di sini .

Sumber: www.habr.com

Tambah komen