MLOps - Buku masak, bab 1

MLOps - Buku masak, bab 1

Halo semua! Saya seorang pengembang CV di CROC. Kami telah melaksanakan proyek di bidang CV selama 3 tahun sekarang. Selama ini banyak hal yang kami lakukan, misalnya: kami memantau pengemudi agar saat berkendara tidak minum, tidak merokok, tidak berbicara di telepon, tidak melihat ke jalan, tidak melihat mimpi atau awan. ; Kami mencatat orang-orang yang mengemudi di jalur khusus dan menempati beberapa tempat parkir; memastikan pekerja mengenakan helm, sarung tangan, dan lain-lain; mengidentifikasi seorang karyawan yang ingin memasuki fasilitas; Kami menghitung semua yang kami bisa.

Untuk apa aku melakukan semua ini?

Dalam proses pelaksanaan proyek, kami menemui banyak kendala, beberapa masalah yang Anda kenal atau akan Anda temui di masa depan.

Memodelkan situasi

Bayangkan kita mendapat pekerjaan di perusahaan muda “N”, yang aktivitasnya berhubungan dengan ML. Kami mengerjakan proyek ML (DL, CV), lalu karena alasan tertentu kami beralih ke pekerjaan lain, biasanya istirahat, dan kembali ke neuron kami sendiri atau orang lain.

  1. Saat kebenaran tiba, Anda perlu mengingat di mana Anda berhenti, hyperparameter apa yang Anda coba, dan, yang paling penting, hasil apa yang dihasilkannya. Ada banyak opsi untuk siapa yang menyimpan informasi pada semua peluncuran: di kepala, konfigurasi, notepad, di lingkungan kerja di cloud. Saya kebetulan melihat opsi ketika hyperparameter disimpan sebagai baris komentar dalam kode, secara umum, sebuah kemewahan. Sekarang bayangkan Anda kembali bukan ke proyek Anda, tetapi ke proyek seseorang yang keluar dari perusahaan dan Anda mewarisi kode dan model bernama model_1.pb. Untuk melengkapi gambaran dan menyampaikan semua rasa sakitnya, bayangkan Anda juga seorang spesialis pemula.
  2. Teruskan. Untuk menjalankan kode tersebut, kita dan semua orang yang akan bekerja dengannya perlu menciptakan lingkungan. Sering terjadi karena alasan tertentu mereka tidak meninggalkannya sebagai warisan kita. Ini juga bisa menjadi tugas yang tidak sepele. Anda tidak ingin membuang waktu untuk langkah ini, bukan?
  3. Kami melatih model (misalnya, detektor mobil). Kita sampai pada titik di mana hasilnya menjadi sangat bagus – inilah waktunya untuk menyimpan hasilnya. Sebut saja car_detection_v1.pb. Lalu kami melatih yang lain - car_detection_v2.pb. Beberapa waktu kemudian, kolega kami atau kami sendiri semakin banyak mengajar, menggunakan arsitektur yang berbeda. Akibatnya, terbentuklah sekumpulan artefak yang informasinya harus dikumpulkan dengan susah payah (tetapi akan kita lakukan nanti, karena untuk saat ini kita memiliki lebih banyak hal yang diprioritaskan).
  4. Oke semuanya sudah berakhir Sekarang! Kami punya model! Bisakah kita mulai melatih model berikutnya, mengembangkan arsitektur untuk memecahkan masalah baru, atau bisakah kita minum teh? Dan siapa yang akan mengerahkan?

Mengidentifikasi masalah

Mengerjakan suatu proyek atau produk merupakan pekerjaan banyak orang. Dan seiring waktu, orang-orang pergi dan datang, ada lebih banyak proyek, dan proyek itu sendiri menjadi lebih kompleks. Dengan satu atau lain cara, situasi dari siklus yang dijelaskan di atas (dan tidak hanya) dalam kombinasi tertentu akan terjadi dari iterasi ke iterasi. Semua ini mengakibatkan waktu terbuang, kebingungan, kegelisahan, kemungkinan ketidakpuasan pelanggan, dan pada akhirnya, kehilangan uang. Meskipun kita semua biasanya mengikuti pola lama yang sama, saya yakin tidak ada seorang pun yang ingin menghidupkan kembali momen-momen ini berulang kali.

