Μετάβαση στο περιεχόμενο

Περιγραφή

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