Поделиться через


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

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

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

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

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

Чтобы использовать HTTP-сервер вывода Машинное обучение Azure для локальной отладки, конфигурация должна содержать следующие компоненты:

  • Python 3.8 или более поздней версии
  • Anaconda

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

Изучение параметров локальной отладки для сетевых конечных точек

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

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

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

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

Сценарий HTTP-сервер вывода Локальная конечная точка
Обновление локальной среды Python без перестроения образа Docker Да Нет
Обновление сценария оценки Да Да
Обновление конфигураций развертывания (развертывание, среда, код, модель) No Да
Интеграция отладчика Microsoft Visual Studio Code (VS 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. Установите пакет azureml-inference-server-http из веб-канала PyPI.

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

Чтобы использовать 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. В командном окне запустите HTTP-сервер вывода с помощью azmlinfsrv --entry_script score.py команды.

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

      1. Выберите "Запустить запуск отладки>" или используйте сочетание клавиш F5.

      2. В командном окне просмотрите журналы с сервера вывода и найдите идентификатор azmlinfsrv процесса команды (а не gunicorn):

        Снимок экрана: окно команды, отображающее журналы из HTTP-сервера вывода и идентификатор процесса выделенной команды azmlinfsrv.

      3. В отладчике VS Code введите идентификатор azmlinfsrv процесса команды.

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

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

Использование комплексного примера

Следующая процедура выполняет сервер локально с примерами файлов (скрипт оценки, файла модели и среды) из репозитория Машинное обучение Azure примера. Дополнительные примеры использования этих примеров файлов см. в статье "Развертывание и оценка модели машинного обучения с помощью сетевой конечной точки".

  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. Запустите 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-сервер вывода принимает следующие параметры:

Параметр Обязательное поле По умолчанию. Описание:
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.

Изучение обработки запросов сервера

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

  1. Оболочка интерфейса командной строки Python обеспечивает взаимодействие с сетевым стеком сервера и используется для запуска сервера.

  2. Клиент отправляет запрос на сервер.

  3. Сервер отправляет запрос через сервер интерфейса шлюза веб-сервера (WSGI), который отправляет запрос рабочему приложению Flask:

  4. Приложение Flask рабочей роли обрабатывает запрос, который включает загрузку скрипта записи и любых зависимостей.

  5. Скрипт записи получает запрос. Скрипт записи вызывает вывод в загруженную модель и возвращает ответ:

Схема, показывающая, как http-сервер вывода обрабатывает входящие запросы.

Изучение журналов сервера

Существует два способа получения данных журнала для теста HTTP-сервера вывода:

  • azureml-inference-server-http Запустите пакет локально и просмотрите выходные данные журналов.
  • Используйте сетевые конечные точки и просмотрите журналы контейнеров. Журнал для сервера вывода называется Машинное обучение Azure версии> 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>: идентификатор процесса, связанного с записью.
  • <level>: первый символ уровня ведения журнала для записи, например E error, I for INFO и т. д.
  • <logger name>: имя ресурса, связанного с записью журнала.
  • <message>: содержимое сообщения журнала.

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

Уровень ведения журнала Числовое значение
КРИТИЧЕСКИЙ; 50
ERROR 40
ПРЕДУПРЕЖДЕНИЕ 30
ИНФОРМАЦИЯ 20
ОТЛАЖИВАТЬ 10
NOTSET 0

Устранение неполадок с сервером

В следующих разделах приведены основные советы по устранению неполадок для Машинное обучение Azure http-сервера вывода. Сведения об устранении неполадок с сетевыми конечными точками см. в статье "Устранение неполадок с сетевыми конечными точками".

Проверка установленных пакетов

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

  1. Сбор сведений об установленных пакетах и версиях среды Python.

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

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

  3. Если указать Flask или его зависимости в вашей среде, удалите эти элементы.

    • Зависимые пакеты включают flask, , jinja2, itsdangerouswerkzeug, markupsafeи click.
    • flask отображается в качестве зависимости в пакете сервера. Лучший подход — разрешить серверу вывода установить flask пакет.
    • Когда сервер вывода настроен на поддержку новых версий Flask, сервер автоматически получает обновления пакета по мере их доступности.

Проверка версии сервера

Пакет azureml-inference-server-http сервера публикуется в PyPI. На странице PyPI перечислены журнал изменений и все предыдущие версии.

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

Версия пакета Description Проблема Решение
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

Если вы указали 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 среды.

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

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

  • Если вы не используете пакет Flask 2 в образе Docker Машинное обучение Azure, используйте последнюю версию azureml-inference-server-http пакета или azureml-defaults пакета.

  • Если вы используете пакет Flask 2 в образе Docker Машинное обучение Azure, убедитесь, что версия сборки образа — июль 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 8 июля 2022 г. Изображение в этом примере совместимо с Flask 2.

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

    Если вы используете сервер с веб-конечной точкой, вы также можете найти журналы на странице "Журналы" на странице "Конечные точки" в Студия машинного обучения Azure.

При развертывании с помощью пакета SDK версии 1 и явного указания образа в конфигурации развертывания сервер применяет openmpi4.1.0-ubuntu20.04 пакет с версией, которая соответствует локальному набору инструментов SDK. Однако установленная версия может быть не последней доступной версией образа.

Для пакета 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или markupsafeclickво время запуска сервера. В следующем примере показано сообщение об ошибке:

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

Ошибки импорта и модуля возникают при использовании версии 0.4.10 или более ранних версий сервера, которые не закрепляют зависимость Flask к совместимой версии. Чтобы предотвратить проблему, установите более позднюю версию сервера.