Отладка скрипта оценки с помощью HTTP-сервера вывода Машинное обучение Azure

Машинное обучение Azure http-сервер вывода — это пакет Python, который предоставляет функцию оценки как конечную точку HTTP и упаковывает код и зависимости сервера Flask в единый пакет. Он включен в предварительно созданные образы Docker для вывода, которые используются при развертывании модели с Машинное обучение Azure. Используя только пакет, вы можете локально развернуть модель для рабочей среды, и вы также можете легко проверить скрипт оценки (записи) в локальной среде разработки. Если с скриптом оценки возникла проблема, сервер вернет ошибку и расположение, в котором произошла ошибка.

Сервер также можно использовать для создания шлюзов проверки в конвейере непрерывной интеграции и развертывания. Например, можно запустить сервер с помощью сценария кандидата и запустить набор тестов для локальной конечной точки.

В этой статье главным образом ориентированы пользователи, которые хотят использовать сервер вывода для локальной отладки, но это поможет вам понять, как использовать сервер вывода с сетевыми конечными точками.

Локальная отладка сетевых конечных точек

Локальная отладка конечных точек перед их развертыванием в облаке поможет заранее обнаруживать ошибки в коде и конфигурации. Для локальной отладки конечных точек можно использовать:

  • HTTP-сервер вывода Машинное обучение Azure
  • локальная конечная точка

В этой статье рассматриваются Машинное обучение Azure HTTP-сервер вывода.

В следующей таблице приведены общие сведения о сценариях, которые помогут вам выбрать наиболее подходящий вариант.

Сценарий HTTP-сервер вывода Локальная конечная точка
Обновление локальной среды Python без перестроения образа Docker Да Нет
Обновление сценария оценки Да Да
Обновление конфигураций развертывания (развертывание, среда, код, модель) No Да
Интеграция отладчика VS Code Да Да

Запустив HTTP-сервер вывода локально, вы можете сосредоточиться на отладке скрипта оценки, не затрагивая конфигурации контейнера развертывания.

Необходимые компоненты

  • Требуется: Python >=3.8
  • Anaconda

Совет

Http-сервер вывода Машинное обучение Azure работает в операционных системах под управлением Windows и Linux.

Установка

Примечание.

Чтобы избежать конфликтов пакетов, установите сервер в виртуальной среде.

Чтобы установить azureml-inference-server-http package, выполните следующую команду в cmd или терминале:

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

Отладка скрипта оценки локально

Чтобы выполнить локальную отладку скрипта оценки, можно проверить поведение сервера с помощью скрипта фиктивной оценки, использовать VS Code для отладки с помощью пакета azureml-inference-server-http или проверить сервер с помощью фактического скрипта оценки, файла модели и файла среды из репозитория примеров.

Тестирование поведения сервера с помощью фиктивного скрипта оценки

  1. Создайте каталог для размещения файлов:

    mkdir server_quickstart
    cd server_quickstart
    
  2. Чтобы предотвратить конфликты пакетов, создайте виртуальную среду и активируйте ее:

    python -m venv myenv
    source myenv/bin/activate
    

    Совет

    После тестирования выполните деактивацию deactivate виртуальной среды Python.

  3. Установите пакет azureml-inference-server-http из веб-канала PyPI.

    python -m pip install azureml-inference-server-http
    
  4. Создайте начальный сценарий (score.py). В следующем примере создается базовый начальный сценарий:

    echo '
    import time
    
    def init():
        time.sleep(1)
    
    def run(input_data):
        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!"}
    

После тестирования можно нажать клавишу Ctrl + C , чтобы завершить работу сервера. Теперь вы можете изменить скрипт оценки (score.py) и проверить изменения, снова запустив сервер (azmlinfsrv --entry_script score.py).

Как интегрировать с Visual Studio Code

