将自定义泊坞窗与 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 结合使用的主要内容,如果未能解决你的问题,请参考以下文章
sh [下载并设置HDF 3.0泊坞窗容器]使用此脚本下载并设置HDF泊坞窗容器#hdf #docker #setup#hdf30