Menyebarkan model ke kluster Azure Kubernetes Service dengan v1

Penting

Artikel ini menjelaskan cara menggunakan Azure Pembelajaran Mesin CLI (v1) dan Azure Pembelajaran Mesin SDK untuk Python (v1) untuk menyebarkan model. Untuk pendekatan yang direkomendasikan untuk v2, lihat Menyebarkan dan menentukan skor model pembelajaran mesin dengan menggunakan titik akhir online.

Pelajari cara menggunakan Azure Machine Learning untuk menyebarkan model sebagai layanan web di Azure Kubernetes Service (AKS). AKS baik untuk penyebaran produksi skala tinggi. Gunakan AKS jika Anda memerlukan satu atau beberapa kemampuan berikut:

  • Waktu respons cepat
  • Penghitungan otomatis layanan yang disebarkan
  • Pembuatan Log
  • Pengumpulan data model
  • Autentikasi
  • Penghentian TLS
  • Opsi akselerasi perangkat keras seperti GPU dan array gerbang yang dapat diprogram bidang (FPGA)

Saat menyebarkan ke AKS, Anda menyebarkan ke kluster AKS yang tersambung ke ruang kerja Anda. Untuk informasi tentang menghubungkan kluster AKS ke ruang kerja, lihat Membuat dan melampirkan kluster Azure Kubernetes Service.

Penting

Kami menyarankan agar Anda men-debug secara lokal sebelum menyebarkan ke layanan web. Untuk informasi selengkapnya, lihat Pemecahan masalah dengan penyebaran model lokal.

Anda juga dapat merujuk ke Sebarkan ke buku catatan lokal di GitHub.

Catatan

Azure Pembelajaran Mesin Endpoints (v2) memberikan pengalaman penyebaran yang lebih baik dan lebih sederhana. Titik akhir mendukung skenario inferensi real-time dan batch. Titik akhir menyediakan antarmuka terpadu untuk menjalankan dan mengelola penyebaran model di seluruh jenis komputasi. Lihat Apa itu titik akhir Azure Pembelajaran Mesin?.

Prasyarat

Memahami proses penyebaran

Penyebaran kata digunakan di Kubernetes dan Azure Pembelajaran Mesin. Penyebaran memiliki arti yang berbeda dalam dua konteks ini. Di Kubernetes, penyebaran adalah entitas konkret, yang ditentukan dengan file YAML deklaratif. Penyebaran Kubernetes memiliki siklus hidup yang ditentukan dan hubungan konkret dengan entitas Kubernetes lainnya seperti Pods dan ReplicaSets. Anda bisa belajar tentang Kubernetes dari dokumen dan video di Apa itu Kubernetes?

Di Azure Pembelajaran Mesin, penyebaran digunakan dalam arti yang lebih umum untuk menyediakan dan membersihkan sumber daya proyek Anda. Langkah-langkah yang dipertimbangkan Azure Machine Learning sebagai bagian dari penyebaran adalah:

  1. Zipping file di folder proyek Anda, mengabaikan yang ditentukan dalam .amlignore atau .gitignore
  2. Meningkatkan skala kluster komputasi Anda (berkaitan dengan Kubernetes)
  3. Membangun atau mengunduh dockerfile ke simpul komputasi (berkaitan dengan Kubernetes)
    1. Sistem menghitung hash dari:
    2. Sistem menggunakan hash ini sebagai kunci dalam pencarian ruang kerja Azure Container Registry (ACR)
    3. Jika tidak ditemukan, ia mencari kecocokan di ACR global
    4. Jika tidak ditemukan, sistem membangun gambar baru yang di-cache dan didorong ke ACR ruang kerja
  4. Mengunduh file proyek zip Anda ke penyimpanan sementara pada node komputasi
  5. Mengekstrak file proyek
  6. Node komputasi yang mengeksekusi python <entry script> <arguments>
  7. Menyimpan log, file model, dan file lain yang ditulis ke ./outputs ke akun penyimpanan yang terkait dengan ruang kerja
  8. Menurunkan skala komputasi, termasuk menghapus penyimpanan sementara (berkaitan dengan Kubernetes)

Router Azure Pembelajaran Mesin

Komponen front-end (azureml-fe) yang merutekan permintaan inferensi masuk ke layanan yang digunakan secara otomatis menskalakan sesuai kebutuhan. Penskalaan azureml-fe didasarkan pada tujuan dan ukuran klaster AKS (jumlah node). Tujuan kluster dan node dikonfigurasi saat Anda membuat atau melampirkan klaster AKS. Ada satu layanan azureml-fe per kluster, yang mungkin berjalan pada beberapa pod.

Penting

