Accélérer le lancement de Julia avec PackageCompiler.jl

En allant sur le site officiel du langage de programmation Julia , vous pouvez voir la déclaration: "Julia est rapide!". Cependant, dans la pratique, les nouveaux utilisateurs sont confrontés au problème du chargement lent des modules, notamment graphiques [ 1 , 2 ]. Dialectiquement, la raison du démarrage lent est l'utilisation de la compilation JIT , dont l'utilisation garantit des performances linguistiques élevées. Si vous le souhaitez, les fonctionnalités de JIT peuvent être trouvées dans d' autres articles . Cet article abordera une tâche plus pratique - comment accélérer le lancement de modules dans Julia à l'aide de PackageCompiler.jl .


Cet article utilise julia v1.1.0 . De plus, la méthode a été testée sur julia v1.0.3 .
Pour évaluer le runtime, un script trivial a été utilisé:


@time using Plots x = 0:0.01:10000 y = @. sin(π*x) @time plot(x,y) # ,   @time plot(x,y) # ,   

En exécutant ce script sur stock julia, les valeurs suivantes sont obtenues:


  2.804964 seconds (5.03 M allocations:x 291.243 MiB, 5.35% gc time) 13.546407 seconds (45.64 M allocations: 2.232 GiB, 9.00% gc time) 0.013167 seconds (2.14 k allocations: 7.788 MiB) 

Comme vous pouvez le voir, la première exécution de la commande plot dure 14 secondes incroyables. Le suivre est déjà 0,01 s.


Essayons d'améliorer ces indicateurs. Pour commencer, installez le module PackageCompiler:


 import Pkg Pkg.add("PackageCompiler") 

Ensuite, testez la construction des dépendances du module Plots :


 import Pkg Pkg.add("Arpack") Pkg.build("Arpack") 

Si l'exécution de la dernière commande a été interrompue avec une erreur
ERROR: LoadError: LibraryProduct(...) is not satisfied, cannot generate deps.jl!
, vous êtes alors devenu victime du problème n ° 5 . Le problème est associé à l'utilisation de bibliothèques dynamiques externes et devra être résolu après l'intégration de BinaryProvider . Comme solution temporaire, sur les conseils de blegat , nous assemblerons nous-mêmes la bibliothèque :


 git clone https://github.com/opencollab/arpack-ng.git /tmp/arpack && cd /tmp/arpack git checkout 3.5.0 bash bootstrap ./configure --enable-mpi --enable-shared make cp SRC/.libs/libarpack.so.2.0.0 ~/.julia/packages/Arpack/UiiMc/deps/usr/lib/ 

Après avoir effectué ces manipulations, l'erreur devrait disparaître:


 import Pkg Pkg.build("Arpack") 

Il est temps de compiler le package Plots :


 import Pkg Pkg.add("Plots") using PackageCompiler compile_package("Plots") 

La compilation dure assez longtemps avec beaucoup de texte dans la console. Faites attention à la dernière ligne du journal:


 ┌ Info: Not replacing system image. └ You can start julia with `julia -J /home/user/.julia/packages/PackageCompiler/oT98U/sysimg/sys.so` at a posix shell to load the compiled files. "/home/user/.julia/packages/PackageCompiler/oT98U/sysimg/sys.so" 

Il indique l'emplacement de l'image compilée et une indication sur la façon de la démarrer.
Exécutez le script de test à l'aide de cette image:


 julia -J /home/user/.julia/packages/PackageCompiler/oT98U/sysimg/sys.so /tmp/test.jl 

  0.000251 seconds (501 allocations: 26.766 KiB) 0.028105 seconds (22.55 k allocations: 8.847 MiB) 0.017211 seconds (2.14 k allocations: 7.788 MiB, 18.16% gc time) 

Ainsi, le temps du premier démarrage de la fonction de plot été réduit de 14 s à 0,03 s.


Cette méthode peut être utilisée pour exporter des images de plusieurs bibliothèques, modifier l'image système et compiler des programmes statiques. Pour en savoir plus sur PackageCompiler.jl, reportez-vous à la description dans le référentiel de projet .

Source: https://habr.com/ru/post/fr451068/


All Articles