Acelerando el lanzamiento de Julia con PackageCompiler.jl

Al ir al sitio web oficial del lenguaje de programación de Julia , puede ver la declaración: "¡Julia es rápida!". Sin embargo, en la práctica, los nuevos usuarios se enfrentan al problema de la carga lenta de los módulos, especialmente los gráficos [ 1 , 2 ]. Dialécticamente, la razón del inicio lento es el uso de la compilación JIT , cuyo uso garantiza un alto rendimiento del lenguaje. Si lo desea, las características de JIT se pueden encontrar en otros artículos . Este artículo discutirá una tarea más práctica: cómo acelerar el lanzamiento de módulos en Julia usando PackageCompiler.jl .


Este artículo utiliza julia v1.1.0 . Además, el método se probó en julia v1.0.3 .
Para evaluar el tiempo de ejecución, se utilizó un script trivial:


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

Al ejecutar este script en stock julia, se obtienen los siguientes valores:


  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) 

Como puede ver, la primera ejecución del comando plot dura unos increíbles 14 segundos. Seguirlo ya es 0.01 s.


Intentemos mejorar estos indicadores. Para comenzar, instale el módulo PackageCompiler:


 import Pkg Pkg.add("PackageCompiler") 

A continuación, pruebe la compilación de dependencia del módulo Plots :


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

Si la ejecución del último comando se interrumpió con un error
ERROR: LoadError: LibraryProduct(...) is not satisfied, cannot generate deps.jl!
, luego te convertiste en víctima del problema # 5 . El problema está asociado con el uso de bibliotecas dinámicas externas y tendrá que resolverse después de la integración de BinaryProvider . Como solución temporal, siguiendo el consejo de blegat , nosotros mismos armaremos la biblioteca :


 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/ 

Después de realizar estas manipulaciones, el error debería desaparecer:


 import Pkg Pkg.build("Arpack") 

Es hora de compilar el paquete Plots :


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

La compilación dura lo suficiente con mucho texto en la consola. Presta atención a la última línea del registro:


 ┌ 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" 

Indica la ubicación de la imagen compilada y una pista sobre cómo iniciarla.
Ejecute el script de prueba con esta imagen:


 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) 

Por lo tanto, el tiempo del primer inicio de la función de plot se redujo de 14 sa 0.03 s.


Este método se puede utilizar para exportar imágenes de varias bibliotecas, modificar la imagen del sistema y compilar programas estáticos. Para obtener más información sobre PackageCompiler.jl, consulte la descripción en el repositorio del proyecto .

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


All Articles