Tutorial: Menerapkan model klasifikasi gambar yang sudah dilatih sebelumnya ke Azure Functions dengan PyTorch
Dalam artikel ini, Anda mempelajari cara menggunakan Python, PyTorch, dan Azure Functions untuk memuat model yang sudah dilatih untuk mengklasifikasikan gambar berdasarkan kontennya. Karena Anda melakukan semua pekerjaan secara lokal dan tidak membuat sumber daya Azure di cloud, tidak ada biaya untuk menyelesaikan tutorial ini.
- Menginisialisasi lingkungan lokal untuk mengembangkan Azure Functions di Python.
- Impor model pembelajaran mesin PyTorch yang telah dilatih sebelumnya ke dalam aplikasi fungsi.
- Buat API HTTP tanpa server untuk mengklasifikasikan gambar sebagai salah satu dari 1000 kelas ImageNet.
- Mengkonsumsi API dari aplikasi web.
Prasyarat
- Akun Azure dengan langganan aktif. Membuat akun secara gratis.
- Python 3.7.4 atau lebih tinggi. (Python 3.8.x dan Python 3.6.x juga diverifikasi dengan Azure Functions.)
- Azure Functions Core Tools
- Editor kode seperti Visual Studio Code
Pemeriksaan prasyarat
- Di terminal atau jendela perintah, jalankan
func --version
untuk memeriksa apakah versi Azure Functions Core Tools adalah 2.7.1846 atau lebih baru. - Jalankan
python --version
(Linux/macOS) ataupy --version
(Windows) untuk memeriksa laporan versi Python Anda 3.7.x.
Mengkloning repositori tutorial
Di terminal atau jendela perintah, kloning repositori berikut menggunakan Git:
git clone https://github.com/Azure-Samples/functions-python-pytorch-tutorial.git
Navigasi ke folder dan periksa isinya.
cd functions-python-pytorch-tutorial
- mulai adalah folder aktif Anda untuk tutorial.
- akhir adalah hasil akhir dan implementasi penuh untuk referensi Anda.
- sumber daya berisi model pembelajaran mesin dan pustaka pembantu.
- frontend adalah situs web yang memanggil aplikasi fungsi.
Membuat dan mengaktifkan lingkungan virtual Python
Navigasi ke folder mulai dan jalankan perintah berikut untuk membuat dan mengaktifkan lingkungan virtual bernama .venv
.
cd start
python -m venv .venv
source .venv/bin/activate
Jika Python tidak memasang paket venv pada distribusi Linux Anda, jalankan perintah berikut:
sudo apt-get install python3-venv
Anda menjalankan semua perintah berikutnya di lingkungan virtual yang diaktifkan ini. (Untuk keluar dari lingkungan virtual, jalankan deactivate
.)
Membuat proyek fungsi lokal
Di Azure Functions, proyek fungsi adalah kontainer untuk satu atau beberapa fungsi individual yang masing-masing merespons pemicu tertentu. Semua fungsi dalam proyek memiliki konfigurasi lokal dan hosting yang sama. Di bagian ini, Anda membuat proyek fungsi yang berisi satu fungsi boilerplate bernama classify
yang menyediakan titik akhir HTTP. Anda menambahkan kode yang lebih spesifik di bagian yang lebih baru.
Di folder mulai, gunakan Azure Functions Core Tools untuk menginisialisasi aplikasi fungsi Python:
func init --worker-runtime python
Setelah inisialisasi, folder start berisi berbagai file untuk proyek inif, termasuk file konfigurasi bernama local.settings.json dan host.json. Karena local.settings.json dapat berisi rahasia yang diunduh dari Azure, file dikecualikan dari kontrol sumber secara default dalam file .gitignore.
Tip
Karena proyek fungsi terikat dengan runtime tertentu, semua fungsi dalam proyek harus ditulis dengan bahasa yang sama.
Tambahkan fungsi ke proyek Anda dengan menggunakan perintah berikut, di mana argumen
--name
adalah nama unik fungsi Anda dan argumen--template
menentukan pemicu fungsi.func new
membuat subfolder yang cocok dengan nama fungsi yang berisi file kode yang sesuai dengan bahasa yang dipilih proyek dan file konfigurasi bernama function.json.func new --name classify --template "HTTP trigger"
Perintah ini membuat folder yang cocok dengan nama fungsi, mengklasifikasikan. Di dalam folder tersebut, terdapat dua file: __init__.py, yang berisi fungsi kode, dan function.json, yang menggambarkan pemicu fungsi serta pengikatan input dan outputnya. Untuk detail tentang konten file-file ini, lihat Model pemrograman di panduan pengembang Python.
Menjalankan fungsi secara lokal
Mulai fungsi dengan memulai host runtime Azure Functions lokal di folder mulai:
func start
Setelah Anda melihat titik akhir
classify
muncul dalam output, navigasi ke URL,http://localhost:7071/api/classify?name=Azure
. Pesan "Halo Azure!" akan muncul pada output.Gunakan Ctrl-C untuk menghentikan host.
Mengimpor model PyTorch dan menambahkan kode pembantu
Untuk memodifikasi fungsi classify
untuk mengklasifikasikan gambar berdasarkan kontennya, Anda menggunakan model ResNet yang telah dilatih sebelumnya. Model yang dilatih sebelumnya, yang berasal dari PyTorch, mengklasifikasikan gambar ke dalam 1 dari 1000 kelas ImageNet. Anda kemudian menambahkan beberapa kode dan dependensi pembantu ke proyek Anda.
Di folder mulai, jalankan perintah berikut ini untuk menyalin kode prediksi dan label ke dalam folder klasifikasi.
cp ../resources/predict.py classify cp ../resources/labels.txt classify
Verifikasi bahwa folder klasifikasi berisi file bernama predict.py dan labels.txt. Jika tidak, periksa apakah Anda menjalankan perintah di folder mulai.
Buka mulai/requirements.txt di editor teks dan tambahkan dependensi yang diperlukan oleh kode pembantu, yang akan terlihat seperti:
azure-functions requests -f https://download.pytorch.org/whl/torch_stable.html torch==1.13.0+cpu torchvision==0.14.0+cpu
Tip
Versi obor dan torchvision harus cocok dengan nilai yang tercantum dalam tabel versi repositori visi PyTorch.
Simpan requirements.txt, lalu jalankan perintah berikut dari folder mulai untuk menginstal dependensi.
pip install --no-cache-dir -r requirements.txt
Penginstalan mungkin memakan waktu beberapa menit, selama waktu tersebut Anda dapat melanjutkan dengan memodifikasi fungsi di bagian berikutnya.
Tip
Di Windows, Anda mungkin mengalami kesalahan, "Tidak dapat menginstal paket karena EnvironmentError: [Errno 2] Tidak ada file atau direktori seperti itu:" diikuti dengan nama jalur panjang ke file seperti sharded_mutable_dense_hashtable.cpython-37.pyc. Biasanya, kesalahan ini terjadi karena kedalaman jalur folder menjadi terlalu panjang. Dalam hal ini, atur kunci registri
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled
ke1
untuk mengaktifkan jalur panjang. Selain itu, periksa di mana penerjemah Python Anda diinstal. Jika lokasi tersebut memiliki jalur panjang, coba instal ulang di folder dengan jalur yang lebih singkat.
Memperbarui fungsi untuk menjalankan prediksi
Buka classify/__init__.py di editor teks kemudian tambahkan baris berikut setelah pernyataan
import
yang sudah ada untuk mengimpor pustaka JSON standar dan pembantu prediksi:import logging import azure.functions as func import json # Import helper script from .predict import predict_image_from_url
Ganti seluruh konten fungsi
main
dengan kode berikut:def main(req: func.HttpRequest) -> func.HttpResponse: image_url = req.params.get('img') logging.info('Image URL received: ' + image_url) results = predict_image_from_url(image_url) headers = { "Content-type": "application/json", "Access-Control-Allow-Origin": "*" } return func.HttpResponse(json.dumps(results), headers = headers)
Fungsi ini menerima URL gambar dalam parameter string kueri bernama
img
. Kemudian memanggilpredict_image_from_url
dari pustaka pembantu untuk mengunduh dan mengklasifikasikan gambar menggunakan model PyTorch. Fungsi ini kemudian mengembalikan respons HTTP dengan hasilnya.Penting
Karena titik akhir HTTP ini dipanggil oleh halaman web yang dihosting di domain lain, respons menyertakan header
Access-Control-Allow-Origin
untuk memenuhi persyaratan Berbagi Sumber Daya Lintas Asal (CORS) browser.Dalam aplikasi produksi, ubah
*
ke asal spesifik halaman web untuk keamanan tambahan.Simpan perubahan Anda, lalu asumsikan bahwa dependensi telah selesai diinstal, mulai host fungsi lokal lagi dengan
func start
. Pastikan untuk menjalankan host di folder mulai dengan lingkungan virtual diaktifkan. Jika tidak, host akan dimulai, tetapi Anda akan melihat kesalahan saat memanggil fungsi.func start
Di browser, buka URL berikut untuk memanggil fungsi dengan URL gambar kucing dan mengonfirmasi bahwa JSON yang dikembalikan mengklasifikasikan gambar sebagai Anjing Gunung Bernese.
http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
Jaga agar host tetap berjalan karena Anda menggunakannya dalam langkah berikutnya.
Jalankan frontend aplikasi web lokal untuk menguji fungsi
Untuk menguji pemanggilan titik akhir fungsi dari aplikasi web lain, ada aplikasi sederhana di folder frontend repositori.
Buka terminal atau perintah baru dan aktifkan lingkungan virtual (seperti yang dijelaskan sebelumnya di bawah Membuat dan mengaktifkan lingkungan virtual Python).
Navigasi ke folder frontend repositori.
Mulai server HTTP dengan Python:
python -m http.server
Di browser, navigasi ke
localhost:8000
, lalu masukkan salah satu URL foto berikut ke dalam kotak teks, atau gunakan URL gambar yang dapat diakses publik.https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
https://github.com/Azure-Samples/functions-python-pytorch-tutorial/blob/master/resources/assets/bald-eagle.jpg?raw=true
https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/penguin.jpg
Pilih Kirim untuk memanggil titik akhir fungsi untuk mengklasifikasikan gambar.
Jika browser melaporkan kesalahan saat Anda mengirimkan URL gambar, periksa terminal tempat Anda menjalankan aplikasi fungsi. Jika Anda melihat kesalahan seperti "Tidak ada modul yang ditemukan 'PIL'", Anda mungkin telah memulai aplikasi fungsi di folder mulai tanpa terlebih dahulu mengaktifkan lingkungan virtual yang Anda buat sebelumnya. Jika Anda masih melihat kesalahan, jalankan
pip install -r requirements.txt
lagi dengan lingkungan virtual diaktifkan dan cari kesalahan.
Bersihkan sumber daya
Karena keseluruhan tutorial ini berjalan secara lokal di komputer Anda, tidak ada sumber daya atau layanan Azure untuk dibersihkan.
Langkah berikutnya
Dalam tutorial ini, Anda mempelajari cara membuat dan mengkustomisasi titik akhir API HTTP dengan Azure Functions untuk mengklasifikasikan gambar menggunakan model PyTorch. Anda juga mempelajari cara memanggil API dari aplikasi web. Anda dapat menggunakan teknik dalam tutorial ini untuk membangun API dari kompleksitas apa pun, sambil berjalan pada model komputasi tanpa server yang disediakan oleh Azure Functions.
Lihat juga: