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


Упаковка зарегистрированной модели с помощью 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.

  1. Запустите следующую команду из оболочки или сеанса командной строки, чтобы проверить подлинность Docker с помощью Реестра контейнеров Azure. Замените <address>, <username> и <password> значениями, полученными с помощью package.get_container_registry().

    docker login <address> -u <username> -p <password>
    
  2. Запустите создание образа, используя следующую команду. Замените <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

Дальнейшие действия