Pembelajaran Mesin Industri: 10 Prinsip Desain

Pembelajaran Mesin Industri: 10 Prinsip Desain

Saat ini, layanan, aplikasi, dan program penting lainnya diciptakan setiap hari yang memungkinkan terciptanya hal-hal luar biasa: mulai dari perangkat lunak untuk mengendalikan roket SpaceX hingga berinteraksi dengan ketel di ruangan sebelah melalui ponsel cerdas.

Dan, terkadang, setiap programmer pemula, baik dia seorang pemula yang bersemangat atau seorang Full Stack atau Data Scientist biasa, cepat atau lambat akan menyadari bahwa ada aturan tertentu dalam pemrograman dan pembuatan perangkat lunak yang sangat menyederhanakan hidup.

Pada artikel ini saya akan menjelaskan secara singkat 10 prinsip cara memprogram pembelajaran mesin industri agar dapat dengan mudah diintegrasikan ke dalam suatu aplikasi/layanan, berdasarkan metodologi Aplikasi 12 faktor. disarankan oleh tim Heroku. Inisiatif saya adalah untuk meningkatkan kesadaran akan teknik ini, yang dapat membantu banyak pengembang dan orang-orang ilmu data.

Artikel ini merupakan prolog dari rangkaian artikel tentang Machine Learning industri. Di dalamnya saya akan membahas lebih lanjut tentang cara membuat model dan meluncurkannya ke produksi, membuat API untuk model tersebut, serta contoh dari berbagai area dan perusahaan yang memiliki ML bawaan di sistem mereka.

Prinsip 1: Satu basis kode

Beberapa programmer pada tahap awal, karena malas untuk mencari tahu (atau karena alasan mereka sendiri), melupakan Git. Mereka benar-benar lupa kata tersebut, yaitu, mereka saling melempar file ke dalam drive/hanya melempar teks/mengirimnya dengan merpati, atau mereka tidak memikirkan alur kerja mereka, dan memasukkan masing-masing ke cabang mereka sendiri, dan kemudian ke menguasai.

Prinsip ini menyatakan: memiliki satu basis kode dan banyak penerapan.

Git dapat digunakan baik dalam produksi maupun dalam penelitian dan pengembangan (R&D), yang jarang digunakan.

Misalnya, dalam fase R&D, Anda dapat meninggalkan komitmen dengan metode dan model pemrosesan data yang berbeda, untuk kemudian memilih yang terbaik dan terus mengerjakannya lebih lanjut dengan mudah.

Kedua, dalam produksi, ini adalah hal yang sangat diperlukan - Anda harus terus-menerus melihat bagaimana kode Anda berubah dan mengetahui model mana yang memberikan hasil terbaik, kode mana yang pada akhirnya berhasil, dan apa yang terjadi yang menyebabkannya berhenti bekerja atau mulai memberikan hasil yang salah. . Itulah gunanya komitmen!

Anda juga dapat membuat paket proyek Anda dengan menempatkannya, misalnya, di Gemfury, dan kemudian mengimpor fungsi darinya untuk proyek lain agar tidak menulis ulang 1000 kali, tetapi lebih dari itu nanti.

Prinsip 2: Deklarasikan dan isolasi dependensi dengan jelas

Setiap proyek memiliki perpustakaan berbeda yang Anda impor dari luar untuk menerapkannya di suatu tempat. Baik itu pustaka Python, atau pustaka bahasa lain untuk berbagai tujuan, atau alat sistem - tugas Anda adalah:

  • Deklarasikan dependensi dengan jelas, yaitu file yang berisi semua pustaka, alat, dan versinya yang digunakan dalam proyek Anda dan harus diinstal (misalnya, dengan Python hal ini dapat dilakukan menggunakan Pipfile atau persyaratan.txt. A tautan yang memungkinkan pemahaman yang baik: realpython.com/pipenv-guide)
  • Pisahkan dependensi khusus untuk program Anda selama pengembangan. Anda tidak ingin terus-menerus mengubah versi dan menginstal ulang, misalnya Tensorflow?

