- PVSM.RU - https://www.pvsm.ru -
Зайдя на официальный сайт языка программирования Julia [1], можно увидеть утверждение: "Julia is fast!". Однако, новые пользователи на практике сталкиваются с проблемой медленной загрузки модулей, в особенности графических [1 [2],2 [3]]. Диалектически, причиной медленного запуска является использование JIT [4] компиляции, использование которой и обеспечивает высокую производительность языка. При желании, с особенностями JIT можно ознакомиться в других статьях [5]. В данной статье пойдёт речь о более практической задаче — о том, как ускорить запуск модулей в Julia при помощи PackageCompiler.jl [6].
В данной статье используется julia v1.1.0 [7]. Кроме того, работа метода была проверена на julia v1.0.3 [8].
Для оценки времени выполнения использовался тривиальный скрипт:
@time using Plots
x = 0:0.01:10000
y = @. sin(π*x)
@time plot(x,y) # Первый, медленный запуск
@time plot(x,y) # Второй, быстрый запуск
Запуская этот скрипт на стоковой julia, получены следующие значения:
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)
Как видно, первое выполнение команды plot длится невероятные 14 с. Следующее за ним — уже 0,01 с.
Попробуем улучшить эти показатели. Для начала, установим модуль PackageCompiler:
import Pkg
Pkg.add("PackageCompiler")
Далее, протестируем сборку зависимости модуля Plots:
import Pkg
Pkg.add("Arpack")
Pkg.build("Arpack")
Если выполнение последней команды прервалось с ошибкой
ERROR: LoadError: LibraryProduct(...) is not satisfied, cannot generate deps.jl!
, то Вы стали жертвой Issue #5 [9]. Проблема связана с использованием внешних динамических библиотек и должна будет решиться после интеграции BinaryProvider [10]. В качестве временного решения, по совету blegat [11], соберём библиотеку [12] сами:
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/
После выполнения данных манипуляций ошибка должна пропасть:
import Pkg
Pkg.build("Arpack")
Настало время компиляции пакета Plots:
import Pkg
Pkg.add("Plots")
using PackageCompiler
compile_package("Plots")
Компиляция длится достаточно долго с большим количеством текста в консоли. Обратите внимание на последнюю строку лога:
┌ 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"
В ней указано расположение скомпилированного образа и подсказка, как его запустить.
Запустим тестовый скрипт с использованием этого образа:
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)
Таким образом, время первого запуска функции plot удалось снизить с 14 c до 0,03 с.
Данный метод можно использовать для экспорта образов нескольких библиотек, модификации системного образа и компиляции статических программ. Чтобы узнать подробнее о PackageCompiler.jl, обратитесь к описанию в репозитории проекта [13].
Автор: bazooka_easter
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/julia/317095
Ссылки в тексте:
[1] Julia: https://julialang.org/
[2] 1: https://stackoverflow.com/questions/40116045/why-is-julia-taking-a-long-time-on-the-first-call-into-my-module
[3] 2: https://www.reddit.com/r/Julia/comments/b4qaz4/slow_plotting_is_the_only_thing_preventing_julia/
[4] JIT: https://en.wikipedia.org/wiki/Just-in-time_compilation
[5] других статьях: https://habr.com/ru/search/?q=jit#h
[6] PackageCompiler.jl: http://PackageCompiler.jl
[7] julia v1.1.0: https://packages.debian.org/experimental/julia
[8] julia v1.0.3: https://packages.debian.org/sid/julia
[9] Issue #5: https://github.com/JuliaLinearAlgebra/Arpack.jl/issues/5
[10] BinaryProvider: https://github.com/JuliaLang/Pkg.jl/issues/841
[11] по совету blegat: https://github.com/JuliaLinearAlgebra/Arpack.jl/issues/5#issuecomment-470523795
[12] библиотеку: https://github.com/opencollab/arpack-ng/releases/tag/3.5.0
[13] репозитории проекта: https://github.com/JuliaLang/PackageCompiler.jl
[14] Источник: https://habr.com/ru/post/451068/?utm_campaign=451068
Нажмите здесь для печати.