1

我是新手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
            )

我想:

  • data_prep_step要跑,
  • 让它在我的路径上存储一些数据data_ref),并且
  • 然后我想在管道之外访问这些存储的数据

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

4

1 回答 1

3

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

主要问

使用 Azure ML 管道,我如何访问PythonScriptStep管道上下文之外的输出数据?

简短的回答

考虑使用OutputFileDatasetConfig文档 示例),而不是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
)

一些注意事项:

  • 一定要看看DataPaths 是如何工作的。乍一看可能很棘手。
  • overwrite=False如果您不希望以后的运行覆盖第一次运行的数据,请在 `.as_upload() 方法中设置。

更多上下文

PipelineData曾经是在管道步骤之间临时传递数据的事实上的对象。这个想法是为了方便:

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

缺点是您无法控制管道的保存位置。如果您想要的数据不仅仅是在步骤之间传递的指挥棒,您可以在完成后随心所欲DataTransferStep地降落。PipelineDataPythonScriptStep

这个缺点是动机OutputFileDatasetConfig

辅助询问

如何以编程方式测试 Azure ML 管道的功能?

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

数据管道测试分为三个领域:

  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,但任何一种策略都应该奏效。这种方法的优点在于您可以通过运行管道来运行期望测试(这也使集成测试变得容易)。

于 2021-03-24T22:47:56.987 回答