Comparaison de la vitesse des langages de programmation à l'aide de l'exemple de résolution du problème de l'entraînement d'un réseau neuronal

but du travail


Comparez la vitesse des programmes écrits dans différentes langues et exécutés sur différents systèmes d'exploitation. Les résultats des travaux sont principalement intéressants pour résoudre les problèmes associés aux réseaux de neurones.

Iron et OS


Pour les tests sur Ubuntu et Windows (ordinateur portable DELL Inspiron-7577):

RAM:

CPU 16 Go : Intel Core i7-7700HQ @ 8x 3,8 GHz


figure. 1 (sortie de la commande screenfetch sur le portable DELL Inspiron-7577 sous Ubuntu OS )

Pour les tests sous MAC:

RAM : 8 Go

CPU: Intel Core i7 2,7 GHz

Nous avons également testé sur Raspberry pi 4: 

RAM: 4G Go

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


figure. 2 (sortie de la commande screenfetch sur le raspberry pi 4 )

Programme de test


Pour effectuer des tests, un programme a été simulé qui imitait un réseau de 5 neurones; l'objectif du programme est d'apprendre à résoudre correctement le problème de la recherche d'un delta exclusif ou avec précision = 0,01. Tous les paramètres et propriétés du réseau de neurones, ainsi que l'algorithme de fonctionnement et de formation, ont été extraits de ces 2 messages:

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

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

Les seuls changements ont été sont entrés dans les coefficients E (epsilon) - vitesse d'apprentissage, α (alpha) - moment (E = 0,3, α = 0,5). Lors de l'utilisation des valeurs indiquées dans l'article, le réseau neuronal pendant longtemps (8 heures) n'a pas pu trouver de solution.

Par sa structure, le programme est une sorte de modèle OOP dans lequel la classe NeuronNet fonctionne avec des tableaux d'objets de la classe Neuron et Sinaps. Un objet de la classe Sinaps contient des références à 2 objets de la classe Neuron. Pour les calculs en virgule flottante, le type de données double est utilisé.

Algorithme de test: 

  1. Un objet de classe NeuronNet est créé.
  2. Réussit un ensemble d'entraînement de test. Les résultats du travail du réseau neuronal avant l'entraînement et après sont affichés dans la console et sont utilisés pour la comparaison avec ceux de référence.
  3. Le programme entre dans un cycle sans fin où une fois sur 100 000 résultats. Si l'erreur est inférieure à delta = 0,01, le cycle sans fin se termine. À l'avenir, j'appellerai chacune de ces comparaisons une ère. Lorsqu'une époque passe, la console affiche le temps qu'il a fallu et les résultats du calcul du réseau neuronal pour chaque valeur de la table qui exclut ou.
  4. Après avoir quitté le cycle, le programme imprime le temps écoulé de 0 à la dernière ère et se termine.

Le programme a été initialement écrit en python3 (https://gitlab.com/di.romanov/neuron1.git), puis traduit en Java, Kotlin, C ++ (gcc), php7, ruby


figure. 3 (un exemple de la sortie d'un programme écrit en langage Kotlin fonctionnant sous le système d'exploitation Ubuntu)

Résultats de test


Lors du travail, les programmes écrits en Kotlin, Java, php, ruby ​​et Python donnaient les mêmes réponses après l'ensemble de formation; la sortie après l'ensemble de formation d'un programme écrit en C ++ était différente, ce qui entraînait une modification du nombre d'époques nécessaires à une formation appropriée. Pour cette raison, les deux comparaisons de la durée de l'ensemble du programme et le temps qu'il a fallu pour passer par une ère seront donnés.

Temps de formation [ms.]
Ubuntules fenêtresRaspbianMAC
Python104569204239521112335621
Kotlin49684877199637775
Java48925994179737652
Rubis7968490524457229
C ++100990212000505377
php75591131170513996

languette. 1 (temps de passage de toutes les époques avant l'entraînement du réseau neuronal) 

Temps de voyage d'une époque [ms.]
Ubuntules fenêtresRaspbianMAC
Python8713169424331527576
Kotlin3924051631625
Java3954851434635
Rubis6667756638040
C ++4185883421057
php63811001243168

languette. 2 (le temps passe une ère) 

L'analyse des résultats



graphique. 1 (le temps de passage de toutes les époques pour les programmes exécutés sur le système d'exploitation Ubuntu)

Comme prévu, Kotlin et Java ont montré la même vitesse de travail devant Python d'environ 20 fois. Prenons quelques observations moins évidentes.

Les résultats d'un programme écrit en C ++ ont été étonnamment lents. Cela s'explique en partie par le grand nombre d'époques qu'il lui a fallu pour trouver la bonne réponse. Cependant, même dans cet esprit ( voir graphique. 2 ), il est en retard sur les programmes Java en termes de vitesse. 


graphique. 2 (temps de passage d'une époque pour les programmes exécutés sur le système d'exploitation Ubuntu)

Une autre raison de ces résultats peut être une utilisation différente des ressources du processeur ( voir Fig. 4, Fig. 5 )


. 4 ( Ubuntu Kotlin)




figure. 5 (sortie du moniteur de port Ubuntu lors de l'exécution d'un programme écrit en C ++)

Comme vous pouvez le voir, Java utilise au moins 4 cœurs à la fois, alors qu'un programme C ++ en utilise un. Cependant, cela ne peut pas expliquer la supériorité de la vitesse de 8 fois, car Java n'utilise pas tous les cœurs à 100%.

Différences significatives dans la vitesse d'un programme écrit en Python selon le système d'exploitation. Lors de l'exécution de programmes Java sur différents systèmes d'exploitation, les différences de vitesse n'étaient pas supérieures à 40% (même sur différentes machines, à l'exception de la framboise), mais lors du démarrage d'un programme Python, les valeurs suivantes ont été obtenues: Ubuntu - 104c, Windows - 204c, MAC - 335c . Le rapport de la vitesse du programme sur Kotlin à la vitesse du programme en Python est de 21 pour Ubuntu OS, 26 pour Raspberry et déjà 43 pour Mac.

Tous les langages de programmation interprétés ont montré la même vitesse sur Raspbery

Auteurs de traduction Python3


Ruby, php

https://vk.com/silverlumen

Java

https://vk.com/id365699827

All Articles