如何从 PythonScriptStep 访问输出文件夹?

How to acces output folder from a PythonScriptStep?

我是 azure-ml 的新手,我的任务是为几个管道步骤进行一些集成测试。我准备了一些输入测试数据和一些预期的输出数据,我将它们存储在 'test_datastore' 上。下面的示例代码是我想要做的事情的简化版本:

ws = Workspace.from_config('blabla/config.json')
ds = Datastore.get(ws, datastore_name='test_datastore')

main_ref = DataReference(datastore=ds,
                            data_reference_name='main_ref'
                            )

data_ref = DataReference(datastore=ds,
                            data_reference_name='main_ref',
                            path_on_datastore='/data'
                            )


data_prep_step = PythonScriptStep(
            name='data_prep',
            script_name='pipeline_steps/data_prep.py',
            source_directory='/.',
            arguments=['--main_path', main_ref,
                        '--data_ref_folder', data_ref
                        ],
            inputs=[main_ref, data_ref],
            outputs=[data_ref],
            runconfig=arbitrary_run_config,
            allow_reuse=False
            )

我愿意:

但是,我在文档中找不到有用的函数。任何指导将不胜感激。

这里有两个重要的想法 -- 让我们从主要的开始。

主要提问

With an Azure ML Pipeline, how can I access the output data of a PythonScriptStep outside of the context of the pipeline?

简答

考虑使用 OutputFileDatasetConfig (docs example),而不是 DataReference

对于你上面的例子,我只是改变你的最后两个定义。

data_ref = OutputFileDatasetConfig(
    name='data_ref',
    destination=(ds, '/data')
).as_upload()


data_prep_step = PythonScriptStep(
    name='data_prep',
    script_name='pipeline_steps/data_prep.py',
    source_directory='/.',
    arguments=[
        '--main_path', main_ref,
        '--data_ref_folder', data_ref
                ],
    inputs=[main_ref, data_ref],
    outputs=[data_ref],
    runconfig=arbitrary_run_config,
    allow_reuse=False
)

一些笔记:

  • 务必查看 DataPath 的工作原理。乍一看可能很棘手。
  • 如果您不希望以后的 运行 覆盖第一个 运行 的数据,请在 `.as_upload() 方法中设置 overwrite=False

更多上下文

PipelineData 曾经是在流水线步骤之间临时传递数据的实际对象。这个想法是为了让它更容易:

  1. 将步骤拼接在一起
  2. 如果需要在管道 运行s 之后获取数据 (datastore/azureml/{run_id}/data_ref)

缺点是您无法控制管道保存的位置。如果你想要的数据不仅仅是作为在步骤之间传递的接力棒,你可以有一个 DataTransferStepPythonScriptStep 完成后随心所欲地降落 PipelineData

这个缺点是 OutputFileDatasetConfig

的动机

辅助提问

how might I programmatically test the functionality of my Azure ML pipeline?

恕我直言,谈论数据管道测试的人还不够多。

数据管道测试分为三个方面:

  1. 单元测试(步骤中的代码有效?
  2. 集成测试(代码在提交到 Azure ML 服务时有效)
  3. 数据预期测试(出来的数据符合我的预期)

对于 #1,我认为它应该在管道之外完成,也许作为辅助函数包的一部分 对于 #2,为什么不只查看整个管道是否完成,我想通过这种方式获得更多信息。这就是我们 运行 我们 CI.

的方式

#3 是最多汁的,我们在我们的管道中使用 Great Expectations (GE) Python 库来做到这一点。 GE 社区将这些称为“期望测试”。对我来说,在 Azure ML 管道中包含期望测试有两种选择:

  1. PythonScriptStep 本身内,即
    1. 运行 无论你有什么代码
    2. 在写出之前用GE测试输出;或者,
  2. 对于每个功能 PythonScriptStep,挂起下游 PythonScriptStep 关闭它,您 运行 您对输出数据的期望。

我们的团队做了#1,但是这两种策略都应该有效。这种方法的优点在于,您可以 运行 通过 运行 管道(这也使集成测试变得容易)来测试您的期望。