Linux 体图像数据的分布式处理

Linux 体图像数据的分布式处理,linux,image,hadoop,machine-learning,distributed-computing,Linux,Image,Hadoop,Machine Learning,Distributed Computing,对于目标识别算法的开发,我需要在一大组体积图像文件(MR扫描)上重复运行检测程序。 检测程序是一个命令行工具。如果我在本地计算机上以单个文件和单线程运行它,大约需要10秒。处理结果将写入文本文件。 典型的运行方式是: 10000个图像,每个300 MB=3TB 单芯10秒=100000秒=约27小时 我可以做些什么来更快地获得结果?我可以访问一个由20台服务器组成的集群,每个服务器有24个(虚拟)核心(Xeon E5,1字节磁盘,CentOS Linux 7.2)。 理论上,480个内核只需

对于目标识别算法的开发,我需要在一大组体积图像文件(MR扫描)上重复运行检测程序。 检测程序是一个命令行工具。如果我在本地计算机上以单个文件和单线程运行它,大约需要10秒。处理结果将写入文本文件。 典型的运行方式是:

  • 10000个图像,每个300 MB=3TB
  • 单芯10秒=100000秒=约27小时
我可以做些什么来更快地获得结果?我可以访问一个由20台服务器组成的集群,每个服务器有24个(虚拟)核心(Xeon E5,1字节磁盘,CentOS Linux 7.2)。 理论上,480个内核只需要3.5分钟即可完成任务。 我正在考虑使用Hadoop,但它不是为处理二进制数据而设计的,它会分割输入文件,这不是一个选项。 我可能需要某种分布式文件系统。我使用NFS进行了测试,网络成为了一个严重的瓶颈。每个服务器只应处理其本地存储的文件。 另一种选择可能是购买一台高端工作站,而忘记分布式处理

我不确定,如果我们需要数据位置, i、 e.每个节点在本地硬盘上保存部分数据,仅处理其数据
本地数据。

我定期使用Spot实例在AWS上运行大规模分布式计算。您肯定应该使用由20台服务器组成的集群供您使用

您没有提到您的服务器正在使用哪些操作系统,但如果它是基于linux的,您最好的朋友是bash。您还很幸运,它是一个命令行程序。这意味着您可以使用ssh从一个主节点直接在服务器上运行命令

典型的处理顺序是:

  • 在主节点上运行脚本,该脚本通过ssh在所有从节点上发送和运行脚本
  • 每个从节点从存储它们的主节点下载一部分文件(通过NFS或scp)
  • 每个从属节点处理其文件,通过scp、mysql或文本刮削保存所需的数据
  • 要开始,您需要从主服务器获得对所有从属服务器的ssh访问权。然后,您可以将scp文件发送到每个从属服务器,就像脚本一样。如果您在专用网络上运行,则不必太担心安全性,因此只需将ssh密码设置为简单的密码即可

    就CPU内核而言,如果您使用的命令行程序不是为多核设计的,那么您可以对每个从机运行几个ssh命令。最好的办法是运行一些测试,看看进程的最佳数量是多少,因为太多的进程可能会由于内存不足、磁盘访问或类似原因而变慢。但是假设您发现12个同时进行的进程提供了最快的平均时间,然后通过ssh同时运行12个脚本


    完成这一切不是一件小事,但是,您将永远能够在很短的时间内完成处理。

    我经常使用Spot实例在AWS上运行大规模分布式计算。您肯定应该使用由20台服务器组成的集群供您使用

    您没有提到您的服务器正在使用哪些操作系统,但如果它是基于linux的,您最好的朋友是bash。您还很幸运,它是一个命令行程序。这意味着您可以使用ssh从一个主节点直接在服务器上运行命令

    典型的处理顺序是:

  • 在主节点上运行脚本,该脚本通过ssh在所有从节点上发送和运行脚本
  • 每个从节点从存储它们的主节点下载一部分文件(通过NFS或scp)
  • 每个从属节点处理其文件,通过scp、mysql或文本刮削保存所需的数据
  • 要开始,您需要从主服务器获得对所有从属服务器的ssh访问权。然后,您可以将scp文件发送到每个从属服务器,就像脚本一样。如果您在专用网络上运行,则不必太担心安全性,因此只需将ssh密码设置为简单的密码即可

    就CPU内核而言,如果您使用的命令行程序不是为多核设计的,那么您可以对每个从机运行几个ssh命令。最好的办法是运行一些测试,看看进程的最佳数量是多少,因为太多的进程可能会由于内存不足、磁盘访问或类似原因而变慢。但是假设您发现12个同时进行的进程提供了最快的平均时间,然后通过ssh同时运行12个脚本


    完成这一切不是一件小事,但是,您将永远能够在很短的时间内完成处理。

    您可以使用Hadoop。是的,FileInputFormat和RecordReader的默认实现是将文件分割成块并将块分割成行,但您可以编写自己的FileInputFormat和RecordReader实现。我创建自定义FileInputFormat的另一个目的是,我遇到了相反的问题——比默认值更精细地分割输入数据,但有一个很好的方法可以解决您的问题:plus


    但从另一个角度看,Hadoop是一头沉重的野兽。它对映射程序的启动有很大的开销,所以映射程序的最佳运行时间是几分钟。你的任务太短了。也许可以创建更聪明的FileInputFormat,它可以将一堆文件解释为单个文件,并将文件作为记录提供给同一个映射器,我不确定。

    您可以使用Hadoop。是的,FileInputFormat和RecordReader的默认实现是将文件分割成块并将块分割成行,但您可以编写自己的FileInputFormat和RecordReader实现。我创建自定义FileInputFormat的另一个目的是,我遇到了相反的问题——比默认值更精细地分割输入数据,但有一个很好的方法可以解决您的问题:plus

    但从另一个角度看,Hadoop是一头沉重的野兽。它对映射程序的启动有很大的开销,所以映射程序的最佳运行时间是几分钟。你的任务太短了。也许有可能