다음을 통해 공유


Azure Machine Learning 유추 HTTP 서버를 사용하여 채점 스크립트 디버그

Azure Machine Learning 유추 HTTP 서버는 채점 함수를 HTTP 엔드포인트로 노출하고 Flask 서버 코드 및 종속성을 단일 패키지로 래핑하는 Python 패키지입니다. 이 서버는 Azure Machine Learning을 사용하여 모델을 배포할 때 사용되는 유추를 위해 미리 빌드된 Docker 이미지에 포함되어 있습니다. 이 패키지만 사용하여 프로덕션을 위해 모델을 로컬로 배포할 수 있으며 로컬 개발 환경에서 채점(항목) 스크립트의 유효성을 쉽게 검사할 수 있습니다. 채점 스크립트에 문제가 있으면 서버는 오류와 오류 위치를 반환합니다.

연속 통합 및 배포 파이프라인에서 유효성 검사 게이트를 만들 때에도 서버를 사용할 수 있습니다. 예를 들어 후보 스크립트를 사용하여 서버를 시작하고 로컬 엔드포인트에 대해 테스트 도구 모음을 실행할 수 있습니다.

이 문서는 로컬에서 디버깅을 위해 유추 서버를 사용하려는 개발자를 지원하고 Windows에서 온라인 엔드포인트와 함께 유추 서버를 사용하는 방법을 설명합니다.

필수 조건

로컬 디버깅을 위해 Azure Machine Learning 유추 HTTP 서버를 사용하려면 구성에 다음 구성 요소가 포함되어야 합니다.

  • Python 3.8 이상
  • Anaconda

Azure Machine Learning 유추 HTTP 서버는 Windows 및 Linux 기반 운영 체제에서 실행됩니다.

온라인 엔드포인트에 대한 로컬 디버깅 옵션 탐색

클라우드에 배포하기 전에 로컬에서 엔드포인트를 디버깅하면 코드와 구성의 오류를 더 일찍 catch할 수 있습니다. 엔드포인트를 로컬로 디버깅하려면 다음을 포함한 여러 옵션이 있습니다.

이 문서에서는 Windows에서 Azure Machine Learning 유추 HTTP 서버를 사용하는 방법을 설명합니다.

다음 표에서는 가장 좋은 옵션을 선택하는 데 도움이 되는 시나리오에 대해 간략하게 설명합니다.

시나리오 유추 HTTP 서버 로컬 엔드포인트
Docker 이미지 다시 빌드 없이 로컬 Python 환경 업데이트 아니요
점수 매기기 스크립트 업데이트
배포 구성 업데이트(배포, 환경, 코드, 모델)
Microsoft VS Code(Visual Studio Code) 디버거 통합

유추 HTTP 서버를 로컬에서 실행하면 배포 컨테이너 구성을 고려하지 않고 채점 스크립트 디버깅에 집중할 수 있습니다.

azureml-inference-server-http 패키지 설치

azureml-inference-server-http 패키지를 설치하려면 다음 명령을 실행합니다.

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

참고 항목

패키지 충돌을 피하려면 가상 환경에 유추 HTTP 서버를 설치합니다. pip install virtualenv 명령을 사용하면 구성에 대한 가상 환경을 사용하도록 설정할 수 있습니다.

로컬로 채점 스크립트 디버그

채점 스크립트를 로컬에서 디버깅하려면 서버 동작을 테스트하기 위한 몇 가지 옵션이 있습니다.

  • 더미 채점 스크립트를 사용해 보세요.
  • Visual Studio Code를 사용하여 azureml-inference-server-http 패키지로 디버깅합니다.
  • 리포지토리 예에서 실제 채점 스크립트, 모델 파일 및 환경 파일을 실행합니다.

더미 채점 스크립트를 사용하여 서버 동작 테스트

  1. server_quickstart라는 이름의 디렉터리를 만들어 파일을 보관합니다.

    mkdir server_quickstart
    cd server_quickstart
    
  2. 패키지 충돌을 방지하려면 myenv와 같은 가상 환경을 만들고 활성화합니다.

    python -m virtualenv myenv
    

    참고 항목

    Linux에서는 source myenv/bin/activate 명령을 실행하여 가상 환경을 활성화합니다.

    서버를 테스트한 후 deactivate 명령을 실행하여 Python 가상 환경을 비활성화할 수 있습니다.

  3. pypi 피드에서 azureml-inference-server-http 패키지를 설치합니다.

    python -m pip install azureml-inference-server-http
    
  4. 항목 스크립트를 만듭니다. 다음 예에서는 기본 항목 스크립트를 만들어 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. azmlinfsrv 명령으로 서버를 시작하고 score.py 파일을 항목 스크립트로 설정합니다.

    azmlinfsrv --entry_script score.py
    

    참고 항목

    서버는 0.0.0.0에 호스트되므로 호스트된 컴퓨터의 모든 IP 주소를 수신 대기합니다.

  6. curl 유틸리티를 사용하여 서버에 채점 요청을 보냅니다.

    curl -p 127.0.0.1:5001/score
    

    서버는 다음과 같은 응답을 게시합니다.

    {"message": "Hello, World!"}
    
  7. 테스트 후 Ctrl + C를 눌러 서버를 종료합니다.