Dengan cara ini, pengembang yang akan bergabung dengan tim Anda di masa depan akan dapat dengan cepat mengenal perpustakaan dan versinya yang digunakan dalam proyek Anda, dan Anda juga akan memiliki kesempatan untuk mengelola versi dan perpustakaan itu sendiri yang diinstal untuk tujuan tertentu. proyek, yang akan membantu Anda menghindari ketidakcocokan perpustakaan atau versinya.

Aplikasi Anda juga tidak boleh bergantung pada alat sistem yang mungkin diinstal pada OS tertentu. Alat-alat ini juga harus dideklarasikan dalam manifes dependensi. Hal ini diperlukan untuk menghindari situasi ketika versi alat (serta ketersediaannya) tidak sesuai dengan alat sistem OS tertentu.

Jadi, meskipun curl dapat digunakan di hampir semua komputer, Anda tetap harus mendeklarasikannya dalam dependensi, karena saat bermigrasi ke platform lain mungkin curl tersebut tidak ada atau versinya tidak akan sesuai dengan yang Anda perlukan semula.

Misalnya, persyaratan.txt Anda mungkin terlihat seperti ini:

# Model Building Requirements
numpy>=1.18.1,<1.19.0
pandas>=0.25.3,<0.26.0
scikit-learn>=0.22.1,<0.23.0
joblib>=0.14.1,<0.15.0

# testing requirements
pytest>=5.3.2,<6.0.0

# packaging
setuptools>=41.4.0,<42.0.0
wheel>=0.33.6,<0.34.0

# fetching datasets
kaggle>=1.5.6,<1.6.0

Prinsip 3: Konfigurasi

Banyak yang telah mendengar cerita tentang berbagai pengembang yang secara tidak sengaja mengunggah kode ke GitHub ke repositori publik dengan kata sandi dan kunci lain dari AWS, bangun keesokan harinya dengan hutang sebesar $6000, atau bahkan $50000.

Pembelajaran Mesin Industri: 10 Prinsip Desain

Tentu saja, kasus-kasus ini ekstrem, namun sangat signifikan. Jika Anda menyimpan kredensial atau data lain yang diperlukan untuk konfigurasi di dalam kode, Anda membuat kesalahan, dan menurut saya tidak perlu menjelaskan alasannya.

Alternatifnya adalah dengan menyimpan konfigurasi dalam variabel lingkungan. Anda dapat membaca lebih lanjut tentang variabel lingkungan di sini.

Contoh data yang biasanya disimpan dalam variabel lingkungan:

  • Nama domain
  • URL API/URI
  • Kunci publik dan pribadi
  • Kontak (surat, telepon, dll.)

Dengan cara ini Anda tidak perlu terus-menerus mengubah kode jika variabel konfigurasi Anda berubah. Ini akan membantu menghemat waktu, tenaga, dan uang Anda.

Misalnya, jika Anda menggunakan Kaggle API untuk melakukan pengujian (misalnya, mengunduh perangkat lunak dan menjalankan model melalui perangkat lunak tersebut untuk menguji apakah model berfungsi dengan baik saat dijalankan), maka kunci pribadi dari Kaggle, seperti KAGGLE_USERNAME dan KAGGLE_KEY, seharusnya disimpan dalam variabel lingkungan.

Prinsip 4: Layanan Pihak Ketiga

Idenya di sini adalah untuk membuat program sedemikian rupa sehingga tidak ada perbedaan antara sumber daya lokal dan pihak ketiga dalam hal kode. Misalnya, Anda dapat menghubungkan MySQL lokal dan pihak ketiga. Hal yang sama berlaku untuk berbagai API seperti Google Maps atau Twitter API.

Untuk menonaktifkan layanan pihak ketiga atau menghubungkan layanan lain, Anda hanya perlu mengubah kunci konfigurasi di variabel lingkungan, yang saya bicarakan di paragraf di atas.

Jadi, misalnya, daripada menentukan jalur ke file dengan kumpulan data di dalam kode setiap saat, lebih baik menggunakan pustaka pathlib dan mendeklarasikan jalur ke kumpulan data di config.py, sehingga layanan apa pun yang Anda gunakan (untuk Misalnya, CircleCI), program ini dapat menemukan jalur ke kumpulan data dengan mempertimbangkan struktur sistem file baru di layanan baru.

