【问题标题】:Using a custom docker with Azure ML将自定义泊坞窗与 Azure ML 结合使用
【发布时间】:2020-11-03 06:33:46
【问题描述】:

我遵循指南 (https://docs.microsoft.com/en-us/azure/machine-learning/how-to-use-environments) 在 Azure 上使用自定义 docker 文件。我创建环境的脚本如下所示:

from azureml.core.environment import Environment

myenv = Environment(name = "myenv")
myenv.docker.enabled = True
dockerfile = r"""
FROM mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04
RUN apt-get update && apt-get install -y libgl1-mesa-glx
RUN echo "Hello from custom container!"
"""
myenv.docker.base_image = None
myenv.docker.base_dockerfile = dockerfile

在执行时,这将被完全忽略并且未安装 libgl1。任何想法为什么?

编辑:这是我的其余代码:

est = Estimator(
    source_directory = '.',
    script_params = script_params,
    use_gpu = True,
    compute_target = 'gpu-cluster-1',
    pip_packages = ['scipy==1.1.0', 'torch==1.5.1'],
    entry_script = 'AzureEntry.py',
    )

run = exp.submit(config = est)
run.wait_for_completion(show_output=True)

https://docs.microsoft.com/en-us/azure/machine-learning/how-to-use-environments

【问题讨论】:

  • 你能分享更多你的代码吗?特别是如何使用环境?得分?培训?
  • 添加了一些细节。它被用于训练。

标签: python azure azure-machine-learning-service


【解决方案1】:

安装库没有问题。首先,请将您的 dockerfile 内容转储到一个文件中,更易于维护和阅读;)

e = Environment("custom")
e.docker.base_dockerfile = "path/to/your/dockerfile"

将文件的内容设置成一个字符串属性。

e.register(ws).build(ws).wait_for_completion()

步骤 2/16 将有您的 apt 更新和 libgl1 安装

注意,这应该适用于 >=1.7 SDK

【讨论】:

  • 当我尝试这个时,我得到:图像构建状态:正在运行,图像构建状态:失败
  • FROM mcr.microsoft.com/azureml/intelmpi2018.3-ubuntu16.04 RUN apt-get update && apt-get install -y libgl1-mesa-glx 是我拥有的 dockerfile 的内容。你的 azureml-core 版本是什么?
  • 这构建正确,但不幸的是我的实验仍然失败(未找到 libGL)。我认为问题在于实验中没有使用环境......
  • 正如拉里所说,您需要在估算器中设置环境对象。 docs.microsoft.com/en-us/python/api/azureml-train-core/…。 environment_definition 参数,请将 pip 包中的 python 依赖项移动到环境对象中以具有一个真实来源
  • 现在很好用。非常感谢。问题解决了。
【解决方案2】:

这应该可行:

from azureml.core import Workspace
from azureml.core.environment import Environment
from azureml.train.estimator import Estimator
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core import Experiment

ws = Workspace (...)
exp = Experiment(ws, 'test-so-exp')

myenv = Environment(name = "myenv")
myenv.docker.enabled = True
dockerfile = r"""
FROM mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04
RUN apt-get update && apt-get install -y libgl1-mesa-glx
RUN echo "Hello from custom container!"
"""
myenv.docker.base_image = None
myenv.docker.base_dockerfile = dockerfile

## You need to instead put your packages in the Environment definition instead... 
## see below for some changes too

myenv.python.conda_dependencies = CondaDependencies.create(pip_packages = ['scipy==1.1.0', 'torch==1.5.1'])

最后,您可以稍微不同地构建您的估算器:

est = Estimator(
    source_directory = '.',
#     script_params = script_params,
#     use_gpu = True,
    compute_target = 'gpu-cluster-1',
#     pip_packages = ['scipy==1.1.0', 'torch==1.5.1'],
    entry_script = 'AzureEntry.py',
    environment_definition=myenv
    )

然后提交:

run = exp.submit(config = est)
run.wait_for_completion(show_output=True)

让我们知道这是否有效。

【讨论】:

  • 这就是我最终要做的。完美运行:)
【解决方案3】:

完全可以理解你为什么会挣扎——others have also expressed a need for more information

  1. 也许base_dockerfile 需要是一个文本文件(里面有内容)而不是字符串?我会要求环境 PM 更具体地了解它是如何工作的
  2. 另一种选择是利用 Azure 容器实例 (ACI)。启动 Azure ML 工作区时会自动创建 ACI。有关详细信息,请参阅 this GitHub issue

【讨论】:

    【解决方案4】:

    有关在环境中使用 Docker 的更多信息,请参阅文章`启用 码头工人https://docs.microsoft.com/azure/machine-learning/how-to-use-environments#enable-docker
    以下示例显示了如何将 docker 步骤加载为字符串。

       from azureml.core import Environment
       myenv = Environment(name="myenv")
    
       # Creates the environment inside a Docker container.
       myenv.docker.enabled = True
    
       # Specify docker steps as a string.
       dockerfile = r'''
       FROM mcr.microsoft.com/azureml/intelmpi2018.3-ubuntu16.04
       RUN echo "Hello from custom container!"
       '''
    
       # Alternatively, load from a file.
       #with open("dockerfiles/Dockerfile", "r") as f:
       #    dockerfile=f.read()
    
       myenv.docker.base_dockerfile = dockerfile
    

    【讨论】:

    • 很遗憾这不起作用——您可以清楚地看到我的示例与此一致,并且没有产生预期的效果。
    【解决方案5】:

    我认为您正在使用估算器。估算器创建自己的环境,除非您设置 environment_definition 参数,我在您的 sn-p 中没有看到该参数。我在看https://docs.microsoft.com/en-us/python/api/azureml-train-core/azureml.train.estimator.estimator?view=azure-ml-py

    没有尝试过,但我认为您可以通过将代码更改为:

    est = Estimator(
        source_directory = '.',
        script_params = script_params,
        use_gpu = True,
        compute_target = 'gpu-cluster-1',
        pip_packages = ['scipy==1.1.0', 'torch==1.5.1'],
        entry_script = 'AzureEntry.py',
        environment_definition = myenv
        )
    
    run = exp.submit(config = est)
    run.wait_for_completion(show_output=True)
    

    您可能还必须将 use_gpu 设置移动到环境定义中,因为我在上面链接的 SDK 页面说环境将优先于这个和其他几个估算器参数。

    【讨论】:

    • 这确实是问题的一部分!!对于其他读者:在指定自定义环境 (environment_definition = myenv) 时,将忽略 Estimator 初始化中指定的 pip_packages。您需要将它们添加到自定义环境中,例如myenv.python.conda_dependencies = conda_dep
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2020-06-03
    • 2021-11-05
    • 2018-12-20
    • 2019-06-28
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多