Почему мультипроцессорная Юлия нарушает импорт моего модуля? - PullRequest
6 голосов
/ 30 марта 2020

Моя команда пытается запустить библиотеку (Cb c с JuMP) с многопроцессорной обработкой и использованием аргумента julia -p #. Наш код находится в пакете julia, поэтому мы можем нормально выполнить наш код, используя julia --project, он просто запускается с одним процессом. Попытка указать оба сразу, однако julia --project -p 8 лишает нас возможности запускать проект, так как запуск using PackageName после приводит к ошибке. Мы также намереваемся скомпилировать это с использованием библиотеки PackageCompiler, поэтому необходимо заставить ее работать с проектом.

Наш проект находится в папке с каталогом sr c, Project.toml и a Manifest.toml sr c содержит: main.jl и Solver.jl

Project.toml содержит:

name = "Solver"
uuid = "5a323fe4-ce2a-47f6-9022-780aeeac18fe"
authors = ["..."]
version = "0.1.0"

Обычно наш проект работает нормально, начиная с этого пути (однопоточный) :

julia --project
julia> using Solver
julia> include("src/main.jl")

Если мы добавим аргумент -p 8 при запуске Julia, мы получим ошибку при наборе using Solver:

ERROR: On worker 2:
ArgumentError: Package Solver [5a323fe4-ce2a-47f6-9022-780aeeac18fe] is required but does not seem to be installed:
 - Run `Pkg.instantiate()` to install all recorded dependencies.

Мы попытались запустить using Pkg; Pkg.instantiate(); using Solver, но это не помогает, так как другая ошибка просто происходит позже (на шаге include("src/main.jl")):

ERROR: LoadError: On worker 2:
ArgumentError: Package Solver not found in current path:
- Run `import Pkg; Pkg.add("Solver")` to install the Solver package.

, а затем следование этому совету приводит к другой ошибке:

ERROR: The following package names could not be resolved:
 * Solver (not found in project, manifest or registry)
Please specify by known `name=uuid`.

Почему этот модуль импортная работа нормально в однопроцессном режиме , но не с -p 8?

Заранее спасибо за внимание

Ответы [ 2 ]

5 голосов
/ 30 марта 2020

Во-первых, важно отметить, что вы НЕ используете многопоточный параллелизм, вы используете распределенный параллелизм. При запуске с -p 2 вы запускаете два разных процесса, которые не разделяют одну и ту же память. Кроме того, проект загружается только в главный процесс, поэтому другие процессы не могут видеть то, что находится в проекте. Вы можете узнать больше о различных видах параллелизма, которые предлагает Джулия в официальной документации .

Чтобы загрузить среду для всех рабочих, вы можете добавить это в начало вашего файла.

using Distributed
addprocs(2; exeflags="--project")
@everywhere using Solver
@everywhere include("src/main.jl")

и удалите -p 2 часть строки, с которой вы запускаете Джулию. Это загрузит проект на все процессы. Макрос @everywhere используется для указания всего процесса выполнения данной задачи. Эта часть документов объясняет это.

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

3 голосов
/ 31 марта 2020

Существует проблема с Джулией, когда существует нескомпилированный модуль, и несколько параллельных процессов одновременно пытаются скомпилировать его для первого использования.

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

using Distributed, Pkg
@everywhere using Distributed, Pkg
Pkg.activate(".")
@everywhere Pkg.activate(".")
using YourModuleName
@everywhere using YourModuleName

Я думаю, что этот подход недокументирован, но я нашел его экспериментально наиболее надежным. Если вы не используете мой шаблон иногда (не всегда!), Возникает погоня за компилятором, и происходят странные вещи.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...