이제 채점 스크립트 파일(score.py)을 수정하고 azmlinfsrv --entry_script score.py 명령으로 서버를 다시 실행하여 변경 내용을 테스트할 수 있습니다.

Visual Studio Code와 통합

azureml-inference-server-http 패키지로 디버깅을 위해 VS Code와 Python 확장을 사용하려면 시작 및 연결 모드를 사용할 수 있습니다.

  • 시작 모드의 경우 VS Code에서 launch.json 파일을 설정하고 VS Code 내에서 Azure Machine Learning 유추 HTTP 서버를 시작합니다.

    1. VS Code를 시작하고 스크립트가 포함된 폴더(score.py)를 엽니다.

    2. VS Code의 해당 작업 영역에 대한 launch.json 파일에 다음 구성을 추가합니다.

      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. 실행>디버깅 시작을 선택하거나 바로 가기 키 F5를 사용하여 VS Code에서 디버깅 세션을 시작합니다.

  • 연결 모드의 경우 명령 창에서 Azure Machine Learning 유추 HTTP 서버를 시작하고 Python 확장 기능이 있는 VS Code를 사용하여 프로세스에 연결합니다.

    참고 항목

    Linux의 경우 먼저 sudo apt-get install -y gdb 명령을 실행하여 gdb 패키지를 설치합니다.

    1. VS Code의 해당 작업 영역에 대한 launch.json 파일에 다음 구성을 추가합니다.

      launch.json

      {
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "Python: Attach using Process Id",
                  "type": "python",
                  "request": "attach",
                  "processId": "${command:pickProcess}",
                  "justMyCode": true
              }
          ]
        }
      
    2. 명령 창에서 azmlinfsrv --entry_script score.py 명령을 사용하여 유추 HTTP 서버를 시작합니다.

    3. VS Code에서 디버깅 세션을 시작합니다.

      1. 실행>디버깅 시작을 선택하거나 바로 가기 키 F5를 사용합니다.

      2. 명령 창에서 유추 서버의 로그를 보고 azmlinfsrv 명령의 프로세스 ID를 찾습니다(gunicorn이 아님).

        유추 HTTP 서버의 로그와 azmlinfsrv 명령의 프로세스 ID가 강조 표시된 명령 창을 보여 주는 스크린샷.

      3. VS Code 디버거에서 azmlinfsrv 명령의 프로세스 ID를 입력합니다.

        VS Code 프로세스 선택기가 표시되지 않으면 해당 작업 영역의 launch.json 파일에 있는 processId 필드에 프로세스 ID를 수동으로 입력할 수 있습니다.

두 모드 모두 중단점을 설정하고 스크립트를 단계별로 디버깅할 수 있습니다.

엔드투엔드 예 사용

다음 절차에서는 Azure Machine Learning 리포지토리 예의 샘플 파일(채점 스크립트, 모델 파일 및 환경)을 사용하여 서버를 로컬로 실행합니다. 이러한 샘플 파일을 사용하는 방법에 대한 자세한 내용은 온라인 엔드포인트를 사용하여 기계 학습 모델 배포 및 점수 매기기를 참조하세요.

  1. 샘플 리포지토리를 복제합니다.

    git clone --depth 1 https://github.com/Azure/azureml-examples
    cd azureml-examples/cli/endpoints/online/model-1/
    
  2. conda를 사용하여 가상 환경을 만들고 활성화합니다.

    이 예에서는 azureml-inference-server-http 패키지가 자동으로 설치됩니다. 패키지는 conda.yml 파일에 azureml-defaults 패키지의 종속 라이브러리로 포함됩니다.

    # 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. 채점 스크립트를 검토합니다.

    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. 채점 스크립트와 모델 파일을 지정하여 유추 HTTP 서버를 실행합니다.

    model_dir 매개 변수에 지정된 모델 디렉터리는 AZUREML_MODEL_DIR 변수를 사용하여 정의되고 채점 스크립트에서 검색됩니다.

    이 경우, 채점 스크립트에 하위 디렉터리가 model/sklearn_regression_model.pkl로 지정되어 있으므로 현재 디렉터리 ./를 지정합니다.

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

    서버가 시작되고 채점 스크립트를 성공적으로 호출하면 예 시작 로그가 열립니다. 그렇지 않으면 로그에 오류 메시지가 표시됩니다.

  5. 샘플 데이터로 채점 스크립트를 테스트합니다.

    다른 명령 창을 열고 명령을 실행한 동일한 작업 디렉터리로 변경합니다.

    curl 유틸리티를 사용하여 서버로 요청 예를 보내고 채점 결과를 받습니다.

    curl --request POST "127.0.0.1:5001/score" --header "Content-Type:application/json" --data @sample-request.json
    

    채점 스크립트에 문제가 없으면 스크립트는 채점 결과를 반환합니다. 문제가 발생하면 채점 스크립트를 업데이트하고, 서버를 다시 시작하여 업데이트된 스크립트를 테스트할 수 있습니다.

