Tutorial: Menerapkan model pembelajaran mesin di Azure Functions dengan Python dan TensorFlow

Dalam artikel ini, Anda mempelajari cara menggunakan Python, TensorFlow, dan Azure Functions dengan model pembelajaran mesin untuk mengklasifikasikan gambar berdasarkan kontennya. Karena Anda melakukan semua bekerja 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 TensorFlow kustom ke dalam aplikasi fungsi.
  • Buat API HTTP tanpa server untuk mengklasifikasikan gambar berisi anjing atau kucing.
  • Mengkonsumsi API dari aplikasi web.

Prasyarat

Pemeriksaan prasyarat

  1. Di terminal atau jendela perintah, jalankan func --version untuk memeriksa apakah versi Azure Functions Core Tools adalah 2.7.1846 atau lebih baru.
  2. Jalankan python --version (Linux/macOS) atau py --version (Windows) untuk memeriksa laporan versi Python Anda 3.7.x.

Mengkloning repositori tutorial

  1. Di terminal atau jendela perintah, kloning repositori berikut menggunakan Git:

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. Navigasi ke folder dan periksa isinya.

    cd functions-python-tensorflow-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. Pastikan untuk menggunakan Python 3.7 yang didukung oleh Azure Functions.

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.

  1. 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.

  2. 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

  1. Mulai fungsi dengan memulai host runtime Azure Functions lokal di folder mulai:

    func start
    
  2. 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.

  3. Gunakan Ctrl-C untuk menghentikan host.

Mengimpor model TensorFlow dan menambahkan kode pembantu

Untuk memodifikasi fungsi classify untuk mengklasifikasikan gambar berdasarkan kontennya, Anda menggunakan model TensorFlow bawaan yang dilatih dan diekspor dari Azure Custom Vision Service. Model, yang berada dalam folder sumber daya sampel yang Anda kloning sebelumnya, mengklasifikasikan gambar berdasarkan apakah berisi anjing atau kucing. Anda kemudian menambahkan beberapa kode dan dependensi pembantu ke proyek Anda.

Untuk membangun model Anda sendiri menggunakan tingkat gratis Custom Vision Service, ikuti instruksi dalam repositori proyek sampel.

Tip

Jika Anda ingin menghosting model TensorFlow yang independen dari aplikasi fungsi, Anda dapat memasang berbagi file yang berisi model Anda ke aplikasi fungsi Linux Anda. Untuk mempelajari selengkapnya, lihat Memasang berbagi file ke aplikasi fungsi Python menggunakan Azure CLI.

  1. Di folder mulai, jalankan perintah berikut untuk menyalin file model ke folder klasifikasi. Pastikan untuk menyertakan \* dalam perintah.

    cp ../resources/model/* classify
    
  2. Verifikasi bahwa folder klasifikasi berisi file bernama model.pb dan labels.txt. Jika tidak, periksa apakah Anda menjalankan perintah di folder mulai.

  3. Di folder mulai, jalankan perintah berikut ini untuk menyalin file dengan kode pembantu ke dalam folder klasifikasi:

    cp ../resources/predict.py classify
    
  4. Verifikasi bahwa folder klasifikasi sekarang berisi file bernama predict.py.

  5. Buka start/requirements.txt di editor teks dan tambahkan dependensi berikut yang diperlukan oleh kode pembantu:

    tensorflow==1.14
    Pillow
    requests
    
  6. Simpan requirements.txt.

  7. Instal dependensi dengan menjalankan perintah berikut ini di folder mulai. Penginstalan mungkin memakan waktu beberapa menit, selama waktu tersebut Anda dapat melanjutkan dengan memodifikasi fungsi di bagian berikutnya.

    pip install --no-cache-dir -r requirements.txt
    

    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 ke 1 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.

Tip

Ketika memanggil predict.py untuk membuat prediksi pertamanya, fungsi bernama _initialize memuat model TensorFlow dari disk dan cache dalam variabel global. Penembolokan ini mempercepat prediksi berikutnya. Untuk informasi selengkapnya tentang menggunakan variabel global, lihat panduan pengembang Azure Functions Python.

Memperbarui fungsi untuk menjalankan prediksi

  1. 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
    
  2. 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 memanggil predict_image_from_url dari pustaka pembantu untuk mengunduh dan mengklasifikasikan gambar menggunakan model TensorFlow. 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.

  3. 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 memulai, tetapi Anda akan melihat kesalahan saat memanggil fungsi.

    func start
    
  4. Di browser, buka URL berikut untuk memanggil fungsi dengan URL gambar kucing dan mengonfirmasi bahwa JSON yang dikembalikan mengklasifikasikan gambar sebagai kucing.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  5. 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.

  1. Buka terminal atau perintah baru dan aktifkan lingkungan virtual (seperti yang dijelaskan sebelumnya di bawah Membuat dan mengaktifkan lingkungan virtual Python).

  2. Navigasi ke folder frontend repositori.

  3. Mulai server HTTP dengan Python:

    python -m http.server
    
  4. 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-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat2.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog2.png
  5. Pilih Kirim untuk memanggil titik akhir fungsi untuk mengklasifikasikan gambar.

    Cuplikan layar proyek yang sudah selesai

    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.

Catatan

Model selalu mengklasifikasikan konten gambar sebagai kucing atau anjing, terlepas dari apakah gambar berisi salah satunya, default ke anjing. Gambar harimau dan panter, misalnya, biasanya diklasifikasi sebagai kucing, tetapi gambar gajah, wortel, atau pesawat terbang diklasifikasikan sebagai anjing.

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 TensorFlow. 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: