From f44549bdf1051096eecfc3ee0a5934aea5a02e58 Mon Sep 17 00:00:00 2001 From: Brendan Lyons Date: Wed, 29 Oct 2025 14:30:17 -0700 Subject: [PATCH 1/2] Allow multiple threads since PackageCompiler fixed multithreading --- deploy/omega/deploy.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deploy/omega/deploy.sh b/deploy/omega/deploy.sh index 3275bda98..a559df2c1 100755 --- a/deploy/omega/deploy.sh +++ b/deploy/omega/deploy.sh @@ -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 From 729b4f62167258b2be9e194921827a715b25d8e5 Mon Sep 17 00:00:00 2001 From: Brendan Lyons Date: Wed, 29 Oct 2025 14:35:11 -0700 Subject: [PATCH 2/2] time_dependent_d3d script and interactive plotting in sysimage --- deploy/omega/install_fuse_environment.jl | 67 +++++++++++++++++++++--- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/deploy/omega/install_fuse_environment.jl b/deploy/omega/install_fuse_environment.jl index b833c451a..c40367bb9 100644 --- a/deploy/omega/install_fuse_environment.jl +++ b/deploy/omega/install_fuse_environment.jl @@ -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) @@ -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") @@ -47,9 +46,11 @@ 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) @@ -57,15 +58,67 @@ 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")