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:

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

  1. Buat direktori untuk menyimpan file Anda:

    mkdir server_quickstart
    cd server_quickstart
    
  2. 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.

  3. Pasang paket azureml-inference-server-http dari umpan pypi:

    python -m pip install azureml-inference-server-http
    
  4. 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
    
  5. 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.

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

    1. Mulai Visual Studio Code dan buka folder yang berisi skrip (score.py).

    2. 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"
                  ]
              }
          ]
      }
      
    3. 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 menjalankan sudo apt-get install -y gdb.

    1. 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
              },
          ]
      }
      
    2. Mulai server inferensi menggunakan CLI (azmlinfsrv --entry_script score.py).

    3. Mulai sesi penelusuran kesalahan di Visual Studio Code.

      1. Di Visual Studio Code, pilih "Jalankan" -> "Mulai Penelusuran Kesalahan" (atau F5).
      2. Masukkan ID azmlinfsrv proses (bukan gunicorn) menggunakan log (dari server inferensi) yang ditampilkan di CLI. Cuplikan layar CLI yang memperlihatkan ID proses server.

      Catatan

      Jika pemilih proses tidak ditampilkan, masukkan ID proses secara manual di processId bidang launch.json.

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

  1. Kloning repositori sampel.

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli/endpoints/online/model-1/
    
  2. Membuat dan mengaktifkan lingkungan virtual dengan conda. Dalam contoh ini, azureml-inference-server-http paket secara otomatis diinstal karena disertakan sebagai pustaka dependen paket azureml-defaults sebagai conda.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
    
  3. 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()
    
  4. Jalankan server inferensi dengan menentukan skrip penilaian dan file model. Direktori model yang ditentukan (model_dir parameter) akan didefinisikan sebagai AZUREML_MODEL_DIR variabel dan diambil dalam skrip penilaian. Dalam hal ini, kami menentukan direktori saat ini (./) karena subdirektori ditentukan dalam skrip penilaian sebagai model/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.

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

  1. Pembungkus CLI Python ada di tumpukan jaringan server dan digunakan untuk memulai server.
  2. Klien mengirim permintaan ke server.
  3. Saat diterima, permintaan akan melalui server WSGI dan kemudian dikirim ke salah satu pekerja.
  4. Permintaan kemudian ditangani oleh aplikasi Flask, yang memuat skrip entri dan semua dependensi.
  5. Akhirnya, permintaan dikirim ke skrip entri Anda. Skrip entri kemudian melakukan panggilan inferensi ke model yang dimuat dan menampilkan respons.

Diagram proses server HTTP.

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:

  1. Kumpulkan informasi versi untuk lingkungan Python Anda.
  2. 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.
  3. Jika Anda menentukan Flask (dan atau dependensinya) di lingkungan Anda, hapus. Dependensi termasuk Flask, , Jinja2, itsdangerous, Werkzeug, MarkupSafe, dan click. 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 di azureml-defaults>=1.34,<=1.43. 0.4.13 adalah versi stabil terakhir. Jika Anda menggunakan server sebelum versi 0.4.11, Anda mungkin melihat masalah dependensi Flask seperti tidak dapat mengimpor nama Markup dari jinja2. Anda disarankan untuk meningkatkan ke 0.4.13 atau 0.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 atau azureml-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 menggunakan openmpi4.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 atau azureml-inference-server-http~=0.4.13, yang akan menginstal server versi lama dengan Flask 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