Men-debug skrip penilaian dengan server HTTP inferensi Azure Pembelajaran Mesin
Server HTTP inferensi Azure Pembelajaran Mesin adalah paket Python yang mengekspos fungsi penilaian Anda sebagai titik akhir HTTP dan membungkus kode server Flask dan dependensi ke dalam paket tunggal. Ini termasuk dalam gambar Docker bawaan untuk inferensi yang digunakan saat menyebarkan model dengan Azure Pembelajaran Mesin. Dengan menggunakan paket saja, Anda dapat menyebarkan model secara lokal untuk produksi, dan Anda juga dapat dengan mudah memvalidasi skrip penilaian (entri) Anda di lingkungan pengembangan lokal. Jika ada masalah dengan skrip penilaian, server akan mengembalikan kesalahan dan lokasi di mana kesalahan terjadi.
Server juga dapat digunakan untuk membuat gerbang validasi dalam alur integrasi dan penyebaran berkelanjutan. Misalnya, Anda dapat memulai server dengan skrip kandidat dan menjalankan rangkaian pengujian terhadap titik akhir lokal.
Artikel ini terutama menargetkan pengguna yang ingin menggunakan server inferensi untuk men-debug secara lokal, tetapi juga akan membantu Anda memahami cara menggunakan server inferensi dengan titik akhir online.
Penelusuran kesalahan lokal titik akhir online
Telusuri kesalahan titik akhir secara lokal sebelum menyebarkannya ke cloud dapat membantu Anda mendeteksi kesalahan dalam kode dan konfigurasi lebih awal. Untuk men-debug titik akhir secara lokal, Anda dapat menggunakan:
- server HTTP inferensi Azure Pembelajaran Mesin
- titik akhir lokal
Artikel ini berfokus pada server HTTP inferensi Azure Pembelajaran Mesin.
Tabel berikut memberikan gambaran umum skenario untuk membantu Anda memilih yang terbaik untuk Anda.
Skenario | Server HTTP Inferensi | Titik akhir lokal |
---|---|---|
Memperbarui lingkungan Python lokal tanpa pembangunan ulang gambar Docker | Ya | Tidak |
Perbarui skrip penilaian | Ya | Ya |
Perbarui konfigurasi penyebaran (penyebaran, lingkungan, kode, model) | Tidak | Ya |
Mengintegrasikan Vs Code Debugger | Ya | Ya |
Dengan menjalankan server HTTP inferensi secara lokal, Anda dapat fokus pada penelusuran kesalahan skrip penilaian Anda tanpa terpengaruh oleh konfigurasi kontainer penyebaran.
Prasyarat
- Memerlukan: Python >=3.8
- Anaconda
Tip
Server HTTP inferensi Azure Pembelajaran Mesin berjalan pada sistem operasi berbasis Windows dan Linux.
Penginstalan
Catatan
Untuk menghindari konflik paket, pasang server di lingkungan virtual.
Untuk memasang azureml-inference-server-http package
, jalankan perintah berikut di cmd/terminal Anda:
python -m pip install azureml-inference-server-http
Men-debug skrip penilaian Anda secara lokal
Untuk men-debug skrip penilaian Anda secara lokal, Anda dapat menguji perilaku server dengan skrip penilaian dummy, menggunakan Visual Studio Code untuk men-debug dengan paket azureml-inference-server-http, atau menguji server dengan skrip penilaian aktual, file model, dan file lingkungan dari contoh repositori kami.
Menguji perilaku server dengan skrip penilaian dummy
Buat direktori untuk menyimpan file Anda:
mkdir server_quickstart cd server_quickstart
Untuk menghindari konflik paket, buat lingkungan virtual dan aktifkan:
python -m venv myenv source myenv/bin/activate
Tip
Setelah pengujian, jalankan
deactivate
untuk menonaktifkan lingkungan virtual Python.Pasang paket
azureml-inference-server-http
dari umpan pypi:python -m pip install azureml-inference-server-http
Siapkan skrip entri Anda (
score.py
). Contoh berikut membuat skrip entri dasar:echo ' import time def init(): time.sleep(1) def run(input_data): return {"message":"Hello, World!"} ' > score.py
Mulai server (azmlinfsrv) dan atur
score.py
sebagai skrip entri:azmlinfsrv --entry_script score.py
Catatan
Server dihost di 0.0.0.0, yang berarti akan mendengarkan semua alamat IP komputer hosting.
Kirim permintaan penilaian ke server menggunakan
curl
:curl -p 127.0.0.1:5001/score
Server akan merespons seperti ini.
{"message": "Hello, World!"}
Setelah pengujian, Anda dapat menekan Ctrl + C
untuk mengakhiri server.
Sekarang Anda dapat mengubah skrip penilaian (score.py
) dan menguji perubahan Anda dengan menjalankan server lagi (azmlinfsrv --entry_script score.py
).
Cara mengintegrasikan dengan Visual Studio Code
Ada dua cara untuk menggunakan Visual Studio Code (VISUAL Code) dan Ekstensi Python untuk men-debug dengan paket azureml-inference-server-http (mode Luncurkan dan Lampirkan).
Mode peluncuran: siapkan
launch.json
di Visual Studio Code dan mulai server HTTP inferensi Azure Pembelajaran Mesin dalam Visual Studio Code.Mulai Visual Studio Code dan buka folder yang berisi skrip (
score.py
).Tambahkan konfigurasi berikut ke
launch.json
untuk ruang kerja tersebut di Visual Studio Code:launch.json
{ "version": "0.2.0", "configurations": [ { "name": "Debug score.py", "type": "python", "request": "launch", "module": "azureml_inference_server_http.amlserver", "args": [ "--entry_script", "score.py" ] } ] }
Mulai sesi penelusuran kesalahan di Visual Studio Code. Pilih "Jalankan" -> "Mulai Penelusuran Kesalahan" (atau
F5
).
Mode lampirkan: mulai server HTTP inferensi Azure Pembelajaran Mesin di baris perintah dan gunakan Visual Studio Code + Python Extension untuk melampirkan ke proses.
Catatan
Jika Anda menggunakan lingkungan Linux, pertama-tama
gdb
instal paket dengan menjalankansudo apt-get install -y gdb
.Tambahkan konfigurasi berikut ke
launch.json
untuk ruang kerja tersebut di Visual Studio Code:launch.json
{ "version": "0.2.0", "configurations": [ { "name": "Python: Attach using Process Id", "type": "python", "request": "attach", "processId": "${command:pickProcess}", "justMyCode": true }, ] }
Mulai server inferensi menggunakan CLI (
azmlinfsrv --entry_script score.py
).Mulai sesi penelusuran kesalahan di Visual Studio Code.
- Di Visual Studio Code, pilih "Jalankan" -> "Mulai Penelusuran Kesalahan" (atau
F5
). - Masukkan ID
azmlinfsrv
proses (bukangunicorn
) menggunakan log (dari server inferensi) yang ditampilkan di CLI.
Catatan
Jika pemilih proses tidak ditampilkan, masukkan ID proses secara manual di
processId
bidanglaunch.json
.- Di Visual Studio Code, pilih "Jalankan" -> "Mulai Penelusuran Kesalahan" (atau
Dengan kedua cara ini, Anda dapat mengatur titik henti dan debug langkah demi langkah.
Contoh ujung-ke-ujung
Di bagian ini, kita akan menjalankan server secara lokal dengan file sampel (skrip penilaian, file model, dan lingkungan) di repositori contoh kami. File sampel juga digunakan dalam artikel kami untuk Menyebarkan dan menilai model pembelajaran mesin dengan menggunakan titik akhir online
Kloning repositori sampel.
git clone --depth 1 https://github.com/Azure/azureml-examples cd azureml-examples/cli/endpoints/online/model-1/
Membuat dan mengaktifkan lingkungan virtual dengan conda. Dalam contoh ini,
azureml-inference-server-http
paket secara otomatis diinstal karena disertakan sebagai pustaka dependen paketazureml-defaults
sebagaiconda.yml
berikut.# Create the environment from the YAML file conda env create --name model-env -f ./environment/conda.yml # Activate the new environment conda activate model-env
Tinjau skrip penilaian Anda.
onlinescoring/score.py
import os import logging import json import numpy import joblib def init(): """ This function is called when the container is initialized/started, typically after create/update of the deployment. You can write the logic here to perform init operations like caching the model in memory """ global model # AZUREML_MODEL_DIR is an environment variable created during deployment. # It is the path to the model folder (./azureml-models/$MODEL_NAME/$VERSION) # Please provide your model's folder name if there is one model_path = os.path.join( os.getenv("AZUREML_MODEL_DIR"), "model/sklearn_regression_model.pkl" ) # deserialize the model file back into a sklearn model model = joblib.load(model_path) logging.info("Init complete") def run(raw_data): """ This function is called for every invocation of the endpoint to perform the actual scoring/prediction. In the example we extract the data from the json input and call the scikit-learn model's predict() method and return the result back """ logging.info("model 1: request received") data = json.loads(raw_data)["data"] data = numpy.array(data) result = model.predict(data) logging.info("Request processed") return result.tolist()
Jalankan server inferensi dengan menentukan skrip penilaian dan file model. Direktori model yang ditentukan (
model_dir
parameter) akan didefinisikan sebagaiAZUREML_MODEL_DIR
variabel dan diambil dalam skrip penilaian. Dalam hal ini, kami menentukan direktori saat ini (./
) karena subdirektori ditentukan dalam skrip penilaian sebagaimodel/sklearn_regression_model.pkl
.azmlinfsrv --entry_script ./onlinescoring/score.py --model_dir ./
Contoh log startup akan ditampilkan jika server diluncurkan dan skrip penilaian berhasil dipanggil. Jika tidak, akan ada pesan kesalahan dalam log.
Uji skrip penilaian dengan data sampel. Buka terminal lain dan pindah ke direktori kerja yang sama untuk menjalankan perintah.
curl
Gunakan perintah untuk mengirim contoh permintaan ke server dan menerima hasil penilaian.curl --request POST "127.0.0.1:5001/score" --header "Content-Type:application/json" --data @sample-request.json
Hasil penilaian akan dikembalikan jika tidak ada masalah dalam skrip penilaian Anda. Jika menemukan sesuatu yang salah, Anda dapat mencoba memperbarui skrip penilaian, dan meluncurkan server lagi untuk menguji skrip yang diperbarui.
Rute Server
Server mendengarkan port 5001 (sebagai default) di rute ini.
Nama | Rute |
---|---|
Pemeriksaan Keaktifan | 127.0.0.1:5001/ |
Skor | 127.0.0.1:5001/skor |
OpenAPI (swagger) | 127.0.0.1:5001/swagger.json |
Parameter server
Tabel berikut berisi parameter yang diterima oleh server:
Parameter | Diperlukan | Default | Deskripsi |
---|---|---|---|
entry_script | Benar | T/A | Jalur relatif atau absolut ke skrip penilaian. |
model_dir | Salah | T/A | Jalur relatif atau absolut ke direktori yang mempertahankan model yang digunakan untuk inferensi. |
pelabuhan | Salah | 5001 | Port penyajian server. |
worker_count | Salah | 1 | Jumlah alur pekerja yang akan memproses permintaan bersamaan. |
appinsights_instrumentation_key | Salah | T/A | Kunci instrumentasi untuk wawasan aplikasi tempat log akan dipublikasikan. |
access_control_allow_origins | Salah | T/A | Aktifkan CORS untuk asal yang ditentukan. Pisahkan beberapa asal dengan ",". Contoh: "microsoft.com, bing.com" |
Aliran permintaan
Langkah-langkah berikut menjelaskan bagaimana server HTTP inferensi Azure Pembelajaran Mesin (azmlinfsrv) menangani permintaan masuk:
- Pembungkus CLI Python ada di tumpukan jaringan server dan digunakan untuk memulai server.
- Klien mengirim permintaan ke server.
- Saat diterima, permintaan akan melalui server WSGI dan kemudian dikirim ke salah satu pekerja.
- Permintaan kemudian ditangani oleh aplikasi Flask, yang memuat skrip entri dan semua dependensi.
- Akhirnya, permintaan dikirim ke skrip entri Anda. Skrip entri kemudian melakukan panggilan inferensi ke model yang dimuat dan menampilkan respons.
Memahami log
Di sini kami menjelaskan log server HTTP inferensi Azure Pembelajaran Mesin. Anda bisa mendapatkan log saat menjalankan azureml-inference-server-http
secara lokal, atau mendapatkan log kontainer jika Anda menggunakan titik akhir online.
Catatan
Format pengelogan telah berubah sejak versi 0.8.0. Jika Anda menemukan log dalam gaya yang berbeda, perbarui azureml-inference-server-http
paket ke versi terbaru.
Tip
Jika Anda menggunakan titik akhir online, log dari server inferensi dimulai dengan Azure Machine Learning Inferencing HTTP server <version>
.
Log startup
Ketika server dimulai, pengaturan server pertama kali ditampilkan oleh log sebagai berikut:
Azure Machine Learning Inferencing HTTP server <version>
Server Settings
---------------
Entry Script Name: <entry_script>
Model Directory: <model_dir>
Worker Count: <worker_count>
Worker Timeout (seconds): None
Server Port: <port>
Application Insights Enabled: false
Application Insights Key: <appinsights_instrumentation_key>
Inferencing HTTP server version: azmlinfsrv/<version>
CORS for the specified origins: <access_control_allow_origins>
Server Routes
---------------
Liveness Probe: GET 127.0.0.1:<port>/
Score: POST 127.0.0.1:<port>/score
<logs>
Misalnya, saat Anda meluncurkan server mengikuti contoh end-to-end:
Azure Machine Learning Inferencing HTTP server v0.8.0
Server Settings
---------------
Entry Script Name: /home/user-name/azureml-examples/cli/endpoints/online/model-1/onlinescoring/score.py
Model Directory: ./
Worker Count: 1
Worker Timeout (seconds): None
Server Port: 5001
Application Insights Enabled: false
Application Insights Key: None
Inferencing HTTP server version: azmlinfsrv/0.8.0
CORS for the specified origins: None
Server Routes
---------------
Liveness Probe: GET 127.0.0.1:5001/
Score: POST 127.0.0.1:5001/score
2022-12-24 07:37:53,318 I [32726] gunicorn.error - Starting gunicorn 20.1.0
2022-12-24 07:37:53,319 I [32726] gunicorn.error - Listening at: http://0.0.0.0:5001 (32726)
2022-12-24 07:37:53,319 I [32726] gunicorn.error - Using worker: sync
2022-12-24 07:37:53,322 I [32756] gunicorn.error - Booting worker with pid: 32756
Initializing logger
2022-12-24 07:37:53,779 I [32756] azmlinfsrv - Starting up app insights client
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - Found user script at /home/user-name/azureml-examples/cli/endpoints/online/model-1/onlinescoring/score.py
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - run() is not decorated. Server will invoke it with the input in JSON string.
2022-12-24 07:37:54,518 I [32756] azmlinfsrv.user_script - Invoking user's init function
2022-12-24 07:37:55,974 I [32756] azmlinfsrv.user_script - Users's init has completed successfully
2022-12-24 07:37:55,976 I [32756] azmlinfsrv.swagger - Swaggers are prepared for the following versions: [2, 3, 3.1].
2022-12-24 07:37:55,977 I [32756] azmlinfsrv - AML_FLASK_ONE_COMPATIBILITY is set, but patching is not necessary.
Format Log
Log dari server inferensi dihasilkan dalam format berikut, kecuali untuk skrip peluncur karena mereka bukan bagian dari paket python:
<UTC Time> | <level> [<pid>] <logger name> - <message>
Berikut <pid>
adalah ID proses dan <level>
merupakan karakter pertama dari tingkat pengelogan - E untuk KESALAHAN, saya untuk INFO, dll.
Ada enam tingkat pengelogan di Python, dengan angka yang terkait dengan tingkat keparahan:
Tingkat pengelogan | Nilai numerik |
---|---|
KRITIS | 50 |
KESALAHAN | 40 |
PERINGATAN | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
Panduan pemecahan masalah
Di bagian ini, kami akan memberikan tips pemecahan masalah dasar untuk server HTTP inferensi Azure Pembelajaran Mesin. Jika Anda ingin memecahkan masalah titik akhir online, lihat juga Pemecahan masalah penyebaran titik akhir online
Langkah-langkah dasar
Langkah-langkah dasar untuk pemecahan masalah adalah:
- Kumpulkan informasi versi untuk lingkungan Python Anda.
- Pastikan versi paket python azureml-inference-server-http yang ditentukan dalam file lingkungan cocok dengan versi server HTTP Inferensi AzureML yang ditampilkan di log startup. Terkadang pemecah masalah dependensi pip mengarah ke versi paket yang tidak terduga yang diinstal.
- Jika Anda menentukan Flask (dan atau dependensinya) di lingkungan Anda, hapus. Dependensi termasuk
Flask
, ,Jinja2
,itsdangerous
,Werkzeug
,MarkupSafe
, danclick
. Flask terdaftar sebagai dependensi dalam paket server dan yang terbaik adalah membiarkan server kami menginstalnya. Dengan cara ini ketika server mendukung versi flask baru, Anda akan mendapatkannya secara otomatis.
Versi server
Paket azureml-inference-server-http
server diterbitkan ke PyPI. Anda dapat menemukan changelog kami dan semua versi sebelumnya di halaman PyPI kami. Perbarui ke versi terbaru jika Anda menggunakan versi yang lebih lama.
- 0.4.x: Versi yang dibundel dalam gambar pelatihan ≤
20220601
dan diazureml-defaults>=1.34,<=1.43
.0.4.13
adalah versi stabil terakhir. Jika Anda menggunakan server sebelum versi0.4.11
, Anda mungkin melihat masalah dependensi Flask seperti tidak dapat mengimpor namaMarkup
darijinja2
. Anda disarankan untuk meningkatkan ke0.4.13
atau0.8.x
(versi terbaru), jika memungkinkan. - 0.6.x: Versi yang telah diinstal sebelumnya dalam menyimpulkan gambar ≤ 20220516. Versi stabil terbaru adalah
0.6.1
. - 0.7.x: Versi pertama yang mendukung Flask 2. Versi stabil terbaru adalah
0.7.7
. - 0.8.x: Format log telah berubah dan dukungan Python 3.6 telah turun.
Dependensi paket
Paket yang paling relevan untuk server azureml-inference-server-http
adalah paket berikut:
- Labu
- opencensus-ext-azure
- inferensi-skema
Jika Anda menentukan azureml-defaults
di lingkungan Python, azureml-inference-server-http
paket bergantung pada, dan akan diinstal secara otomatis.
Tip
Jika Anda menggunakan Python SDK v1 dan tidak secara eksplisit menentukan azureml-defaults
di lingkungan Python Anda, SDK dapat menambahkan paket untuk Anda. Namun, SDK akan menguncinya ke versi yang diaktifkan SDK. Misalnya, jika versi SDK adalah 1.38.0
, versi tersebut akan ditambahkan azureml-defaults==1.38.0
ke persyaratan pip lingkungan.
Tanya jawab umum
1.Saya mengalami kesalahan berikut selama startup server:
TypeError: register() takes 3 positional arguments but 4 were given
File "/var/azureml-server/aml_blueprint.py", line 251, in register
super(AMLBlueprint, self).register(app, options, first_registration)
TypeError: register() takes 3 positional arguments but 4 were given
Anda telah menginstal Flask 2 di lingkungan python tetapi menjalankan versi azureml-inference-server-http
yang tidak mendukung Flask 2. Dukungan untuk Flask 2 ditambahkan di azureml-inference-server-http>=0.7.0
, yang juga ada di azureml-defaults>=1.44
.
Jika Anda tidak menggunakan paket ini dalam gambar docker AzureML, gunakan versi terbaru
azureml-inference-server-http
atauazureml-defaults
.Jika Anda menggunakan paket ini dengan gambar docker AzureML, pastikan Anda menggunakan gambar bawaan atau setelah Juli 2022. Versi gambar tersedia di log kontainer. Anda harus dapat menemukan log yang mirip dengan yang berikut ini:
2022-08-22T17:05:02,147738763+00:00 | gunicorn/run | AzureML Container Runtime Information 2022-08-22T17:05:02,161963207+00:00 | gunicorn/run | ############################################### 2022-08-22T17:05:02,168970479+00:00 | gunicorn/run | 2022-08-22T17:05:02,174364834+00:00 | gunicorn/run | 2022-08-22T17:05:02,187280665+00:00 | gunicorn/run | AzureML image information: openmpi4.1.0-ubuntu20.04, Materializaton Build:20220708.v2 2022-08-22T17:05:02,188930082+00:00 | gunicorn/run | 2022-08-22T17:05:02,190557998+00:00 | gunicorn/run |
Tanggal build gambar muncul setelah "Build Materialisasi", yang dalam contoh di atas adalah
20220708
, atau 8 Juli 2022. Gambar ini kompatibel dengan Flask 2. Jika Anda tidak melihat banner seperti ini di log kontainer, gambar Anda sudah kedaluarsa, dan harus diperbarui. Jika Anda menggunakan gambar CUDA, dan tidak dapat menemukan gambar yang lebih baru, periksa apakah gambar Anda tidak digunakan lagi di AzureML-Containers. Jika ya, Anda harus dapat menemukan pengganti.Jika Anda menggunakan server dengan titik akhir online, Anda juga dapat menemukan log di bawah "Log penyebaran" di halaman titik akhir online di studio Azure Pembelajaran Mesin. Jika Anda menyebarkan dengan SDK v1 dan tidak secara eksplisit menentukan gambar dalam konfigurasi penyebaran Anda, defaultnya akan menggunakan versi
openmpi4.1.0-ubuntu20.04
yang cocok dengan perangkat SDK lokal Anda, yang mungkin bukan versi terbaru dari gambar tersebut. Misalnya, SDK 1,43 akan menggunakanopenmpi4.1.0-ubuntu20.04:20220616
secara default, yang tidak kompatibel. Pastikan Anda menggunakan SDK terbaru untuk penyebaran Anda.Jika karena alasan tertentu Anda tidak dapat memperbarui gambar, Anda dapat menghindari masalah untuk sementara dengan menyematkan
azureml-defaults==1.43
atauazureml-inference-server-http~=0.4.13
, yang akan menginstal server versi lama denganFlask 1.0.x
.
2. Saya menemukan ImportError
atau ModuleNotFoundError
pada modul opencensus
, jinja2
, MarkupSafe
, atau click
saat memulai seperti pesan berikut:
ImportError: cannot import name 'Markup' from 'jinja2'
Versi server yang lebih lama (<= 0.4.10) tidak menyematkan dependensi Flask ke versi yang kompatibel. Masalah ini diperbaiki di versi terbaru dari server.
Langkah berikutnya
- Untuk informasi selengkapnya tentang cara membuat skrip entri dan menyebarkan model, lihat Cara menyebarkan model menggunakan Azure Machine Learning.
- Pelajari Mencantumkan citra Docker bawaan untuk inferensi