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
相关产品推荐
相关产品推荐

