Azure ML File Dataset mount() 很慢,下载数据两次



我已经使用Azure ML python API创建了一个Fie数据集。有问题的数据是驻留在Azure Data Lake Gen 2中的一堆镶木文件(约10K个镶木文件,每个大小为330KB(,分布在多个分区中。然后,我尝试在AML计算实例中挂载数据集。在这个安装过程中,我观察到每个镶木地板文件已经在计算实例的/tmp目录下下载了两次,并在控制台日志中打印了以下消息:

Downloaded path: /tmp/tmp_3qwqu9u/c2c69fd1-9ded-4d69-b75a-c19e1694b7aa/<blob_path>/20211203.parquet is different from target path: /tmp/tmp_3qwqu9u/c2c69fd1-9ded-4d69-b75a-c19e1694b7aa/<container_name>/<blob_path>/20211203.parquet

此日志消息将为数据集中的每个镶木地板文件打印。

此外,安装数据集的过程非常缓慢:对于每个大小为330KB的约10K的镶木文件,需要44分钟。

"%%时间";Jupyter实验室中的命令显示大部分时间都用于IO过程?

CPU times: user 4min 22s, sys: 51.5 s, total: 5min 13s
Wall time: 44min 15s

注意:Data Lake Gen 2和Azure ML计算实例都在同一个虚拟网络下。

以下是我的问题:

  1. 如何避免两次下载镶木地板文件
  2. 如何加快安装过程

我已经浏览了这个线程,但那里的讨论没有结束

我使用的Python代码如下:

data = Dataset.File.from_files(path=list_of_blobs, validate=True)
dataset = data.register(workspace=ws, name=dataset_name, create_new_version=create_new_version)
mount_context = None
try:
mount_context = dataset.mount(path_to_mount)
# Mount the file stream
mount_context.start()
except Exception as ex:
raise(ex)
df = pd.read_parquet(path_to_mount)

健壮的选项是直接从AzureBlobDatastore下载。您需要知道数据存储和相对路径,这是通过打印数据集描述获得的。即

ws = Workspace.from_config()
dstore = ws.datastores.get(dstore_name)
target = (dstore, dstore_path)
with tempfile.TemporaryDirectory() as tmpdir:
ds = Dataset.File.from_files(target)
ds.download(tmpdir)
df = pd.read_parquet(tmpdir)

方便的选项是流式传输表格数据集。请注意,您无法控制文件的读取方式(Microsoft转换器有时可能无法正常工作(。这是模板:

ds = Dataset.Tabular.from_parquet_files(target)
df = ds.to_pandas_dataframe()

我已经执行了一系列测试来比较FileDataset.mount()FileDataset.download()的性能。在我的环境中,download()mount()快得多。

当计算机的磁盘大小足够大以容纳所有文件时,download()工作良好。然而,在多节点环境中,相同的数据(在我的情况下是镶木地板文件(会下载到每个节点(多个副本(。根据文件:

如果脚本处理数据集中的所有文件您的计算资源足够大,可以下载数据集接入方式是更好的选择。下载访问模式将避免在运行时流式传输数据的开销。如果您的脚本访问数据集的子集,或者对于您的计算来说太大,请使用装载访问模式。

在多节点环境中下载数据可能会引发性能问题(链接(。在这种情况下,mount()可能是优选的。

我也尝试过使用表格数据集。正如Maciej S所提到的,在TabularData Set的情况下,用户不需要决定如何从数据存储中读取数据(即用户不需要选择装载或下载作为访问模式(。但是,对于TabularDataset的当前实现(azureml core 1.38.0(,与FileDataset.download((相比,对于相同的拼花文件集,compute需要更大的内存(RAM(。看起来,当前的实现首先将所有单独的镶木地板文件读取到pandas DataFrame中(保存到内存/RAM中(。然后,它将这些数据附加到单个DataFrame(API用户访问(中。可能需要更高的内存来实现这个";热切的";API的性质。

相关内容

  • 没有找到相关文章

最新更新