MLOps - Buku masak, bab 1

Jadi, kami telah melalui satu siklus pengembangan dan kami melihat ada masalah yang perlu diselesaikan. Untuk melakukan ini, Anda perlu:

  • menyimpan hasil pekerjaan dengan nyaman;
  • menyederhanakan proses pelibatan karyawan baru;
  • menyederhanakan proses penerapan lingkungan pengembangan;
  • konfigurasikan proses pembuatan versi model;
  • memiliki cara mudah untuk memvalidasi model;
  • temukan model alat manajemen negara;
  • menemukan cara untuk mengirimkan model ke produksi.

Tampaknya perlu untuk membuat alur kerja yang memungkinkan Anda mengelola siklus hidup ini dengan mudah dan nyaman? Praktek ini disebut MLOps

MLOps, atau DevOps untuk pembelajaran mesin, memungkinkan ilmu data dan tim TI berkolaborasi dan meningkatkan kecepatan pengembangan dan penerapan model melalui pemantauan, validasi, dan tata kelola model pembelajaran mesin.

Anda bisa kehormatanApa pendapat orang-orang Google tentang semua ini? Dari artikel tersebut jelas bahwa MLOps adalah hal yang cukup banyak.

MLOps - Buku masak, bab 1

Lebih lanjut dalam artikel saya, saya hanya akan menjelaskan sebagian dari prosesnya. Untuk implementasinya saya akan menggunakan tool MLflow, karena... Ini adalah proyek sumber terbuka, sejumlah kecil kode diperlukan untuk terhubung dan ada integrasi dengan kerangka ml populer. Anda dapat mencari alat lain di Internet, seperti Kubeflow, SageMaker, Trains, dll., dan mungkin menemukan alat yang lebih sesuai dengan kebutuhan Anda.

“Membangun” MLOps menggunakan contoh penggunaan alat MLFlow

