Отладка скрипта оценки с помощью 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 или проверить сервер с помощью фактического скрипта оценки, файла модели и файла среды из репозитория примеров.
Тестирование поведения сервера с помощью фиктивного скрипта оценки
Создайте каталог для размещения файлов:
mkdir server_quickstart cd server_quickstart
Чтобы предотвратить конфликты пакетов, создайте виртуальную среду и активируйте ее:
python -m venv myenv source myenv/bin/activate
Совет
После тестирования выполните деактивацию
deactivate
виртуальной среды Python.Установите пакет
azureml-inference-server-http
из веб-канала PyPI.python -m pip install azureml-inference-server-http
Создайте начальный сценарий (
score.py
). В следующем примере создается базовый начальный сценарий:echo ' import time def init(): time.sleep(1) def run(input_data): return {"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
).
Как интегрировать с Visual Studio Code
Существует два способа использования 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 }, ] }
Запустите сервер вывода с помощью ИНТЕРФЕЙСА командной строки (
azmlinfsrv --entry_script score.py
).Запуск сеанса отладки в VS Code.
- В VS Code выберите "Запустить" —> "Начать отладку" (или
F5
). - Введите идентификатор
azmlinfsrv
процесса (а неgunicorn
) с помощью журналов (с сервера вывода), отображаемых в CLI.
Примечание.
Если средство выбора процессов не отображается, введите идентификатор процесса вручную в
processId
поле поляlaunch.json
.- В VS Code выберите "Запустить" —> "Начать отладку" (или
В обоих случаях можно задать точку останова и выполнить отладку пошаговые инструкции.
Полный пример
В этом разделе мы будем запускать сервер локально с примерами файлов (скрипт оценки, файла модели и среды) в нашем примере репозитория. Примеры файлов также используются в нашей статье для развертывания и оценки модели машинного обучения с помощью сетевой конечной точки
Клонируйте репозиторий.
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()
Запустите сервер вывода с указанием скрипта оценки и файла модели. Указанный каталог модели (
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
Результат оценки будет возвращен, если в скрипте оценки нет проблем. Если вы нашли что-то неправильное, можно попытаться обновить скрипт оценки и снова запустить сервер, чтобы проверить обновленный скрипт.
Маршруты сервера
Сервер прослушивает порт 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) обрабатывает входящие запросы:
- Оболочка интерфейса командной строки Python обеспечивает взаимодействие с сетевым стеком сервера и используется для запуска сервера.
- Клиент отправляет запрос на сервер.
- При получении запрос обрабатывается сервером WSGI и отправляется в один из рабочих процессов.
- Затем запросы обрабатываются приложением Flask, которое загружает начальный сценарий и все зависимости.
- Наконец, запрос отправляется в начальный сценарий. Затем начальный сценарий направляет вызов вывода в загруженную модель и возвращает ответ.
Общие сведения о журналах
Здесь описаны журналы 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-сервера вывода. Если вы хотите устранить неполадки с сетевыми конечными точками, см. также сведения об устранении неполадок при развертывании конечных точек в Сети.
Основные этапы
Ниже приведены основные действия по устранению неполадок.
- Сбор сведений о версии для среды Python.
- Убедитесь, что версия пакета python azureml-inference-server-http, указанная в файле среды, соответствует версии HTTP-сервера для вывода AzureML, отображаемой в журнале запуска. Иногда сопоставитель зависимостей pip приводит к непредвиденным версиям установленных пакетов.
- Если вы указываете Flask (и его зависимости) в вашей среде, удалите их. Зависимости включают
Flask
, ,Jinja2
,itsdangerous
,Werkzeug
иMarkupSafe
click
. 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 к совместимым версиям. Эта проблема исправлена в последней версии сервера.
Следующие шаги
- Дополнительные сведения о создании начального сценария и развертывании моделей см. в статье Развертывание моделей с помощью Машинного обучения Azure.
- Дополнительные сведения о готовых образах Docker для вывода