将自定义泊坞窗与 Azure ML 结合使用

Posted

技术标签:

【中文标题】将自定义泊坞窗与 Azure ML 结合使用【英文标题】:Using a custom docker with 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

【问题讨论】:

你能分享更多你的代码吗?特别是如何使用环境?得分?培训? 添加了一些细节。它被用于训练。 【参考方案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。

    也许base_dockerfile 需要是一个文本文件(里面有内容)而不是字符串?我会要求环境 PM 更具体地了解它是如何工作的 另一种选择是利用 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

以上是关于将自定义泊坞窗与 Azure ML 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

Azure 应用服务泊坞窗容器“服务不可用”

如何将自定义日志转发到 Azure Sentinel

sh MacOSX泊坞窗 - 输入泊坞窗实例

sh 标记并推送泊坞窗图像到泊坞窗集线器

sh [下载并设置HDF 3.0泊坞窗容器]使用此脚本下载并设置HDF泊坞窗容器#hdf #docker #setup#hdf30

Azure Cosmos SQL API - 如何将自定义对象存储为 @PartitionKey