Saat menggunakan kluster yang dikonfigurasi sebagai dev-test, penskala mandiri dinonaktifkan. Bahkan untuk kluster FastProd/DenseProd, Penskala Mandiri hanya diaktifkan saat telemetri menunjukkan bahwa itu diperlukan.

Catatan

Payload permintaan maksimum adalah 100MB.

Azureml-fe menskalakan naik (vertikal) untuk menggunakan lebih banyak core, dan keluar (horizontal) untuk menggunakan lebih banyak pod. Saat membuat keputusan untuk meningkatkan skala, waktu yang diperlukan untuk merutekan permintaan inferensi masuk digunakan. Jika kali ini melebihi ambang batas, skala ke atas akan terjadi. Jika waktu untuk merutekan permintaan masuk terus melebihi ambang batas, skala keluar akan terjadi.

Saat menskalakan ke bawah dan ke dalam, penggunaan CPU digunakan. Jika ambang penggunaan CPU terpenuhi, ujung depan terlebih dahulu diturunkan skalanya. Jika penggunaan CPU turun ke ambang batas skala ke dalam, operasi skala ke dalam akan terjadi. Peningkatan dan peluasan skala hanya terjadi jika ada cukup sumber daya kluster yang tersedia.

Saat peningkatan atau penurunan skala, pod azureml-fe dimulai ulang untuk menerapkan perubahan cpu/memori. Menghidupkan ulang tidak memengaruhi permintaan inferensi.

Memahami persyaratan konektivitas untuk kluster inferensi AKS

Saat Azure Pembelajaran Mesin membuat atau melampirkan kluster AKS, kluster AKS disebarkan dengan salah satu dari dua model jaringan berikut:

  • Jaringan Kubenet: Sumber daya jaringan biasanya dibuat dan dikonfigurasi saat kluster AKS disebarkan.
  • Jaringan Azure Container Networking Interface (CNI): Kluster AKS terhubung ke sumber daya dan konfigurasi jaringan virtual yang ada.

Untuk jaringan Kubenet, jaringan dibuat dan dikonfigurasi dengan benar untuk Azure Machine Learning service. Untuk jaringan CNI, Anda perlu memahami persyaratan konektivitas dan memastikan resolusi DNS dan konektivitas keluar untuk inferensi AKS. Misalnya, Anda mungkin menggunakan firewall untuk memblokir lalu lintas jaringan.

Diagram berikut menangkap semua persyaratan konektivitas untuk inferensi AKS. Panah hitam mewakili komunikasi yang sebenarnya, dan panah biru mewakili nama domain. Anda mungkin perlu menambahkan entri untuk host ini ke firewall Anda atau ke server DNS kustom Anda.

Diagram that shows connectivity requirements for AKS inferencing.

Untuk persyaratan konektivitas AKS umum, lihat Membatasi lalu lintas jaringan dengan Azure Firewall di AKS.

Untuk mengakses layanan Azure Pembelajaran Mesin di belakang firewall, lihat Mengonfigurasi lalu lintas jaringan masuk dan keluar.

Persyaratan resolusi DNS secara keseluruhan

Resolusi DNS dalam jaringan virtual yang ada berada di bawah kontrol Anda. Misalnya, firewall atau server DNS kustom. Host berikut harus dapat dijangkau:

Nama Host Digunakan oleh
<cluster>.hcp.<region>.azmk8s.io Server API AKS
mcr.microsoft.com Microsoft Container Registry (MCR)
<ACR name>.azurecr.io Azure Container Registry (ACR) Anda
<account>.table.core.windows.net Akun Azure Storage (penyimpanan tabel)
<account>.blob.core.windows.net Akun Azure Storage (penyimpanan blob)
api.azureml.ms Autentikasi Microsoft Entra
ingest-vienna<region>.kusto.windows.net Titik akhir Kusto untuk mengunggah telemetri
<leaf-domain-label + auto-generated suffix>.<region>.cloudapp.azure.com Nama domain titik akhir, jika Anda dibuat secara otomatis dengan Azure Pembelajaran Mesin. Apabila Anda menggunakan nama domain kustom, Anda tidak memerlukan entri ini.

persyaratan Koneksi ivitas dalam urutan kronologis

Dalam proses AKS membuat atau melampirkan, router Azure Pembelajaran Mesin (azureml-fe) disebarkan ke dalam kluster AKS. Untuk menyebarkan router Azure Pembelajaran Mesin, simpul AKS harus dapat:

  • Mengatasi DNS untuk server API AKS
  • Mengatasi DNS untuk MCR untuk mengunduh gambar docker untuk router Azure Pembelajaran Mesin
  • Unduh gambar dari MCR, di mana konektivitas keluar diperlukan

