【问题标题】:Using the Environment Class with Pipeline Runs将环境类与管道运行一起使用
【发布时间】:2020-02-06 03:28:12
【问题描述】:

我正在使用 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 属性中。 这是我的代码的 sn-p:

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 时,这很有效,但如果我将这个 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.

这表明它忽略了我在与此 Estimator 关联的 Environment 类中的 FROM mcr.... 语句,并且我的 pip install 失败。

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

【问题讨论】:

    标签: azure-machine-learning-service


    【解决方案1】:

    我现在找到了一个解决方法,那就是构建自己的 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 机器学习工作区的容器注册表的任何 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
    

    一旦图像被推送,你应该能够得到它的工作。

    【讨论】:

      【解决方案2】:

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

      与您的解决方法类似的另一个解决方法是将您的自定义 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 作为参数
      • EstimatorScriptRunConfig 的包装器,其中 RunConfig 设置可作为参数使用
      • 恕我直言,EstimatorStep 不应该存在,因为最好分别定义 Env 和 Steps,而不是在一次调用中同时定义。

      【讨论】:

      • 谢谢! sdk 文档很全面,但要知道如何使用它却令人困惑……这位 11 年的 Python 编程老手说!
      • @MajidalDosari 你和我!但是 SDK 最近变得更加稳定和强大(一旦您知道自己的方式)。我订阅了 Azure ML SO 标签,所以在您提出问题时发布更多问题!
      • 注意到该站点已上线 azure.github.io/azureml-web/docs。应该有帮助!否则,sdk 就是 OO 地狱!
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 2018-01-29
        • 2013-07-29
        相关资源
        最近更新 更多