mirror of
https://github.com/jupyter/docker-stacks.git
synced 2025-10-17 15:02:57 +00:00

* Specify multiple architectures for Julia to precompile to For amd64 (x86_64), we should specify what specific targets the precompilation should be done for. If we don't specify it, it's *only* done for the target of the host doing the compilation. When the container runs on a host that's still x86_64, but a *different* generation of CPU than what the build host was, the precompilation is useless and Julia takes a long long time to start up. This specific multitarget comes from https://docs.julialang.org/en/v1/devdocs/sysimg/#Specifying-multiple-system-image-targets, and is the same set of options that the official Julia x86_64 build is compiled with. If the architecture the container runs on is different, precompilation may still have to be re-done on first startup - but this *should* catch most of the issues. h/t to https://discourse.julialang.org/t/is-it-possible-to-make-precompilation-portable-for-docker-images-built-with-a-different-cpu/95913 which helped point me towards `JULIA_CPU_TARGET`. Fixes https://github.com/jupyter/docker-stacks/issues/2015 for more information * Fix bash syntax issue * Add JULIA_CPU_TARGET for aarch64 as well - Don't need `export` as this is only used within this script - Steal from upstream what should be setup for aarch64 * Re-add export for JULIA_CPU_TARGET Quietens pre-commit
56 lines
2.3 KiB
Bash
Executable File
56 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
|
set -exuo pipefail
|
|
# Requirements:
|
|
# - Run as a non-root user
|
|
# - The JULIA_PKGDIR environment variable is set
|
|
# - Julia is already set up, with the setup-julia.bash command
|
|
|
|
|
|
# If we don't specify what CPUs the precompilation should be done for, it's
|
|
# *only* done for the target of the host doing the compilation. When the
|
|
# container runs on a host that's the same architecture, but a *different*
|
|
# generation of CPU than what the build host was, the precompilation is useless
|
|
# and Julia takes a long long time to start up. This specific multitarget comes
|
|
# from https://github.com/JuliaCI/julia-buildkite/blob/70bde73f6cb17d4381b62236fc2d96b1c7acbba7/utilities/build_envs.sh#L20-L76,
|
|
# and may need to be updated as new CPU generations come out.
|
|
# If the architecture the container runs on is different,
|
|
# precompilation may still have to be re-done on first startup - but this
|
|
# *should* catch most of the issues. See
|
|
# https://github.com/jupyter/docker-stacks/issues/2015 for more information
|
|
if [ "$(uname -m)" == "x86_64" ]; then
|
|
# See https://github.com/JuliaCI/julia-buildkite/blob/70bde73f6cb17d4381b62236fc2d96b1c7acbba7/utilities/build_envs.sh#L24
|
|
# for an explanation of these options
|
|
export JULIA_CPU_TARGET="generic;sandybridge,-xsaveopt,clone_all;haswell,-rdrnd,base(1)"
|
|
elif [ "$(uname -m)" == "aarch64" ]; then
|
|
# See https://github.com/JuliaCI/julia-buildkite/blob/70bde73f6cb17d4381b62236fc2d96b1c7acbba7/utilities/build_envs.sh#L54
|
|
# for an explanation of these options
|
|
export JULIA_CPU_TARGET="generic;cortex-a57;thunderx2t99;carmel"
|
|
fi
|
|
|
|
# Install base Julia packages
|
|
julia -e '
|
|
import Pkg;
|
|
Pkg.update();
|
|
Pkg.add([
|
|
"HDF5",
|
|
"IJulia",
|
|
"Pluto"
|
|
]);
|
|
Pkg.precompile();
|
|
'
|
|
|
|
# Move the kernelspec out of ${HOME} to the system share location.
|
|
# Avoids problems with runtime UID change not taking effect properly
|
|
# on the .local folder in the jovyan home dir.
|
|
mv "${HOME}/.local/share/jupyter/kernels/julia"* "${CONDA_DIR}/share/jupyter/kernels/"
|
|
chmod -R go+rx "${CONDA_DIR}/share/jupyter"
|
|
rm -rf "${HOME}/.local"
|
|
fix-permissions "${JULIA_PKGDIR}" "${CONDA_DIR}/share/jupyter"
|
|
|
|
# Install jupyter-pluto-proxy to get Pluto to work on JupyterHub
|
|
mamba install --yes \
|
|
'jupyter-pluto-proxy' && \
|
|
mamba clean --all -f -y && \
|
|
fix-permissions "${CONDA_DIR}" && \
|
|
fix-permissions "/home/${NB_USER}"
|