Mengubah skrip menjadi alat pembelajaran mesin yang indah

Kami membuat mesin pencari semantik dengan pembelajaran mesin waktu nyata untuk 300 baris kode Python.

Pengalaman saya menunjukkan bahwa setiap proyek pembelajaran mesin yang lebih atau kurang kompleks cepat atau lambat akan berubah menjadi seperangkat alat internal yang kompleks tidak didukung. Alat-alat ini biasanya merupakan campuran skrip dari Jupyter Notebooks and Flask, yang sulit untuk digunakan dan diintegrasikan dengan solusi seperti sesi GPU Tensorflow.


Saya pertama kali menemukan ini di Universitas Carnegie, kemudian di Berkeley, di Google X, dan akhirnya, ketika membuat robot mandiri di Zoox. Alat-alat lahir dalam bentuk notebook Jupyter kecil: utilitas kalibrasi sensor, layanan simulasi, aplikasi LIDAR, utilitas scripting, dll.


Dengan semakin pentingnya alat, manajer muncul. Birokrasi tumbuh. Persyaratan meningkat. Proyek-proyek kecil berubah menjadi mimpi buruk yang aneh.



Siklus: 1. Jelajahi di Jupyter 2. Salin-tempel ke skrip Python 3. Tulis aplikasi Flask dengan HTML, JS dan banyak lagi 4. Tambahkan lebih banyak fungsi. // Masalah dukungan dimulai sejak langkah 3

Ketika alat menjadi kritis, kami melibatkan tim untuk membuat alat . Mereka menggunakan Vue dan Bereaksi. Laptop mereka ditutupi dengan stiker dari konferensi kerangka deklaratif. Mereka memiliki proses debug sendiri:


Proses yang disederhanakan: 1. Kumpulan persyaratan 2. Templat untuk komponen reaktif 3. Membuat aplikasi dalam HTML, CSS, Python, Bereaksi, dll. 4. Sebulan kemudian: "Aplikasi sudah siap, kami dapat memperbaruinya dalam beberapa bulan." // Setelah langkah 4, pekerjaan bergerak dengan kecepatan kura-kura

Prosesnya luar biasa. Berikut adalah alat yang muncul setiap minggu. Dan tim alat mendukung sepuluh proyek lainnya. Menambahkan fungsi baru butuh waktu berbulan-bulan.


Jadi kami kembali membuat alat sendiri, menyebarkan aplikasi Flask, menulis HTML, CSS dan JavaScript, dan mencoba untuk porting semua ini dari Jupyter sambil menjaga gaya. Jadi teman lama Google X saya Thiago Teheheira dan saya mulai merenungkan pertanyaan: Bagaimana jika kita dapat membuat alat semudah kita menulis skrip dengan Python?


Kami ingin spesialis pembelajaran mesin dapat membuat aplikasi yang elegan tanpa melibatkan tim untuk membuat alat. Alat internal seharusnya tidak menjadi tujuan itu sendiri, tetapi produk sampingan dari bekerja dengan ML. Menulis utilitas harus dirasakan sebagai bagian dari pekerjaan melatih jaringan saraf atau melakukan analisis di Jupyter! Tetapi pada saat yang sama, kami ingin memiliki fleksibilitas dan kekuatan kerangka kerja web. Sebenarnya, kami menginginkan sesuatu seperti ini:


Proses bekerja di Streamlit: 1. Tambahkan beberapa panggilan ke API dalam skrip Anda 2. Alat yang indah siap!

Dengan bantuan komunitas insinyur luar biasa dari Uber, Twitter, Stitch Fix, dan Dropbox, kami mengembangkan Streamlit sepanjang tahun ini - kerangka kerja open source gratis untuk membantu pekerja pembelajaran mesin. Dengan setiap iterasi berikutnya, prinsip-prinsip pada inti Streamlit menjadi lebih sederhana. Inilah tujuan kami:


# 1: Gunakan pengetahuan Python. Aplikasi Streamlit adalah skrip yang dijalankan dari atas ke bawah. Tidak ada kondisi tersembunyi di dalamnya. Jika Anda dapat menulis dengan Python, Anda dapat membuat aplikasi dalam Streamlit. Begini cara layar ditampilkan:


