Pembelajaran Mesin Industri: 10 Prinsip Reka Bentuk

Pembelajaran Mesin Industri: 10 Prinsip Reka Bentuk

Pada masa kini, perkhidmatan baharu, aplikasi dan program penting lain dicipta setiap hari yang memungkinkan untuk mencipta perkara yang luar biasa: daripada perisian untuk mengawal roket SpaceX kepada berinteraksi dengan cerek di bilik sebelah melalui telefon pintar.

Dan, kadangkala, setiap pengaturcara baru, sama ada dia seorang pemula yang bersemangat atau seorang Full Stack atau Saintis Data biasa, lambat laun menyedari bahawa terdapat peraturan tertentu untuk pengaturcaraan dan mencipta perisian yang sangat memudahkan kehidupan.

Dalam artikel ini, saya akan menerangkan secara ringkas 10 prinsip cara memprogramkan pembelajaran mesin industri supaya ia boleh disepadukan dengan mudah ke dalam aplikasi/perkhidmatan, berdasarkan metodologi Aplikasi 12 faktor. dicadangkan oleh pasukan Heroku. Inisiatif saya adalah untuk meningkatkan kesedaran tentang teknik ini, yang boleh membantu ramai pembangun dan orang sains data.

Artikel ini ialah prolog kepada siri artikel tentang Pembelajaran Mesin industri. Di dalamnya saya akan bercakap lebih lanjut tentang cara benar-benar membuat model dan melancarkannya ke dalam pengeluaran, mencipta API untuknya, serta contoh dari pelbagai kawasan dan syarikat yang mempunyai ML terbina dalam dalam sistem mereka.

Prinsip 1: Satu asas kod

Sesetengah pengaturcara pada peringkat pertama, kerana malas memikirkannya (atau atas sebab tertentu mereka sendiri), melupakan Git. Mereka sama ada lupa sepenuhnya perkataan itu, iaitu, mereka membuang fail antara satu sama lain dalam pemacu/hanya membuang teks/hantar oleh merpati, atau mereka tidak memikirkan aliran kerja mereka, dan komited setiap satu ke cawangan mereka sendiri, dan kemudian ke tuan.

Prinsip ini menyatakan: mempunyai satu pangkalan kod dan banyak penggunaan.

Git boleh digunakan dalam pengeluaran dan dalam penyelidikan dan pembangunan (R&D), di mana ia tidak digunakan begitu kerap.

Sebagai contoh, dalam fasa R&D anda boleh meninggalkan komit dengan kaedah dan model pemprosesan data yang berbeza, untuk kemudian memilih yang terbaik dan dengan mudah terus bekerja dengannya dengan lebih lanjut.

Kedua, dalam pengeluaran ini adalah perkara yang tidak boleh diganti - anda perlu sentiasa melihat bagaimana kod anda berubah dan mengetahui model mana yang menghasilkan hasil terbaik, kod mana yang berfungsi pada akhirnya dan apa yang berlaku yang menyebabkan ia berhenti berfungsi atau mula menghasilkan hasil yang salah . Itulah gunanya commit!

Anda juga boleh membuat pakej projek anda, meletakkannya, sebagai contoh, pada Gemfury, dan kemudian hanya mengimport fungsi daripadanya untuk projek lain, supaya tidak menulis semula 1000 kali, tetapi lebih lanjut mengenainya kemudian.

Prinsip 2: Mengisytiharkan dan mengasingkan kebergantungan dengan jelas

Setiap projek mempunyai perpustakaan berbeza yang anda import dari luar untuk menggunakannya di suatu tempat. Sama ada perpustakaan Python, atau perpustakaan bahasa lain untuk pelbagai tujuan, atau alatan sistem - tugas anda ialah:

  • Istiharkan kebergantungan dengan jelas, iaitu fail yang akan mengandungi semua perpustakaan, alatan dan versinya yang digunakan dalam projek anda dan yang mesti dipasang (contohnya, dalam Python ini boleh dilakukan menggunakan Pipfile atau requirements.txt. A pautan yang membolehkan yang baik untuk memahami: realpython.com/pipenv-guide)
  • Asingkan kebergantungan khusus untuk program anda semasa pembangunan. Anda tidak mahu sentiasa menukar versi dan memasang semula, sebagai contoh, Tensorflow?