Prinsip 5. Bangun, rilis, runtime

Banyak orang di Ilmu Data merasakan manfaatnya meningkatkan keterampilan menulis perangkat lunak mereka. Jika kita ingin program kita sering crash dan bekerja tanpa kegagalan selama mungkin, kita perlu membagi proses rilis versi baru menjadi 3 tahap:

  1. Panggung majelis. Anda mengubah kode kosong Anda dengan sumber daya individual menjadi apa yang disebut paket yang berisi semua kode dan data yang diperlukan. Paket ini disebut perakitan.
  2. Panggung lepaskan — di sini kami menghubungkan konfigurasi kami ke rakitan, yang tanpanya kami tidak akan dapat merilis program kami. Sekarang ini adalah rilis yang sepenuhnya siap untuk diluncurkan.
  3. Berikutnya adalah panggung pemenuhan. Di sini kami merilis aplikasi dengan menjalankan proses yang diperlukan dari rilis kami.

Sistem untuk merilis versi baru dari suatu model atau keseluruhan saluran memungkinkan Anda untuk memisahkan peran antara administrator dan pengembang, memungkinkan Anda melacak versi dan mencegah penghentian program yang tidak diinginkan.

Untuk tugas rilis, banyak layanan berbeda telah dibuat di mana Anda dapat menulis proses untuk dijalankan sendiri dalam file .yml (misalnya, di CircleCI ini adalah config.yml untuk mendukung proses itu sendiri). Wheely hebat dalam membuat paket untuk proyek.

Anda dapat membuat paket dengan versi berbeda dari model pembelajaran mesin Anda, lalu mengemasnya dan merujuk ke paket yang diperlukan serta versinya untuk menggunakan fungsi yang Anda tulis dari sana. Ini akan membantu Anda membuat API untuk model Anda, dan paket Anda dapat dihosting di Gemfury, misalnya.

Prinsip 6. Jalankan model Anda sebagai satu atau lebih proses

Selain itu, proses tidak boleh berbagi data. Artinya, proses harus ada secara terpisah, dan semua jenis data harus ada secara terpisah, misalnya pada layanan pihak ketiga seperti MySQL atau lainnya, tergantung kebutuhan Anda.

Artinya, menyimpan data di dalam sistem file proses jelas tidak layak dilakukan, jika tidak, hal ini dapat menyebabkan penghapusan data ini selama rilis berikutnya/perubahan konfigurasi atau transfer sistem tempat program dijalankan.

Namun ada pengecualian: untuk proyek pembelajaran mesin, Anda dapat menyimpan cache perpustakaan agar tidak menginstalnya kembali setiap kali Anda meluncurkan versi baru, jika tidak ada perpustakaan tambahan atau perubahan apa pun yang dilakukan pada versinya. Dengan cara ini, Anda akan mengurangi waktu yang diperlukan untuk meluncurkan model Anda di industri.

Untuk menjalankan model sebagai beberapa proses, Anda dapat membuat file .yml di mana Anda menentukan proses yang diperlukan dan urutannya.

Prinsip 7: Daur Ulang

Proses yang berjalan di aplikasi model Anda harus mudah untuk dimulai dan dihentikan. Dengan demikian, ini akan memungkinkan Anda menerapkan perubahan kode dengan cepat, perubahan konfigurasi, penskalaan yang cepat dan fleksibel, dan mencegah kemungkinan kerusakan pada versi yang berfungsi.

Artinya, proses Anda dengan model harus:

  • Minimalkan waktu mulai. Idealnya, waktu startup (dari saat perintah startup dikeluarkan hingga proses mulai beroperasi) tidak boleh lebih dari beberapa detik. Caching perpustakaan, yang dijelaskan di atas, adalah salah satu teknik untuk mengurangi waktu startup.
  • Akhiri dengan benar. Artinya, mendengarkan pada port layanan sebenarnya ditangguhkan, dan permintaan baru yang dikirimkan ke port ini tidak akan diproses. Di sini Anda perlu membangun komunikasi yang baik dengan para insinyur DevOps, atau memahami cara kerjanya sendiri (tentu saja, sebaiknya yang terakhir, tetapi komunikasi harus selalu dijaga, dalam proyek apa pun!)

