Azure ML管道输出文件output.csv缺失及FileNotFoundError问题求助
你遇到的核心问题是管道运行环境与Notebook本地环境的路径逻辑不一致,下面是针对性的排查方向和解决方案:
1. 硬编码绝对路径不兼容管道运行环境
在Compute Instance的Notebook里手动运行时,/mnt/azmnt/code/Users/aniello.spiezia/outputs/是有效路径,但管道如果运行在Compute Cluster上,每个节点的文件系统是临时隔离的,不会有这个固定用户目录结构;即使使用Compute Instance作为管道计算目标,运行上下文的工作目录也和你手动跑Notebook时不同。
解决方案:用Azure ML运行上下文获取规范输出路径
修改test.ipynb的保存逻辑,通过运行上下文获取官方推荐的输出目录,确保在任何计算目标上都有效:
import os from azureml.core import Run # 获取当前管道运行的上下文 run = Run.get_context() # 获取管道预设的输出目录(自动适配计算环境) output_dir = run.output_locations["outputs"] # 确保目录存在,避免创建失败报错 os.makedirs(output_dir, exist_ok=True) # 拼接最终输出文件路径 output_file_path = os.path.join(output_dir, "output.csv") # 执行你的数据加载、合并逻辑... # 保存结果到规范路径 df.to_csv(output_file_path, index=False) # 上传到默认Datastore(可选,管道输出会自动关联到Datastore) datastore = run.experiment.workspace.get_default_datastore() run.upload_file(name="outputs/output.csv", path_or_stream=output_file_path)
2. 管道步骤未显式配置输出依赖
如果你用PythonScriptStep调用脚本(管道更推荐用.py脚本而非.ipynb,若必须用Notebook请用NotebookRunStep),需要显式定义输出对象,让Azure ML管道跟踪并管理这个输出文件。
解决方案:配置PipelineData关联输出
修改pipeline.ipynb的管道定义,添加输出配置:
from azureml.core import Workspace, Experiment from azureml.pipeline.core import Pipeline, PipelineData from azureml.pipeline.steps import NotebookRunStep from azureml.widgets import RunDetails ws = Workspace.from_config() compute_target = ws.compute_targets["你的计算目标名称"] datastore = ws.get_default_datastore() # 定义管道输出,绑定到默认Datastore output_data = PipelineData( name="output_csv", datastore=datastore, output_path_on_compute="outputs/output.csv" ) # 定义Notebook运行步骤,传递输出路径作为参数 notebook_step = NotebookRunStep( name="run-test-notebook", notebook_path="./test.ipynb", arguments=["--output_path", output_data], outputs=[output_data], compute_target=compute_target, allow_reuse=False ) # 创建并提交管道 pipeline = Pipeline(workspace=ws, steps=[notebook_step]) experiment = Experiment(ws, "test-pipeline-experiment") run = experiment.submit(pipeline) RunDetails(run).show()
然后在test.ipynb中用argparse解析这个参数,获取输出路径,彻底避免硬编码。
3. 未提前创建输出目录(临时应急方案)
如果暂时坚持使用绝对路径(不推荐),一定要在保存文件前创建目标目录:
import os output_dir = "/mnt/azmnt/code/Users/aniello.spiezia/outputs" # 递归创建目录,已存在则不报错 os.makedirs(output_dir, exist_ok=True) # 保存文件 df.to_csv(os.path.join(output_dir, "output.csv"), index=False)
4. 计算目标路径权限问题
如果管道用Compute Cluster作为计算目标,它没有权限访问Compute Instance的/mnt/azmnt/code本地存储(这是Compute Instance独有的路径)。这种情况下必须放弃绝对路径,改用Azure ML Datastore或计算集群的临时存储路径。
快速验证方法
管道运行完成后,进入运行详情页的Logs标签,查看是否有目录创建失败、权限拒绝类的报错,这能帮你快速定位问题根源。
内容的提问来源于stack exchange,提问作者Aniello Spiezia