Tepat setelah azureml-fe disebarkan, azureml-fe mencoba memulai dan ini mengharuskan Anda untuk:

  • Mengatasi DNS untuk server API AKS
  • Kueri server API AKS untuk menemukan instans lain dari dirinya sendiri (instans ini adalah layanan multi-pod)
  • Menyambungkan ke contoh lain itu sendiri

Setelah azureml-fe dimulai, diperlukan konektivitas berikut agar azureml-fe berfungsi dengan baik:

  • Menyambungkan ke Azure Storage untuk mengunduh konfigurasi dinamis
  • Atasi DNS untuk server autentikasi Microsoft Entra api.azureml.ms dan berkomunikasi dengannya saat layanan yang disebarkan menggunakan autentikasi Microsoft Entra.
  • Kueri AKS API server untuk menemukan model yang disebarkan
  • Berkomunikasi dengan POD model yang disebarkan

Pada waktu penyebaran model, untuk penyebaran model yang berhasil, simpul AKS harus dapat:

  • Mengatasi DNS untuk ACR pelanggan
  • Unduh gambar dari ACR pelanggan
  • Mengatasi DNS untuk BLOB Azure tempat model disimpan
  • Unduh model dari BLOB Azure

Setelah model disebarkan dan layanan dimulai, azureml-fe secara otomatis menemukannya menggunakan API AKS, dan siap untuk merutekan permintaan ke model tersebut. Ini harus dapat berkomunikasi dengan pod model.

Catatan

Jika model yang disebarkan memerlukan konektivitas apa pun (misalnya, mengkueri database eksternal atau layanan REST lainnya, atau mengunduh BLOB), resolusi DNS dan komunikasi keluar untuk layanan ini harus diaktifkan.

Sebarkan ke AKS

Untuk menyebarkan model ke AKS, buat konfigurasi penyebaran yang menjelaskan sumber daya komputasi yang diperlukan. Misalnya, jumlah inti dan memori. Anda juga memerlukan konfigurasi inferensi, yang menjelaskan lingkungan yang diperlukan untuk melakukan host model dan layanan web. Untuk informasi selengkapnya tentang membuat konfigurasi inferensi, lihat Cara dan tempat untuk menyebarkan model.

Catatan

Jumlah model yang akan digunakan dibatasi hingga 1.000 model per penyebaran (per kontainer).

BERLAKU UNTUK:SDK Python azureml v1

from azureml.core.webservice import AksWebservice, Webservice
from azureml.core.model import Model
from azureml.core.compute import AksCompute

aks_target = AksCompute(ws,"myaks")
# If deploying to a cluster configured for dev/test, ensure that it was created with enough
# cores and memory to handle this deployment configuration. Note that memory is also used by
# things such as dependencies and AML components.
deployment_config = AksWebservice.deploy_configuration(cpu_cores = 1, memory_gb = 1)
service = Model.deploy(ws, "myservice", [model], inference_config, deployment_config, aks_target)
service.wait_for_deployment(show_output = True)
print(service.state)
print(service.get_logs())

Untuk informasi selengkapnya tentang kelas, metode, dan parameter yang digunakan dalam contoh ini, lihat dokumen referensi berikut:

Penskalaan otomatis

BERLAKU UNTUK:SDK Python azureml v1

Komponen yang menangani penskalaan otomatis untuk penyebaran model Azure Pembelajaran Mesin adalah azureml-fe, yang merupakan router permintaan cerdas. Karena semua permintaan inferensi melaluinya, ia memiliki data yang diperlukan untuk menskalakan model yang disebarkan secara otomatis.

Penting

  • Jangan aktifkan Autoscaler Pod Horizontal Kubernetes (HPA) untuk penyebaran model. Melakukannya menyebabkan dua komponen penskalakan otomatis bersaing satu sama lain. Azureml-fe dirancang untuk menskalakan model skala otomatis yang disebarkan oleh Azure Pembelajaran Mesin, di mana HPA harus menebak atau memperkirakan pemanfaatan model dari metrik generik seperti penggunaan CPU atau konfigurasi metrik kustom.

  • Azureml-fe tidak menskalakan jumlah node dalam klaster AKS, karena ini dapat menyebabkan kenaikan biaya yang tidak terduga. Sebaliknya, ini menskalakan jumlah replika untuk model dalam batas klaster fisik. Jika Anda perlu menskalakan jumlah node dalam klaster, Anda dapat menskalakan klaster secara manual atau mengonfigurasi penskala otomatis kluster AKS.

Penskalaan otomatis dapat dikontrol dengan pengaturan autoscale_target_utilization, autoscale_min_replicas, dan autoscale_max_replicas untuk layanan web AKS. Contoh berikut menunjukkan cara mengaktifkan penskalaan otomatis:

