Bagikan melalui


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. Server disertakan 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 dengan mudah memvalidasi skrip penilaian (entri) Anda di lingkungan pengembangan lokal. Jika ada masalah dengan skrip penilaian, server mengembalikan kesalahan dan lokasi kesalahan.

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 mendukung pengembang yang ingin menggunakan server inferensi untuk men-debug secara lokal dan menjelaskan cara menggunakan server inferensi dengan titik akhir online di Windows.

Prasyarat

Untuk menggunakan server HTTP inferensi Azure Pembelajaran Mesin untuk penelusuran kesalahan lokal, konfigurasi Anda harus menyertakan komponen berikut:

  • Python 3.8 atau yang lebih baru
  • Anaconda

Server HTTP inferensi Azure Pembelajaran Mesin berjalan pada sistem operasi berbasis Windows dan Linux.

Menjelajahi opsi penelusuran kesalahan lokal untuk titik akhir online

Dengan men-debug titik akhir secara lokal sebelum menyebarkan ke cloud, Anda dapat menangkap kesalahan dalam kode dan konfigurasi Anda sebelumnya. Untuk men-debug titik akhir secara lokal, Anda memiliki beberapa opsi, termasuk:

Artikel ini menjelaskan cara bekerja dengan server HTTP inferensi Azure Pembelajaran Mesin di Windows.

Tabel berikut ini menyediakan gambaran umum skenario untuk membantu Anda memilih opsi terbaik:

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 Debugger Microsoft Visual Studio Code (VS Code) Ya Ya

Saat menjalankan server HTTP inferensi secara lokal, Anda dapat fokus pada penelusuran kesalahan skrip penilaian Anda tanpa khawatir untuk konfigurasi kontainer penyebaran.

Menginstal paket azureml-inference-server-http

Untuk menginstal azureml-inference-server-http paket, jalankan perintah berikut:

python -m pip install azureml-inference-server-http

Catatan

Untuk menghindari konflik paket, instal server HTTP inferensi di lingkungan virtual. Anda dapat menggunakan pip install virtualenv perintah untuk mengaktifkan lingkungan virtual untuk konfigurasi Anda.

Men-debug skrip penilaian Anda secara lokal

Untuk men-debug skrip penilaian Anda secara lokal, Anda memiliki beberapa opsi untuk menguji perilaku server:

  • Coba skrip penilaian dummy.
  • Gunakan Visual Studio Code untuk men-debug dengan paket azureml-inference-server-http .
  • Jalankan skrip penilaian aktual, file model, dan file lingkungan dari contoh repositori kami.

Menguji perilaku server dengan skrip penilaian dummy

  1. Buat direktori bernama server_quickstart untuk menyimpan file Anda:

    mkdir server_quickstart
    cd server_quickstart
    
  2. Untuk menghindari konflik paket, buat lingkungan virtual, seperti myenv, dan aktifkan:

    python -m virtualenv myenv
    

    Catatan

    Di Linux, jalankan source myenv/bin/activate perintah untuk mengaktifkan lingkungan virtual.

    Setelah menguji server, Anda dapat menjalankan deactivate perintah untuk menonaktifkan lingkungan virtual Python.

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

    python -m pip install azureml-inference-server-http
    
  4. Buat skrip entri Anda. Contoh berikut membuat skrip entri dasar dan menyimpannya ke file bernama score.py:

    echo -e "import time def init(): \n\t time.sleep(1) \n\n def run(input_data): \n\t return {"message":"Hello, World!"}" > score.py
    
  5. Mulai server dengan azmlinfsrv perintah dan atur file score.py sebagai skrip entri:

    azmlinfsrv --entry_script score.py
    

    Catatan

    Server dihosting di 0.0.0.0, yang berarti mendengarkan semua alamat IP komputer hosting.

  6. Kirim permintaan penilaian ke server dengan menggunakan curl utilitas:

    curl -p 127.0.0.1:5001/score
    

    Server memposting respons berikut:

    {"message": "Hello, World!"}
    
  7. Setelah pengujian, pilih Ctrl + C untuk mengakhiri server.

Sekarang Anda dapat mengubah file skrip penilaian (score.py) dan menguji perubahan Anda dengan menjalankan server lagi dengan azmlinfsrv --entry_script score.py perintah .

Integrasikan dengan Visual Studio Code

