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


Расширяемость готовых образов Docker с помощью пакетов Python (предварительная версия)

ПРИМЕНЯЕТСЯ К:Пакет SDK машинного обучения Azure версии 1 для Python

Внимание

В этой статье содержатся сведения об использовании пакета SDK машинного обучения Azure версии 1. Пакет SDK версии 1 не рекомендуется использовать 31 марта 2025 г. и поддержка этого пакета завершится 30 июня 2026 г. Вы можете установить и использовать пакет SDK версии 1 до этой даты.

Рекомендуется перейти на пакет SDK версии 2 до 30 июня 2026 г. Дополнительные сведения о пакете SDK версии 2 см. в статье "Что такое пакет SDK для Python для Машинного обучения Azure версии 2 " и справочник по пакету SDK версии 2.

Готовые образы Docker для вывода модели содержат пакеты для популярных платформ машинного обучения. Существует два способа добавить пакеты Python без перестроения образа Docker.

  • Динамическая установка. Этот подход использует файл требований для автоматического восстановления пакетов Python при загрузке контейнера Docker.

    Он подходит для быстрого создания прототипов. При запуске образа пакеты восстанавливаются с помощью файла requirements.txt. Этот метод увеличивает время начальной загрузки образа, и вам потребуется дольше подождать, прежде чем развертывание сможет обслуживать запросы.

  • Предварительно установленные пакеты Python. Вы указываете каталог, содержащий предустановленные пакеты Python. Во время развертывания этот каталог подключается в контейнер для вашего начального сценария (score.py).

    Это подход следует использовать для развертывания в рабочей среде. Поскольку каталог, содержащий пакеты, подключается к образу, его можно использовать, даже если в развертывании отсутствует доступ к Интернету (например, при развертывании в защищенной виртуальной сети Azure).

Внимание

Расширяемость готовых образов Docker c Машинным обучением Azure с помощью пакетов Python в настоящее время доступна в виде предварительной версии. Функция предварительной версии предоставляется "как есть", без гарантии поддержки или соглашения об уровне обслуживания. Дополнительные сведения см. в статье Дополнительные условия использования предварительных версий Microsoft Azure.

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

Динамическая установка

В этом подходе используется файл требований для автоматического восстановления пакетов Python при запуске образа.

Чтобы расширить готовый образ контейнера Docker с помощью файла requirements.txt, выполните указанные ниже действия.

  1. Создайте файл requirements.txt вместе со скриптом score.py.
  2. Добавьте в файл requirements.txt необходимые пакеты.
  3. Задайте расположение файла AZUREML_EXTRA_REQUIREMENTS_TXT в качестве значения переменной среды в requirements.txt.

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

Совет

Даже при создании прототипов рекомендуется фиксировать в файле requirements.txt версию каждого пакета. Например, вместо scipy == 1.2.3 или даже scipy используйте scipy > 1.2.3. Если вы не зафиксируете определенную версию и появится новый выпуск scipy, это может привести к сбою скрипта оценки и ошибкам во время развертывания и масштабирования.

В следующем примере иллюстрируется установка переменной среды AZUREML_EXTRA_REQUIRMENTS_TXT:

from azureml.core import Environment
from azureml.core.conda_dependencies import CondaDependencies 

myenv = Environment(name="my_azureml_env")
myenv.docker.enabled = True
myenv.docker.base_image = <MCR-path>
myenv.python.user_managed_dependencies = True

myenv.environment_variables = {
    "AZUREML_EXTRA_REQUIREMENTS_TXT": "requirements.txt"
}

Следующая схема наглядно представляет процесс динамической установки:

Схема процесса динамической установки

Предварительно установленные пакеты Python

В рамках этого подхода в образ подключается предоставленный вами каталог. Затем пакеты Python из этого каталога можно использовать в начальном сценарии (score.py).

Чтобы расширить готовый образ контейнера Docker с помощью предварительно установленных пакетов Python, выполните указанные ниже действия.

Внимание

В зависимости от используемого образа необходимо использовать пакеты, совместимые с Python 3.8 или 3.8.

  1. Создайте виртуальную среду с помощью virtualenv.

  2. Установите зависимости. При наличии списка зависимостей в файле requirements.txt вы можете использовать его для установки с помощью команды pip install -r requirements.txt (для отдельных зависимостей — с помощью команды pip install).

  3. При указании переменной среды AZUREML_EXTRA_PYTHON_LIB_PATH задавайте правильный каталог пакетов сайта, который зависит от названия среды и версии Python. В следующем коде показано, как задать путь к виртуальной среде с именем myenv и Python 3.8:

    from azureml.core import Environment
    from azureml.core.conda_dependencies import CondaDependencies 
    
    myenv = Environment(name='my_azureml_env')
    myenv.docker.enabled = True
    myenv.docker.base_image = <MCR-path>
    myenv.python.user_managed_dependencies = True
    
    myenv.environment_variables = {
        "AZUREML_EXTRA_PYTHON_LIB_PATH": "myenv/lib/python3.8/site-packages"
    }
    