MLFlow adalah platform sumber terbuka untuk manajemen siklus hidup model ml (https://mlflow.org/).

MLflow mencakup empat komponen:

  • Pelacakan MLflow - mencakup masalah pencatatan hasil dan parameter yang mengarah pada hasil ini;
  • Proyek MLflow - memungkinkan Anda mengemas kode dan mereproduksinya di platform apa pun;
  • Model MLflow - bertanggung jawab untuk menerapkan model ke produksi;
  • MLflow Registry - memungkinkan Anda menyimpan model dan mengelola statusnya dalam repositori terpusat.

MLflow beroperasi pada dua entitas:

  • peluncuran adalah siklus penuh pelatihan, parameter, dan metrik yang ingin kita daftarkan;
  • Eksperimen adalah “topik” yang berjalan bersama-sama.

Semua langkah dalam contoh diimplementasikan pada sistem operasi Ubuntu 18.04.

1. Sebarkan server

Agar kami dapat dengan mudah mengelola proyek kami dan menerima semua informasi yang diperlukan, kami akan menyebarkan server. Server pelacakan MLflow memiliki dua komponen utama:

  • toko backend - bertanggung jawab untuk menyimpan informasi tentang model terdaftar (mendukung 4 DBMS: mysql, mssql, sqlite, dan postgresql);
  • toko artefak - bertanggung jawab untuk menyimpan artefak (mendukung 7 opsi penyimpanan: Amazon S3, Azure Blob Storage, Google Cloud Storage, server FTP, Server SFTP, NFS, HDFS).

Sebagai toko artefak Untuk mempermudah, mari kita ambil server sftp.

  • membuat grup
    $ sudo groupadd sftpg
  • tambahkan pengguna dan tetapkan kata sandi untuknya
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • menyesuaikan beberapa pengaturan akses
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • tambahkan beberapa baris ke /etc/ssh/sshd_config
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • memulai ulang layanan
    $ sudo systemctl restart sshd

Sebagai toko backend Mari kita 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 memulai server, Anda perlu menginstal paket python berikut (saya sarankan membuat lingkungan virtual terpisah):

pip install mlflow
pip install pysftp

Mari kita mulai server kita

$ 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. Tambahkan pelacakan

Agar hasil pelatihan kami tidak hilang, generasi pengembang masa depan dapat memahami apa yang terjadi, dan agar kawan-kawan yang lebih tua dan Anda dapat dengan tenang menganalisis proses pembelajaran, kami perlu menambahkan pelacakan. Pelacakan berarti menyimpan parameter, metrik, artefak, dan informasi tambahan apa pun tentang dimulainya pelatihan, dalam kasus kami, di server.

Misalnya, saya membuat yang kecil proyek di github pada Keras untuk mengelompokkan semua yang ada di dalamnya Kumpulan data COCO. Untuk menambahkan pelacakan, saya membuat file mlflow_training.py.

Berikut adalah baris-baris tempat hal paling menarik terjadi:

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 adalah pembungkus kecil metode mlflow.tracking. MlflowClient (Saya membuatnya untuk kenyamanan), yang dengannya saya membuat eksperimen dan menjalankannya di server. Selanjutnya, saya menunjukkan di mana hasil peluncuran harus digabungkan (mlflow.set_tracking_uri(self.tracking_uri)). Saya mengaktifkan logging otomatis mlflow.keras.autolog(). Saat ini Pelacakan MLflow mendukung logging otomatis untuk TensorFlow, Keras, Gluon XGBoost, LightGBM, Spark. Jika Anda belum menemukan kerangka kerja atau pustaka Anda, Anda selalu dapat mencatat secara eksplisit. Kami memulai pelatihan. Daftarkan tag dan masukkan parameter pada server jarak jauh.

Beberapa baris dan Anda, seperti orang lain, memiliki akses ke informasi tentang semua peluncuran. Dingin?

3. Kami menyusun proyek

Sekarang mari kita permudah peluncuran proyek ini. Untuk melakukannya, tambahkan file MLproject dan conda.yaml ke root proyek.
proyek 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}"

Proyek MLflow memiliki beberapa properti:

  • Nama - nama proyek Anda;
  • Lingkungan - dalam kasus saya, conda_env menunjukkan bahwa Anaconda digunakan untuk menjalankan dan deskripsi ketergantungan ada di file conda.yaml;
  • Titik Masuk - menunjukkan file mana dan parameter mana yang dapat kita jalankan (semua parameter dicatat secara otomatis saat memulai pelatihan)

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 dapat menggunakan buruh pelabuhan sebagai lingkungan runtime Anda, untuk lebih jelasnya silakan merujuk ke dokumentasi.

4. Mari kita mulai pelatihan

Kami mengkloning proyek dan pergi ke direktori proyek:

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

Untuk menjalankannya, Anda perlu menginstal perpustakaan

pip install mlflow
pip install pysftp

Karena dalam contoh saya menggunakan conda_env, Anaconda harus diinstal di komputer Anda (tetapi Anda dapat menyiasatinya dengan menginstal sendiri semua paket yang diperlukan dan bermain-main dengan parameter peluncuran).

Semua langkah persiapan telah selesai dan kami dapat mulai meluncurkan pelatihan. Dari akar proyek:

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

Setelah memasukkan perintah, lingkungan conda akan secara otomatis dibuat dan pelatihan akan dimulai.
Pada contoh di atas, saya memberikan jumlah epoch untuk pelatihan, kategori yang ingin kita segmentasikan (Anda dapat melihat daftar lengkapnya di sini) dan alamat server jarak jauh kami.
Daftar lengkap parameter yang mungkin dapat ditemukan di file MLproject.

5. Evaluasi hasil belajar

Setelah menyelesaikan pelatihan, kita bisa masuk ke browser ke alamat server kita http://server_host:server_port

MLOps - Buku masak, bab 1

