Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion deploy/omega/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ export FUSE_ENVIRONMENT="$fuse_env"
export JULIA_DEPOT_PATH="$envdir/.julia:"
export JULIA_PKG_USE_CLI_GIT=1
export JULIA_CC="gcc -O3"
export JULIA_NUM_THREADS=1
export JULIA_NUM_THREADS=10
export JULIA_NUM_PRECOMPILE_TASKS=10

# cascadelake for Intel login; znver2 for worker; generic fallback
# remove xsaveopt since that's what julia distributions do
Expand Down
67 changes: 60 additions & 7 deletions deploy/omega/install_fuse_environment.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
@assert (Threads.nthreads() == 1) "Error: Installing FUSE sysimage requires running Julia with one thread"

@assert ("FUSE_ENVIRONMENT" in keys(ENV)) "Error: Must define FUSE_ENVIRONMENT environment variable"
fuse_env = ENV["FUSE_ENVIRONMENT"]
env_dir = joinpath(ENV["FUSE_HOME"], "environments", fuse_env)
Expand Down Expand Up @@ -37,6 +35,7 @@ println("### Setup new environment")
Pkg.activate(env_dir)
Pkg.add([["FUSE", "Plots", "IJulia", "WebIO", "Interact", "EFIT", "ArgParse"]; packages])
Pkg.build("IJulia")
Pkg.build("WebIO")

println()
println("### Freeze Project and Manifest to read only")
Expand All @@ -47,25 +46,79 @@ println()
println("### Create precompile script")
precompile_execution_file = joinpath(env_dir, "precompile_script.jl")
precompile_cmds = """
using WebIO
using FUSE, EFIT, $pkgs_using
include(joinpath(pkgdir(FUSE), "docs", "src", "tutorial.jl"))
include(joinpath(pkgdir(FUSE), "test", "runtests.jl"))
include(joinpath(pkgdir(FUSE), "deploy", "omega", "time_dependent_d3d.jl")
"""
write(precompile_execution_file, precompile_cmds)
chmod(precompile_execution_file, 0o444)

println()
println("### Precompile FUSE sys image")
sysimage_path = joinpath(env_dir, "sys_fuse.so")
create_sysimage(["FUSE"]; sysimage_path, precompile_execution_file, cpu_target)
create_sysimage(["FUSE", "IJulia", "WebIO", "Interact", "Plots"];
project=env_dir,
sysimage_path,
precompile_execution_file,
cpu_target)

chmod(sysimage_path, 0o555)

println()
println("### Create IJulia kernels (10 threads for login, 40 for worker)")
println("### Create IJulia kernels")
import IJulia
IJulia.installkernel("Julia+FUSE - single thread", "--sysimage=$sysimage_path"; env=Dict("JULIA_NUM_THREADS"=>"1"))
IJulia.installkernel("Julia+FUSE - 16-thread (medium)", "--sysimage=$sysimage_path"; env=Dict("JULIA_NUM_THREADS"=>"16"))
IJulia.installkernel("Julia+FUSE - 10-thread (long)", "--sysimage=$sysimage_path"; env=Dict("JULIA_NUM_THREADS"=>"10"))

#===
We're putting IJulia, WebIO, and Interact into the sysimage now
This causes issues with `import WebIO` not seeing jupyter
when the sysimage is loaded
The solution is to call `WebIO.__init__()` at the beginning of the kernel
This does some fancy stuff to print warning from this to the terminal
instead of inside the notebook where it may confuse users
===#
preload_webio_commands = """const __WEBIO_INITED__ = Ref(false)
try
using IJulia, Logging
IJulia.push_preexecute_hook(() -> begin
if !__WEBIO_INITED__[]
@info "WebIO automatically reinitialized for Julia+FUSE sysimage"
term_logger = ConsoleLogger(IJulia.orig_stderr[], Logging.Warn)
with_logger(term_logger) do
# send warnings/errors to the terminal, not the notebook
redirect_stderr(IJulia.orig_stderr[]) do
@eval import WebIO
WebIO.__init__() # re-register provider quietly for the notebook
end
end
__WEBIO_INITED__[] = true
end
nothing
end)
catch e
@warn "preload_webio failed" exception=(e, catch_backtrace())
end
"""
preload_webio_file = joinpath(env_dir, ".jupyter", "preload_webio.jl")
write(preload_webio_file, preload_webio_commands)
chmod(preload_webio_file, 0o444)
IJulia.installkernel("Julia+FUSE - single thread",
"--project=$env_dir",
"--sysimage=$sysimage_path",
"--load=$preload_webio_file";
env=Dict("JULIA_NUM_THREADS"=>"1"))
IJulia.installkernel("Julia+FUSE - 16-thread (medium)",
"--project=$env_dir",
"--sysimage=$sysimage_path",
"--load=$preload_webio_file";
env=Dict("JULIA_NUM_THREADS"=>"16"))
IJulia.installkernel("Julia+FUSE - 10-thread (long)",
"--project=$env_dir",
"--sysimage=$sysimage_path",
"--load=$preload_webio_file";
env=Dict("JULIA_NUM_THREADS"=>"10"))

println()
println("### Create fuse executable")
Expand Down