【问题标题】:How to pass parameters to a training script in Azure Machine Learning service?如何将参数传递给 Azure 机器学习服务中的训练脚本?
【发布时间】: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 映像,但我仍然必须尝试...

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


【解决方案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
    

    (成功了!)

    【讨论】:

    猜你喜欢
    • 2019-07-15
    • 2011-02-15
    • 2018-06-11
    • 1970-01-01
    • 2017-06-25
    • 2017-04-06
    • 2020-05-06
    • 2021-08-23
    • 2020-06-15
    相关资源
    最近更新 更多