带有 DataTransferStep 的 Azure ML PipelineData 结果为 0 字节文件
Azure ML PipelineData with DataTransferStep results in 0 bytes file
我正在使用 azureml Python SDK 构建 Azure ML 管道。管道调用 PythonScriptStep 将数据存储在 AML 工作区的 workspaceblobstore 上。
我想扩展管道以将管道数据导出到 Azure Data Lake(第 1 代)。据我了解,Azure ML 不支持将 PythonScriptStep 的输出直接连接到 Azure Data Lake(第 1 代)。因此,我向管道添加了一个额外的 DataTransferStep,它将 PythonScriptStep 的输出作为直接输入到 DataTransferStep 中。根据 Microsoft 文档,这应该是可能的。
到目前为止,我已经构建了这个解决方案,只有这会在第 1 代数据湖上生成一个 0 字节的文件。我认为 output_export_blob PipelineData 没有正确引用 test.csv,因此 DataTransferStep 无法找到输入。如何将 DataTransferStep 与 PythonScriptStep 的 PipelineData 输出正确连接?
pipeline.py
input_dataset = delimited_dataset(
datastore=prdadls_datastore,
folderpath=FOLDER_PATH_INPUT,
filepath=INPUT_PATH
)
output_export_blob = PipelineData(
'export_blob',
datastore=workspaceblobstore_datastore,
)
test_step = PythonScriptStep(
script_name="test_upload_Whosebug.py",
arguments=[
"--output_extract", output_export_blob,
],
inputs=[
input_dataset.as_named_input('input'),
],
outputs=[output_export_blob],
compute_target=aml_compute,
source_directory="."
)
output_export_adls = DataReference(
datastore=prdadls_datastore,
path_on_datastore=os.path.join(FOLDER_PATH_OUTPUT, 'test.csv'),
data_reference_name='export_adls'
)
export_to_adls = DataTransferStep(
name='export_output_to_adls',
source_data_reference=output_export_blob,
source_reference_type='file',
destination_data_reference=output_export_adls,
compute_target=adf_compute
)
pipeline = Pipeline(
workspace=aml_workspace,
steps=[
test_step,
export_to_adls
]
)
test_upload_Whosebug.py
import os
import pathlib
from azureml.core import Datastore, Run
parser = argparse.ArgumentParser("train")
parser.add_argument("--output_extract", type=str)
args = parser.parse_args()
run = Run.get_context()
df_data_all = (
run
.input_datasets["input"]
.to_pandas_dataframe()
)
os.makedirs(args.output_extract, exist_ok=True)
df_data_all.to_csv(
os.path.join(args.output_extract, "test.csv"),
index=False
)
代码示例非常有用。感谢那。你说得对,得到 PythonScriptStep -> PipelineData
可能会让人感到困惑。即使没有 DataTransferStep
.
也能开始工作
我 100% 不知道发生了什么,但我想我会吐出一些想法:
- 您的
PipelineData
、export_blob
是否包含 "test.csv" 文件?在对 DataTransferStep
进行故障排除之前,我会验证这一点。您可以使用 SDK 或使用 UI 更轻松地验证这一点。
- 转到 PipelineRun 页面,单击有问题的
PythonScriptStep
。
- 在 "Outputs + Logs" 页面上,有一个 "Data Outputs" 部分(最初加载速度很慢)
- 打开它,你会看到输出 PipelineDatas 然后点击 "View Output"
- 导航到 Azure 门户或 Azure 存储资源管理器中的给定路径。
- 在
test_upload_Whosebug.py
中,您在调用 .to_csv()
时将 PipelineData
视为一个目录,而不是您只是调用 df_data_all.to_csv(args.output_extract, index=False)
的文件。也许尝试用 is_directory=True
定义 PipelineData
。不确定是否需要这样做。
我正在使用 azureml Python SDK 构建 Azure ML 管道。管道调用 PythonScriptStep 将数据存储在 AML 工作区的 workspaceblobstore 上。
我想扩展管道以将管道数据导出到 Azure Data Lake(第 1 代)。据我了解,Azure ML 不支持将 PythonScriptStep 的输出直接连接到 Azure Data Lake(第 1 代)。因此,我向管道添加了一个额外的 DataTransferStep,它将 PythonScriptStep 的输出作为直接输入到 DataTransferStep 中。根据 Microsoft 文档,这应该是可能的。
到目前为止,我已经构建了这个解决方案,只有这会在第 1 代数据湖上生成一个 0 字节的文件。我认为 output_export_blob PipelineData 没有正确引用 test.csv,因此 DataTransferStep 无法找到输入。如何将 DataTransferStep 与 PythonScriptStep 的 PipelineData 输出正确连接?
pipeline.py
input_dataset = delimited_dataset(
datastore=prdadls_datastore,
folderpath=FOLDER_PATH_INPUT,
filepath=INPUT_PATH
)
output_export_blob = PipelineData(
'export_blob',
datastore=workspaceblobstore_datastore,
)
test_step = PythonScriptStep(
script_name="test_upload_Whosebug.py",
arguments=[
"--output_extract", output_export_blob,
],
inputs=[
input_dataset.as_named_input('input'),
],
outputs=[output_export_blob],
compute_target=aml_compute,
source_directory="."
)
output_export_adls = DataReference(
datastore=prdadls_datastore,
path_on_datastore=os.path.join(FOLDER_PATH_OUTPUT, 'test.csv'),
data_reference_name='export_adls'
)
export_to_adls = DataTransferStep(
name='export_output_to_adls',
source_data_reference=output_export_blob,
source_reference_type='file',
destination_data_reference=output_export_adls,
compute_target=adf_compute
)
pipeline = Pipeline(
workspace=aml_workspace,
steps=[
test_step,
export_to_adls
]
)
test_upload_Whosebug.py
import os
import pathlib
from azureml.core import Datastore, Run
parser = argparse.ArgumentParser("train")
parser.add_argument("--output_extract", type=str)
args = parser.parse_args()
run = Run.get_context()
df_data_all = (
run
.input_datasets["input"]
.to_pandas_dataframe()
)
os.makedirs(args.output_extract, exist_ok=True)
df_data_all.to_csv(
os.path.join(args.output_extract, "test.csv"),
index=False
)
代码示例非常有用。感谢那。你说得对,得到 PythonScriptStep -> PipelineData
可能会让人感到困惑。即使没有 DataTransferStep
.
我 100% 不知道发生了什么,但我想我会吐出一些想法:
- 您的
PipelineData
、export_blob
是否包含 "test.csv" 文件?在对DataTransferStep
进行故障排除之前,我会验证这一点。您可以使用 SDK 或使用 UI 更轻松地验证这一点。- 转到 PipelineRun 页面,单击有问题的
PythonScriptStep
。 - 在 "Outputs + Logs" 页面上,有一个 "Data Outputs" 部分(最初加载速度很慢)
- 打开它,你会看到输出 PipelineDatas 然后点击 "View Output"
- 导航到 Azure 门户或 Azure 存储资源管理器中的给定路径。
- 转到 PipelineRun 页面,单击有问题的
- 在
test_upload_Whosebug.py
中,您在调用.to_csv()
时将PipelineData
视为一个目录,而不是您只是调用df_data_all.to_csv(args.output_extract, index=False)
的文件。也许尝试用is_directory=True
定义PipelineData
。不确定是否需要这样做。