Следующая схема наглядно представляет процесс использования предварительно установленных пакетов:

Схема процесса с использованием предварительно установленных пакетов

Распространенные проблемы

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

Вот некоторые моменты, которые могут вызвать эту проблему.

  • virtualenv по умолчанию создает изолированную среду. После активации виртуальной среды использовать глобальные зависимости нельзя.
  • Если ваша переменная среды PYTHONPATH указывает на глобальные зависимости, это может повлиять на работу виртуальной среды. После активации среды запустите команды pip list и pip freeze, чтобы убедиться в отсутствии в среде ненужных зависимостей.
  • При одновременной работе сред Conda и virtualenv могут возникать проблемы. Не используйте среду Conda и virtualenv параллельно.

Ограничения

Model.package()

  • Метод Model.package() позволяет создать пакет модели в виде образа Docker или контекста сборки Dockerfile. При вызове метода Model.package() с готовыми образами Docker запускается промежуточная сборка образа, которая заменяет обычного пользователя на пользователя root.

  • Рекомендуем использовать наши решения для расширения с помощью пакетов Python. Если вам требуются другие зависимости (например, пакеты apt), создайте собственный файл Dockerfile на основе образа вывода.

Часто задаваемые вопросы

  • При использовании файла requirements.txt для расширения обязательно ли этот файл должен называться requirements.txt?

    myenv.environment_variables = {
        "AZUREML_EXTRA_REQUIREMENTS_TXT": "name of your pip requirements file goes here"
    }
    
  • В чем основные различия подходов с использованием requirements.txt и с подключением?

    Для создания прототипов используйте файл requirements.txt. Через некоторое время, когда вы будете точно знать, какие пакеты (и версии) необходимы для успешного развертывания модели, переходите на подход с использованием подключения.

    Ниже приведено подробное сравнение.

    Позиция Requirements.txt (динамическая установка) Подключение пакетов
    Решение Создайте файл requirements.txt, который устанавливает указанные пакеты при запуске контейнера. Создайте локальную среду Python со всеми зависимостями. Подключите этот каталог к контейнеру на этапе выполнения.
    Установка пакетов Установки дополнительных компонентов не требуется (предполагается, что pip уже установлен) Установка виртуальной среды или среды conda.
    Установка виртуальной среды Дополнительная настройка виртуальной среды не требуется, так как пользователи могут для создания requirements.txt загрузить текущую локальную среду с помощью pip freeze. Необходимо настроить чистую виртуальную среду, и в зависимости от текущей локальной среды пользователя могут потребоваться дополнительные действия.
    Отладка Простота настройки и отладки сервера, так как зависимости четко перечислены. Если виртуальная среда не создана с нуля, при отладке сервера могут возникать проблемы. Например, может быть неясно, с чем (со средой или пользовательским кодом) связаны ошибки.
    Единообразный процесс горизонтального масштабирования Единообразия нет (все зависит от внешних пакетов PyPi и пользователей, фиксирующих разные версии зависимостей). Внешние загружаемые файлы могут быть ненадежными. Используется исключительно среда пользователя, поэтому проблем с единообразием нет.
  • Почему в контейнере нет файла requirements.txt и подключенного каталога с зависимостями?

    Убедитесь, что переменные среды заданы правильно на локальном уровне. Затем проверьте правильность указанных путей и их существование. Проверьте, правильно ли задан исходный каталог в конструкторе конфигурации вывода.

  • Можно ли переопределить зависимости пакетов Python в готовом образе Docker?

    Да. Если вам нужна другая версия пакета Python (отличная от той, что уже установлена в образе вывода), наше решение для расширения будет использовать вашу версию. Убедитесь в отсутствии конфликтов между двумя версиями.

Рекомендации

Исправления ошибок

2021-07-26

  • AZUREML_EXTRA_REQUIREMENTS_TXT и AZUREML_EXTRA_PYTHON_LIB_PATH теперь всегда зависят от каталога скрипта оценки. Например, если файл requirements.txt и скрипт оценки расположены в каталоге my_folder, для AZUREML_EXTRA_REQUIREMENTS_TXT нужно задать значение requirements.txt. Для переменной AZUREML_EXTRA_REQUIREMENTS_TXT больше не нужно указывать значение в формате my_folder/requirements.txt.

Следующие шаги

Дополнительные сведения о развертывании модели см. в этой статье.

Сведения об устранении неполадок с развертыванием готовых образов Docker см. в этой статье.