Существует два способа использования Visual Studio Code (VS Code) и расширения Python для отладки с помощью пакета azureml-inference-server-http (режимы запуска и подключения).

  • Режим запуска: настройте launch.json в VS Code и запустите HTTP-сервер вывода Машинное обучение Azure в VS Code.

    1. Запустите VS Code и откройте папку, содержащую скрипт (score.py).

    2. Добавьте следующую конфигурацию launch.json для этой рабочей области в VS 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. Запуск сеанса отладки в VS Code. Выберите "Выполнить" —> "Начать отладку" (или F5).

  • Режим подключения: запустите http-сервер вывода Машинное обучение Azure в командной строке и используйте расширение VS Code + Python для присоединения к процессу.

    Примечание.

    Если вы используете среду Linux, сначала установите gdb пакет, выполнив команду sudo apt-get install -y gdb.

    1. Добавьте следующую конфигурацию launch.json для этой рабочей области в VS Code:

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

    3. Запуск сеанса отладки в VS Code.

      1. В VS Code выберите "Запустить" —> "Начать отладку" (или F5).
      2. Введите идентификатор azmlinfsrv процесса (а не gunicorn) с помощью журналов (с сервера вывода), отображаемых в CLI. Снимок экрана: интерфейс командной строки, на котором показан идентификатор процесса сервера.

      Примечание.

      Если средство выбора процессов не отображается, введите идентификатор процесса вручную в processId поле поля launch.json.

В обоих случаях можно задать точку останова и выполнить отладку пошаговые инструкции.

Полный пример