Dengan cara ini, pembangun yang akan menyertai pasukan anda pada masa hadapan akan dapat membiasakan diri dengan cepat dengan perpustakaan dan versi mereka yang digunakan dalam projek anda, dan anda juga akan berpeluang untuk mengurus versi dan perpustakaan yang dipasang sendiri untuk sesuatu yang khusus. projek, yang akan membantu anda mengelakkan ketidakserasian perpustakaan atau versinya.

Aplikasi anda juga seharusnya tidak bergantung pada alatan sistem yang mungkin dipasang pada OS tertentu. Alat ini juga mesti diisytiharkan dalam manifes dependensi. Ini adalah perlu untuk mengelakkan situasi di mana versi alat (serta ketersediaannya) tidak sepadan dengan alat sistem OS tertentu.

Oleh itu, walaupun curl boleh digunakan pada hampir semua komputer, anda masih harus mengisytiharkannya dalam kebergantungan, kerana apabila berhijrah ke platform lain ia mungkin tidak ada atau versinya bukan yang anda perlukan pada asalnya.

Sebagai contoh, requirements.txt anda mungkin kelihatan 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

Ramai yang telah mendengar cerita tentang pelbagai lelaki pembangun secara tidak sengaja memuat naik kod ke GitHub ke dalam repositori awam dengan kata laluan dan kunci lain daripada AWS, bangun keesokan harinya dengan hutang $6000, atau bahkan $50000.

Pembelajaran Mesin Industri: 10 Prinsip Reka Bentuk

Sudah tentu, kes-kes ini melampau, tetapi sangat penting. Jika anda menyimpan bukti kelayakan anda atau data lain yang diperlukan untuk konfigurasi di dalam kod, anda membuat kesilapan, dan saya rasa tidak perlu menjelaskan sebabnya.

Alternatif untuk ini ialah menyimpan konfigurasi dalam pembolehubah persekitaran. Anda boleh membaca lebih lanjut tentang pembolehubah persekitaran di sini.

Contoh data yang biasanya disimpan dalam pembolehubah persekitaran:

  • Nama domain
  • URL API/URI
  • Kunci awam dan peribadi
  • Kenalan (mel, telefon, dsb.)

Dengan cara ini anda tidak perlu sentiasa menukar kod jika pembolehubah konfigurasi anda berubah. Ini akan membantu menjimatkan masa, usaha dan wang anda.

Contohnya, jika anda menggunakan API Kaggle untuk menjalankan ujian (contohnya, muat turun perisian dan jalankan model melaluinya untuk menguji apabila menjalankan model itu berfungsi dengan baik), maka kunci peribadi daripada Kaggle, seperti KAGGLE_USERNAME dan KAGGLE_KEY, hendaklah disimpan dalam pembolehubah persekitaran.

Prinsip 4: Perkhidmatan Pihak Ketiga

Idea di sini adalah untuk mencipta program sedemikian rupa sehingga tiada perbezaan antara sumber tempatan dan pihak ketiga dari segi kod. Sebagai contoh, anda boleh menyambung kedua-dua MySQL tempatan dan pihak ketiga. Perkara yang sama berlaku untuk pelbagai API seperti Peta Google atau API Twitter.

Untuk melumpuhkan perkhidmatan pihak ketiga atau menyambung yang lain, anda hanya perlu menukar kekunci dalam konfigurasi dalam pembolehubah persekitaran, yang saya bincangkan dalam perenggan di atas.

Jadi, sebagai contoh, daripada menentukan laluan ke fail dengan set data di dalam kod setiap kali, lebih baik menggunakan pustaka pathlib dan mengisytiharkan laluan ke set data dalam config.py, supaya tidak kira perkhidmatan yang anda gunakan (untuk contoh, CircleCI), program ini dapat mengetahui laluan ke set data dengan mengambil kira struktur sistem fail baharu dalam perkhidmatan baharu.

Prinsip 5. Bina, lepaskan, masa jalan

