Comparación de la velocidad de los lenguajes de programación usando el ejemplo de resolver el problema de entrenar una red neuronal

propósito del trabajo


Compare la velocidad de los programas escritos en diferentes idiomas y ejecute en diferentes sistemas operativos. Los resultados del trabajo son principalmente interesantes para resolver problemas asociados con las redes neuronales.

Hierro y OS


Para probar en Ubuntu y Windows (computadora portátil DELL Inspiron-7577):

RAM:

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


higo. 1 (salida del comando screenfetch en la computadora portátil DELL Inspiron-7577 en Ubuntu OS )

Para probar en MAC:

RAM: 8 Gb

CPU: Intel Core i7 2.7 GHz

También probamos en Raspberry pi 4: 

RAM:

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


higo. 2 (salida del comando screenfetch en raspberry pi 4 )

Programa de prueba


Para realizar las pruebas, se simuló un programa que imitaba una red de 5 neuronas; el objetivo del programa es aprender cómo resolver correctamente el problema de encontrar una exclusiva o con una precisión delta = 0.01. Todos los parámetros y propiedades de la red neuronal, así como el algoritmo de operación y entrenamiento, se tomaron de estas 2 publicaciones:

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

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

Los únicos cambios fueron se ingresan en los coeficientes E (épsilon) - velocidad de aprendizaje, α (alfa) - momento (E = 0.3, α = 0.5). Al utilizar los valores indicados en el artículo, la red neuronal durante mucho tiempo (8 horas) no pudo encontrar una solución.

Por su estructura, el programa es un tipo de modelo OOP en el que la clase NeuronNet opera con matrices de objetos de la clase Neuron y Sinaps. Un objeto de la clase Sinaps contiene referencias a 2 objetos de la clase Neuron. Para los cálculos de coma flotante, se usa el tipo de datos doble.

Algoritmo de prueba: 

  1. Se crea un objeto de clase NeuronNet.
  2. Pasa un conjunto de prueba de entrenamiento. Los resultados del trabajo de la red neuronal antes y después del entrenamiento se muestran en la consola y se utilizan para compararlos con los de referencia.
  3. El programa entra en un ciclo sin fin donde una vez en 100,000 resultados. Si el error es menor que delta = 0.01, el ciclo sin fin termina. En el futuro llamaré a cada una de esas comparaciones una era. Cuando pasa la era, el tiempo que tomó y los resultados del cálculo de la red neuronal para cada valor de la tabla que excluye o se muestra en la consola.
  4. Después de salir del ciclo, el programa imprime el tiempo transcurrido desde 0 hasta la última era y finaliza.

El programa se escribió originalmente en python3 (https://gitlab.com/di.romanov/neuron1.git) y posteriormente se tradujo a Java, Kotlin, C ++ (gcc), php7, ruby


higo. 3 (un ejemplo de la salida de un programa escrito en el idioma Kotlin que se ejecuta en el sistema operativo Ubuntu)

Resultados de la prueba


Al trabajar, los programas escritos en Kotlin, Java, php, ruby ​​y Python dieron las mismas respuestas después del conjunto de entrenamiento; el resultado después del conjunto de entrenamiento de un programa escrito en C ++ fue diferente, lo que implicó un cambio en la cantidad de épocas que requería para un entrenamiento adecuado. Por esta razón, se proporcionarán tanto las comparaciones del tiempo de ejecución de todo el programa como el tiempo que llevó completar una era.

Tiempo de entrenamiento [ms.]
UbuntuVentanasRaspbianMAC
Pitón104569204239521112335621
Kotlin49684877199637775
Java48925994179737652
Rubí7968490524457229
C ++100990212000505377
php75591131170513996

lengüeta. 1 (tiempo de paso de todas las eras antes de entrenar la red neuronal) 

Tiempo de viaje de una era [ms.]
UbuntuVentanasRaspbianMAC
Pitón8713169424331527576
Kotlin3924051631625
Java3954851434635
Rubí6667756638040
C ++4185883421057
php63811001243168

lengüeta. 2 (el tiempo pasa una era) 

Análisis de resultados



grafico. 1 (el tiempo de paso de todas las eras para los programas que se ejecutan en el sistema operativo Ubuntu)

Como se esperaba, Kotlin y Java mostraron la misma velocidad de trabajo por delante de Python unas 20 veces. Consideremos algunas observaciones no tan obvias.

Los resultados de un programa escrito en C ++ fueron inesperadamente lentos. En parte, esto puede explicarse por la gran cantidad de eras que le llevó encontrar la respuesta correcta. Sin embargo, incluso con esto en mente ( ver gráfico 2 ), se encuentra muy por detrás de los programas Java en velocidad. 


grafico. 2 (tiempo de paso de una era para programas que se ejecutan en el sistema operativo Ubuntu)

Otra razón para tales resultados puede ser el uso diferente de los recursos del procesador ( ver Fig. 4, Fig. 5 )


. 4 ( Ubuntu Kotlin)




higo. 5 (salida del monitor de puerto de Ubuntu durante la ejecución de un programa escrito en C ++)

Como puede ver, Java usa al menos 4 núcleos a la vez, mientras que un programa C ++ usa uno. Sin embargo, esto no puede explicar la superioridad de la velocidad de 8 veces, ya que Java no utiliza todos los núcleos al 100%.

Diferencias significativas en la velocidad de un programa escrito en Python dependiendo del sistema operativo. Al ejecutar programas Java en diferentes sistemas operativos, las diferencias de velocidad no eran más del 40% (incluso en diferentes máquinas, con la excepción de la frambuesa), pero al iniciar un programa Python, se obtuvieron los siguientes valores: Ubuntu - 104c, Windows - 204c, MAC - 335c . La relación entre la velocidad del programa en Kotlin y la velocidad del programa en Python es 21 para el sistema operativo Ubuntu, 26 para Raspberry y ya 43 para Mac.

Todos los lenguajes de programación interpretados mostraron la misma velocidad en Raspbery

Autores de traducción Python3


Ruby, php

https://vk.com/silverlumen

Java

https://vk.com/id365699827

All Articles