我已经成功运行了一个ML Pipeline实验,并发布了Azure ML Pipeline,没有遇到任何问题。然而,当我直接在成功运行和发布后运行以下代码(即我在Jupyter中运行所有单元格),测试就失败了!
interactive_auth = InteractiveLoginAuthentication()auth_header = interactive_auth.get_authentication_header()rest_endpoint = published_pipeline.endpointresponse = requests.post(rest_endpoint, headers=auth_header, json={"ExperimentName": "***redacted***", "ParameterAssignments": {"process_count_per_node": 6}})run_id = response.json()["Id"]
以下是azureml-logs/70_driver_log.txt中的错误信息:
[2020-12-10T17:17:50.124303] 实验失败。正在完成运行...清理所有未完成的运行操作,等待900.0秒3个项目正在清理...清理耗时0.20258069038391113秒Traceback (most recent call last): File "driver/amlbi_main.py", line 48, in <module> main() File "driver/amlbi_main.py", line 44, in main JobStarter().start_job() File "/mnt/batch/tasks/shared/LS_root/jobs/***redacted***/azureml/***redacted***/mounts/workspaceblobstore/azureml/***redacted***/driver/job_starter.py", line 52, in start_job job.start() File "/mnt/batch/tasks/shared/LS_root/jobs/***redacted***/azureml/***redacted***/mounts/workspaceblobstore/azureml/***redacted***/driver/job.py", line 105, in start master.wait() File "/mnt/batch/tasks/shared/LS_root/jobs/***redacted***/azureml/***redacted***/mounts/workspaceblobstore/azureml/***redacted***/driver/master.py", line 301, in wait file_helper.start() File "/mnt/batch/tasks/shared/LS_root/jobs/***redacted***/azureml/***redacted***/mounts/workspaceblobstore/azureml/***redacted***/driver/file_helper.py", line 206, in start self.analyze_source() File "/mnt/batch/tasks/shared/LS_root/jobs/***redacted***/azureml/***redacted***/mounts/workspaceblobstore/azureml/***redacted***/driver/file_helper.py", line 69, in analyze_source raise Exception(message)Exception: 未找到临时文件。任务失败。一个任务应该生成临时文件,或者在这一步之前就应该失败。请检查日志以了解原因。
异常:未找到临时文件。任务失败。一个任务应该生成临时文件,或者在这一步之前就应该失败。请检查日志以了解原因。
以下是logs/sys/warning.txt中的错误信息:
requests.exceptions.HTTPError: 429 客户端错误:请求过多,URL为:https://eastus.experiments.azureml.net/execution/v1.0/subscriptions/***redacted***/resourceGroups/***redacted***/providers/Microsoft.MachineLearningServices/workspaces/***redacted***/experiments/***redacted-experiment-name***/runs/***redacted-run-id***/telemetry
[…]
requests.exceptions.HTTPError: 500 服务器错误:内部服务器错误,URL为:
相同的URL。
接下来…
当我等待几分钟后重新运行以下代码/单元格时。
interactive_auth = InteractiveLoginAuthentication()auth_header = interactive_auth.get_authentication_header()rest_endpoint = published_pipeline.endpointresponse = requests.post(rest_endpoint, headers=auth_header, json={"ExperimentName": "***redacted***", "ParameterAssignments": {"process_count_per_node": 2}})run_id = response.json()["Id"]
它成功完成了!?怎么回事?(我在这里更改了进程数,但我认为这不会产生影响)。此外,日志中没有用户错误。
对于这里可能发生的情况,有什么想法吗?
提前感谢您可能提供的任何见解,祝您编码愉快!:)
========== 更新 #1: ==========
在包含约30万行的1个文件上运行。有时任务能正常工作,有时却不能。我们尝试了许多版本,不同的配置设置,所有版本都时不时地会失败。将sklearn模型改为使用n_jobs=1。我们在进行NLP工作,对文本数据进行评分。
default_ds = ws.get_default_datastore()# 输出数据集output_dir = OutputFileDatasetConfig(destination=(def_file_store, 'model/results')).register_on_complete(name='model_inferences')# 评分脚本的位置experiment_folder = 'model_pipeline' rit = 60*60*24parallel_run_config = ParallelRunConfig( source_directory=experiment_folder, entry_script="score.py", mini_batch_size="5", error_threshold=10, output_action="append_row", environment=batch_env, compute_target=compute_target, node_count=5, run_invocation_timeout=rit, process_count_per_node=1)
我们的下一个测试是将每一行数据放入单独的文件中。我尝试了仅30行的数据,即30个文件,每个文件包含一条记录用于评分,但仍然得到相同的错误。这次我将错误阈值改为1。
2020-12-17 02:26:16,721|ParallelRunStep.ProgressSummary|INFO|112|ParallelRunStep处理了所有迷你批次。有6个迷你批次,包含30个项目。处理了6个迷你批次,包含30个项目,30个成功,0个失败。错误阈值为1。2020-12-17 02:26:16,722|ParallelRunStep.Telemetry|INFO|112|开始拼接。2020-12-17 02:26:17,202|ParallelRunStep.FileHelper|ERROR|112|未找到临时文件。任务失败。一个任务应该生成临时文件,或者在这一步之前就应该失败。请检查日志以了解原因。2020-12-17 02:26:17,368|ParallelRunStep.Telemetry|INFO|112|运行状态:运行中2020-12-17 02:26:17,495|ParallelRunStep.Telemetry|ERROR|112|执行任务时发生异常:未找到临时文件。任务失败。一个任务应该生成临时文件,或者在这一步之前就应该失败。请检查日志以了解原因。Traceback (most recent call last): File "/mnt/batch/tasks/shared/LS_root/jobs/**redacted**/mounts/workspaceblobstore/azureml/**redacted**/driver/job.py", line 105, in start master.wait() File "/mnt/batch/tasks/shared/LS_root/jobs/**redacted**/mounts/workspaceblobstore/azureml/**redacted**/driver/master.py", line 301, in wait file_helper.start() File "/mnt/batch/tasks/shared/LS_root/jobs/**redacted**/mounts/workspaceblobstore/azureml/**redacted**/driver/file_helper.py", line 206, in start self.analyze_source() File "/mnt/batch/tasks/shared/LS_root/jobs/**redacted**/mounts/workspaceblobstore/azureml/**redacted**/driver/file_helper.py", line 69, in analyze_source raise Exception(message)Exception: 未找到临时文件。任务失败。一个任务应该生成临时文件,或者在这一步之前就应该失败。请检查日志以了解原因。
在那些完成的轮次中,只返回了一些记录。有一次返回的记录数我记得是25或23,另一次是15。
========== 更新 #2: 12/17/2020 ==========
我移除了一个模型(我的模型是15个模型的权重混合)。我甚至清理了我的文本字段,移除了所有制表符、换行符和逗号。现在我在评分30个文件,每个文件包含一条记录,任务有时会完成,但不会返回30条记录。有时它会返回错误,仍然会得到“未找到临时文件”的错误。
回答:
我想我可能已经回答了自己的问题。我认为问题出在
OutputFileDatasetConfig
一旦我切换回使用
PipelineData
一切又开始正常工作了。我猜Azure并不是在开玩笑,当他们说OutputFileDatasetConfig仍然是实验性的。
我仍然不明白的是,如果没有OutputFileDatasetConfig,我们如何从Data Factory Pipeline中获取ML Studio Pipeline的结果?PipelineData将结果输出到一个基于子步骤运行ID的文件夹中,那么Data Factory应该如何知道从哪里获取结果?我很乐意听到任何人可能提供的反馈。谢谢:)
== 更新 ==
关于如何从Data Factory Pipeline中获取ML Studio Pipeline的结果,请查看从ML Studio Pipeline中获取Data Factory Pipeline的结果
== 更新 #2 ==
https://github.com/Azure/azure-sdk-for-python/issues/16568#issuecomment-781526789
你好@yeamusic21 ,感谢你的反馈,在当前版本中,OutputDatasetConfig无法与ParallelRunStep一起工作,我们正在修复这个问题。