我已经完成了使用增强分类器的多类分类算法。主要计算方法之一是加权最小二乘回归。我使用过的主要库包括:
我用Python开发了算法,使用Anaconda的Spyder。
我现在需要使用算法开始训练分类模型。所以我将把大约7000到10000张图像传递给这个算法,每个图像大约50x100,都是灰度的。
现在有人告诉我,为了加速训练过程,有一台强大的机器。他们问我“我用的是GPU吗?”还有其他几个问题。
老实说,我在CUDA/GPU等方面没有经验,我只听说过他们。我没有考虑到任何这样的事情来开发我的代码。事实上,我(无知的)印象是,一台好机器会比普通机器更快地自动运行我的代码,而无需做任何事情。(除了显然在循环、O(n)等方面有效地编写常规代码之外)。
仅仅因为在高性能的计算机上,我的代码还能被加速吗?或者我需要修改它来使用并行处理机器?
发布于 2014-06-19 22:17:31
这些评论和司法部的回答给出了很多好的建议。我对python的信号/图像处理有一定的经验,并多次将头撞在性能墙上,我只想分享一些关于使事情变得更快的想法。也许这些有助于用缓慢的算法找出可能的解决方案。
在哪里度过的时间?
让我们假设你有一个很好的算法,它太慢了。第一步是对其进行剖析,以了解在哪里花费的时间。有时时间是用愚蠢的方式做琐碎的事情。它可能在您自己的代码中,甚至可能在库代码中。例如,如果您想要运行一个具有较大内核的2D高斯滤波器,直接卷积是非常慢的,甚至FFT也可能是慢的。在某些情况下,用计算成本低的连续滑动平均逼近滤波器,可以使速度提高10或100倍,并给出足够接近的结果。
如果在某些模块/库代码上花费了大量时间,那么您应该检查该算法是否只是一个缓慢的算法,或者库中是否有慢的地方。Python是一种很好的编程语言,但是对于纯粹的数字处理操作来说,它不是很好,这意味着大多数伟大的库都有一些二进制库来完成繁重的工作。另一方面,如果您能够找到合适的库,在信号/图像处理中使用python的代价通常是可以忽略不计的。因此,用C重写整个程序通常没有多大帮助。
即使在C中编写一个好的算法也不总是那么简单,有时性能可能会因CPU缓存之类的事情而有很大的差异。如果数据位于CPU缓存中,则可以非常快地获取数据,如果不是,则算法要慢得多。根据数据大小,这可能会在处理时间中引入非线性步骤。(大多数人都是从虚拟内存交换中知道这一点的,在虚拟内存交换中,它更可见。)因此,用100000分解决100个问题可能比用10000分解决1个问题更快。
要检查的一件事是计算中使用的精度。在某些情况下,float32和float64一样好,但速度更快。在许多情况下没有差别。
Multi-threading
Python --我提到了吗?-是一种很好的编程语言,但它的缺点之一是它在其基本形式上只运行一个线程。因此,无论你的系统中有多少个核心,挂钟的时间总是一样的。其结果是,其中一个核心是100 %,而其他人的时间闲置。使事情并行和有多个线程可能会提高你的性能的一个因素,例如,3在一台4核机器。
如果你能把你的问题分成小的、独立的部分,这通常是一个非常好的主意。它有助于解决许多性能瓶颈。
不要指望技术会来拯救我们。如果代码不是写成并行的,那么机器就很难使其并行。
图形处理器
你的机器可能有一个伟大的GPU,可能有1536个渴望数字的核心,随时准备处理所有你抛向他们的东西。坏消息是,编写GPU代码与编写CPU代码略有不同。有一些稍微通用的API (CUDA,OpenCL),但是如果您不习惯为GPU编写并行代码,那么就为陡峭的学习曲线做好准备。另一方面,很可能有人已经编写了您需要的库,然后您只需将其挂钩即可。
使用GPU,纯粹的数字运算能力令人印象深刻,几乎令人恐惧。我们可以讨论3 TFLOPS (3x10^12单精度浮点运算每秒).问题是如何获得数据到GPU核心,因为内存带宽将成为限制因素。这意味着,即使在许多情况下使用GPU是个好主意,但在很多情况下却没有好处。
通常,如果您在映像上执行大量本地操作,则这些操作很容易并行,并且非常适合GPU。如果你在做全球性的操作,情况就会更加复杂一些。FFT需要来自整个图像的信息,因此标准算法在GPU中不能很好地工作。(FFT有基于GPU的算法,它们有时会让事情变得更快。)
另外,请注意,在GPU上运行算法时,要将您绑定到该GPU。代码跨OSes或机器的可移植性受到影响。
购买一些性能
另外,需要考虑的一件重要事情是,如果您需要运行算法一次,偶尔运行一次,或者实时运行一次。有时,解决办法就像从更大的计算机上争取时间一样容易。每小时花一两美元,你就可以用大量的资源从速度相当快的机器上买到时间。它比你想象的要简单,而且往往更便宜。此外,GPU的容量可以很容易地以类似的价格购买。
与物理机器相比,在某些情况下,虚拟机的IO速度是非常好的。这一区别来自于这样一个事实,即没有旋转盘,平均每一次数据所需的转速为半转。对于数据密集型应用程序来说,这一点可能很重要,特别是当您处理大量文件并以非线性方式访问它们时。
发布于 2014-06-19 12:37:06
恐怕你不能仅仅在一台强大的计算机上运行它来加速你的程序。我回来的时候有过这个问题。我首先使用python (非常慢),然后移动到C(慢速),然后不得不使用其他技巧和技巧。例如,有时可以应用一些降维方法来加快速度,同时具有合理的精确结果,或者如您所提到的使用多个处理技术。
由于您正在处理图像处理问题,您做了大量的矩阵操作和GPU肯定会有很大的帮助。在python中有一些很好而且很活跃的CUDA包装器,您可以通过不了解太多的cuda轻松地使用它们。我尝试了西亚诺,俾库达和科基特-库达(从那以后应该有更多的)。
https://stackoverflow.com/questions/24306285
复制相似问题