Ускорение запуска Julia при помощи PackageCompiler.jl

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Зайдя на официальный сайт языка программирования Julia, можно увидеть утверждение: "Julia is fast!". Однако, новые пользователи на практике сталкиваются с проблемой медленной загрузки модулей, в особенности графических [1,2]. Диалектически, причиной медленного запуска является использование JIT компиляции, использование которой и обеспечивает высокую производительность языка. При желании, с особенностями JIT можно ознакомиться в других статьях. В данной статье пойдёт речь о более практической задаче — о том, как ускорить запуск модулей в Julia при помощи PackageCompiler.jl.


В данной статье используется julia v1.1.0. Кроме того, работа метода была проверена на julia v1.0.3.
Для оценки времени выполнения использовался тривиальный скрипт:


@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. Проблема связана с использованием внешних динамических библиотек и должна будет решиться после интеграции BinaryProvider. В качестве временного решения, по совету blegat, соберём библиотеку сами:


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, обратитесь к описанию в репозитории проекта.

Источник: https://habr.com/ru/post/451068/


Интересные статьи

Интересные статьи

Что такое вишинг? Vishing (voice phishing, голосовой фишинг) — это вид атаки, при котором жертву пытаются убедить раскрыть ценную личную информацию по телефону. Хотя по описанию ...
Это развитие идей из публикации Визуализация при помощи генеративных алгоритмов: гифа, деревья, повторяющиеся и дифференциальные линии (на Python), однако вам необязательно читать...
Время от времени мне пишут комментарии о том, что мои работы не выглядят созданными компьютером. Как по мне, это лучшая похвала: мой глубокий интерес к генеративному искусству нач...
У людей, отвечающих за пуск ракет, есть такая старая шутка: если ракета готова к запуску, то погода заставит вас отложить его на день. Однако почему же НАСА, 45-е космическое к...
Как-то у нас исторически сложилось, что Менеджеры сидят в Битрикс КП, а Разработчики в Jira. Менеджеры привыкли ставить и решать задачи через КП, Разработчики — через Джиру.