Περιγραφή¶
The Julia Programming Language. Julia was designed from the beginning for high performance. Julia programs compile to efficient native code for multiple platforms via LLVM.
Julia 1.9.2¶
Παράδειγμα χρήσης¶
Σε αυτό το παράδειγμα θα δούμε πώς υποβάλλουμε δοκιμαστικά μία εργασία που τρέχει ένα julia
script.
Δημιουργούμε το αρχείο εισόδου, έστω julia-example.jl
:
julia script
function f(x,y)
return x + y
end
a=f(3,5)
println("a=$a")
b=f(8,10)
println("b=$b")
το οποίο τυπώνει ένα μέσο όρο από ένα δοκιμαστικό δείγμα της R.
Για την υποβολή της εργασίας, χρησιμοποιούμε το submission script, έστω Julia-1.9.2-case.sh
:
Submission Script
#!/bin/bash
#SBATCH --job-name=Julia-1.9.2-case
#SBATCH --time=10:00
#SBATCH --partition=batch
module load gcc/12.2.0 julia
julia julia-example.jl
Υποβάλλουμε το παραπάνω script προς εκτέλεση με την εντολή:
$ sbatch Julia-1.9.2-case.sh
Παρακολουθούμε την πορεία της εργασίας με την εντολή squeue
.
Το αναμενόμενο αποτέλεσμα φαίνεται στο αρχείο τύπου *.out
:
Terminal output
a=8
b=18
Julia CUDA¶
Για την προσθήκη του πακέτου CUDA.jl μπορούμε να χρησιμοποιήσουμε το παρακάτω julia script
:
julia script
import Pkg; Pkg.add("CUDA")
using CUDA
CUDA.versioninfo()
[CUDA.capability(dev) for dev in CUDA.devices()]
Για να προστεθεί το CUDA.jl
πακέτο, μπορούμε να τρέξουμε το script που δημιουργήσαμε στο GPU partition
της συστοιχίας, χρησιμοποιώντας το submission script Julia-install-CUDA.sh
:
Submission Script
#!/bin/bash
#SBATCH --job-name=Julia-install-GPU
#SBATCH --time=1-00:00:00
#SBATCH --partition=gpu
#SBATCH --gres=gpu:1
module load gcc/10.2.0 julia cuda/11.1.0 cudnn/8.0.4.30-11.0-linux-x64
julia julia-CUDA.jl
Julia Distributed¶
Αντίστοιχα με την προσθήκη του πακέτου CUDA.jl
μπορούμε να προσθέσουμε και κάποιο άλλο πακέτο όπως το Distributed.jl
και να ξεκινήσουμε να το χρησιμοποιούμε εκτελώντας ένα julia script
το οποίο θα περιλαμβάνει τις παρακάτω εντολές στο batch partition
της συστοιχίας:
julia commands (install packages)
import Pkg; Pkg.add("Distributed")
using Distributed
Υλοποίηση παράλληλου προγράμματος στη συστοιχία¶
Για να αξιοποιήσουμε πολλούς κόμβους στη συστοιχία, θα χρειαστεί να φορτώσουμε επιπλέον της Distributed.jl
και τη βιβλιοθήκη ClusterManagers.jl
.
Αρχικά θα τρέξουμε τις παρακάτω εντολές στο login node προκειμένου να εγκαταστήσουμε τις δύο βιβλιοθήκες.
# module load gcc/12.2.0 julia
# julia
> import Pkg
> Pkg.add("Distributed")
> Pkg.add("ClusterManagers")
Στο παρακάτω παράδειγμα γίνεται import η βιβλιοθήκη ClusterManagers conditionally εφόσον το julia script εκτελείται εντός ενός slurm job.
Εκτέλεση julia script εντός ενός slurm job
# detect if we are inside a SLURM job
const IN_SLURM = "SLURM_JOBID" in keys(ENV)
# load packages
using Distributed
IN_SLURM && using ClusterManagers
# Here we create our parallel julia processes
if IN_SLURM
pids = addprocs_slurm(parse(Int, ENV["SLURM_NTASKS"]))
print("\n")
else
pids = addprocs()
end
# See ids of our workers. Should be same length as SLURM_NTASKS
# The output of this `println` command will appear in the
# SLURM output file julia_in_parallel.output
println(workers())
# Here we ask everyone to say hi!
# Output will appear in julia_in_parallel.output
g = @sync @distributed (vcat) for w in workers()
worker_id = myid()
worker_host = gethostname()
"Hello! I'm worker number $worker_id, and I reside on machine $worker_host. Nice to meet you!"
end
for i in g
println(i)
end
rmprocs(pids)
println("procs removed")
Εργασία εκτέλεσης julia script
#!/bin/bash
#SBATCH --job-name=julia_job
#SBATCH --time=1:00:00
#SBATCH --nodes=2
#SBATCH --tasks-per-node=10
#SBATCH --partition=batch
module load gcc/10.2.0 julia
julia JuliaSlurm.jl
Υποβάλλουμε την εργασία προς εκτέλεση:
# sbatch JuliaSlurm.sh
και παρακολουθούμε την εξέλιξή της μέσω των αρχείων εξόδου, π.χ.:
# tail -f slurm-XXXXX.out
Julia console¶
Για την εκκίνηση της κονσόλας της γλώσσας Julia
μπορούμε να τρέξουμε τις παρακάτω εντολές στο login node:
$ module load gcc/12.2.0 julia
$ julia