import streamlit as st st.write('Hello, world!') 

Kenalan pertama.

# 2: Pikirkan widget sebagai variabel. Tidak ada callback di Streamlit ! Setiap perubahan cukup restart script dari atas ke bawah. Pendekatan ini memungkinkan Anda untuk menulis pembersih kode:


 import streamlit as st x = st.slider('x') st.write(x, 'squared is', x * x) 

Aplikasi interaktif dalam tiga baris kode.

# 3: Gunakan data dan perhitungan berulang kali. Bagaimana jika Anda mengunduh banyak data untuk melakukan perhitungan yang panjang? Maka penting untuk menggunakannya kembali di antara restart. Streamlit memiliki primitif untuk caching persisten kondisi default tidak berubah. Jadi, misalnya, kode di bawah ini mengunduh data dari proyek Udacity pada mobil yang dikelola sendiri, menghasilkan aplikasi yang sederhana dan indah:


 import streamlit as st import pandas as pd # Reuse this data across runs! read_and_cache_csv = st.cache(pd.read_csv) BUCKET = "https://streamlit-self-driving.s3-us-west-2.amazonaws.com/" data = read_and_cache_csv(BUCKET + "labels.csv.gz", nrows=1000) desired_label = st.selectbox('Filter to:', ['car', 'truck']) st.write(data[data.label == desired_label]) 

Untuk menjalankan kode di atas, ikuti instruksi dari sini .

Dan di sini adalah bagaimana hasilnya akan terlihat.

Singkatnya, Streamlit berfungsi seperti ini:


  1. Script dijalankan kembali setiap waktu
  2. Streamlit memberikan setiap variabel nilai saat ini dari widget.
  3. Caching menghindari akses jaringan yang tidak perlu atau penghitungan ulang yang panjang.

Pekerjaan Streamlit dalam gambar:


Input pengguna mulai ulang skrip. Di antara restart, hanya cache yang disimpan.

Apakah Anda tertarik? Kalau begitu cobalah sendiri! Jalankan:


 $ pip install --upgrade streamlit $ streamlit hello     .  URL: http://localhost:8501  URL: http://10.0.1.29:8501 

Kode ini akan membuka aplikasi Streamlit di browser. Jika ini tidak terjadi, klik saja tautannya.


Untuk melihat lebih banyak contoh seperti animasi fraktal ini, jalankan saja streamlit hello dari baris perintah.



Tidak cukup bermain dengan fraktal? Hati-hati, fraktal dapat menempel dalam waktu yang lama.


Kesederhanaan contoh tidak boleh menyesatkan: Anda dapat membuat aplikasi besar di Streamlit. Bekerja di Zoox dan Google X, saya melihat bagaimana proyek otomobil mandiri meningkat hingga gigabytes data visual yang perlu ditemukan dan diproses, termasuk menguji berbagai model untuk membandingkan kinerja. Setiap proyek kecil pada mesin self-driving cepat atau lambat tumbuh dengan ukuran membutuhkan tim pengembangan yang terpisah.


Tetapi dengan Streamlit, membuat aplikasi seperti itu sepele. Berikut ini adalah demo di Streamlit , di mana pencarian semantik penuh diimplementasikan di seluruh array data Udacity untuk mesin self-driving , visualisasi label orang yang diberi catatan dan peluncuran jaringan saraf penuh ( YOLO ) secara real-time di dalam aplikasi yang sama [1].


Demo 300-line pada Streamlit ini menggabungkan pencarian semantik dengan hasil real-time dari jaringan saraf.

Aplikasi ini sepenuhnya mandiri, sebagian besar dari 300 baris adalah pembelajaran mesin. Selain itu, API Streamlit hanya disebut 23 kali . Coba sendiri!


 $ pip install --upgrade streamlit opencv-python $ streamlit run https://raw.githubusercontent.com/streamlit/demo-self-driving/master/app.py 



Dalam proses bekerja dengan tim pembelajaran mesin, kami menyadari bahwa beberapa ide sederhana berhasil dengan baik:


Aplikasi Streamlit adalah file Python biasa. Jadi, Anda dapat menggunakan editor favorit Anda untuk mengembangkan seluruh aplikasi.


