开发使用docker容器并行化python代码的机制

技术(包括计算机技术)的当前发展阶段向我们展示了数据量的增长以及对越来越强大的计算机的需求。中央处理器的开发一直基于增加微处理器芯片上晶体管数量的技术。著名的摩尔定律说:“如果这种趋势持续下去,计算设备的能力将在相对较短的时间段(24个月)内呈指数增长



。” “,他承认在很长一段时间内物理量的指数增长是不可能的。只有晶体管及其制造技术的发展才有可能将该法则扩展几代。



摩尔在2007年表示,由于物质的原子性质和光速限制,该法律显然将很快失效。当前,处理器中晶体管的最大尺寸为5纳米。也有3nm处理器的试用样品,但它的发布要到2021年才开始。这表明芯片上晶体管数量的进一步增加将很快停止(直到发现一种新材料或彻底更新工艺过程)。



解决此问题的方法之一是并行计算。该术语被理解为一种组织计算机计算的方式,其中程序被开发为一组并行(同时)工作的交互计算过程。



通过同步方法进行的并行计算分为两种。



在第一种变体中,进程的交互通过共享内存发生:在多处理器系统的每个处理器上启动单独的执行线程。所有线程都属于一个进程。线程通过共享内存区域为给定进程交换数据。线程数与处理器数相对应。流可以通过编程语言(例如,Java,C#,C ++ 11中的C ++,C11中的C)或使用库来创建。在这种情况下,可以显式创建线程(例如,在C / C ++中使用PThreads),声明性创建(例如,使用OpenMP库)或使用内置编译器工具(例如,高性能Fortran)自动创建线程。所描述的并行编程变体通常需要某种形式的控件捕获(互斥体,信号量,监视器)以协调彼此之间的流。



在第二变体中,使用消息传输来执行交互。单线程进程在多处理器系统中的每个处理器上启动,该进程使用消息与在其他处理器上运行的其他进程进行通信。通过调用操作系统的相应功能显式创建进程,并使用特殊的库(例如MPI协议实现)或使用语言工具(例如High Performance Fortran,Erlang或occam)交换消息。



除了上述两个之外,还使用混合选项:在具有分布式内存(DM-MIMD)的多处理器系统上,其中系统的每个节点都是具有共享内存的多处理器(SM-MIMD),可以使用以下方法。在系统的每个节点上启动多线程进程,该进程在该节点的处理器之间分配线程。节点上的线程之间的数据交换是通过共享内存进行的,而节点之间的数据交换是通过消息传输进行的。在这种情况下,进程数由节点数确定,线程数由每个节点上的处理器数确定。并行编程的混合方法更加复杂(需要以特殊方式重写并行程序),但是在使用多处理器系统的每个节点的硬件资源时,效率最高。



在本文中,我建议采用这种混合方法来并行化Python中的计算。这项工作的关键特征是使用docker-container技术。正在开发的框架将具有客户端-服务器体系结构,其中包括以下元素。



在客户端:



  1. 序列化器:根据名称,它序列化函数及其变量(即,可以将它们保存到外部设备或网络,然后加载到同一节点或另一个节点上的内存中)。还值得强调一下并行装饰器,它是一个包装函数,可让您将串行器用于各种功能。
  2. 服务器/集群连接配置的类
  3. 用于标记要并行化的功能的其他语言工具。


服务器端:



  1. 反序列化器-相应地,对接收到的数据进行反序列化(请参见上文)。
  2. Executor是处理反序列化数据(函数及其参数)的类,还将必需的库安装到Python解释器的虚拟环境中。


图中显示了正在开发的系统的一般体系结构。



图片



对于客户端和服务器之间的通信,可以使用套接字或扭曲的框架,将通过开发的API进行交互。



该系统的实现假定使用docker技术。这使您可以方便快捷地开始配置软件:只需启动docker-swarm群集,在所选服务器上部署docker映像并设置复制数量。



使用docker技术的其他重要优点是通过虚拟化类似UNIX的系统(Ubuntu-轻量级Alpine Linux)来创建同质计算环境,以及存在群集模式,该模式可让您在不同服务器上运行多个容器并通过将作业转移到可用容器来快速平衡负载。 ...



开发的框架可用于需要使用Python语言执行大量计算的各个领域,包括机器学习和深度数据分析任务,以及用于较简单的任务,例如在编程比赛中进行分布式决策检查。



All Articles