Pembelajaran Mesin Industri: 10 Prinsip Desain
Saat ini, setiap hari, layanan baru, aplikasi, dan program penting lainnya dibuat yang memungkinkan Anda membuat hal-hal luar biasa: dari perangkat lunak untuk mengendalikan roket SpaceX hingga berinteraksi dengan ketel di ruangan sebelah melalui ponsel cerdas.
Dan, kadang-kadang, setiap programmer pemula, apakah dia seorang start-up yang bersemangat atau seorang Full Stack biasa atau Data Scientist, cepat atau lambat akan menyadari bahwa ada aturan tertentu untuk pemrograman dan pengembangan perangkat lunak yang sangat menyederhanakan kehidupan.
Dalam artikel ini, saya akan menjelaskan secara singkat 10 prinsip tentang cara memprogram pembelajaran mesin industri agar dapat dengan mudah diintegrasikan ke dalam aplikasi / layanan, berdasarkan metodologi Aplikasi 12 faktor yang diusulkan oleh tim Heroku.... Inisiatif saya adalah untuk meningkatkan kesadaran akan teknik ini, yang dapat membantu banyak pengembang dan orang-orang dari Ilmu Data.
Artikel ini merupakan prolog dari serangkaian artikel tentang Pembelajaran Mesin Industri. Di dalamnya, saya akan terus berbicara tentang bagaimana sebenarnya membuat model dan menjalankannya dalam produksi, membuat API untuknya, serta contoh dari berbagai area dan perusahaan yang memiliki ML di dalam sistem mereka.
Prinsip 1. Satu basis kode
Beberapa programmer pada tahap pertama, karena malas untuk memahaminya (atau karena alasan tertentu) melupakan Git. Mereka lupa baik dari kata itu sepenuhnya, yaitu, mereka saling melempar file di drive / hanya melempar teks / mengirim burung merpati, atau mereka tidak memikirkan alur kerja mereka, dan masing-masing berkomitmen ke cabang mereka sendiri, dan kemudian ke master.
Prinsip ini mengatakan: 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 komit dengan metode dan model pemrosesan data yang berbeda, untuk kemudian memilih yang terbaik dan dengan mudah melanjutkan bekerja dengannya lebih lanjut.
Kedua, dalam produksi, ini adalah hal yang tak tergantikan - Anda harus terus melihat bagaimana kode Anda berubah dan mengetahui model mana yang memberikan hasil terbaik, kode mana yang bekerja di akhir dan apa yang terjadi, karena apa yang berhenti berfungsi atau mulai dikeluarkan. hasil yang salah. Untuk itulah komitmen!
Dan juga Anda dapat membuat paket proyek Anda dengan menempatkannya, misalnya, di Gemfury, dan kemudian cukup 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 project memiliki library berbeda yang Anda impor dari luar untuk menerapkannya di suatu tempat. Apakah itu pustaka Python, atau pustaka bahasa lain untuk tujuan yang berbeda, atau alat sistem - tugas Anda adalah:
- dependencies, , , , , (, Python Pipfile requirements.txt. , : realpython.com/pipenv-guide)
- dependencies . , , Tensorflow?
Dengan demikian, pengembang yang akan bergabung dengan tim Anda di masa mendatang akan dapat dengan cepat membiasakan diri dengan pustaka dan versinya yang digunakan dalam proyek Anda, serta Anda akan dapat mengontrol versi dan pustaka yang dipasang sendiri untuk proyek tertentu, yang akan membantu Anda menghindari ketidakcocokan perpustakaan atau versinya.
Aplikasi Anda juga tidak harus bergantung pada alat sistem yang mungkin diinstal pada OS tertentu. Alat ini juga harus dideklarasikan di manifes dependensi. Ini diperlukan untuk menghindari situasi ketika versi alat (serta ketersediaannya) tidak cocok dengan alat sistem dari OS tertentu.
Jadi, meskipun Anda dapat menggunakan curl di hampir semua komputer, Anda tetap harus mendeklarasikannya dalam dependensi, karena saat bermigrasi ke platform lain, curl mungkin tidak ada atau versinya tidak akan seperti yang Anda butuhkan.
Misalnya, requirement.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 di mana berbagai orang pengembangan secara tidak sengaja mengunggah kode ke GitHub ke dalam repositori terbuka dengan kata sandi dan kunci lain dari AWS, bangun keesokan harinya dengan hutang $ 6.000, atau bahkan dengan semua $ 50.000.
Tentu saja, kasus-kasus ini ekstrem, tetapi sangat mengungkap. Jika Anda menyimpan kredensial atau data lain yang diperlukan untuk konfigurasi di dalam kode, Anda membuat kesalahan, dan saya pikir tidak ada gunanya menjelaskan alasannya.
Alternatif untuk ini adalah menyimpan konfigurasi dalam variabel lingkungan. Anda dapat membaca lebih lanjut tentang variabel lingkungan di sini .
Contoh data yang biasanya disimpan di variabel lingkungan:
- Nama domain
- URL / URI API
- 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 menghemat waktu, tenaga, dan uang Anda.
Misalnya, jika Anda menggunakan API Kaggle untuk melakukan pengujian (misalnya, Anda mengunduh dan menjalankan model melaluinya untuk menguji apakah model bekerja dengan baik saat permulaan), maka kunci pribadi dari Kaggle, seperti KAGGLE_USERNAME dan KAGGLE_KEY, harus disimpan dalam variabel lingkungan.
Prinsip 4: Layanan Pihak Ketiga
Idenya di sini adalah untuk merancang 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 yang lain, Anda hanya perlu mengubah kunci dalam konfigurasi di variabel lingkungan, yang saya bicarakan di paragraf di atas.
Jadi, misalnya, daripada menentukan setiap kali jalur ke file dengan kumpulan data di dalam kode, lebih baik menggunakan pustaka pathlib dan mendeklarasikan jalur ke kumpulan data di config.py, sehingga apa pun layanan yang Anda gunakan (misalnya, CircleCI), program Saya dapat menemukan jalur ke kumpulan data, dengan mempertimbangkan struktur sistem file baru di layanan baru.
Prinsip 5. Membangun, merilis, menjalankan
Banyak orang dalam Ilmu Data merasakan manfaatnya mempelajari keterampilan menulis perangkat lunak. Jika kita ingin program kita sering crash dan berjalan lancar selama mungkin, kita perlu membagi proses rilis versi baru menjadi 3 tahap:
- . , . .
- — config, . .
- . .
Sistem seperti itu untuk rilis versi baru dari model atau keseluruhan pipa memungkinkan pembagian peran antara administrator dan pengembang, memungkinkan pelacakan 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 akan dapat membuat paket dengan versi berbeda dari model pembelajaran mesin Anda, kemudian mengemasnya dan merujuk ke paket yang diperlukan dan versinya untuk menggunakan fungsi yang Anda tulis dari sana. Ini akan membantu Anda membuat API untuk model Anda, dan paket Anda dapat ditempatkan di Gemfury misalnya.
Prinsip 6. Kami menjalankan model Anda sebagai satu atau beberapa proses
Selain itu, proses seharusnya tidak 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 pada apa yang Anda butuhkan.
Artinya, pasti tidak ada gunanya menyimpan data di dalam sistem file dari proses tersebut, jika tidak maka data ini dapat dibersihkan pada rilis / perubahan konfigurasi berikutnya atau transfer sistem tempat program berjalan.
Tetapi ada pengecualian: untuk proyek pembelajaran mesin, Anda dapat menyimpan cache perpustakaan sehingga Anda tidak menginstalnya kembali setiap kali Anda meluncurkan versi baru, jika tidak ada perpustakaan tambahan atau perubahan apa pun dalam versinya yang telah dibuat. Dengan demikian, Anda akan mempersingkat waktu peluncuran model Anda di industri.
Untuk menjalankan model sebagai beberapa proses, Anda dapat membuat file .yml di mana Anda hanya menentukan proses yang diperlukan dan urutannya.
Prinsip 7. Daur Ulang
Proses yang berjalan pada model dalam aplikasi Anda harus mudah dimulai dan dihentikan. Dengan demikian, ini akan memungkinkan Anda untuk dengan cepat menerapkan perubahan kode, perubahan konfigurasi, dengan cepat dan fleksibel menskalakan dan mencegah kemungkinan kerusakan versi kerja.
Artinya, proses Anda dengan model harus:
- . ( , , ) . , — .
- . , , , . DevOps , , (, , , , !)
Prinsip 8: Penyebaran / Integrasi Berkelanjutan
Banyak perusahaan menggunakan pemisahan antara tim pengembangan dan penerapan aplikasi (membuat aplikasi tersedia untuk pengguna akhir). Ini dapat sangat memperlambat pengembangan perangkat lunak dan kemajuan untuk meningkatkannya. Itu 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:
- Kurangi waktu rilis sepuluh kali lipat
- Kurangi jumlah kesalahan karena ketidakcocokan kode.
- Ini juga membantu mengurangi beban kerja, karena pengembang dan orang-orang yang menyebarkan aplikasi sekarang menjadi satu tim.
Alat yang memungkinkan Anda untuk bekerja dengan ini adalah CircleCI, Travis CI, GitLab CI, dan lainnya.
Anda dapat dengan cepat menambahkan model, memperbaruinya, dan segera meluncurkannya, sementara itu akan mudah, jika terjadi kegagalan, untuk kembali dengan sangat cepat ke versi kerja, tanpa pengguna akhir menyadarinya. Ini dapat dilakukan dengan cepat dan mudah terutama jika Anda memiliki tes yang bagus.
Minimalkan perbedaan !!!
Prinsip 9. Log Anda
Log (atau "Log") adalah peristiwa yang direkam, biasanya dalam format teks, yang terjadi di dalam aplikasi (aliran peristiwa). Contoh sederhana: "2020-02-02 - level sistem - nama proses". Mereka dirancang agar pengembang benar-benar dapat melihat apa yang terjadi saat program berjalan. Dia melihat kemajuan proses, dan memahami apakah dia seperti yang diinginkan pengembang itu sendiri.
Prinsip ini mengatakan bahwa Anda tidak boleh menyimpan log di dalam sistem file Anda - Anda hanya perlu "menampilkan" mereka, misalnya, melakukannya dalam output standar dari sistem stdout. Dan dengan cara ini, aliran dapat dipantau di terminal selama pengembangan.
Apakah ini berarti Anda tidak perlu menyimpan log sama sekali? Tentu saja tidak. Hanya saja aplikasi Anda tidak boleh melakukan ini - serahkan pada layanan pihak ketiga. Aplikasi Anda hanya bisa mengarahkan log ke file atau terminal tertentu untuk dilihat langsung, atau mengarahkannya ke sistem penyimpanan tujuan umum (seperti Hadoop). Aplikasi Anda sendiri tidak boleh menyimpan atau berinteraksi dengan log.
Prinsip 10. Ujilah!
Untuk pembelajaran mesin industri, fase ini sangat penting, karena Anda perlu memahami bahwa model berfungsi dengan benar dan memberikan apa yang Anda inginkan.
Pengujian dapat dibuat dengan pytest, dan diuji dengan kumpulan data kecil jika Anda memiliki tugas regresi / klasifikasi.
Jangan lupa atur seed yang sama untuk model deep learning agar tidak terus menerus menghasilkan hasil yang berbeda.
Ini adalah uraian singkat tentang 10 prinsip, dan, tentu saja, sulit untuk menggunakannya tanpa mencoba dan melihat cara kerjanya, jadi artikel ini hanyalah prolog dari serangkaian artikel menarik di mana saya akan mengungkapkan cara membuat model pembelajaran mesin industri. bagaimana mengintegrasikannya ke dalam sistem, dan bagaimana prinsip-prinsip ini dapat membuat hidup lebih mudah bagi kita semua.
Saya juga akan mencoba menggunakan prinsip-prinsip keren yang dapat ditinggalkan seseorang di komentar jika mereka mau.