aks_config = AksWebservice.deploy_configuration(autoscale_enabled=True, 
                                                autoscale_target_utilization=30,
                                                autoscale_min_replicas=1,
                                                autoscale_max_replicas=4)

Keputusan untuk meningkatkan atau menurunkan skala didasarkan pada pemanfaatan replika kontainer saat ini. Jumlah replika yang sibuk (memproses permintaan) dibagi dengan jumlah total replika saat ini adalah pemanfaatan saat ini. Jika angka ini melebihi autoscale_target_utilization, maka lebih banyak replika akan dibuat. Apabila lebih rendah, maka replika dikurangi. Secara default, target utilisasi adalah 70%.

Keputusan untuk menambahkan replika sangat bersemangat dan cepat (sekitar 1 detik). Keputusan untuk menghapus replika bersifat konservatif (sekitar 1 menit).

Anda dapat menghitung replika yang diperlukan dengan menggunakan kode berikut:

from math import ceil
# target requests per second
targetRps = 20
# time to process the request (in seconds)
reqTime = 10
# Maximum requests per container
maxReqPerContainer = 1
# target_utilization. 70% in this example
targetUtilization = .7

concurrentRequests = targetRps * reqTime / targetUtilization

# Number of container replicas
replicas = ceil(concurrentRequests / maxReqPerContainer)

Untuk informasi selengkapnya terkait pengaturan autoscale_target_utilization, autoscale_max_replicas, dan autoscale_min_replicas, lihat referensi modul AksWebservice.

Autentikasi layanan web

Saat menyebarkan Azure Kubernetes Service, autentikasi berbasis kunci diaktifkan secara default. Anda juga dapat mengaktifkan autentikasi berbasis token. Autentikasi berbasis token mengharuskan klien menggunakan akun Microsoft Entra untuk meminta token autentikasi, yang digunakan untuk membuat permintaan ke layanan yang disebarkan.

Untuk menonaktifkan autentikasi, atur parameter auth_enabled=False saat membuat konfigurasi penyebaran. Contoh berikut menonaktifkan autentikasi menggunakan SDK:

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, auth_enabled=False)

Untuk informasi tentang mengautentikasi dari aplikasi klien, lihat Menggunakan model Azure Machine Learning yang disebarkan sebagai layanan web.

Autentikasi dengan kunci

Jika otentikasi kunci diaktifkan, Anda dapat menggunakan metode get_keys ini untuk mengambil kunci autentikasi utama dan sekunder:

primary, secondary = service.get_keys()
print(primary)

Penting

Jika Anda perlu meregenerasi kunci, gunakan service.regen_key.

Autentikasi dengan token

Untuk mengaktifkan autentikasi token, atur parameter token_auth_enabled=True saat Anda membuat atau memperbarui penyebaran. Contoh berikut mengaktifkan autentikasi token menggunakan SDK:

deployment_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1, token_auth_enabled=True)

Jika autentikasi token diaktifkan, Anda dapat menggunakan metode get_token untuk mengambil token JWT dan waktu masa habis berlaku token tersebut:

token, refresh_by = service.get_token()
print(token)

Penting

Anda perlu meminta token baru setelah waktu token refresh_by .

Microsoft sangat menyarankan Agar Anda membuat ruang kerja Azure Pembelajaran Mesin di wilayah yang sama dengan kluster AKS Anda. Untuk mengautentikasi dengan token, layanan web melakukan panggilan ke wilayah tempat ruang kerja Azure Pembelajaran Mesin Anda dibuat. Jika wilayah ruang kerja Anda tidak tersedia, maka Anda tidak dapat mengambil token untuk layanan web Anda bahkan, jika kluster Anda berada di wilayah yang berbeda dari ruang kerja Anda. Hal ini secara efektif menyebabkan autentikasi berbasis token tidak tersedia hingga wilayah ruang kerja Anda tersedia lagi. Selain itu, semakin besar jarak antara wilayah kluster Anda dan wilayah ruang kerja Anda, semakin lama waktu yang diperlukan untuk mengambil token.

Untuk mengambil token, Anda harus menggunakan Azure Machine Learning SDK atau perintah az ml service get-access-token.

Pemindaian Kerentanan

Pertahanan Microsoft untuk Cloud menyediakan pengelolaan keamanan terpadu dan perlindungan terhadap ancaman tingkat lanjut di seluruh beban kerja cloud hibrida. Anda harus mengizinkan Pertahanan Microsoft untuk Cloud untuk memindai sumber daya Anda dan mengikuti rekomendasinya. Untuk informasi selengkapnya, lihat Keamanan kontainer di Pertahanan Microsoft untuk kontainer.