Как создать образ sys, в котором несколько пакетов с предварительно скомпилированными функциями кэшированы в julia? - PullRequest
4 голосов
/ 12 апреля 2020

Допустим, у нас есть массив символов пакетов packages::Vector{Symbol} = [...], и мы хотим создать образ sys, используя PackageCompiler.jl . Мы могли бы просто использовать

using PackageCompiler

create_sysimage(packages; incremental = false, sysimage_path = "custom_sys.dll"

, но без файла precompile_execution_file это не будет стоить.

Примечание: sysimage_path = "custom_sys.so" в Linux и "custom_sys" .dylib "в macOS ...

Для файла precompile_execution_file я думал, что запуск теста для каждого пакета может сделать это, поэтому я сделал что-то вроде этого:

precompilation.jl

packages = [...]

@assert typeof(packages) == Vector{Symbol}

import Pkg

m = Module()
try Pkg.test.(Base.require.(m, packages)) catch ; end

Функция try предназначена для случаев, когда некоторые тесты выдают ошибку, и мы не хотим, чтобы она заканчивалась ошибкой.

Затем, выполнив следующее в оболочке, выдается

using PackageCompiler

packages = [...]

Pkg.add.(String.(packages))
Pkg.update()
Pkg.build.(String.(packages))

create_sysimage(packages; incremental = false,
                          sysimage_path = "custom_sys.dll",
                          precompile_execution_file = "precompilation.jl")

библиотека динамического изображения c sys, которая загружается без проблем. Когда я делал using Makie, задержки не было, так что с этой частью все в порядке, но когда я делал некоторые заговоры с Мак ie, все равно была первая задержка графика, так что я предполагаю, что скрипт прекомпиляции не сделал то, что я думал будет делать.

Кроме того, при использовании табуляции для получения предложений в ответ, он будет зависать в первый раз, но я предполагаю, что это ожидаемый побочный эффект.

1 Ответ

1 голос
/ 16 апреля 2020

Есть несколько проблем с вашим скриптом precompilation.jl, из-за которого тесты выдают ошибки, которые вы не видите из-за try...catch.

Но хотя запуск тестов для каждого пакета может быть хорошая идея для осуществления предварительной компиляции, есть более глубокие причины, почему я не думаю, что это может работать так просто:

  • Pkg.test порождает новый процесс, в котором фактически выполняются тесты. Я не думаю, что PackageCompiler может увидеть, что происходит в этом отдельном процессе.
  • Чтобы обойти это, вы можете просто include() файл test/runtests.jl каждого пакета. Но это, вероятно, тоже не удастся, из-за отсутствия test-speci c зависимостей .

Так что я бы сказал, что это работает надежно и систематически для всех пакетов вам нужно будет повторно внедрить (или повторно использовать, если можете) некоторые из внутренних логик c из Pkg.test, чтобы добавить все специфичные для теста c зависимости в текущую среду.

При этом в некоторых пакетах есть готовые сценарии прекомпиляции, помогающие сделать это. Это относится к Мак ie, который предлагает в своей документации использовать следующий файл для построения системных образов:

joinpath(pkgdir(Makie), "test", "test_for_precompile.jl")
...