如何将参数传递给 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_packages
AFAIK 中添加包。因此,按照指南,我假设“使用 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 函数