3

我正在使用 Environment 类对管道使用估计器步骤,以便拥有自定义 Docker 映像,因为我需要一些apt-get包才能安装特定的 pip 包。从日志中可以看出,它完全忽略了环境变量的 docker 部分,这与估算器的非管道版本不同。很简单,这似乎坏了:

我在 SDK v1.0.65 上运行,我的 dockerfile 完全被忽略了,我正在使用

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

当我单独使用 Estimator 时,这很有效,但是如果我将这个估计器插入到 Pipeline 中,它会失败。这是我从管道运行中启动它的代码:

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....在与此 Estimator 关联的 Environment 类中的声明,并且我pip install失败了。

我错过了什么吗?有解决方法吗?

4

3 回答 3

4

我可以确认这是 AML Pipeline 方面的错误。具体来说,runco​​nfig 属性 environment.docker.base_dockerfile 没有在管道作业中正确传递。我们正在努力修复。同时,您可以使用此线程中的解决方法,首先构建 docker 映像并使用 environment.docker.base_image 指定它(正确传递)。

于 2019-10-09T21:50:04.390 回答
2

我最初也用于EstimatorStep自定义图像,但最近想出了如何成功地将Environment' 首先传递给RunConfiguration's,然后再传递给 ' PythonScriptSteps。(下面的例子)

与您的解决方法类似的另一个解决方法是将您的自定义 docker 映像发布到 Docker 集线器,然后参数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是一个包装器,用于ScriptRunConfigRunConfig设置作为参数提供
  • 恕我直言EstimatorStep,不应该存在,因为最好分别定义 Env 和 Steps,而不是在一次调用中同时定义。
于 2019-10-09T18:55:55.747 回答
2

我现在找到了一个解决方法,那就是构建自己的 Docker 映像。您可以使用 Environment 的 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 机器学习工作区的容器注册表的任何 docker 映像。

要创建映像,您可以在可以构建基于 linux 的容器(如 Notebook VM)的机器的命令行上运行类似的内容:

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

推送图像后,您应该能够使其正常工作。

于 2019-10-09T14:24:09.977 回答