You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure ML Studio组件无法向输出URI保存图片的解决咨询

解决Azure ML命令组件写入输出URI的问题

你的错误根源是误将只读的输入目录当作输出路径写入,Azure ML中输入挂载的目录默认是只读权限,只有输出挂载的目录拥有可写权限。要解决这个问题,需要从YAML组件配置和Python脚本两个层面配合处理:

1. 正确配置YAML组件的输入输出

首先确保你的YAML文件里,输出目录的模式设置为可写挂载(rw_mount),并且在命令行参数中把输出路径传递给Python脚本。示例YAML配置如下:

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
name: image_transform_component
display_name: Image Transform Component
version: 1
type: command

inputs:
  input_images:
    type: uri_folder
    mode: ro_mount  # 输入默认只读,无需修改
outputs:
  transformed_images_1:
    type: uri_folder
    mode: rw_mount  # 必须设置为可写挂载
  transformed_images_2:
    type: uri_folder
    mode: rw_mount

code: ./src
command: >-
  python image_transform.py 
  --input_images ${{inputs.input_images}}
  --output_dir1 ${{outputs.transformed_images_1}}
  --output_dir2 ${{outputs.transformed_images_2}}
environment: azureml:AzureML-pytorch-1.10-ubuntu18.04-py38-cpu:1

2. 在Python脚本中正确处理输出路径

你的Python脚本需要通过命令行参数接收输出目录路径,然后将处理后的图片写入到这些路径下。示例脚本(image_transform.py)如下:

import argparse
import os
from PIL import Image
import torchvision.transforms as transforms

def main():
    parser = argparse.ArgumentParser()
    # 接收输入和输出路径参数
    parser.add_argument("--input_images", type=str, required=True)
    parser.add_argument("--output_dir1", type=str, required=True)
    parser.add_argument("--output_dir2", type=str, required=True)
    args = parser.parse_args()

    # 确保输出目录存在(如果不存在则创建)
    os.makedirs(args.output_dir1, exist_ok=True)
    os.makedirs(args.output_dir2, exist_ok=True)

    # 遍历输入文件夹中的图片
    for filename in os.listdir(args.input_images):
        if filename.endswith(('.png', '.jpg', '.jpeg')):
            img_path = os.path.join(args.input_images, filename)
            img = Image.open(img_path).convert('RGB')

            # 示例转换1:转为灰度图
            transform1 = transforms.Grayscale(num_output_channels=1)
            img_transformed1 = transform1(img)
            # 保存到第一个输出目录
            save_path1 = os.path.join(args.output_dir1, f"gray_{filename}")
            img_transformed1.save(save_path1)

            # 示例转换2:调整尺寸
            transform2 = transforms.Resize((224, 224))
            img_transformed2 = transform2(img)
            # 保存到第二个输出目录
            save_path2 = os.path.join(args.output_dir2, f"resized_{filename}")
            img_transformed2.save(save_path2)

if __name__ == "__main__":
    main()

3. 关键注意事项

  • 绝对不要写入输入目录:输入目录是只读挂载,任何写入操作都会触发OSError: Read-only file system错误。
  • 输出路径必须从组件参数传递:不要在脚本中硬编码路径,必须通过YAML传递的${{outputs.*}}参数获取正确的可写路径。
  • 创建子目录要基于输出路径:如果需要在输出目录下创建子文件夹,一定要在脚本里基于接收的输出路径创建,比如os.makedirs(os.path.join(args.output_dir1, "subfolder"), exist_ok=True)。

内容的提问来源于stack exchange,提问作者sumit Sp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:00:53