Отладка скриптов оценки с помощью 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 .
- Запустите фактический скрипт оценки, файл модели и файл среды из репозитория примеров.
Тестирование поведения сервера с помощью скрипта фиктивной оценки
Создайте каталог с именем server_quickstart для хранения файлов:
mkdir server_quickstart cd server_quickstart
Чтобы избежать конфликтов пакетов, создайте виртуальную среду, например myenv, и активируйте ее:
python -m virtualenv myenv
Примечание.
В Linux выполните
source myenv/bin/activate
команду, чтобы активировать виртуальную среду.После тестирования сервера можно выполнить
deactivate
команду, чтобы отключить виртуальную среду Python.Установите пакет
azureml-inference-server-http
из веб-канала PyPI.python -m pip install azureml-inference-server-http
Создайте скрипт записи. В следующем примере создается базовый скрипт записи и сохраняется в файл с именем 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
Запустите сервер с
azmlinfsrv
помощью команды и задайте файл score.py в качестве скрипта записи:azmlinfsrv --entry_script score.py
Примечание.
Сервер размещен на сайте 0.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
помощью команды.
Интеграция с Visual Studio Code
Чтобы использовать VS Code и расширение Python для отладки с пакетом azureml-inference-server-http , можно использовать режимы запуска и подключения.
В режиме запуска настройте файл launch.json в VS Code и запустите HTTP-сервер вывода Машинное обучение Azure в VS Code:
Запустите VS Code и откройте папку, содержащую скрипт (score.py).
Добавьте следующую конфигурацию в файл 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" ] } ] }
Запустите сеанс отладки в VS Code, выбрав запустить запуск>отладки или используйте сочетание клавиш F5.
В режиме подключения запустите http-сервер вывода Машинное обучение Azure в командном окне и используйте VS Code с расширением Python для подключения к процессу:
Примечание.
Для Linux сначала установите
gdb
пакет, выполнивsudo apt-get install -y gdb
команду.Добавьте следующую конфигурацию в файл 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 } ] }
В командном окне запустите HTTP-сервер вывода с помощью
azmlinfsrv --entry_script score.py
команды.Запустите сеанс отладки в VS Code:
Выберите "Запустить запуск отладки>" или используйте сочетание клавиш F5.
В командном окне просмотрите журналы с сервера вывода и найдите идентификатор
azmlinfsrv
процесса команды (а неgunicorn
):В отладчике VS Code введите идентификатор
azmlinfsrv
процесса команды.Если средство выбора процессов VS Code не отображается, можно вручную ввести идентификатор процесса в
processId
поле файла launch.json для этой рабочей области.
Для обоих режимов можно задать точки останова и выполнить отладку скрипта пошаговые инструкции.
Использование комплексного примера
Следующая процедура выполняет сервер локально с примерами файлов (скрипт оценки, файла модели и среды) из репозитория Машинное обучение Azure примера. Дополнительные примеры использования этих примеров файлов см. в статье "Развертывание и оценка модели машинного обучения с помощью сетевой конечной точки".
Клонируйте репозиторий примера.
git clone --depth 1 https://github.com/Azure/azureml-examples cd azureml-examples/cli/endpoints/online/model-1/
Создайте и активируйте виртуальную среду с помощью 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
Просмотрите скрипт оценки:
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()
Запустите HTTP-сервер вывода, указав скрипт оценки и файл модели:
Каталог модели, указанный в параметре
model_dir
, определяется с помощьюAZUREML_MODEL_DIR
переменной и извлекается в скрипте оценки.В этом случае необходимо указать текущий каталог ./ , так как подкаталог указан в скрипте оценки как model/sklearn_regression_model.pkl.
azmlinfsrv --entry_script ./onlinescoring/score.py --model_dir ./
Когда сервер запускает и успешно вызывает скрипт оценки, откроется пример журнала запуска. В противном случае в журнале отображаются сообщения об ошибках.
Протестируйте скрипт оценки с примерами данных:
Откройте другое командное окно и перейдите в тот же рабочий каталог, где выполняется команда.
Используйте служебную
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
) обрабатывает входящие запросы:
Оболочка интерфейса командной строки Python обеспечивает взаимодействие с сетевым стеком сервера и используется для запуска сервера.
Клиент отправляет запрос на сервер.
Сервер отправляет запрос через сервер интерфейса шлюза веб-сервера (WSGI), который отправляет запрос рабочему приложению Flask:
Приложение Flask рабочей роли обрабатывает запрос, который включает загрузку скрипта записи и любых зависимостей.
Скрипт записи получает запрос. Скрипт записи вызывает вывод в загруженную модель и возвращает ответ:
Изучение журналов сервера
Существует два способа получения данных журнала для теста 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-сервера вывода. Сведения об устранении неполадок с сетевыми конечными точками см. в статье "Устранение неполадок с сетевыми конечными точками".
Проверка установленных пакетов
Выполните следующие действия, чтобы устранить проблемы с установленными пакетами.
Сбор сведений об установленных пакетах и версиях среды Python.
Убедитесь, что
azureml-inference-server-http
версия пакета Python, указанная в файле среды, соответствует версии http-сервера вывода Машинное обучение Azure, отображаемой в журнале запуска.В некоторых случаях сопоставитель зависимостей pip устанавливает непредвиденные версии пакета. Возможно, потребуется выполнить исправление
pip
установленных пакетов и версий.Если указать Flask или его зависимости в вашей среде, удалите эти элементы.
- Зависимые пакеты включают
flask
, ,jinja2
,itsdangerous
werkzeug
,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
или markupsafe
click
во время запуска сервера. В следующем примере показано сообщение об ошибке:
ImportError: cannot import name 'Markup' from 'jinja2'
Ошибки импорта и модуля возникают при использовании версии 0.4.10 или более ранних версий сервера, которые не закрепляют зависимость Flask к совместимой версии. Чтобы предотвратить проблему, установите более позднюю версию сервера.