我们的团队在 Azure 机器学习 (AML) 上部署了一个 Python 脚本来处理存储在 Azure 存储帐户上的文件。
我们的管道由一个 ForEach 活动组成,该活动调用每个或列出的文件的 Python 脚本。从 Azure 数据工厂 (ADF) 运行它会触发多个单独的管道 同时运行 我没有使用表达式 并行 ,因为我不确定如何在不同的 vCPU 之间分配这些单独的作业。
除了由 AML 管理的“并行化”之外,并行化使用Python的 多处理 模块在Python级别进行处理?
我使用以下方法进行了尝试,但它似乎并没有减少总体处理时间。
from multiprocessing import Process
from multiprocessing import Pool
[...]
mp_processes = 2
if mp_processes is True :
p = Pool(int(mp_processes))
output1, output2 = zip(*p.map(process, process_queue))
[...]
在 Azure 机器学习中使用 Python 的
multiprocessing
模块来并行化你的代码,
取决于你的工作负载和 Azure ML 计算实例配置
,可能有意义,也可能没有意义。
以下是你需要考虑的因素:
何时在 Azure ML 中使用
multiprocessing
有意义:
-
CPU 密集型任务:
如果你的 Python 脚本执行了大量的 CPU 密集型操作(例如,数值计算、图像处理),
multiprocessing
可以通过在多个核心中分配工作负载来帮助你充分利用 Azure ML 计算实例的 CPU 资源。 -
并行处理独立任务:
你的
process
函数处理单个文件,并且每个文件都可以独立于其他文件进行处理。这与multiprocessing
的工作方式很好地一致。 -
计算实例具有多个内核:
确保你的 Azure ML 计算实例具有多个内核,以便
multiprocessing
可以有效地分配工作负载。
何时在 Azure ML 中使用
multiprocessing
没有
意义:
-
I/O 密集型任务:
如果你的脚本花费了大量时间等待 I/O 操作(例如,读取和写入文件),
multiprocessing
可能无法提供显著的性能提升,甚至可能会由于进程间通信的开销而降低性能。在这种情况下,探索异步 I/O 或其他优化技术可能会更有益。 -
Azure ML 管道并行度:
你的 Azure 数据工厂管道已经通过 ForEach 活动并行运行 Python 脚本的多个实例。在每个实例中添加
multiprocessing
可能会导致资源争用,并且如果管道并行度已经使计算资源饱和,则不会带来任何好处。 -
单核计算实例:
如果你的 Azure ML 计算实例只有一个内核,
multiprocessing
将无法提供任何性能提升,因为它仍然只能按顺序运行进程。
你需要调查的事情:
-
性能分析:
在没有
multiprocessing
的情况下对你的代码进行性能分析,以识别瓶颈所在。这将帮助你确定并行化是否是正确的优化策略。 -
资源利用率:
监控你的 Azure ML 计算实例的 CPU 和内存利用率,以了解你的工作负载在没有
multiprocessing
的情况下是否充分利用了可用资源。 - Azure ML 并行计算目标: 对于更高级的并行计算场景,探索 Azure ML 提供的并行计算目标(例如,Azure ML Compute Clusters),这些目标允许你以分布式方式运行代码。
总而言之:
仅仅添加
multiprocessing
并不能保证提高性能。仔细考虑你的工作负载特征、Azure ML 环境以及资源利用率至关重要。性能分析和实验对于确定
multiprocessing
是否适合你的特定情况至关重要。