Ramai orang dalam Sains Data mendapati ia berguna untuk meningkatkan kemahiran menulis perisian mereka. Jika kami mahu program kami ranap sejarang mungkin dan berfungsi tanpa kegagalan selama mungkin, kami perlu membahagikan proses mengeluarkan versi baharu kepada 3 peringkat:

  1. Pentas perhimpunan. Anda mengubah kod kosong anda dengan sumber individu menjadi pakej yang dipanggil yang mengandungi semua kod dan data yang diperlukan. Pakej ini dipanggil perhimpunan.
  2. Pentas pelepasan β€” di sini kami menyambungkan konfigurasi kami ke perhimpunan, tanpanya kami tidak akan dapat melepaskan program kami. Sekarang ini adalah keluaran sedia untuk dilancarkan sepenuhnya.
  3. Seterusnya datang pentas pemenuhan. Di sini kami mengeluarkan aplikasi dengan menjalankan proses yang diperlukan daripada keluaran kami.

Sistem sedemikian untuk mengeluarkan versi baharu model atau keseluruhan saluran paip membolehkan anda memisahkan peranan antara pentadbir dan pembangun, membolehkan anda menjejak versi dan menghalang program berhenti yang tidak diingini.

Untuk tugas keluaran, banyak perkhidmatan berbeza telah dibuat di mana anda boleh menulis proses untuk menjalankan sendiri dalam fail .yml (contohnya, dalam CircleCI ini ialah config.yml untuk menyokong proses itu sendiri). Wheely hebat dalam mencipta pakej untuk projek.

Anda boleh membuat pakej dengan versi berbeza model pembelajaran mesin anda, kemudian membungkusnya dan merujuk kepada pakej yang diperlukan dan versinya untuk menggunakan fungsi yang anda tulis dari sana. Ini akan membantu anda membuat API untuk model anda dan pakej anda boleh dihoskan di Gemfury, contohnya.

Prinsip 6. Jalankan model anda sebagai satu atau lebih proses

Selain itu, proses tidak sepatutnya mempunyai data yang dikongsi. Iaitu, proses mesti wujud secara berasingan, dan semua jenis data mesti wujud secara berasingan, contohnya, pada perkhidmatan pihak ketiga seperti MySQL atau lain-lain, bergantung pada apa yang anda perlukan.

Iaitu, ia pastinya tidak berbaloi untuk menyimpan data di dalam sistem fail proses, jika tidak, ini boleh membawa kepada pembersihan data ini semasa keluaran/perubahan konfigurasi atau pemindahan sistem yang program dijalankan seterusnya.

Tetapi terdapat pengecualian: untuk projek pembelajaran mesin, anda boleh menyimpan cache perpustakaan supaya tidak memasang semula perpustakaan setiap kali anda melancarkan versi baharu, jika tiada perpustakaan tambahan atau sebarang perubahan dibuat pada versinya. Dengan cara ini, anda akan mengurangkan masa yang diperlukan untuk melancarkan model anda dalam industri.

Untuk menjalankan model sebagai beberapa proses, anda boleh mencipta fail .yml di mana anda menentukan proses yang diperlukan dan urutannya.

Prinsip 7: Kebolehkitar semula

Proses yang dijalankan dalam aplikasi model anda harus mudah dimulakan dan dihentikan. Oleh itu, ini akan membolehkan anda menggunakan perubahan kod dengan cepat, perubahan konfigurasi, skala dengan cepat dan fleksibel, dan menghalang kemungkinan pecahan versi yang berfungsi.

Iaitu, proses anda dengan model harus:

  • Minimumkan masa permulaan. Sebaik-baiknya, masa permulaan (dari saat arahan permulaan dikeluarkan hingga ke saat proses mula beroperasi) hendaklah tidak lebih daripada beberapa saat. Caching perpustakaan, yang diterangkan di atas, adalah satu teknik untuk mengurangkan masa permulaan.
  • Tamat dengan betul. Iaitu, mendengar pada port perkhidmatan sebenarnya digantung, dan permintaan baharu yang diserahkan kepada port ini tidak akan diproses. Di sini anda sama ada perlu menyediakan komunikasi yang baik dengan jurutera DevOps, atau memahami cara ia berfungsi sendiri (sebaik-baiknya, sudah tentu, yang terakhir, tetapi komunikasi harus sentiasa dikekalkan, dalam mana-mana projek!)

