Использование класса среды с конвейерными запусками

Я использую этап оценки для конвейера с использованием класса Environment, чтобы иметь собственный образ Docker, поскольку мне нужны некоторые apt-get пакеты, чтобы можно было установить определенный пакет pip. Из журналов видно, что он полностью игнорирует, в отличие от версии средства оценки без конвейера, докер-часть переменной среды. Очень просто, это кажется сломанным:

Я использую SDK v1.0.65, и мой файл докеров полностью игнорируется, я использую

FROM mcr.microsoft.com/azureml/base:latest\nRUN apt-get update && apt-get -y install freetds-dev freetds-bin vim gcc

в свойстве base_dockerfile моего кода. Вот фрагмент моего кода:

from azureml.core import Environment
from azureml.core.environment import CondaDependencies
conda_dep = CondaDependencies()
conda_dep.add_pip_package('pymssql==2.1.1')
myenv = Environment(name="mssqlenv")
myenv.python.conda_dependencies=conda_dep
myenv.docker.enabled = True
myenv.docker.base_dockerfile = 'FROM mcr.microsoft.com/azureml/base:latest\nRUN apt-get update && apt-get -y install freetds-dev freetds-bin vim gcc'
myenv.docker.base_image = None

Это хорошо работает, когда я использую оценщик отдельно, но если я вставлю этот оценщик в конвейер, он не сработает. Вот мой код для его запуска из конвейера:

from azureml.pipeline.steps import EstimatorStep

sql_est_step = EstimatorStep(name="sql_step", 
                         estimator=est, 
                         estimator_entry_script_arguments=[],
                         runconfig_pipeline_params=None, 
                         compute_target=cpu_cluster)
from azureml.pipeline.core import Pipeline
from azureml.core import Experiment
pipeline = Pipeline(workspace=ws, steps=[sql_est_step])
pipeline_run = exp.submit(pipeline)

При запуске в журналах службы строительства контейнеров обнаруживается:

FROM continuumio/miniconda3:4.4.10... etc.

Это означает, что он игнорирует мой оператор FROM mcr.... в классе Environment, который я связал с этим оценщиком, и мой pip install не работает.

Я что-то упускаю? Есть ли обходной путь?


person omartin2010    schedule 08.10.2019    source источник


Ответы (3)


Я могу подтвердить, что это ошибка на стороне конвейера AML. В частности, свойство runconfig environment.docker.base_dockerfile неправильно передается в заданиях конвейера. Мы работаем над исправлением. А пока вы можете использовать обходной путь из этого потока, сначала создав образ докера и указав его с помощью environment.docker.base_image (который передается правильно).

person Alex Kalita    schedule 09.10.2019

На данный момент я нашел обходной путь - создать собственный образ Docker. Вы можете сделать это, используя следующие параметры DockerSection среды:

myenv.docker.base_image_registry.address = '<your_acr>.azurecr.io'
myenv.docker.base_image_registry.username = '<your_acr>'
myenv.docker.base_image_registry.password = '<your_acr_password>'
myenv.docker.base_image = '<your_acr>.azurecr.io/testimg:latest'

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

Чтобы создать образ, вы должны запустить что-то вроде этого в командной строке машины, которая может создать контейнер на основе Linux (например, виртуальную машину Notebook):

docker build . -t <your_image_name>
# Tag it for upload
docker tag <your_image_name:latest <your_acr>.azurecr.io/<your_image_name>:latest
# Login to Azure
az login
# login to the container registry so that the push will work
az acr login --name <your_acr>
# push the image
docker push <your_acr>.azurecr.io/<your_image_name>:latest

Как только изображение будет отправлено, вы сможете заставить его работать.

person omartin2010    schedule 09.10.2019

Я также изначально использовал EstimatorStep для пользовательских изображений, но недавно понял, как успешно передать Environment сначала RunConfiguration, а затем PythonScriptStep. (пример ниже)

Другой обходной путь, аналогичный вашему обходному пути, - публикация вашего пользовательского образа докера в Docker Hub, тогда параметр docker_base_image становится URI, в нашем случае mmlspark:0.16.

def get_environment(env_name, yml_path, user_managed_dependencies, enable_docker, docker_base_image):
    env = Environment(env_name)
    cd = CondaDependencies(yml_path)
    env.python.conda_dependencies = cd
    env.python.user_managed_dependencies = user_managed_dependencies
    env.docker.enabled = enable_docker
    env.docker.base_image = docker_base_image
    return env


spark_env = f.get_environment(env_name='spark_env',
                              yml_path=os.path.join(os.getcwd(), 'compute/aml_config/spark_compute_dependencies.yml'),
                              user_managed_dependencies=False, enable_docker=True,
                              docker_base_image='microsoft/mmlspark:0.16')

# use pyspark framework
spark_run_config = RunConfiguration(framework="pyspark")
spark_run_config.environment = spark_env

roll_step = PythonScriptStep(
    name='rolling window',
    script_name='roll.py',
    arguments=['--input_dir', joined_data,
                '--output_dir', rolled_data,
                '--script_dir', ".",
                '--min_date', '2015-06-30',
                '--pct_rank', 'True'],
    compute_target=compute_target_spark,
    inputs=[joined_data],
    outputs=[rolled_data],
    runconfig=spark_run_config,
    source_directory=os.path.join(os.getcwd(), 'compute', 'roll'),
    allow_reuse=pipeline_reuse
)


Еще пара моментов (которые могут быть неправильными):

  • PythonScriptStep фактически является оболочкой для ScriptRunConfig, которая принимает run_config в качестве аргумента
  • Estimator - это оболочка для ScriptRunConfig, где RunConfig настройки доступны как параметры
  • IMHO EstimatorStep не должно существовать, потому что лучше определять Env и Steps отдельно, а не одновременно в одном вызове.
person Anders Swanson    schedule 09.10.2019
comment
Спасибо! Документация по sdk исчерпывающая, но понимание того, как ее использовать, сбивает с толку ... говорит этот ~ 11-летний ветеран программирования на Python! - person Majid alDosari; 31.12.2020
comment
@MajidalDosari, ты и я оба! Но SDK в последнее время стал намного более стабильным и мощным (если вы знаете, что с ним делать). Я подписываюсь на тег Azure ML SO, поэтому задавайте больше вопросов по мере их появления! - person Anders Swanson; 31.12.2020
comment
заметили, что этот сайт работает azure.github.io/azureml-web/docs. должно помочь! в противном случае sdk - это о, черт возьми! - person Majid alDosari; 01.01.2021