如何将参数传递给 Azure 机器学习服务中的训练脚本?

Posted

技术标签:

【中文标题】如何将参数传递给 Azure 机器学习服务中的训练脚本?【英文标题】:How to pass parameters to a training script in Azure Machine Learning service? 【发布时间】:2019-08-28 10:45:35 【问题描述】:

我正在尝试使用我的工作区ws 中的ScriptRunConfig 对象在 Azure VM 上本地在 Azure 机器学习服务中提交实验,如

from azureml.core import ScriptRunConfig    
from azureml.core.runconfig import RunConfiguration
from azureml.core import Experiment

experiment = Experiment(ws, name='test')
run_local = RunConfiguration()

script_params = 
    '--data-folder': './data',
    '--training-data': 'train.csv'


src = ScriptRunConfig(source_directory = './source_dir', 
                      script = 'train.py', 
                      run_config = run_local, 
                      arguments = script_params)

run = experiment.submit(src)

但是,这失败了

实验执行异常: “错误详情”: “相关性”: “操作”:“bb12f5b8bd78084b9b34f088a1d77224”, “请求”:“iGFP+sjC34Q=” , “错误”: “代码”:“用户错误”, "message": "无法反序列化运行定义"

更糟糕的是,如果我将数据文件夹设置为使用数据存储(我可能需要这样做)

script_params = 
    '--data-folder': ds.path('mydatastoredir').as_mount(),
    '--training-data': 'train.csv'

错误是

UserErrorException:具有非本机 python 类型值的字典是 在运行配置中不受支持。 '--数据文件夹': $AZUREML_DATAREFERENCE_d93269a580ec4ecf97be428cd2fe79, '--training-data': 'train.csv'

我不太明白我应该如何将我的 script_params 参数传递给我的 train.py(很遗憾,the documentation of ScriptRunConfig 没有包含很多细节)。

有人知道在这两种情况下如何正确创建src 吗?

【问题讨论】:

一种解决方法是在我的 train.py 中为我的 ArgumentParser 添加默认值,但这并不是真正的解决方案... 你能用Estimator代替吗?问是因为这种方法适用于Estimators,但不适用于ScriptRunConfig(我不知道为什么他们不接受两者的相同类型的参数)。 嘿!谢谢你。所以我第一次尝试确实使用Estimator,但我有一些深奥的依赖,我必须通过pip install git+https://github.com/... 处理,因为我无法在conda_packagesAFAIK 中添加包。因此,按照指南,我假设“使用 RunConfiguration 对象和 ScriptRunConfig 对象 [...] 为您提供了很大的灵活性和最大程度的控制”,并在我的 VM 上本地安装了该依赖项。由于这似乎不是一条可行的路线,我可能会选择Estimator 和安装了我的依赖项的自定义 docker 映像,但我仍然必须尝试... 【参考方案1】:

将参数传递给 ScriptRunConfig 和 RunConfig 的正确方法是按照https://docs.microsoft.com/nb-no/python/api/azureml-core/azureml.core.runconfiguration?view=azure-ml-py 的字符串列表。

修改后的工作代码如下。

from azureml.core import ScriptRunConfig    
from azureml.core.runconfig import RunConfiguration
from azureml.core import Experiment

experiment = Experiment(ws, name='test')
run_local = RunConfiguration()

script_params = [
    '--data-folder',
    './data',
    '--training-data',
    'train.csv'
]

src = ScriptRunConfig(source_directory = './source_dir', 
                      script = 'train.py', 
                      run_config = run_local, 
                      arguments = script_params)

run = experiment.submit(src)

【讨论】:

【参考方案2】:

最后我放弃了ScriptRunConfig 并使用Estimator 传递script_params(在配置了计算目标之后):

estimator = Estimator(source_directory='./mysourcedir',
                      script_params=script_params,
                      compute_target='cluster',
                      entry_script='train.py',
                      conda_packages = ["pandas"],
                      pip_packages = ["git+https://github.com/..."], 
                      use_docker=True,
                      custom_docker_image='<mydockeraccount>/<mydockerimage>')

这也允许我安装我的 pip_packages 依赖项,方法是在 https://hub.docker.com/ 上安装一个从 Dockerfile 创建的 custom_docker_image Docker 映像,例如:

FROM continuumio/miniconda
RUN apt-get update
RUN apt-get install git gcc g++ -y

(成功了!)

【讨论】:

对于任何在 2021 年之后阅读本文的人...由于 azuremlsdk == 1.19.0 docs.microsoft.com/en-us/azure/machine-learning/… 的最新版本的 AzureML 现在已弃用估算器

以上是关于如何将参数传递给 Azure 机器学习服务中的训练脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 url 中的工作簿参数传递给 Azure Monitor 工作簿?

Terraform - 将类型对象作为参数传递给 Azure 模板部署

如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数

如何将参数传递给服务器端 Blazor 中的剃须刀组件?

如何将 XML 数据作为参数传递给从 C# 到 Sql 服务器的 TVP 参数

ARM - 如何使用空格将参数传递给 commandToExecute?