Untuk menggunakan Visual Studio Code dan Ekstensi Python untuk penelusuran kesalahan dengan paket azureml-inference-server-http , Anda dapat menggunakan mode Luncurkan dan Lampirkan.

  • Untuk mode Peluncuran, siapkan file 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 file 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 dengan memilih Jalankan>Mulai Penelusuran Kesalahan atau gunakan pintasan keyboard F5.

  • Untuk mode Lampirkan, mulai server HTTP inferensi Azure Pembelajaran Mesin di jendela perintah, dan gunakan Visual Studio Code dengan Ekstensi Python untuk melampirkan ke proses:

    Catatan

    Untuk Linux, pertama-tama gdb instal paket dengan menjalankan sudo apt-get install -y gdb perintah .

    1. Tambahkan konfigurasi berikut ke file 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. Di jendela perintah, mulai server HTTP inferensi dengan menggunakan azmlinfsrv --entry_script score.py perintah .

    3. Mulai sesi penelusuran kesalahan di Visual Studio Code:

      1. Pilih Jalankan>Mulai Penelusuran Kesalahan atau gunakan pintasan keyboard F5.

      2. Di jendela perintah, lihat log dari server inferensi dan temukan ID azmlinfsrv proses perintah (bukan gunicorn):

        Cuplikan layar yang memperlihatkan jendela perintah yang menampilkan log dari server HTTP inferensi dan ID proses perintah azmlinfsrv disorot.

      3. Di Debugger Visual Studio Code, masukkan ID azmlinfsrv proses perintah.

        Jika Anda tidak melihat pemilih proses Visual Studio Code, Anda dapat memasukkan ID proses secara manual di bidang file launch.json untuk ruang kerja tersebut.processId

Untuk kedua mode, Anda dapat mengatur titik henti dan men-debug skrip langkah demi langkah.

Menggunakan contoh end-to-end

Prosedur berikut menjalankan server secara lokal dengan file sampel (skrip penilaian, file model, dan lingkungan) dari repositori contoh Azure Pembelajaran Mesin. Untuk contoh selengkapnya tentang cara menggunakan file sampel ini, lihat Menyebarkan dan menilai model pembelajaran mesin dengan menggunakan titik akhir online.

  1. Klon sampel repositori:

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli/endpoints/online/model-1/
    
  2. Buat dan aktifkan lingkungan virtual dengan conda:

    Dalam contoh ini, azureml-inference-server-http paket diinstal secara otomatis. Paket disertakan sebagai pustaka dependen paket azureml-defaults dalam file conda.yml :

    # 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 HTTP inferensi dengan menentukan skrip penilaian dan file model:

    Direktori model yang ditentukan dalam model_dir parameter ditentukan dengan menggunakan AZUREML_MODEL_DIR variabel dan diambil dalam skrip penilaian.

    Dalam hal ini, Anda menentukan direktori saat ini ./ karena subdirektori ditentukan dalam skrip penilaian sebagai model/sklearn_regression_model.pkl.

    azmlinfsrv --entry_script ./onlinescoring/score.py --model_dir ./
    

    Ketika server diluncurkan dan berhasil memanggil skrip penilaian, contoh log startup terbuka. Jika tidak, log akan menampilkan pesan kesalahan.

  5. Uji skrip penilaian dengan data sampel:

    Buka jendela perintah lain dan ubah ke direktori kerja yang sama tempat Anda menjalankan perintah.

    curl Gunakan utilitas 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
    

    Ketika tidak ada masalah dalam skrip penilaian Anda, skrip mengembalikan hasil penilaian. Jika masalah terjadi, Anda dapat mencoba memperbarui skrip penilaian, dan meluncurkan server lagi untuk menguji skrip yang diperbarui.

Meninjau rute server

Server HTTP inferensi mendengarkan port 5001 secara default di rute berikut:

Nama Rute
Pemeriksaan Keaktifan 127.0.0.1:5001/
Skor 127.0.0.1:5001/score
OpenAPI (swagger) 127.0.0.1:5001/swagger.json

Meninjau parameter server

Server HTTP inferensi menerima parameter berikut:

Parameter Wajib Default Deskripsi
entry_script Benar T/A Mengidentifikasi jalur relatif atau absolut ke skrip penilaian.
model_dir Salah T/A Mengidentifikasi jalur relatif atau absolut ke direktori yang menyimpan model yang digunakan untuk inferensi.
port Salah 5001 Menentukan port penyajian server.
worker_count Salah 1 Menyediakan jumlah utas pekerja untuk memproses permintaan bersamaan.
appinsights_instrumentation_key Salah T/A Menyediakan kunci instrumentasi ke wawasan aplikasi tempat log diterbitkan.
access_control_allow_origins Salah T/A Mengaktifkan CORS untuk asal yang ditentukan, di mana beberapa asal dipisahkan oleh koma (,), seperti microsoft.com, bing.com.