Prinsip 8: Penerapan Berterusan/Integrasi

Banyak syarikat menggunakan pemisahan antara pembangunan aplikasi dan pasukan penempatan (menjadikan aplikasi tersedia kepada pengguna akhir). Ini boleh melambatkan pembangunan perisian dan kemajuan dalam menambah baiknya. Ia juga merosakkan budaya DevOps, di mana pembangunan dan integrasi, secara kasarnya, digabungkan.

Oleh itu, prinsip ini menyatakan bahawa persekitaran pembangunan anda harus sedekat mungkin dengan persekitaran pengeluaran anda.

Ini akan membolehkan:

  1. Kurangkan masa keluaran sebanyak berpuluh kali ganda
  2. Kurangkan bilangan ralat disebabkan ketidakserasian kod.
  3. Ini juga mengurangkan beban kerja kakitangan, kerana pembangun dan orang yang menggunakan aplikasi itu kini menjadi satu pasukan.

Alat yang membolehkan anda bekerja dengan ini ialah CircleCI, Travis CI, GitLab CI dan lain-lain.

Anda boleh membuat penambahan pada model dengan cepat, mengemas kini dan melancarkannya dengan segera, sementara ia akan menjadi mudah, sekiranya berlaku kegagalan, untuk kembali dengan cepat ke versi yang berfungsi, supaya pengguna akhir tidak menyedarinya. Ini boleh dilakukan terutamanya dengan mudah dan cepat jika anda mempunyai ujian yang baik.

Kurangkan perbezaan!!!

Prinsip 9. Log anda

Log (atau "Log") ialah peristiwa, biasanya direkodkan dalam format teks, yang berlaku dalam aplikasi (strim acara). Contoh mudah: "2020-02-02 - tahap sistem - nama proses." Mereka direka bentuk supaya pembangun dapat melihat secara literal apa yang berlaku apabila program berjalan. Dia melihat kemajuan proses dan memahami sama ada ia adalah seperti yang dimaksudkan oleh pemaju sendiri.

Prinsip ini menyatakan bahawa anda tidak seharusnya menyimpan log anda di dalam sistem fail anda - anda hanya perlu "mengeluarkan"nya ke skrin, sebagai contoh, melakukan ini pada output standard sistem. Dan dengan cara ini adalah mungkin untuk memantau aliran dalam terminal semasa pembangunan.

Adakah ini bermakna bahawa tiada keperluan untuk menyimpan log sama sekali? Sudah tentu tidak. Aplikasi anda tidak sepatutnya melakukan iniβ€”serahkan pada perkhidmatan pihak ketiga. Aplikasi anda hanya boleh memajukan log ke fail atau terminal tertentu untuk tontonan masa nyata, atau memajukannya ke sistem penyimpanan data tujuan umum (seperti Hadoop). Aplikasi anda sendiri tidak seharusnya menyimpan atau berinteraksi dengan log.

Prinsip 10. Ujian!

Untuk pembelajaran mesin industri, fasa ini amat penting, kerana anda perlu memahami bahawa model berfungsi dengan betul dan menghasilkan apa yang anda inginkan.

Ujian boleh dibuat menggunakan pytest, dan diuji menggunakan set data kecil jika anda mempunyai tugas regresi/pengkelasan.

Jangan lupa untuk menetapkan benih yang sama untuk model pembelajaran mendalam supaya mereka tidak sentiasa menghasilkan hasil yang berbeza.

Ini adalah penerangan ringkas tentang 10 prinsip, dan, sudah tentu, sukar untuk menggunakannya tanpa mencuba dan melihat cara ia berfungsi, jadi artikel ini hanyalah prolog kepada satu siri artikel menarik di mana saya akan mendedahkan cara mencipta model pembelajaran mesin industri , cara mengintegrasikannya ke dalam sistem, dan cara prinsip ini boleh menjadikan kehidupan lebih mudah untuk kita semua.

Saya juga akan cuba menggunakan prinsip hebat yang boleh ditinggalkan oleh sesiapa sahaja dalam komen jika mereka mahu.

Sumber: www.habr.com

Tambah komen