서버 경로 검토

유추 HTTP 서버는 기본적으로 다음 경로에서 포트 5001을 수신 대기합니다.

속성 경로
활동성 프로브 127.0.0.1:5001/
점수 127.0.0.1:5001/score
OpenAPI(Swagger) 127.0.0.1:5001/swagger.json

서버 매개 변수 검토

유추 HTTP 서버는 다음 매개 변수를 허용합니다.

매개 변수 Required 기본값 Description
entry_script True 해당 없음 채점 스크립트의 상대 또는 절대 경로를 식별합니다.
model_dir False 해당 없음 유추에 사용된 모델이 보관된 디렉터리의 상대 또는 절대 경로를 식별합니다.
port False 5001 서버의 서비스 포트를 지정합니다.
worker_count False 1 동시 요청을 처리하기 위한 작업자 스레드 수를 제공합니다.
appinsights_instrumentation_key False 해당 없음 로그가 게시되는 Application Insights에 대한 계측 키를 제공합니다.
access_control_allow_origins False 해당 없음 microsoft.com, bing.com과 같이 여러 원본이 쉼표(,)로 구분된 경우 지정된 원본에 대해 CORS를 사용하도록 설정합니다.

서버 요청 처리 탐색

다음 단계에서는 Azure Machine Learning 유추 HTTP 서버(azmlinfsrv)가 수신 요청을 처리하는 방법을 보여 줍니다.

  1. Python CLI 래퍼는 서버의 네트워크 스택을 중심으로 하며 서버를 시작하는 데 사용됩니다.

  2. 클라이언트는 서버에 요청을 보냅니다.

  3. 서버는 WSGI(웹 서버 게이트웨이 인터페이스) 서버를 통해 요청을 보내고 이 서버는 해당 요청을 Flask 작업자 애플리케이션에 전송합니다.

  4. Flask ​​작업자 앱은 항목 스크립트와 모든 종속성을 로드하는 것을 포함한 요청을 처리합니다.

  5. 사용자의 항목 스크립트가 요청을 수신합니다. 항목 스크립트는 로드된 모델에 대한 유추 호출을 수행하고 응답을 반환합니다.

유추 HTTP 서버가 수신 요청을 처리하는 방식을 보여 주는 다이어그램.

서버 로그 탐색

유추 HTTP 서버 테스트에 대한 로그 데이터를 가져오는 방법은 두 가지가 있습니다.

  • azureml-inference-server-http 패키지를 로컬로 실행하고 로그 출력을 확인합니다.
  • 온라인 엔드포인트를 사용하고 컨테이너 로그를 확인합니다. 유추 서버의 로그 이름은 Azure Machine Learning 유추 HTTP 서버 <버전>입니다.

참고 항목

로깅 형식은 버전 0.8.0 이후에 변경되었습니다. 로그가 예상과 다른 스타일을 사용하는 경우 azureml-inference-server-http 패키지를 최신 버전으로 업데이트합니다.

시작 로그 보기

서버가 시작되면 로그에는 다음과 같이 초기 서버 설정이 표시됩니다.

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>

예를 들어, 엔드투엔드 예에 따라 서버를 시작하면 로그가 다음과 같이 표시됩니다.

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.

로그 데이터 서식 이해

시작 관리자 스크립트를 제외한 유추 HTTP 서버의 모든 로그는 다음 형식으로 데이터를 표시합니다.

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

이 항목은 다음 구성 요소로 구성되어 있습니다.

  • <UTC Time>: 항목이 로그에 입력된 시간입니다.
  • <pid>: 항목과 연관된 프로세스의 ID입니다.
  • <level>: 항목에 대한 로깅 수준의 첫 번째 문자입니다. 예를 들어, ERROR의 경우 E, INFO의 경우 I와 같습니다.
  • <logger name>: 로그 항목과 연관된 리소스의 이름입니다.
  • <message>: 로그 메시지의 콘텐츠입니다.

Python에는 심각도에 따라 숫자 값이 할당된 6가지 수준의 로깅이 있습니다.