Di sini kita melihat daftar semua eksperimen (kiri atas), serta informasi tentang proses yang dijalankan (tengah). Kami dapat melihat informasi lebih detail (parameter, metrik, artefak, dan beberapa informasi tambahan) untuk setiap peluncuran.

MLOps - Buku masak, bab 1

Untuk setiap metrik kita dapat mengamati riwayat perubahannya

MLOps - Buku masak, bab 1

Itu. Saat ini, kami dapat menganalisis hasilnya dalam mode “manual”, dan Anda juga dapat mengatur validasi otomatis menggunakan MLflow API.

6. Daftarkan modelnya

Setelah kami menganalisis model kami dan memutuskan bahwa model tersebut siap untuk berperang, kami melanjutkan untuk mendaftarkannya, untuk ini kami memilih peluncuran yang kami perlukan (seperti yang ditunjukkan pada paragraf sebelumnya) dan turun.

MLOps - Buku masak, bab 1

Setelah kami memberi nama pada model kami, model tersebut memiliki versinya. Jika Anda menyimpan model lain dengan nama yang sama, versinya akan ditingkatkan secara otomatis.

MLOps - Buku masak, bab 1

Untuk setiap model, kita dapat menambahkan deskripsi dan memilih salah satu dari tiga status (Staging, Production, Archived); selanjutnya, dengan menggunakan API, kita dapat mengakses status ini, yang, bersama dengan pembuatan versi, memberikan fleksibilitas tambahan.

MLOps - Buku masak, bab 1

Kami juga memiliki akses mudah ke semua model

MLOps - Buku masak, bab 1

dan versi mereka

MLOps - Buku masak, bab 1

Seperti pada paragraf sebelumnya, semua operasi dapat dilakukan menggunakan API.

7. Terapkan modelnya

Pada tahap ini, kami sudah memiliki model terlatih (keras). Contoh bagaimana Anda dapat 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 dari mlflow.tracking.MlflowClient, untuk kenyamanan. Intinya saya mengakses server jarak jauh dan mencari model di sana dengan nama yang ditentukan, dan versi produksi terbaru. Selanjutnya, saya mengunduh artefak secara lokal ke folder ./model dan membangun model dari direktori ini mlflow.keras.load_model(local_path). Sekarang kita bisa menggunakan model kita. Pengembang CV (ML) dapat dengan mudah meningkatkan model dan menerbitkan versi baru.

Sebagai kesimpulan

Saya mempresentasikan sistem yang memungkinkan:

  • menyimpan informasi secara terpusat tentang model ML, kemajuan dan hasil pelatihan;
  • menyebarkan lingkungan pengembangan dengan cepat;
  • memantau dan menganalisis kemajuan pengerjaan model;
  • akan lebih mudah untuk membuat versi dan mengelola status model;
  • Sangat mudah untuk menerapkan model yang dihasilkan.

Contoh ini adalah mainan dan berfungsi sebagai titik awal untuk membangun sistem Anda sendiri, yang mungkin mencakup otomatisasi evaluasi hasil dan pendaftaran model (masing-masing poin 5 dan 6) atau Anda akan menambahkan versi kumpulan data, atau mungkin yang lainnya? Poin yang ingin saya sampaikan adalah Anda memerlukan MLOps secara keseluruhan, MLflow hanyalah alat untuk mencapai tujuan.

Tulis masalah apa yang Anda temui yang tidak saya tampilkan?
Apa yang akan Anda tambahkan ke sistem agar memenuhi kebutuhan Anda?
Alat dan pendekatan apa yang Anda gunakan untuk menyelesaikan seluruh atau sebagian masalah?

PS Saya akan meninggalkan beberapa tautan:
proyek github - https://github.com/simbakot/mlflow_example
aliran ml - https://mlflow.org/
Email kantor saya untuk pertanyaan - [email dilindungi]

Perusahaan kami secara berkala menyelenggarakan berbagai acara untuk spesialis IT, misalnya: pada tanggal 8 Juli pukul 19 waktu Moskow akan ada pertemuan CV dalam format online, jika berminat bisa mengikuti, pendaftaran di sini .

Sumber: www.habr.com

Tambah komentar