Menjelajahi pemrosesan permintaan server

Langkah-langkah berikut menunjukkan 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. Server mengirimkan permintaan melalui server Web Server Gateway Interface (WSGI), yang mengirimkan permintaan ke aplikasi pekerja Flask:

  4. Aplikasi pekerja Flask menangani permintaan, yang mencakup pemuatan skrip entri dan dependensi apa pun.

  5. Skrip entri Anda menerima permintaan. Skrip entri melakukan panggilan inferensi ke model yang dimuat dan mengembalikan respons:

Diagram yang memperlihatkan bagaimana server HTTP inferensi memproses permintaan masuk.

Menjelajahi log server

Ada dua cara untuk mendapatkan data log untuk pengujian server HTTP inferensi:

  • Jalankan azureml-inference-server-http paket secara lokal dan lihat output log.
  • Gunakan titik akhir online dan lihat log kontainer. Log untuk server inferensi diberi nama Azure Pembelajaran Mesin Inferensi versi> server <HTTP.

Catatan

Format pengelogan telah berubah sejak versi 0.8.0. Jika log Anda menggunakan gaya yang berbeda dari yang diharapkan, perbarui azureml-inference-server-http paket ke versi terbaru.

Menampilkan log startup

Saat server dimulai, log menunjukkan pengaturan server awal 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 dengan mengikuti contoh end-to-end, log ditampilkan sebagai berikut:

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.

Memahami format data log

Semua log dari server HTTP inferensi, kecuali untuk skrip peluncur, menyajikan data dalam format berikut:

<UTC Time> | <level> [<pid>] <logger name> - <message>

Entri terdiri dari komponen-komponen berikut:

Ada enam tingkat pengelogan di Python dengan nilai numerik yang ditetapkan sesuai dengan tingkat keparahan:

Tingkat pengelogan Nilai numerik
KRITIS 50
KESALAHAN 40
PERINGATAN 30
INFO 20
DEBUG 10
NOTSET 0

Memecahkan masalah server

Bagian berikut ini menyediakan tips pemecahan masalah dasar untuk server HTTP inferensi Azure Pembelajaran Mesin. Untuk memecahkan masalah titik akhir online, lihat Memecahkan masalah penyebaran titik akhir online.

Periksa paket yang terinstal

Ikuti langkah-langkah ini untuk mengatasi masalah dengan paket yang diinstal.

  1. Kumpulkan informasi tentang paket dan versi yang diinstal untuk lingkungan Python Anda.

  2. Konfirmasikan bahwa azureml-inference-server-http versi paket Python yang ditentukan dalam file lingkungan cocok dengan versi server HTTP inferensi Azure Pembelajaran Mesin yang ditampilkan di log startup.

    Dalam beberapa kasus, pemecah masalah dependensi pip menginstal versi paket yang tidak terduga. Anda mungkin perlu menjalankan pip untuk memperbaiki paket dan versi yang diinstal.

  3. Jika Anda menentukan Flask atau dependensinya di lingkungan Anda, hapus item ini.

    • Paket dependen mencakup flask, , jinja2itsdangerous, werkzeug, markupsafe, dan click.
    • flask terdaftar sebagai dependensi dalam paket server. Pendekatan terbaik adalah mengizinkan server inferensi menginstal flask paket.
    • Ketika server inferensi dikonfigurasi untuk mendukung versi flask baru, server secara otomatis menerima pembaruan paket saat tersedia.

Periksa versi server

Paket azureml-inference-server-http server diterbitkan ke PyPI. Halaman PyPI mencantumkan changelog dan semua versi sebelumnya.

Jika Anda menggunakan versi paket yang lebih lama, perbarui konfigurasi Anda ke versi terbaru. Tabel berikut ini meringkas versi stabil, masalah umum, dan penyesuaian yang direkomendasikan:

Versi paket Deskripsi Masalah Resolusi
0.4.x Dibundel dalam gambar pelatihan tertanggal 20220601 atau lebih lama dan azureml-defaults versi .1.34 paket melalui 1.43. Versi stabil terbaru adalah 0.4.13. Untuk versi server yang lebih lama dari 0.4.11, Anda mungkin mengalami masalah dependensi Flask, seperti "can't import name Markup from jinja2". Tingkatkan ke versi 0.4.13 atau 0.8.x, versi terbaru, jika memungkinkan.
0.6.x Telah diinstal sebelumnya dalam gambar inferensi yang tertanggal 20220516 dan sebelumnya. Versi stabil terbaru adalah 0.6.1. T/A T/A
0.7.x Mendukung Flask 2. Versi stabil terbaru adalah 0.7.7. T/A T/A
0.8.x Format log berubah. Dukungan Python 3.6 berakhir. T/A T/A

