Julia: Difference between revisions
(add Sharcnet video series) |
No edit summary |
||
Line 61: | Line 61: | ||
Julia 0.7.0 contains all the new functionality of 1.0 as well as the outdated functionalities from 0.x versions, which will give [https://en.wikipedia.org/wiki/Deprecation deprecation warnings] when used. | Julia 0.7.0 contains all the new functionality of 1.0 as well as the outdated functionalities from 0.x versions, which will give [https://en.wikipedia.org/wiki/Deprecation deprecation warnings] when used. | ||
Code that runs in Julia 0.7 without warnings should be compatible with Julia 1.0. | Code that runs in Julia 0.7 without warnings should be compatible with Julia 1.0. | ||
= Running Julia with multiple processes on clusters = | |||
The following is an example of running a parallel Julia code computing pi using 1000 cores across nodes on a cluster | |||
<!--T:15--> | |||
<pre> | |||
#!/bin/bash | |||
#SBATCH --ntasks=1000 # number of MPI processes | |||
#SBATCH --cpus-per-task=1 | |||
#SBATCH --mem-per-cpu=1024M # memory; default unit is megabytes | |||
#SBATCH --time=0-00:10 # time (DD-HH:MM) | |||
#SBATCH --account=def-bge | |||
#SBATCH --job-name=pi_p_1000 | |||
#SBATCH --output=pi_p_1000.log | |||
srun hostname -s > hostfile | |||
sleep 5 | |||
julia --machine-file ./hostfile ./pi_p.jl 1000000000000000 | |||
</pre> | |||
In this example, the command | |||
<pre> | |||
srun hostname -s > hostfile | |||
</pre> | |||
generates a list of names of the nodes allocated and writes it to the text file hostfile. Then the command | |||
<pre> | |||
julia --machine-file ./hostfile ./pi_p.jl 1000000000000000 | |||
</pre> | |||
starts 1+1000 julia processes on the nodes specified in the hostfile and runs the parallel Julia code pi_p.jl in parallel. | |||
<!--T:16--> | |||
= Videos = | = Videos = |
Revision as of 15:43, 5 November 2020
Julia is a programming language that was designed from the beginning for performance, ease of use and portability. It is is available as a module on Compute Canada clusters.
Compiling packages[edit]
When compiling packages for Julia, files will normally be added to ~/.julia
. However, you may run into problems if the package depends on system-provided libraries. For instance, JLD depends on a system-provided HDF5 library. On a personal computer, Julia attempts to install such a dependency using yum or apt with sudo. This will not work on a Compute Canada cluster; instead, some extra information must be provided to allow Julia's package manager (Pkg) to find the HDF5 library.
[hahn@gra-login2 ~]$ module load gcc/7.3.0 hdf5 julia/1.4.1 [hahn@gra-login2 ~]$ julia julia> using Libdl julia> push!(Libdl.DL_LOAD_PATH, ENV["HDF5_DIR"] * "/lib") julia> using Pkg julia> Pkg.add("JLD") julia> using JLD
If we were to omit the Libdl.DL_LOAD_PATH
line from the above example, it would happen to work on Graham because Graham has HDF5 installed system-wide. It would fail on Cedar because Cedar does not. The best practice on any Compute Canada system, though, is that shown above: Load the appropriate module first, and use the environment variable defined by the module (HDF5_DIR
in this example) to extend Libdl.DL_LOAD_PATH
. This will work uniformly on all systems.
Package files and storage quotas[edit]
In the example above, installing just the JLD package creates a ~/.julia
tree with 18673 files and directories and using 236M of space, almost 5% of a standard user's quota for /home
. It's worth remembering that installing a lot of packages will consume a lot of space.
Available versions[edit]
We have removed earlier versions of Julia (< 1.0) because the old package manager was creating vast numbers of small files which in turn caused performance issues on the parallel file systems. Please start using Julia 1.4, or newer versions.
[name@server ~]$ module spider julia
--------------------------------------------------------
julia: julia/1.4.1
--------------------------------------------------------
[...]
You will need to load all module(s) on any one of the lines below before the "julia/1.4.1" module is available to load.
nixpkgs/16.09 gcc/7.3.0
[...]
[name@server ~]$ module load gcc/7.3.0 julia/1.4.1
Porting code from Julia 0.x to 1.x[edit]
In the summer of 2018 the Julia developers released version 1.0, in which they stabilized the language API and removed deprecated (outdated) functionality. To help updating Julia programs for version 1.0, the developers also released version 0.7.0. Julia 0.7.0 contains all the new functionality of 1.0 as well as the outdated functionalities from 0.x versions, which will give deprecation warnings when used. Code that runs in Julia 0.7 without warnings should be compatible with Julia 1.0.
Running Julia with multiple processes on clusters[edit]
The following is an example of running a parallel Julia code computing pi using 1000 cores across nodes on a cluster
#!/bin/bash
#SBATCH --ntasks=1000 # number of MPI processes
#SBATCH --cpus-per-task=1
#SBATCH --mem-per-cpu=1024M # memory; default unit is megabytes
#SBATCH --time=0-00:10 # time (DD-HH:MM)
#SBATCH --account=def-bge
#SBATCH --job-name=pi_p_1000
#SBATCH --output=pi_p_1000.log
srun hostname -s > hostfile
sleep 5
julia --machine-file ./hostfile ./pi_p.jl 1000000000000000
In this example, the command
srun hostname -s > hostfile
generates a list of names of the nodes allocated and writes it to the text file hostfile. Then the command
julia --machine-file ./hostfile ./pi_p.jl 1000000000000000
starts 1+1000 julia processes on the nodes specified in the hostfile and runs the parallel Julia code pi_p.jl in parallel.
Videos[edit]
A series of online seminars produced by SHARCNET:
- Julia: A first perspective (47 minutes)
- Julia: A second perspective (57 minutes)
- Julia: A third perspective - parallel computing explained (65 minutes)
- Julia: Parallel computing revisited (available soon)