Prinsip 8: Penerapan/Integrasi Berkelanjutan

Banyak perusahaan menggunakan pemisahan antara tim pengembangan dan penerapan aplikasi (membuat aplikasi tersedia bagi pengguna akhir). Hal ini dapat sangat memperlambat pengembangan perangkat lunak dan kemajuan dalam memperbaikinya. Hal ini juga merusak budaya DevOps, di mana pengembangan dan integrasi, secara kasar, digabungkan.

Oleh karena itu, prinsip ini menyatakan bahwa lingkungan pengembangan Anda harus sedekat mungkin dengan lingkungan produksi Anda.

Ini akan memungkinkan:

  1. Kurangi waktu rilis hingga puluhan kali lipat
  2. Mengurangi jumlah kesalahan karena ketidakcocokan kode.
  3. Hal ini juga mengurangi beban kerja staf, karena pengembang dan orang yang menerapkan aplikasi kini menjadi satu tim.

Alat yang memungkinkan Anda mengerjakannya adalah CircleCI, Travis CI, GitLab CI, dan lainnya.

Anda dapat dengan cepat menambahkan model, memperbaruinya, dan segera meluncurkannya, sementara akan mudah, jika terjadi kegagalan, untuk kembali dengan sangat cepat ke versi yang berfungsi, sehingga pengguna akhir bahkan tidak menyadarinya. Hal ini dapat dilakukan dengan mudah dan cepat jika Anda memiliki tes yang bagus.

Minimalkan perbedaan!!!

Prinsip 9. Log Anda

Log (atau “Log”) adalah peristiwa, biasanya direkam dalam format teks, yang terjadi dalam aplikasi (aliran peristiwa). Contoh sederhana: "2020-02-02 - tingkat sistem - nama proses." Mereka dirancang agar pengembang benar-benar dapat melihat apa yang terjadi ketika program sedang berjalan. Dia melihat kemajuan proses dan memahami apakah itu sesuai dengan keinginan pengembangnya.

Prinsip ini menyatakan bahwa Anda tidak boleh menyimpan log Anda di dalam sistem file Anda - Anda hanya perlu “mengeluarkannya” ke layar, misalnya, lakukan ini pada keluaran standar sistem. Dan dengan cara ini dimungkinkan untuk memantau aliran di terminal selama pengembangan.

Apakah ini berarti tidak perlu menyimpan log sama sekali? Tentu saja tidak. Aplikasi Anda seharusnya tidak melakukan hal ini—serahkan pada layanan pihak ketiga. Aplikasi Anda hanya dapat meneruskan log ke file atau terminal tertentu untuk dilihat secara real-time, atau meneruskannya ke sistem penyimpanan data tujuan umum (seperti Hadoop). Aplikasi Anda sendiri tidak boleh menyimpan atau berinteraksi dengan log.

Prinsip 10. Uji!

Untuk pembelajaran mesin industri, fase ini sangat penting, karena Anda perlu memahami bahwa model berfungsi dengan benar dan menghasilkan apa yang Anda inginkan.

Pengujian dapat dibuat menggunakan pytest, dan diuji menggunakan kumpulan data kecil jika Anda memiliki tugas regresi/klasifikasi.

Jangan lupa untuk menetapkan benih yang sama untuk model deep learning agar tidak terus-menerus memberikan hasil yang berbeda.

Demikian uraian singkat tentang 10 prinsip tersebut, dan tentunya sulit untuk menggunakannya tanpa mencoba dan melihat cara kerjanya, jadi artikel ini hanyalah prolog dari rangkaian artikel menarik yang akan saya ungkapkan cara membuatnya. model pembelajaran mesin industri, cara mengintegrasikannya ke dalam sistem, dan bagaimana prinsip-prinsip ini dapat membuat hidup kita lebih mudah.

Saya juga akan mencoba menggunakan prinsip-prinsip keren yang dapat ditinggalkan oleh siapa pun di komentar jika mereka mau.

Sumber: www.habr.com