Periksa dependensi paket

Paket dependen yang paling relevan untuk azureml-inference-server-http paket server meliputi:

  • flask
  • opencensus-ext-azure
  • inference-schema

Jika Anda menentukan azureml-defaults paket di lingkungan Python Anda, azureml-inference-server-http paket tersebut adalah paket dependen. Dependensi diinstal secara otomatis.

Tip

Jika Anda menggunakan Python SDK v1 dan tidak secara eksplisit menentukan azureml-defaults paket di lingkungan Python Anda, SDK mungkin secara otomatis menambahkan paket. Namun, versi packager dikunci relatif terhadap versi SDK. Misalnya, jika versi SDK adalah 1.38.0, maka azureml-defaults==1.38.0 entri ditambahkan ke persyaratan pip lingkungan.

TypeError selama startup server

Anda mungkin mengalami hal berikut TypeError 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

Kesalahan ini terjadi ketika Anda menginstal Flask 2 di lingkungan Python Anda, tetapi versi paket Anda azureml-inference-server-http tidak mendukung Flask 2. Dukungan untuk Flask 2 tersedia dalam azureml-inference-server-http paket versi 0.7.0 dan yang lebih baru, dan azureml-defaults paket versi 1.44 dan yang lebih baru.

  • Jika Anda tidak menggunakan paket Flask 2 dalam gambar Azure Pembelajaran Mesin Docker, gunakan versi azureml-inference-server-http terbaru paket atau azureml-defaults .

  • Jika Anda menggunakan paket Flask 2 dalam gambar Azure Pembelajaran Mesin Docker, konfirmasikan bahwa versi build gambar adalah Juli 2022 atau yang lebih baru.

    Anda dapat menemukan versi gambar di log kontainer. Contohnya:

    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, Materialization 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 Materialization Build notasi. Dalam contoh sebelumnya, versi gambar adalah 20220708 atau 8 Juli 2022. Gambar dalam contoh ini kompatibel dengan Flask 2.

    Jika Anda tidak melihat pesan serupa di log kontainer, gambar Anda sudah kedaluarsa dan harus diperbarui. Jika Anda menggunakan gambar Compute Unified Device Architecture (CUDA), dan Anda tidak dapat menemukan gambar yang lebih baru, periksa apakah gambar Anda tidak digunakan lagi di AzureML-Containers. Anda dapat menemukan pengganti yang ditunjuk untuk gambar yang tidak digunakan lagi.

    Jika Anda menggunakan server dengan titik akhir online, Anda juga dapat menemukan log di halaman Log di Titik Akhir di studio Azure Pembelajaran Mesin.

Jika Anda menyebarkan dengan SDK v1, dan tidak secara eksplisit menentukan gambar dalam konfigurasi penyebaran Anda, server menerapkan openmpi4.1.0-ubuntu20.04 paket dengan versi yang cocok dengan toolset SDK lokal Anda. Namun, versi yang diinstal mungkin bukan versi gambar terbaru yang tersedia.

Untuk SDK versi 1.43, server menginstal openmpi4.1.0-ubuntu20.04:20220616 versi paket secara default, tetapi versi paket ini tidak kompatibel dengan SDK 1.43. Pastikan Anda menggunakan SDK terbaru untuk penyebaran Anda.

Jika Anda tidak dapat memperbarui gambar, Anda dapat menghindari masalah untuk sementara waktu dengan menyematkan azureml-defaults==1.43 entri atau azureml-inference-server-http~=0.4.13 dalam file lingkungan Anda. Entri ini mengarahkan server untuk menginstal versi lama dengan flask 1.0.x.

ImportError atau ModuleNotFoundError selama startup server

Anda mungkin menemukan ImportError atau ModuleNotFoundError pada modul tertentu, seperti opencensus, , jinja2, markupsafeatau click, selama startup server. Contoh berikut menunjukkan pesan kesalahan:

ImportError: cannot import name 'Markup' from 'jinja2'

Kesalahan impor dan modul terjadi saat Anda menggunakan versi 0.4.10 atau versi server yang lebih lama yang tidak menyematkan dependensi Flask ke versi yang kompatibel. Untuk mencegah masalah, instal versi server yang lebih baru.