Упаковка зарегистрированной модели с помощью Docker
В этой статье описано, как упаковать зарегистрированную модель Машинного обучения Azure с помощью Docker.
Необходимые компоненты
В этой статье предполагается, что вы уже обучили и зарегистрировали модель в рабочей области машинного обучения. Чтобы узнать, как обучить и зарегистрировать модель scikit-learn, следуйте указаниям этого руководства.
Упаковка моделей
Иногда может потребоваться создание образа Docker без развертывания модели. Также можно скачать образ и запустить его в локальной установке Docker. Может даже потребоваться скачать файлы, используемые для создания образа, проверить их, изменить и создать образ вручную.
Упаковка модели позволяет выполнять эти задачи. Эта функция упаковывает все ресурсы, необходимые для размещения модели в качестве веб-службы, и позволяет скачать полностью созданный образ Docker или файлы, необходимые для его создания. Упаковку модели можно использовать двумя способами.
Скачивание упакованной модели. Скачайте образ Docker, содержащий модель и другие файлы, необходимые для размещения его в качестве веб-службы.
Создание Dockerfile. Скачайте Dockerfile, модель, сценарий входа и другие ресурсы, необходимые для создания образа Docker. Затем можно проверить файлы или внести изменения, а затем создать образ локально.
Оба пакета можно использовать для получения локального образа Docker.
Совет
Создание пакета аналогично развертыванию модели. При этом используется зарегистрированная модель и конфигурация вывода.
Внимание
Чтобы скачать полностью созданный образ или создать образ локально, необходимо установить Docker в среде разработки.
Скачивание упакованной модели
В следующем примере создается образ, который регистрируется в Реестре контейнеров Azure для вашей рабочей области:
package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)
После создания пакета можно использовать package.pull()
, чтобы извлечь образ в локальную среду Docker. В выходных данных этой команды будет указано имя образа. Например:
Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338
.
Скачав модель, используйте команду docker images
, чтобы вывести список локальных образов:
REPOSITORY TAG IMAGE ID CREATED SIZE
myworkspacef78fd10.azurecr.io/package 20190822181338 7ff48015d5bd 4 minutes ago 1.43 GB
Чтобы запустить локальный контейнер на основе этого образа, используйте следующую команду для запуска именованного контейнера из оболочки или командной строки. Замените значение <imageid>
идентификатором образа, возвращенным командой docker images
.
docker run -p 6789:5001 --name mycontainer <imageid>
Эта команда запускает последнюю версию образа с именем myimage
. Она сопоставляет локальный порт 6789 с портом контейнера, настроенным на ожидание передачи данных от веб-службы (5001). Она также присваивает контейнеру имя mycontainer
, что облегчает остановку контейнера. После запуска контейнера можно отправлять запросы в http://localhost:6789/score
.
Создание Dockerfile и зависимостей
В следующем примере показано, как скачать Dockerfile, модель и другие ресурсы, необходимые для локального создания образа. Параметр generate_dockerfile=True
указывает, что требуются файлы, а не полностью созданный образ.
package = Model.package(ws, [model], inference_config, generate_dockerfile=True)
package.wait_for_creation(show_output=True)
# Download the package.
package.save("./imagefiles")
# Get the Azure container registry that the model/Dockerfile uses.
acr=package.get_container_registry()
print("Address:", acr.address)
print("Username:", acr.username)
print("Password:", acr.password)
Этот код позволяет скачать файлы, необходимые для создания образа, в каталог imagefiles
. Dockerfile, который входит в набор сохраненных файлов, ссылается на базовый образ, хранящийся в Реестре контейнеров Azure. При создании образа в локальной установке Docker необходимо использовать адрес, имя пользователя и пароль для проверки подлинности в реестре. Выполните следующие действия, чтобы создать образ с помощью локальной установки Docker.
Запустите следующую команду из оболочки или сеанса командной строки, чтобы проверить подлинность Docker с помощью Реестра контейнеров Azure. Замените
<address>
,<username>
и<password>
значениями, полученными с помощьюpackage.get_container_registry()
.docker login <address> -u <username> -p <password>
Запустите создание образа, используя следующую команду. Замените
<imagefiles>
на путь к каталогу, в котором были сохранены файлы при выполненииpackage.save()
.docker build --tag myimage <imagefiles>
Эта команда присваивает образу имя
myimage
.
Чтобы убедиться, что образ создан, используйте команду docker images
. Список должен содержать образ myimage
.
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 2d5ee0bf3b3b 49 seconds ago 1.43 GB
myimage latest 739f22498d64 3 minutes ago 1.43 GB
Чтобы запустить новый контейнер на основе этого образа, используйте следующую команду:
docker run -p 6789:5001 --name mycontainer myimage:latest
Эта команда запускает последнюю версию образа с именем myimage
. Она сопоставляет локальный порт 6789 с портом контейнера, настроенным на ожидание передачи данных от веб-службы (5001). Она также присваивает контейнеру имя mycontainer
, что облегчает остановку контейнера. После запуска контейнера можно отправлять запросы в http://localhost:6789/score
.
Пример клиента для тестирования локального контейнера
Следующий код представляет собой пример клиента Python, который можно использовать с контейнером:
import requests
import json
# URL for the web service.
scoring_uri = 'http://localhost:6789/score'
# Two sets of data to score, so we get two results back.
data = {"data":
[
[ 1,2,3,4,5,6,7,8,9,10 ],
[ 10,9,8,7,6,5,4,3,2,1 ]
]
}
# Convert to JSON string.
input_data = json.dumps(data)
# Set the content type.
headers = {'Content-Type': 'application/json'}
# Make the request and display the response.
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)
Примеры клиентов на других языках программирования см. в статье Использование моделей, развернутых в качестве веб-служб.
Остановка контейнера Docker
Чтобы остановить работу контейнера, запустите следующую команду из другой оболочки или командной строки:
docker kill mycontainer
Следующие шаги
- Устранение неполадок при развертывании
- развертывание в Службе Azure Kubernetes.
- Создание клиентских приложений для использования веб-служб
- Обновление веб-службы
- Развертывание модели с помощью пользовательского образа Docker
- Использование TLS для защиты веб-службы с помощью Машинного обучения Azure.
- Мониторинг моделей машинного обучения в Azure с помощью Application Insights
- Сбор данных для моделей в рабочей среде
- Создание предупреждений и триггеров событий для развертываний моделей