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:
- Server HTTP inferensi Azure Pembelajaran Mesin
- Titik akhir lokal
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
Buat direktori bernama server_quickstart untuk menyimpan file Anda:
mkdir server_quickstart cd server_quickstart
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.Pasang paket
azureml-inference-server-http
dari umpan pypi:python -m pip install azureml-inference-server-http
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
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.
Kirim permintaan penilaian ke server dengan menggunakan
curl
utilitas:curl -p 127.0.0.1:5001/score
Server memposting respons berikut:
{"message": "Hello, World!"}
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:
Mulai Visual Studio Code dan buka folder yang berisi skrip (score.py).
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" ] } ] }
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 menjalankansudo apt-get install -y gdb
perintah .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 } ] }
Di jendela perintah, mulai server HTTP inferensi dengan menggunakan
azmlinfsrv --entry_script score.py
perintah .Mulai sesi penelusuran kesalahan di Visual Studio Code:
Pilih Jalankan>Mulai Penelusuran Kesalahan atau gunakan pintasan keyboard F5.
Di jendela perintah, lihat log dari server inferensi dan temukan ID
azmlinfsrv
proses perintah (bukangunicorn
):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.
Klon sampel repositori:
git clone --depth 1 https://github.com/Azure/azureml-examples cd azureml-examples/cli/endpoints/online/model-1/
Buat dan aktifkan lingkungan virtual dengan conda:
Dalam contoh ini,
azureml-inference-server-http
paket diinstal secara otomatis. Paket disertakan sebagai pustaka dependen paketazureml-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
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 HTTP inferensi dengan menentukan skrip penilaian dan file model:
Direktori model yang ditentukan dalam
model_dir
parameter ditentukan dengan menggunakanAZUREML_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.
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:
Pembungkus CLI Python ada di tumpukan jaringan server dan digunakan untuk memulai server.
Klien mengirim permintaan ke server.
Server mengirimkan permintaan melalui server Web Server Gateway Interface (WSGI), yang mengirimkan permintaan ke aplikasi pekerja Flask:
Aplikasi pekerja Flask menangani permintaan, yang mencakup pemuatan skrip entri dan dependensi apa pun.
Skrip entri Anda menerima permintaan. Skrip entri melakukan panggilan inferensi ke model yang dimuat dan mengembalikan respons:
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:
<UTC Time>
: Waktu ketika entri dimasukkan ke dalam log.<pid>
: ID proses yang terkait dengan entri.<level>
: Karakter pertama tingkat pengelogan untuk entri, seperti untuk ERROR,I
untuk INFO, dan sebagainyaE
.<logger name>
: Nama sumber daya yang terkait dengan entri log.<message>
: Isi pesan log.
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.
Kumpulkan informasi tentang paket dan versi yang diinstal untuk lingkungan Python Anda.
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.Jika Anda menentukan Flask atau dependensinya di lingkungan Anda, hapus item ini.
- Paket dependen mencakup
flask
, ,jinja2
itsdangerous
,werkzeug
,markupsafe
, danclick
. flask
terdaftar sebagai dependensi dalam paket server. Pendekatan terbaik adalah mengizinkan server inferensi menginstalflask
paket.- Ketika server inferensi dikonfigurasi untuk mendukung versi flask baru, server secara otomatis menerima pembaruan paket saat tersedia.
- Paket dependen mencakup
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 atauazureml-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 adalah20220708
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
, markupsafe
atau 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.