Azure ML管道PythonScriptStep访问HTTP URI源FileDataset异常咨询
HTTP源FileDataset挂载异常的根因与解决方法
问题根因
这个问题是Azure ML SDK 1.2x分支下纯HTTP/HTTPS来源FileDataset的已知bug:
- SDK处理纯Web URI输入时,会把URI的协议头
https:做URL编码,生成名叫https%3A的顶层虚拟目录 - 两个目标文件会被完整塞到这个嵌套目录下,不会按照预期把原文件平铺到挂载点根路径
- Notebook端用1.24版本SDK创建数据集、计算节点跑1.25版本SDK的跨版本组合,会触发这个bug的错误分支,不管换as_mount/as_download/as_upload哪种传入模式都绕不开
- 你在Notebook里查询到的数据集注册结构完全正常,这个bug是在计算节点的挂载执行阶段触发的,注册阶段的元数据存储不会出现异常
注:该bug仅影响纯HTTP/HTTPS URI创建的FileDataset,Blob、ADLS等原生存储源的数据集逻辑完全不受影响
可行解决方式
- 版本对齐修复:把Notebook端和计算节点环境的AML SDK版本统一升级到1.31.0及以上,该版本已经修复了HTTP源数据集的路径编码逻辑,挂载时会直接把拉取的文件以原文件名平铺到目标路径
- 临时适配不升级:如果暂时没法调整SDK版本,在脚本里手动跳过那个编码目录,递归取实际文件就行,示例代码:
import os from azureml.core import Run run = Run.get_context() # 获取挂载后的数据集根路径 data_root = run.input_datasets['Files_mount'] # 定位生成的编码后嵌套目录 encoded_dir = [d for d in os.listdir(data_root) if d.startswith('https%3A')][0] nested_path = os.path.join(data_root, encoded_dir) # 递归遍历拿到所有实际文件的完整路径 actual_file_list = [] for root, _, files in os.walk(nested_path): for f in files: actual_file_list.append(os.path.join(root, f)) - 替代实现方案:如果不需要用到FileDataset的版本管控能力,可以绕开Dataset加载逻辑,直接在PythonScriptStep的脚本里用HTTP请求库把目标文件下载到临时工作目录,完全避开SDK的挂载bug
内容的提问来源于stack exchange,提问作者Vlad Iliescu
相关产品推荐
相关产品推荐

