Azure Machine Learning 推論 HTTP サーバーは、スコアリング関数を HTTP エンドポイントとして公開し、Flask サーバー コードと依存関係を単一のパッケージにラップしている Python パッケージです。 推論サーバーは、Azure Machine Learning でモデルをデプロイするときに使用される 推論用の事前構築済みの Docker イメージ に含まれています。 パッケージを単独で使用する場合は、運用環境用にモデルをローカルにデプロイできます。 また、ローカル開発環境でスコアリング (エントリ) スクリプトを簡単に検証することもできます。 スコアリング スクリプトに問題がある場合、推論サーバーはエラーとエラーの場所を返します。
また、推論サーバーを使用して、継続的インテグレーションとデプロイ パイプラインに検証ゲートを作成することもできます。 たとえば、候補スクリプトを使用して推論サーバーを起動し、ローカル エンドポイントに対してテスト スイートを実行できます。
この記事では、推論サーバーを使用してローカルでデバッグする開発者をサポートします。 この記事では、オンライン エンドポイントで推論サーバーを使用する方法について説明します。
前提条件
- Python 3.8 以降
- アナコンダ
推論サーバーは、Windows および Linux ベースのオペレーティング システムで実行されます。
オンライン エンドポイント用のローカル デバッグ オプションを調べる
クラウドにデプロイする前にエンドポイントをローカルでデバッグすることで、コードと構成のエラーを早期にキャッチできます。 ローカル環境でのエンドポイントのデバッグには、次のようないくつかのオプションがあります。
- Azure Machine Learning 推論 HTTP サーバー。
- ローカル エンドポイント。
次の表は、各オプションがさまざまなデバッグ シナリオで提供するサポートの概要を示しています。
シナリオ | 推論サーバー | ローカル エンドポイント |
---|---|---|
Docker イメージをリビルドすることなく、ローカルの Python 環境を更新する | はい | いいえ |
スコアリング スクリプトを更新する | はい | はい |
デプロイ構成を更新する (デプロイ、環境、コード、モデル) | いいえ | はい |
Microsoft Visual Studio Code (VS Code) デバッガーを統合する | はい | はい |
この記事では、推論サーバーの使用方法について説明します。
推論サーバーをローカルで実行する場合は、デプロイ コンテナーの構成を気にせずにスコアリング スクリプトのデバッグに集中できます。
スコアリング スクリプトをローカルでデバッグする
スコアリング スクリプトをローカルでデバッグするには、推論サーバーの動作をテストするためのオプションがいくつかあります。
- ダミー スコアリング スクリプトを使用します。
- VS Code を使用して 、azureml-inference-server-http パッケージを使用してデバッグします。
- サンプル リポジトリから実際のスコアリング スクリプト、モデル ファイル、環境ファイルを実行します。
次のセクションでは、各オプションに関する情報を提供します。
ダミー スコアリング スクリプトを使用して推論サーバーの動作をテストする
server_quickstartという名前のディレクトリを作成して、ファイルを保持します。
mkdir server_quickstart cd server_quickstart
パッケージの競合を回避するには、
myenv
などの仮想環境を作成し、アクティブ化します。python -m virtualenv myenv
注
Linux では、
source myenv/bin/activate
コマンドを実行して仮想環境をアクティブにします。推論サーバーをテストした後、
deactivate
コマンドを実行して Python 仮想環境を非アクティブ化できます。Python パッケージ インデックス (PyPI) フィードから
azureml-inference-server-http
パッケージをインストールします。python -m pip install azureml-inference-server-http
エントリ スクリプトを作成します。 次の例では、基本的なエントリ スクリプトを作成し、score.py という名前のファイルに保存します。
echo -e 'import time\ndef init(): \n\ttime.sleep(1) \n\ndef run(input_data): \n\treturn {"message":"Hello, World!"}' > score.py
azmlinfsrv
コマンドを使用して推論サーバーを起動し、score.py ファイルをエントリ スクリプトとして設定します。azmlinfsrv --entry_script score.py
注
推論サーバーは 0.0.0.0 でホストされています。つまり、ホスティング マシンのすべての IP アドレスをリッスンします。
curl
ユーティリティを使用して、スコアリング要求を推論サーバーに送信します。curl -p 127.0.0.1:5001/score
推論サーバーは、次の応答を投稿します。
{"message": "Hello, World!"}
テストが完了したら、 Ctrl+C を選択して推論サーバーを停止します。
score.py スコアリング スクリプト ファイルを変更できます。 その後、 azmlinfsrv --entry_script score.py
コマンドを使用して推論サーバーをもう一度実行することで、変更をテストできます。
VS Code との統合
VS Code では、Azureml-inference-server-http パッケージを使用したデバッグに Python 拡張機能を使用できます。 VS Code には、デバッグ用の 2 つのモード ( 起動とアタッチ) が用意されています。
いずれかのモードを使用する前に、次のコマンドを実行して azureml-inference-server-http
パッケージをインストールします。
python -m pip install azureml-inference-server-http
注
パッケージの競合を回避するには、推論サーバーを仮想環境にインストールします。 pip install virtualenv
コマンドを使用して、構成の仮想環境を有効にすることができます。
起動モード
起動モードの場合は、次の手順に従って VS Code launch.json 構成ファイルを設定し、VS Code 内で推論サーバーを起動します。
VS Code を起動し、score.py スクリプトを含むフォルダーを開きます。
VS Code のそのワークスペースに対して、launch.json ファイルに次の構成を追加します。
{ "version": "0.2.0", "configurations": [ { "name": "Debug score.py", "type": "debugpy", "request": "launch", "module": "azureml_inference_server_http.amlserver", "args": [ "--entry_script", "score.py" ] } ] }
VS Code でデバッグセッションを開始するには、実行>メニューのデバッグの開始を選択するか、F5キーを押します。
アタッチ モード
アタッチ モードの場合は、次の手順を実行して、VS Code と Python 拡張機能を使用して推論サーバー プロセスにアタッチします。
注
Linux の場合は、最初に gdb
コマンドを実行して、sudo apt-get install -y gdb
パッケージをインストールします。
VS Code を起動し、score.py スクリプトを含むフォルダーを開きます。
VS Code のそのワークスペースに対して、launch.json ファイルに次の構成を追加します。
{ "version": "0.2.0", "configurations": [ { "name": "Python: Attach using Process ID", "type": "debugpy", "request": "attach", "processId": "${command:pickProcess}", "justMyCode": true } ] }
コマンド ウィンドウで、
azmlinfsrv --entry_script score.py
コマンドを実行して推論サーバーを起動します。VS Code でデバッグ セッションを開始するには、次の手順を実行します。
起動モードとアタッチ モードでは、 ブレークポイントを 設定し、スクリプトを段階的にデバッグできます。
エンド ツー エンドの例を使用する
次の手順では、Azure Machine Learning サンプル リポジトリの サンプル ファイル を使用して推論サーバーをローカルで実行します。 サンプル ファイルには、スコアリング スクリプト、モデル ファイル、環境ファイルが含まれます。 これらのサンプル ファイルの使用方法の他の例については、「オンライン エンドポイントを使用して機械学習モデルをデプロイおよびスコア付けする」をご覧ください。
サンプル リポジトリを複製し、関連するサンプル ファイルを含むフォルダーに移動します。
git clone --depth 1 https://github.com/Azure/azureml-examples cd azureml-examples/cli/endpoints/online/model-1/
conda を使用して、仮想環境を作成してアクティブ化します。
この例では、
azureml-inference-server-http
パッケージが自動的にインストールされます。 パッケージは、conda.yaml ファイルに記載されているazureml-defaults
パッケージの依存ライブラリとして含まれています。# Create the environment from the YAML file. conda env create --name model-env -f ./environment/conda.yaml # Activate the new environment. conda activate model-env
スコアリング スクリプト、オンラインスコアリング/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()
スコアリング スクリプトとモデル フォルダーへのパスを指定して、推論サーバーを実行します。
デプロイ時に、モデル フォルダーへのパスを格納するために、
AZUREML_MODEL_DIR
変数が定義されます。model_dir
パラメーターでその値を指定します。 スコアリング スクリプトを実行すると、AZUREML_MODEL_DIR
変数から値が取得されます。この場合、スコアリング スクリプトはサブディレクトリを
model/sklearn_regression_model.pkl
として指定するため、現在のディレクトリ./
をmodel_dir
値として使用します。azmlinfsrv --entry_script ./onlinescoring/score.py --model_dir ./
推論サーバーが起動し、スコアリング スクリプトが正常に呼び出されると、 サンプルのスタートアップ ログ が開きます。 そうでない場合は、ログでエラー メッセージが示されます。
次の手順を実行して、サンプル データを使用してスコアリング スクリプトをテストします。
別のコマンド ウィンドウを開き、
azmlinfsrv
コマンドを実行したのと同じ作業ディレクトリに移動します。次の
curl
ユーティリティを使用して、推論サーバーに要求の例を送信し、スコア付け結果を受け取ります。curl --request POST "127.0.0.1:5001/score" --header "Content-Type:application/json" --data @sample-request.json
スコアリング スクリプトに問題がない場合、スクリプトはスコアリングの結果を返します。 問題が発生した場合は、スコアリング スクリプトを更新してから推論サーバーを再度起動して、更新されたスクリプトをテストできます。
推論サーバー ルートを確認する
推論サーバーは、既定では次のルートでポート 5001 でリッスンします。
名前 | ルート |
---|---|
Liveness Probe | 127.0.0.1:5001/ |
スコア | 127.0.0.1:5001/score |
OpenAPI (Swagger) | 127.0.0.1:5001/swagger.json |
推論サーバーのパラメーターを確認する
推論サーバーは、次のパラメーターを受け入れます。
パラメーター | 必須 | 既定値 | 説明 |
---|---|---|---|
entry_script |
正しい | 該当なし | スコアリング スクリプトへの相対パスまたは絶対パスを識別します |
model_dir |
いいえ | 該当なし | 推論に使用されるモデルを保持するディレクトリへの相対パスまたは絶対パスを識別します。 |
port |
いいえ | 5001 | 推論サーバーのサービス ポートを指定します |
worker_count |
いいえ | 1 | 同時実行要求を処理するワーカー スレッドの数を提供します |
appinsights_instrumentation_key |
いいえ | 該当なし | ログが発行される Application Insights のインスタンスのインストルメンテーション キーを提供します |
access_control_allow_origins |
いいえ | 該当なし | 指定した配信元に対してクロスオリジン リソース共有 (CORS) を有効にします。複数の配信元はコンマ (,) で区切られます(例: microsoft.com, bing.com |
推論サーバー要求の処理を調べる
次の手順では、推論サーバー ( azmlinfsrv
) が受信要求を処理する方法を示します。
Python CLI ラッパーは、推論サーバーのネットワーク スタックを囲み、推論サーバーを起動するために使用されます。
クライアントが推論サーバーに要求を送信します。
推論サーバーは 、Web サーバー ゲートウェイ インターフェイス (WSGI) サーバーを介して要求を送信し、次のいずれかの Flask ワーカー アプリケーションに要求をディスパッチします。
Flask ワーカー アプリは要求を処理します。これには、エントリ スクリプトとすべての依存関係の読み込みが含まれます。
エントリ スクリプトが要求を受け取ります。 エントリ スクリプトは、読み込まれたモデルに対して推論呼び出しを行い、応答を返します。
推論サーバー のログを調べる
推論サーバー テストのログ データを取得するには、次の 2 つの方法があります。
azureml-inference-server-http
パッケージをローカルで実行し、ログ出力を表示します。- オンライン エンドポイントを使って、コンテナー ログを表示します。 推論サーバーのログには、Azure Machine Learning Inferencing HTTP server <バージョン> という 名前が付いています。
注
バージョン 0.8.0 以降、ログ形式が変更されています。 ログで想定とは異なるスタイルが使われている場合は、azureml-inference-server-http
パッケージを最新バージョンに更新します。
スタートアップ ログを表示する
推論サーバーが起動すると、ログには次の初期サーバー設定が表示されます。
Azure ML Inferencing HTTP server <version>
Server Settings
---------------
Entry Script Name: <entry-script>
Model Directory: <model-directory>
Config File: <configuration-file>
Worker Count: <worker-count>
Worker Timeout (seconds): None
Server Port: <port>
Health Port: <port>
Application Insights Enabled: false
Application Insights Key: <Application-Insights-instrumentation-key>
Inferencing HTTP server version: azmlinfsrv/<version>
CORS for the specified origins: <access-control-allow-origins>
Create dedicated endpoint for health: <health-check-endpoint>
Server Routes
---------------
Liveness Probe: GET 127.0.0.1:<port>/
Score: POST 127.0.0.1:<port>/score
<logs>
たとえば、エンドツーエンドの例の手順を実行して推論サーバー を 実行すると、ログには次の情報が含まれます。
Azure ML Inferencing HTTP server v1.2.2
Server Settings
---------------
Entry Script Name: /home/user-name/azureml-examples/cli/endpoints/online/model-1/onlinescoring/score.py
Model Directory: ./
Config File: None
Worker Count: 1
Worker Timeout (seconds): None
Server Port: 5001
Health Port: 5001
Application Insights Enabled: false
Application Insights Key: None
Inferencing HTTP server version: azmlinfsrv/1.2.2
CORS for the specified origins: None
Create dedicated endpoint for health: 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,976 I [32756] azmlinfsrv - Scoring timeout is set to 3600000
2022-12-24 07:37:55,976 I [32756] azmlinfsrv - Worker with pid 32756 ready for serving traffic
ログのデータ形式を理解する
ランチャー スクリプトを除く推論サーバーのすべてのログは、次の形式でデータを表示します。
<UTC-time> <level> [<process-ID>] <logger-name> - <message>
各エントリは、次のコンポーネントで構成されます。
<UTC-time>
: エントリがログに入力された時刻<level>
: エントリの ログ レベル の最初の文字 (ERROR のE
、INFO のI
など)<process-ID>
: エントリに関連付けられているプロセスの ID<logger-name>
: ログ エントリに関連付けられているリソースの名前<message>
: ログ メッセージの内容
Python には 6 つのレベルのログ記録があります。 各レベルには、重大度に応じて割り当てられた数値があります。
ログ記録レベル | 数値 |
---|---|
危うい | 50 |
エラー | 40 |
警告 | 30 |
INFO | 20 |
デバッグ | 10 |
未設定 | 0 |
推論サーバーに関する問題のトラブルシューティング
次のセクションでは、推論サーバーの基本的なトラブルシューティングのヒントを示します。 オンライン エンドポイントのトラブルシューティングを行うには、「 オンライン エンドポイントのデプロイとスコアリングのトラブルシューティング」を参照してください。
インストールしたパッケージを確認する
インストールされているパッケージに関する問題に対処するには、次の手順に従います。
Python 環境にインストールされているパッケージとバージョンに関する情報を収集します。
環境ファイルで、指定されている
azureml-inference-server-http
Python パッケージのバージョンを確認します。 Azure Machine Learning 推論 HTTP サーバー のスタートアップ ログで、表示されている推論サーバーのバージョンを確認します。 2 つのバージョンが一致することを確認します。場合によっては、pip 依存関係リゾルバーによって予期しないパッケージ バージョンがインストールされます。 インストールされているパッケージとバージョンを修正するには、
pip
を実行する必要がある場合があります。Flask またはその依存関係を環境内で指定した場合は、これらの項目を削除します。
- 依存パッケージには、
flask
、jinja2
、itsdangerous
、werkzeug
、markupsafe
、click
が含まれます。 flask
パッケージは、推論サーバー パッケージの依存関係として一覧表示されます。 最適な方法は、推論サーバーがflask
パッケージをインストールできるようにすることです。- 新しいバージョンの Flask をサポートするように推論サーバーが構成されている場合、推論サーバーはパッケージの更新プログラムが使用可能になると自動的に受信します。
- 依存パッケージには、
推論サーバーのバージョンを確認する
サーバー パッケージ azureml-inference-server-http
は PyPI に公開されています。 PyPI ページには、変更ログとパッケージのすべてのバージョンが一覧表示されます。
初期パッケージ バージョンを使用する場合は、構成を最新バージョンに更新します。 次の表は、安定したバージョン、よくある問題、推奨される調整をまとめたものです。
パッケージのバージョン | 説明 | 問題 | 解決策 |
---|---|---|---|
0.4.x | 日付が 20220601 以前および azureml-defaults パッケージ バージョン 0.1.34 から 1.43 のトレーニング イメージにバンドルされています。 最新の安定バージョンは 0.4.13 です。 |
0.4.11 より前のバージョンのサーバーでは、 can't import name Markup from jinja2 など、Flask の依存関係の問題が発生する可能性があります。 |
可能であれば、最新バージョンのバージョン 0.4.13 または 1.4.x にアップグレードします。 |
0.6.x | 20220516 以前の日付の推論イメージにプレインストールされています。 最新の安定バージョンは 0.6.1 です。 |
該当なし | 該当なし |
0.7.x | Flask 2 をサポートします。 最新の安定バージョンは 0.7.7 です。 | 該当なし | 該当なし |
0.8.x | 更新されたログ形式を使用します。 Python 3.6 のサポートを終了します。 | 該当なし | 該当なし |
1.0.x | Python 3.7 のサポートを終了します。 | 該当なし | 該当なし |
1.1.x | pydantic 2.0 に移行します。 |
該当なし | 該当なし |
1.2.x | Python 3.11 のサポートを追加しました。 gunicorn バージョン 22.0.0 に更新されます。 werkzeug をバージョン 3.0.3 およびそれ以降のバージョンに更新します。 |
該当なし | 該当なし |
1.3.x | Python 3.12 のサポートを追加しました。 certifi バージョン 2024.7.4 にアップグレードします。 flask-cors バージョン 5.0.0 にアップグレードします。 gunicorn パッケージとpydantic パッケージをアップグレードします。 |
該当なし | 該当なし |
1.4.x | waitress バージョン 3.0.1 にアップグレードします。 Python 3.8 のサポートを終了します。 Flask 2.0 のアップグレードで要求オブジェクト コードが中断されないようにする互換性レイヤーを削除します。 |
互換性レイヤーに依存している場合は、要求オブジェクト コードが機能しない可能性があります。 | スコア スクリプトを Flask 2 に移行します。 |
パッケージの依存関係を確認する
サーバー パッケージ azureml-inference-server-http
に最も関連のある依存パッケージには、次のものが含まれます。
flask
opencensus-ext-azure
inference-schema
Python 環境で azureml-defaults
パッケージを指定した場合、 azureml-inference-server-http
パッケージは依存パッケージです。 依存関係は自動的にインストールされます。
ヒント
Azure Machine Learning SDK for Python v1 を使用し、Python 環境で azureml-defaults
パッケージを明示的に指定しない場合、SDK によってパッケージが自動的に追加される可能性があります。 ただし、パッケージのバージョンは SDK バージョンに対してロックされます。 たとえば、SDK バージョンが 1.38.0 の場合、 azureml-defaults==1.38.0
エントリは環境の pip 要件に追加されます。
推論サーバーの起動時の TypeError
推論サーバーの起動時に、次の TypeError
が発生することがあります。
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
このエラーは、Python 環境に Flask 2 がインストールされているが、azureml-inference-server-http
パッケージ バージョンが Flask 2 をサポートしていない場合に発生します。 Flask 2 のサポートは、 azureml-inference-server-http
0.7.0 パッケージ以降のバージョンと、 azureml-defaults
1.44 パッケージ以降のバージョンで利用できます。
Azure Machine Learning Docker イメージで Flask 2 パッケージを使用しない場合は、最新バージョンの
azureml-inference-server-http
またはazureml-defaults
パッケージを使用します。Azure Machine Learning Docker イメージで Flask 2 パッケージを使用する場合は、イメージビルドのバージョンが
July 2022
以降であることを確認します。イメージのバージョンは、コンテナー ログで確認できます。 たとえば、次のログ ステートメントを参照してください。
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 |
イメージのビルド日は、
Materialization Build
表記の後に表示されます。 前の例では、イメージのバージョンは20220708
(2022 年 7 月 8 日)です。 この例のイメージは Flask 2 と互換性があります。類似のメッセージがコンテナー ログ内にない場合、そのイメージは古く、更新する必要があります。 コンピューティング統合デバイス アーキテクチャ (CUDA) イメージを使用していて、新しいイメージが見つからない場合は、 AzureML-Containers リポジトリを確認して、イメージが非推奨かどうかを確認します。 非推奨のイメージに対し、指定された代替バージョンを見つけることができます。
オンライン エンドポイントで推論サーバーを使用する場合は、Azure Machine Learning Studio でログを見つけることもできます。 エンドポイントのページで、[ ログ ] タブを選択します。
SDK v1 を使用してデプロイし、デプロイ構成でイメージを明示的に指定しない場合、推論サーバーはローカル SDK ツールセットに一致するバージョンで openmpi4.1.0-ubuntu20.04
パッケージを適用します。 ただし、インストールされているバージョンは、イメージの利用可能な最新バージョンではない可能性があります。
SDK バージョン 1.43 の場合、推論サーバーは既定で openmpi4.1.0-ubuntu20.04:20220616
パッケージ バージョンをインストールしますが、このパッケージ バージョンは SDK 1.43 と互換性がありません。 デプロイに最新の SDK を使用していることを確認します。
イメージを更新できない場合は、環境ファイルに azureml-defaults==1.43
エントリまたは azureml-inference-server-http~=0.4.13
エントリをピン留めすることで、一時的に問題を回避できます。 これらのエントリは、 flask 1.0.x
を使用して古いバージョンをインストールするように推論サーバーに指示します。
推論サーバーの起動時に ImportError または ModuleNotFoundError が発生する
推論サーバーの起動時に、ImportError
、ModuleNotFoundError
、opencensus
、jinja2
など、特定のモジュールでmarkupsafe
またはclick
が発生する場合があります。 次の例は、エラー メッセージを示しています。
ImportError: cannot import name 'Markup' from 'jinja2'
インポートとモジュールのエラーは、Flask の依存関係を互換性のあるバージョンにピン留めしないバージョン 0.4.10 以前のバージョンの推論サーバーを使用すると発生します。 この問題を回避するには、新しいバージョンの推論サーバーをインストールします。