В этом разделе мы будем запускать сервер локально с примерами файлов (скрипт оценки, файла модели и среды) в нашем примере репозитория. Примеры файлов также используются в нашей статье для развертывания и оценки модели машинного обучения с помощью сетевой конечной точки

  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 так как он включается в качестве зависимой azureml-defaults библиотеки пакета, 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. Просмотрите скрипт оценки.

    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. Запустите сервер вывода с указанием скрипта оценки и файла модели. Указанный каталог модели (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
    

    Результат оценки будет возвращен, если в скрипте оценки нет проблем. Если вы нашли что-то неправильное, можно попытаться обновить скрипт оценки и снова запустить сервер, чтобы проверить обновленный скрипт.

Маршруты сервера

Сервер прослушивает порт 5001 (по умолчанию) на этих маршрутах.

Имя. Маршрут
Проба активности 127.0.0.1:5001/
Балл 127.0.0.1:5001/score
OpenAPI (swagger) 127.0.0.1:5001/swagger.json

Параметры сервера

В следующей таблице приведены параметры, принимаемые сервером.

Параметр Обязательное поле По умолчанию. Description
entry_script Истина Н/П Относительный или абсолютный путь к сценарию оценки.
model_dir False Н/П Относительный или абсолютный путь к каталогу, в котором хранится модель, используемая для вывода.
port False 5001 Служебный порт сервера.
worker_count False 1 Количество рабочих потоков, с помощью которых обрабатываются одновременные запросы.
appinsights_instrumentation_key False Н/П Ключ инструментирования для аналитики приложений, где будут опубликованы журналы.
access_control_allow_origins False Н/П Включите CORS для указанных источников. Разделите несколько источников с ",".
Пример: "microsoft.com, bing.com"

Поток запроса

Ниже описано, как http-сервер вывода Машинное обучение Azure (azmlinfsrv) обрабатывает входящие запросы:

  1. Оболочка интерфейса командной строки Python обеспечивает взаимодействие с сетевым стеком сервера и используется для запуска сервера.
  2. Клиент отправляет запрос на сервер.
  3. При получении запрос обрабатывается сервером WSGI и отправляется в один из рабочих процессов.
    • Gunicorn используется в Linux.
    • Waitress используется в Windows.
  4. Затем запросы обрабатываются приложением Flask, которое загружает начальный сценарий и все зависимости.
  5. Наконец, запрос отправляется в начальный сценарий. Затем начальный сценарий направляет вызов вывода в загруженную модель и возвращает ответ.

Схема процесса HTTP-сервера.

Общие сведения о журналах

Здесь описаны журналы http-сервера вывода Машинное обучение Azure. Журнал можно получить при локальном azureml-inference-server-http запуске или получить журналы контейнеров, если вы используете сетевые конечные точки.

Примечание.

Формат ведения журнала изменился с версии 0.8.0. Если вы найдете журнал в другом стиле, обновите azureml-inference-server-http пакет до последней версии.

Совет

Если вы используете сетевые конечные точки, журнал с сервера вывода начинается с Azure Machine Learning Inferencing HTTP server <version>.

Журналы запуска

При запуске сервера параметры сервера сначала отображаются в журналах следующим образом:

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.

Формат журнала

Журналы с сервера вывода создаются в следующем формате, за исключением скриптов средства запуска, так как они не являются частью пакета Python:

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

Ниже <pid> приведен идентификатор процесса и <level> первый символ уровня ведения журнала — E for ERROR, I for INFO и т. д.

В Python имеется шесть уровней ведения журнала с числами, связанными с серьезностью:

Уровень ведения журнала Числовое значение
КРИТИЧЕСКИЕ 50
ОШИБКА 40
ПРЕДУПРЕЖДЕНИЕ 30
INFO 20
ОТЛАДКА 10
NOTSET 0

Руководство по устранению неполадок

В этом разделе приведены основные советы по устранению неполадок для Машинное обучение Azure HTTP-сервера вывода. Если вы хотите устранить неполадки с сетевыми конечными точками, см. также сведения об устранении неполадок при развертывании конечных точек в Сети.

Основные этапы

Ниже приведены основные действия по устранению неполадок.

  1. Сбор сведений о версии для среды Python.
  2. Убедитесь, что версия пакета python azureml-inference-server-http, указанная в файле среды, соответствует версии HTTP-сервера для вывода AzureML, отображаемой в журнале запуска. Иногда сопоставитель зависимостей pip приводит к непредвиденным версиям установленных пакетов.
  3. Если вы указываете Flask (и его зависимости) в вашей среде, удалите их. Зависимости включают Flask, , Jinja2, itsdangerous, Werkzeugи MarkupSafeclick. 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, например не удается импортировать имя Markup из 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
  • схема вывода

Если вы указали azureml-defaults в среде Python, azureml-inference-server-http пакет зависит от и будет установлен автоматически.

Совет

Если вы используете пакет SDK для Python версии 1 и не явно указываете azureml-defaults в среде Python, пакет SDK может добавить для вас. Однако он заблокирует его до версии пакета SDK. Например, если версия пакета SDK является 1.38.0, она добавит azureml-defaults==1.38.0 требования к pip среды.

Часто задаваемые вопросы

1. При запуске сервера возникла следующая ошибка:


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

Вы установили Flask 2 в среде Python, но используете версию azureml-inference-server-http, которая не поддерживает Flask 2. Поддержка Flask 2 добавлена в azureml-inference-server-http>=0.7.0, который также находится в azureml-defaults>=1.44.

  • Если вы не используете этот пакет в образе Docker AzureML, используйте последнюю версию azureml-inference-server-http или azureml-defaults.

  • Если вы используете этот пакет с образом Docker AzureML, убедитесь, что вы используете образ, созданный в июле 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, Materializaton Build:20220708.v2
    2022-08-22T17:05:02,188930082+00:00 | gunicorn/run | 
    2022-08-22T17:05:02,190557998+00:00 | gunicorn/run | 
    

    Дата сборки образа отображается после фразы "Сборка материализации". В приведенном выше примере это 20220708 или 8 июля 2022 г. Этот образ совместим с Flask 2. Если в журнале контейнеров не отображаются эти сведения, значит образ устарел и должен быть обновлен. Если вы используете образ CUDA и не можете найти более новый образ, проверка, если образ не рекомендуется использовать в AzureML-Containers. Если это так, вы сможете найти замены.

  • Если вы используете сервер с веб-конечной точкой, вы также можете найти журналы в разделе "Журналы развертывания" на странице веб-конечной точки в Студия машинного обучения Azure. Если вы развертываете пакет SDK версии 1 и не указываете образ в конфигурации развертывания явным образом, по умолчанию используется версия openmpi4.1.0-ubuntu20.04, которая соответствует локальному набору инструментов пакета SDK и может не быть последней версией образа. Например, пакет SDK 1.43 по умолчанию будет использовать openmpi4.1.0-ubuntu20.04:20220616, что несовместимо. Убедитесь, что для развертывания используется последняя версия пакета SDK.

  • Если по какой-либо причине вы не можете обновить образ, вы можете временно избежать проблемы, закрепив azureml-defaults==1.43 или azureml-inference-server-http~=0.4.13, что позволит установить сервер более старой версии с Flask 1.0.x.

2. Во время запуска обнаружены ошибки ImportError или ModuleNotFoundError в модулях opencensus, jinja2, MarkupSafe или click, аналогичные следующему сообщению:

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

Более старые версии (<= 0.4.10) сервера не закрепляли зависимость Flask к совместимым версиям. Эта проблема исправлена в последней версии сервера.

Следующие шаги