使用 Azure 机器学习优化数据处理

本文介绍可帮助优化本地和大规模的数据处理速度的最佳实践。

Azure 机器学习与用于数据处理的开放源代码包和框架进行了集成。 通过使用这些集成并应用本文中的最佳做法建议,可以提高本地和大规模数据处理的速度。

Parquet 和 CSV 文件格式

逗号分隔值 (csv) 文件是用于数据处理的常见文件格式。 但是,建议将 parquet 文件格式用于机器学习任务。

Parquet 文件以二进制纵栏格式存储数据。 如果需要将数据拆分为多个文件,此格式会很有用。 此外,使用此格式可将机器学习试验的相关字段设定为目标。 可以通过只选择训练 ML 模型时所必需的列来减少数据加载量,而不必读取全部 20 GB 的数据文件。 还可以对 Parquet 文件进行压缩,以最大程度减小所需的处理能力和占用的空间。

CSV 文件通常用于导入和导出数据,因为它们易于在 Excel 中进行编辑和读取。 CSV 中的数据采用基于行的格式以字符串形式存储,并且可以对这类文件进行压缩以减少数据传输负载。 未经压缩的 CSV 大小可增加约 2-10 倍,经过压缩的 CSV 甚至可以增加更多。 因此,内存中的 5-GB CSV 可扩展至超过计算机具有的 8 GB RAM。 这种压缩行为可能会增加数据传输延迟,在需要处理大量数据的情况下,此行为可能产生不好的效果。

Pandas 数据帧

Pandas 数据帧常见于数据操作和分析。 Pandas 适用于小于 1 GB 的数据大小,但当文件大小超过 1 GB 时,pandas 数据帧的处理时间会变慢。 这种减慢是因为存储中的数据大小不同于数据帧中的数据大小。 例如,CSV 文件中的数据在数据帧中最多可以扩展到 10 倍,因此,1 GB 的 CSV 文件在数据帧中可能会变成 10 GB。

Pandas 是单线程的,也就是说,在单个 CPU 上每次只能执行一个操作。 借助使用分布式后端来包装 PandasModin 等包,可以很容易地让工作负载在单个 Azure 机器学习计算实例上的多个虚拟 CPU 中并行运行。

要使用 ModinDask 并行运行任务,只需将这行代码 import pandas as pd 更改为 import modin.pandas as pd

数据帧:内存不足错误

通常,当数据帧扩展至超过计算机上的可用 RAM 时,会发生内存不足错误。 此概念还适用于分布式框架,如 ModinDask。 也就是说,你的操作尝试在群集的每个节点上的内存中加载数据帧,但没有足够的 RAM 来执行此操作。

一个解决方案是增加 RAM 以适应内存中的数据帧。 建议将计算大小和处理能力设置为包含 2 倍大小的 RAM。 因此,如果数据帧为 10 GB,请使用至少具有 20 GB RAM 的计算目标,以确保可以将数据帧恰当地置于内存中并对其进行处理。

对于多个虚拟 CPU (vCPU),请记住,所设置的分区应拟合计算机上的每个 vCPU 所能拥有的 RAM 容量。 也就是说,如果具有 16 GB RAM 4 个 vCPU,则每个 vCPU 需要大约 2 GB 的数据帧。

本地与远程

你可能会注意到,与使用 Azure 机器学习预配的远程 VM 相比,在本地电脑上工作时,某些 pandas 数据帧命令的执行速度更快。 你的本地电脑通常启用了页面文件,这样就可以加载多于物理内存所能容纳的数据量,也就是你的硬盘驱动器将充当 RAM 的扩展。 目前,Azure 机器学习 VM 运行时未启用页面文件,因此,只能加载可用物理 RAM 允许的数据量。

对于计算密集型作业,建议选取更大的 VM 以提高处理速度。

详细了解 Azure 机器学习的可用 VM 系列和大小

有关 RAM 规范,请参阅相应的 VM 系列页,例如 Dv2-Dsv2 系列

最小化 CPU 工作负载

如果无法将更多 RAM 添加到计算机,则可以通过以下技巧来帮助最小化 CPU 工作负载和优化处理时间。 单个系统和分布式系统均适用以下建议。

方法 说明
压缩 为数据使用其他表示形式,该形式应使用较少内存且不会对计算结果产生显著影响。

示例: 不要将条目存储为每个条目包含 10 个字节或更多字节的字符串,而是将它们存储为布尔值 True 或 False(可使用 1 个字节存储)。
分块 将数据以子集(区块)的形式加载到内存中,每次处理一个子集或并行处理多个子集。 如果需要处理所有数据,但不需要同时将所有数据加载到内存中,则此方法最有效。

示例: 一次加载和处理一个月的数据,而不是一次处理整整一年的数据。
索引 应用并使用索引,即用于指示在何处查找所需数据的摘要。 当只需要使用数据的一个子集而不是完整集时,索引很有用

示例: 如果有按月份排序的全年销售数据,可借助索引快速搜索要处理的所需月份的数据。

改变数据处理的规模

如果前面的建议不够用,且无法找到适合容纳你的数据的虚拟机,可以:

  • 使用像 SparkDask 这样的框架来处理“超出内存”的数据。 通过这种方式,数据帧按分区加载到 RAM 中并进行处理,最后收集最终结果。

  • 使用分布式框架横向扩展到群集。 采用这种方式,将拆分数据处理负载并在多个 CPU 上并行运行,最后收集最终结果。

下表根据代码偏好或数据大小推荐与 Azure 机器学习集成的分布式框架。

经验或数据大小 建议
如果你熟悉 Pandas ModinDask 数据帧
如果偏好 Spark PySpark
适用于小于 1 GB 的数据 在本地或对远程 Azure 机器学习计算实例执行 Pandas
适用于大于 10 GB 的数据 使用 RayDaskSpark 移动到群集

提示

使用 to_dask_dataframe() 方法将数据集加载到 Dask 数据帧中,以进行大规模数据处理。 此方法是一个试验性预览功能,可能会随时更改。

后续步骤