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.
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.
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?
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).
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.
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.
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
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):
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
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.
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.
Untuk setiap metrik kita dapat mengamati riwayat perubahannya
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.
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.
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.
Kami juga memiliki akses mudah ke semua model
dan versi mereka
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:
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?
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 .