以解决神经网络训练问题为例的编程语言速度比较

工作目的


比较以不同语言编写并在不同操作系统上运行的程序的速度。这项工作的结果对于解决与神经网络相关的问题非常有趣。

铁和操作系统


对于在Ubuntu和Windows(DELL Inspiron-7577笔记本电脑)上进行的测试:

RAM:16Gb

CPU:Intel Core i7-7700HQ @ 8x 3.8GHz


图。1(在Ubuntu OS下 DELL Inspiron-7577 笔记本电脑上的screenfetch命令输出

对于在MAC下进行测试:

RAM:8Gb

CPU:英特尔酷睿i7 2.7GHz

我们还在Raspberry pi 4上进行了测试: 

RAM:4Gb

CPU:ARMv7 rev 3(v7l)@ 4x 1,5Ghz


图。2(在raspberry pi 4 上输出的screenfetch命令

测试程序


为了进行测试,模拟了一个程序,该程序模仿了5个神经元的网络;该程序的目标是学习如何正确解决发现互斥或精度为delta = 0.01的问题。所有参数和神经网络的性能,以及操作和训练算法,从这些2个职位采取:

https://habr.com/en/post/312450/

https://habr.com/en/post/313216/

唯一的变化是在系数E(ε)-学习速度,α(alpha)-力矩中输入(E = 0.3,α= 0.5)。当使用文章中指示的值时,神经网络长时间(8小时)找不到解决方案。

根据其结构,该程序是一种OOP模型,其中NeuronNet类与Neuron和Sinaps类的对象数组一起运行。Sinaps类的一个对象包含对Neuron类的2个对象的引用。对于浮点计算,使用double数据类型。

测试算法: 

  1. 将创建类NeuronNet的对象。
  2. 通过测试训练集。训练之前和之后的神经网络工作结果将显示在控制台中,并用于与参考值进行比较。
  3. 程序进入一个无限循环,每100,000个 结果一次如果误差小于delta = 0.01,则无限循环结束。将来,我将每个这样的比较称为一个时代。当一个时期过去时,控制台将显示所花费的时间以及该表中每个值(不包括or)的神经网络计算结果。
  4. 退出循环后,程序将打印从0到最后一个时代的经过时间并结束。

该程序最初是用python3(https://gitlab.com/di.romanov/neuron1.git)编写的,随后被翻译成Java,Kotlin,C ++(gcc),php7,ruby


图。3(在Ubuntu操作系统下运行以Kotlin语言编写的程序的输出示例)

试验结果


在工作时,用Kotlin,Java,php,ruby和Python编写的程序在训练集后给出了相同的答案;用C ++编写的程序的训练集后的输出是不同的,这导致正确训练所需的时期数发生了变化。因此,将对整个程序的运行时间和完成一个时代所需的时间进行比较。

训练时间[毫秒]
的Ubuntu视窗树莓派苹果电脑
蟒蛇104569204239521112335621
科特林49684877199637775
爪哇48925994179737652
红宝石7968490524457229
C ++100990212000505377
的PHP75591131170513996

标签。1(训练神经网络之前所有时代的通过时间) 

一个时代的旅行时间[毫秒]
的Ubuntu视窗树莓派苹果电脑
蟒蛇8713169424331527576
科特林3924051631625
爪哇3954851434635
红宝石6667756638040
C ++4185883421057
的PHP63811001243168

标签。2(时光流逝一个时代) 

结果分析



图形。1(在Ubuntu操作系统上运行程序的所有时代都过去了)可以

预期,Kotlin和Java的工作速度比Python快20倍。让我们考虑一些不太明显的观察。

用C ++编写的程序的结果出乎意料的缓慢。在一定程度上,这可以用她找到正确答案的许多时代来解释。但是,即使考虑到这一点(请参见图2),它的速度也落后于Java程序。 


图形。2(在Ubuntu OS上运行的程序的一个时代的通过时间)

导致这种结果的另一个原因可能是处理器资源的使用不同(请参见图4,图5)。


. 4 ( Ubuntu Kotlin)




图。 5(执行用C ++编写的程序时,Ubuntu端口监视器的输出)

如您所见,Java一次至少使用4个内核,而C ++程序一次使用一个。但是,这不能解释8倍的速度优势,因为Java并未100%使用所有内核。

使用Python编写的程序的速度在很大程度上取决于操作系统。在不同的操作系统上运行Java程序时,速度差异不超过40%(即使在不同的机器上,除了raspberry),但是在启动Python程序时,获得了以下值:Ubuntu-104c,Windows-204c,MAC-335c 。在Ubuntu操作系统上,Kotlin上的程序速度与Python上的程序速度之比为21,对于Raspberry为26,对于Mac为43。

所有解释过的编程语言在Raspbery上显示出相同的速度

Python3翻译作者


Ruby,PHP

https://vk.com/silverlumen

Java

https://vk.com/id365699827

All Articles