로깅 수준 숫자 값
CRITICAL 50
ERROR 40
경고  30
INFO 20
DEBUG 10
NOTSET 0

서버 문제 해결

다음 섹션에서는 Azure Machine Learning 유추 HTTP 서버에 대한 기본적인 문제 해결 팁을 제공합니다. 온라인 엔드포인트 문제를 해결하려면 온라인 엔드포인트 배포 문제 해결을 참조하세요.

설치된 패키지를 확인합니다

설치된 패키지의 문제를 해결하려면 다음 단계를 따릅니다.

  1. Python 환경에 설치된 패키지와 버전에 대한 정보를 수집합니다.

  2. 환경 파일에 지정된 azureml-inference-server-http Python 패키지 버전이 시작 로그에 표시된 Azure Machine Learning 유추 HTTP 서버 버전과 일치하는지 확인합니다.

    어떤 경우에는 pip 종속성 확인자가 예기치 못한 패키지 버전을 설치합니다. 설치된 패키지와 버전을 수정하려면 pip를 실행해야 할 수도 있습니다.

  3. 환경에서 Flask나 해당 종속성을 지정하는 경우 이러한 항목을 제거합니다.

    • 종속 패키지에는 flask, jinja2, itsdangerous, werkzeug, markupsafe, click이 포함됩니다.
    • flask는 서버 패키지의 종속성으로 나열되어 있습니다. 가장 좋은 방법은 유추 서버가 flask 패키지를 설치하도록 허용하는 것입니다.
    • 유추 서버가 Flask의 새로운 버전을 지원하도록 구성된 경우, 서버는 패키지 업데이트가 제공되면 자동으로 해당 업데이트를 수신합니다.

서버 버전 확인

서버 패키지 azureml-inference-server-http가 PyPI에 게시됩니다. PyPI 페이지에는 변경 로그 및 모든 이전 버전이 나열됩니다.

이전 패키지 버전을 사용하는 경우 구성을 최신 버전으로 업데이트합니다. 다음 표는 안정적인 버전, 일반적인 문제 및 권장 조정 사항을 요약한 것입니다.

패키지 버전 설명 문제 해결 방법
0.4.x 20220601 또는 이전 날짜의 학습 이미지와 azureml-defaults 패키지 버전 .1.34부터 1.43까지 번들로 제공됩니다. 안정적인 최신 버전은 0.4.13입니다. 0.4.11 이전 서버 버전의 경우 Flask 종속성 문제가 발생할 수 있습니다(예: "can't import name Markup from jinja2"). 가능하면 0.4.13 또는 0.8.x(최신 버전)으로 업그레이드합니다.
0.6.x 20220516 이전의 유추 이미지에 사전 설치되어 있습니다. 안정적인 최신 버전은 0.6.1입니다. 해당 없음 해당 없음
0.7.x Flask 2를 지원합니다. 안정적인 최신 버전은 0.7.7입니다. 해당 없음 해당 없음
0.8.x 로그 형식이 변경되었습니다. Python 3.6 지원이 종료되었습니다. 해당 없음 해당 없음

패키지 종속성 확인

azureml-inference-server-http 서버 패키지에 가장 관련성 있는 종속 패키지는 다음과 같습니다.

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

Python 환경에서 azureml-defaults 패키지를 지정한 경우 azureml-inference-server-http 패키지는 종속 패키지입니다. 종속성은 자동으로 설치됩니다.

Python SDK 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 패키지를 사용하는 경우 이미지 빌드 버전이 2022년 7월 이후인지 확인합니다.

    컨테이너 로그에서 이미지 버전을 찾을 수 있습니다. 예시:

    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(Compute Unified Device Architecture) 이미지를 사용하고 최신 이미지를 찾을 수 없는 경우 AzureML-Containers에서 해당 이미지가 더 이상 사용되지 않는지 확인합니다. 더 이상 사용되지 않는 이미지에 대한 지정된 대체 이미지를 찾을 수 있습니다.

    온라인 엔드포인트에서 서버를 사용하는 경우 Azure Machine Learning 스튜디오의 엔드포인트 페이지에 있는 로그에서 로그를 찾을 수도 있습니다.

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 발생

서버 시작 중에 opencensus, jinja2, markupsafe 또는 click과 같은 특정 모듈에서 ImportError 또는 ModuleNotFoundError가 발생할 수 있습니다. 다음 예제에서는 오류 메시지를 보여 줍니다.

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

Flask 종속성을 호환되는 버전에 고정하지 않는 서버의 버전 0.4.10 또는 이전 버전을 사용하는 경우 가져오기 및 모듈 오류가 발생합니다. 문제를 방지하려면 최신 버전의 서버를 설치합니다.