Julia and Packages ================== By default, Julia Programming Language is available via module. * Load & list available modules .. code-block:: console module use /applis/PSMN/debian11/E5/modules/all module avail * Load the version of Julia you want to work with .. code-block:: console module load Julia/1.9.4-linux-x86_64 If you want to work with another particular version of Julia (See below section JILL), you will have to install it in your ``$HOME`` or team storage (see :doc:`../filesystems/storages`). For the rest of this documentation, replace ``mylogin`` by your login as provided by PSMN. Project Management with Julia ----------------------------- You can manage packages within a project environment (similar to a python venv) * Create a directory where you want to store your project .. code-block:: console mylogin@c8220node1:~/$ mkdir -p ~/julia/julia194 && cd ~/julia/julia194 * Enter Project Manager Type ``]`` key: .. code-block:: console mylogin@c8220node1:~/julia/julia194$ julia mylogin@c8220node1:~/julia/julia194$ ] * Activate a new project .. code-block:: jlcon (@v1.9) pkg> activate tutorial Activating new project at `~/julia/julia194/tutorial` (tutorial) pkg> status Status `~/julia/julia194/tutorial/Project.toml` (empty project) * Install a package inside Julia project environment For example, ``Roots``: .. code-block:: jlcon (tutorial) pkg> add Roots You can now use ``Roots`` in your project environment .. code-block:: jlcon (tutorial) pkg> status Status `~/julia/julia194/tutorial/Project.toml` [f2b01f46] Roots v2.1.5 * Verify the dependencies of your project .. code-block:: console mylogin@x5570comp1:~/julia/julia194/tutorial$ ls Manifest.toml Project.toml mylogin@x5570comp1:~/julia/julia194/tutorial$ less Project.toml * Exit (deactivate) a project environment .. code-block:: jlcon (tutorial) pkg> activate Activating project at `~/.julia/environments/v1.9` (@v1.9) pkg> * Exit package manager Type ``backspace`` key. * Exit Julia .. code-block:: jlcon julia> exit() Alternative Project Management with Julia ----------------------------------------- This method will create a project folder and source folder. * Enter Project Manager Type ``]`` key: .. code-block:: console mylogin@c8220node1:~/julia/julia194$ julia mylogin@c8220node1:~/julia/julia194$ ] * Generate new project .. code-block:: jlcon (@v1.9) pkg> generate tutorial2 Generating project tutorial2: tutorial2/Project.toml tutorial2/src/tutorial2.jl mylogin@c8220node1: ls ~/julia/julia194/tutorial2 Project.toml src * Exit package manager Type ``backspace`` key. * Exit Julia .. code-block:: jlcon julia> exit() * Two files were created: ``~/julia/julia194/tutorial2/Project.toml`` specifies the dependencies. ``~/julia/julia194/tutorial2/src/tutorial2.jl`` is a placeholder for your code. * Activate Existing Project .. code-block:: console mylogin@c8220node1:~$ cd ~/julia/julia194/tutorial2 mylogin@c8220node1:~/julia/julia194/tutorial2$ julia --project=. * Add Packages to project .. code-block:: jlcon julia> ] (tutorial2) pkg> add Roots (tutorial2) pkg> status Project tutorial2 v0.1.0 Status `~/julia/julia194/tutorial2/Project.toml` [f2b01f46] Roots v2.1.5 You can now use the package ``Roots`` in your project environment. Multiple Versions of Julia with JILL ------------------------------------- The most simple way to manage and work with multiple versions of Julia in your ``$HOME`` is to install the python package, JILL. * Install JILL .. code-block:: console mylogin@c8220node1:~$ python3.9 -m pip install jill mylogin@c8220node1:~$ export PATH="/home/mylogin/.local/bin:$PATH" If you wish to make JILL permanently available in your environment, add the export line (``export PATH="/home/mylogin/.local/bin:$PATH"``) to the end of your ``~/.bashrc`` file. * Install latest version of Julia with Jill .. code-block:: console mylogin@c8220node1:~$ jill list mylogin@c8220node1:~$ jill install * Launch Julia .. code-block:: console mylogin@c8220node1:~$ julia _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.10.4 (2024-06-04) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia> * Install specific Julia version with JILL .. code-block:: console mylogin@c8220node1:~$ jill install 1.6.2 mylogin@c8220node1:~$ jill list Found 4 julia(s) in /home/mylogin/.local/bin: julia --> 1.10.4 julia-1 --> 1.10.4 julia-1.6 --> 1.6.2 julia-1.10 --> 1.10.4 * Launch specific Julia version with JILL .. code-block:: console mylogin@c8220node1:~$ julia-1.6 _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.6.2 (2021-07-14) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia> Julia on GPU ------------ To run a Julia program on GPU, you must launch your job on a GPU machine (See :ref:`e5-gpu`). As an example, we will run a test on ``r730gpu01`` (which is a login node). **However, this is only a test.**. Once you are prepared to launch your job, you should write a script and submit it through the queuing system (See :doc:`../clusters_usage/submitting`). * Load Julia and CUDA modules PSMN has NVidia GPUs therefore you must load the CUDA API. (*NOTE: CUDA version may vary for your software!*) .. code-block:: console mylogin@r730gpu01: module use /applis/PSMN/debian11/E5/modules/all module load Julia/1.9.4-linux-x86_64 module load CUDA/11.4.1 * Call Julia and run command This is an example using the package ``Oceananigans``. .. code-block:: console mylogin@r730gpu01:~$ julia _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.10.4 (2024-06-04) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | julia> using Oceananigans grid = RectilinearGrid(GPU(), size=(128, 128), x=(0, 2π), y=(0, 2π), topology=(Periodic, Periodic, Flat)) model = NonhydrostaticModel(; grid, advection=WENO()) ϵ (x, y) = 2rand() - 1 set!(model, u=ϵ, v=ϵ) simulation = Simulation(model; Δt=0.01, stop_time=4) run!(simulation)