Alur kerja saya dengan Streamlit mencakup VSCode di sebelah kiri dan Chrome di sebelah kanan.

Skrip bersih disimpan tanpa masalah di Git atau sistem kontrol versi lainnya. Bekerja dengan python murni, Anda mendapatkan kumpulan besar alat yang siap pakai untuk pengembangan sebagai sebuah tim.


Aplikasi Streamlit sepenuhnya dihosting di Git.

Streamlit adalah lingkungan pengkodean respons instan. Cukup klik Selalu jalankan kembali ketika Streamlit melihat perubahan pada file sumber.


Klik "Selalu jalankan kembali" untuk pengkodean respons instan.

Caching sangat menyederhanakan pekerjaan dengan rantai perhitungan. Menggabungkan beberapa hasil caching berfungsi dengan baik sebagai saluran pipa yang efisien untuk komputasi! Lihatlah kode ini yang diambil dari demo Udacity :


 import streamlit as st import pandas as pd @st.cache def load_metadata(): DATA_URL = "https://streamlit-self-driving.s3-us-west-2.amazonaws.com/labels.csv.gz" return pd.read_csv(DATA_URL, nrows=1000) @st.cache def create_summary(metadata, summary_type): one_hot_encoded = pd.get_dummies(metadata[["frame", "label"]], columns=["label"]) return getattr(one_hot_encoded.groupby(["frame"]), summary_type)() # Piping one st.cache function into another forms a computation DAG. summary_type = st.selectbox("Type of summary:", ["sum", "any"]) metadata = load_metadata() summary = create_summary(metadata, summary_type) st.write('## Metadata', metadata, '## Summary', summary) 

Pipeline untuk komputasi Streamlit. Untuk menjalankan skrip, ikuti instruksi ini.



Faktanya, pipeline adalah load_metadata -> create_summary. Setiap kali skrip dijalankan, Streamlit hanya menceritakan apa yang dibutuhkan untuk hasil yang benar . Keren!


Untuk kinerja maksimum, Streamlit hanya menceritakan apa yang benar-benar diperlukan untuk memperbarui UI.

Streamlit dirancang untuk bekerja dengan GPU. Streamlit memungkinkan Anda untuk bekerja secara langsung dengan TensorFlow, PyTorch dan perpustakaan serupa lainnya. Misalnya, dalam demo ini, cache Streamlit menyimpan GAN selebritas dari NVIDIA [2]. Ini memungkinkan Anda untuk mencapai respons yang hampir instan ketika mengubah nilai-nilai slider.


Aplikasi Streamlit menunjukkan GAN wajah selebriti dari NVIDIA [2] menggunakan TL-GAN Shaobo Guan [3].

Streamlit adalah proyek sumber terbuka . Anda dapat dengan bebas mendistribusikan aplikasi di Streamlit tanpa meminta izin kepada kami. Anda bahkan dapat menjalankan aplikasi di Streamlit secara lokal tanpa koneksi internet! Dan proyek yang ada dapat mengimplementasikan Streamlit secara bertahap.


Beberapa cara untuk menggunakan Streamlit. (Ikon diambil dari fullvector / Freepik .)



Dan ini hanya gambaran umum tentang fitur Streamlit. Salah satu aspek paling keren dari perpustakaan adalah kemudahan menggabungkan primitif ke dalam aplikasi besar. Kami memiliki banyak informasi tentang infrastruktur dan rencana Streamlit untuk masa depan, tetapi kami akan menyimpannya untuk publikasi di masa mendatang.


Diagram komponen streamlit. Tunggu publikasi selanjutnya!

Kami senang berbagi Streamlit dengan dunia dan kami berharap dengan itu skrip Python ML Anda akan berubah menjadi aplikasi lengkap yang indah.




Referensi:


[1] J. Redmon dan A. Farhadi, YOLOv3: An Incremental Improvement (2018), arXiv.


[2] T. Karras, T. Aila, S. Laine, dan J. Lehtinen, Pertumbuhan Progresif GAN untuk Peningkatan Kualitas, Stabilitas, dan Variasi (2018), ICLR.


[3] S. Guan, Controlled image synthesis and editing menggunakan novel TL-GAN model (2018), Insight Data Science Blog.

Source: https://habr.com/ru/post/id473196/


All Articles