สามารถเข้าสู่ระบบได้ 2 วิธี
- Secure Shell (SSH) ผ่าน CMD, PowerShell, Terminal หรือโปรแกรมต่าง ๆ เช่น Xshell,MobaXterm, Termius, PuTTY
- Jupyter Notebook เข้าใช้งานบน web browser ระบุ URL: https://erawan.cmu.ac.th:8000
การเข้าสู่ระบบต้องอยู่ภายในเครือข่ายของมหาวิทยาลัยเชียงใหม่เท่านั้นหรือใช้ CMU VPN
สามารถเข้าผ่าน cmd หรือ PowerShell
รูปแบบ: ssh [account]@erawan.cmu.ac.th
ตัวอย่าง: ssh cmmet01@erawan.cmu.ac.th
*ถ้าเข้าใช้งานครั้งแรกจะมีการถาม fingerprint ให้ตอบ yes
เมื่อใส่รหัสผ่านเรียบร้อยแล้วจะเข้าสู่หน้าระบบของ Erawan HPC ดังรูป
โปรแกรม MobaXterm จะสามารถเก็บ Server ที่เราตั้งค่าไว้ได้ ทำให้สะดวกต่อการใช้งานครั้งต่อไป
Remote host: erawan.cmu.ac.th
username: cmu account
กด New Host แล้วโปรแกรมจะขึ้นหน้าต่าง Setup ขึ้นมาทางด้านขวา
Label: ใส่ชื่ออะไรก็ได้
Address: erawan.cmu.ac.th
Group: ใส่หรือไม่ใส่ก็ได้
Username & password: ใส่ CMU Account
รูปแบบคำสั่ง
File
: scp [file] [cmu account]@erawan.cmu.ac.th:/path/directory
$ scp "Multi boot nini Windows7.rar" sirapat.au@cmu.ac.th@erawan.cmu.ac.th:/home/pornnapa.p
Folder
: scp -r [./directory] [cmu account]@erawan.cmu.ac.th:/path/directory
$ scp -r ./folderName pornnapa.p@cmu.ac.th@erawan.cmu.ac.th:/home/pornnapa.p/folderName
Copy จาก server มา Local
: scp [cmu account]@erawan.cmu.ac.th:/path/directory [/local/directory]
$ scp pornnapa.p@cmu.ac.th@erawan.cmu.ac.th:/home/pornnapa.p/folderName ./folderName
สามารถใช้โปรแกรมสำหรับโอนไฟล์เข้าสู่ Server ได้เช่น WinSCP, FileZilla, MobaXterm, Termius
Command | Example | รายละเอียด |
---|---|---|
ls | ls | รายการไฟล์และไดเร็กทอรี |
pwd | pwd | แสดงไดเร็กทอรีปัจจุบัน |
mkdir | mkdir new_directory | สร้างไดเร็กทอรี |
cd | cd new_directory | เปลี่ยนไดเร็กทอรี |
touch | touch file1 | สร้างไฟล์ใหม่ |
cat | cat file1 | แสดงเนื้อหาของไฟล์ |
cp | cp file1 file2 | คัดลอกไฟล์ |
mv | mv file1 /home/name | ย้ายหรือเปลี่ยนชื่อไฟล์ |
rm | rm file2 | ลบไฟล์ |
vi, vim, nano | vi file1 | แก้ไขไฟล์ด้วย text editor |
<<command>> -- help แสดงข้อมูลความช่วยเหลือ
man <<command>> แสดงคู่มือการใช้งานของคำสั่ง
เป็นซอฟต์แวร์ Job scheduler มีหน้าที่ในการจัดลำดับงาน หลักการทำงานของ Slurm
- ผู้ใช้ต้องส่ง Job script ผ่านเครื่อง Login node เข้าไปต่อคิวใน Slurm เพื่อรอที่จะรันงาน
- Slurm จะทำการส่งงานไปรันที่เครื่อง Compute node ตาม Partition ที่ท่านกำหนดในไฟล์ Job script
- เมื่อประมวลผลเสร็จ ผลลัพธ์จะเก็บอยู่ในตำแหน่งที่ท่านรัน
Partition | Node | CPU | GPU | Time Limit | Max CPU/Job | Running Job/User | Submit Job/User |
---|---|---|---|---|---|---|---|
CPU | 2 | 192 | - | 168 hours | 32 | 2 | 3 |
GPU | 2 | 64 | 16 | 168 hours | 4 | 2 | 3 |
Mixed | 1 | 128 | 8 | 24 hours | 64 | 1 | 2 |
Commands | Syntax | รายละเอียด |
---|---|---|
sinfo |
sinfo |
คำสั่งดูข้อมูลของทรัพยากรในระบบ |
squeue |
squeue -u <user> |
คำสั่งเพื่อดูคิวสำหรับรันงาน |
scancel |
scancel <job-id> |
คำสั่งยกเลิกงาน |
scontrol |
scontrol show job <job-id |
คำสั่งแสดงข้อมูลแบบละเอียดของงาน |
scontrol show partition <patition> |
คำสั่งแสดงข้อมูลแบบละเอียดของ partition | |
srun |
srun <option> |
คำสั่งเรียกใช้งานแบบ Interactive |
sbatch |
sbatch <file slurm script> |
คำสั่ง submit job |
sinfo
Output
PARTITION AVAIL TIMELIMIT STATE NODESLIST CPU(A/I/O/T) MAX_CPUS_PER_NODE GRES_USED
gpu* up 7-00:00:00 mix compute1 77/51/0/128 32 gpu:7
gpu* up 7-00:00:00 mix compute2 9/119/0/128 32 gpu:6
cpu up 7-00:00:00 mix compute1 77/51/0/128 96 gpu:7
cpu up 7-00:00:00 mix compute2 9/119/0/128 96 gpu:6
mixed up 1-00:00:00 idle compute3 0/128/0/128 128 gpu:0
(*) default ถ้าไม่มีการระบุ partition การใช้งานจะใช้ partition gpu โดยอัตโนมัติ
PARTITION: แบบแผนการจัดสรรทรัพยากรหรือกลุ่มเครื่องใช้งานในประเภทต่างๆ <ดูรายละเอียดสำหรับ ERAWAN>
AVAIL: ความพร้อมใช้งานของกลุ่มเครื่องใช้งา
TIMELIMIT: เวลาสูงสุดที่สามารถรันงานได้
STATE: สถานะของเครื่อง
NODELIST: ชื่อของเครื่อง
CPU(A/I/O/T): จำนวน CPU (Allocated/Idle/Other/Total)
MAX_CPUS_PER_NODE: จำนวน CPU มากที่สุด
GRES_USED: จำนวน GPU ที่ถูกใช้งาน
สถานะของเครื่อง
State | รายละเอียด |
---|---|
idle | สถานะเครื่องพร้อมใช้งาน ไม่มีการจองงาน |
alloc | สถานะเครื่องมีการใช้งานเต็ม ไม่สามารเข้าใช้รันงานได้ |
mix | สถานะเครื่องมีการจองใช้งาน ยังมีบางส่วนสามารถเข้าใข้งานได้ |
down | สถานะเครื่องไม่พร้อมให้ใช้งาน |
drain | สถานะเครื่องไม่พร้อมให้ใช้งาน เนื่องจากปัญหาด้านระบบ |
Syntax: squeue -u <user>
squeue -u pornnapa.p
Output
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
3649 gpu dmso-20 user25 R 5-22:28:28 1 compute1
3547 michael c1-sa user25 R 10-18:43:34 1 compute1
JOBID: เลขของงานที่รัน
PARTITION: แบบแผนการจัดสรรทรัพยากรหรือกลุ่มเครื่องใช้งานในประเภทต่างๆ <ดูรายละเอียดสำหรับ ERAWAN>
NAME: ชื่องานที่รัน
USER: ผู้ใช้งาน
ST: สถานะของงาน
NODELIST: ชื่อของเครื่อง
(REASON): สาเหตุที่ไม่สามารถรันงานได้
สถานะของงาน (ST)
Status | Code | รายละเอียด |
---|---|---|
RUNNING | R |
งานปัจจุบันถูกจัดสรรไปยังโหนดและกำลังทำงานอยู่ |
PENDING | PD |
งานกำลังรอการจัดสรรทรัพยากร |
FAILED | F |
ไม่สามารถดำเนินการรันงานได้ |
COMPLETED | CD |
งานเสร็จสิ้นสมบูรณ์ |
COMPLETING | CG |
งานกำลังจะเสร็จสิ้น แต่บางกระบวนการยังคงทำงานอยู่ |
สาเหตุที่ไม่สามารถรันงาน (REASON)
Reason Code | รายละเอียด |
---|---|
Priority |
มีงานที่มีความสำคัญสูงกว่าอยู่ในคิวรอที่จะทำงาน งานของคุณจะทำงานต่อเมื่องานเหล่านั้นเสร็จสิ้น |
Resources |
งานนี้กำลังรอทรัพยากรที่จำเป็นอยู่ เมื่อทรัพยากรว่าง จึงจะเริ่มทำงาน |
QOSGrpCpuLimit |
CPU ทั้งหมดที่กำหนดไว้สำหรับ QoS ของงานของคุณถูกใช้งานอยู่ งานจะทำงานต่อเมื่อมี CPU ว่าง |
QOSGrpMaxJobsLimit |
จำนวนงานสูงสุดสำหรับ QoS ของงานของคุณถูกใช้ไปแล้ว งานจะทำงานต่อเมื่อมีงานอื่นเสร็จสิ้น |
QOSMaxJobsPerUserLimit |
จำนวนงานสูงสุดที่ผู้ใช้สามารถรันภายใต้ QoS ที่กำหนดไว้ ถูกใช้ไปแล้ว งานจะทำงานต่อเมื่อมีงานอื่นของผู้ใช้เสร็จสิ้น |
Syntax: scancel <job-id>
scancel 3700
ไม่สามารถยกเลิกงานของผู้ใช้คนอื่นได้
syntax: scontrol show job <job-id>
scontrol show job 3700
output
JobId=3700 JobName=M_xqc_L506_64
UserId=user41(1059) GroupId=users(100) MCS_label=N/A
Priority=4294901595 Nice=0 Account=training QOS=normal
JobState=RUNNING Reason=None Dependency=(null)
Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
RunTime=19:51:35 TimeLimit=1-00:00:00 TimeMin=N/A
SubmitTime=2023-06-06T13:48:13 EligibleTime=2023-06-06T13:48:13
AccrueTime=2023-06-06T13:48:13
StartTime=2023-06-06T13:48:13 EndTime=2023-06-07T13:48:13 Deadline=N/A
SuspendTime=None SecsPreSuspend=0 LastSchedEval=2023-06-06T13:48:13 Scheduler=Main
Partition=short AllocNode:Sid=erawan:1763199
ReqNodeList=(null) ExcNodeList=(null)
NodeList=compute3
BatchHost=compute3
NumNodes=1 NumCPUs=64 NumTasks=64 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=64,node=1,billing=64
Socks/Node=* NtasksPerN:B:S:C=0:0:*:1 CoreSpec=*
MinCPUsNode=1 MinMemoryNode=1T MinTmpDiskNode=0
Features=(null) DelayBoot=00:00:00
OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
Command=/home/user41/natthiti/job/MOF/xqc_L506_64/run_g16_Erawan_230605.sub
WorkDir=/home/user41/natthiti/job/MOF/xqc_L506_64
StdErr=/home/user41/natthiti/job/MOF/xqc_L506_64/slurm-3700.out
StdIn=/dev/null
StdOut=/home/user41/natthiti/job/MOF/xqc_L506_64/slurm-3700.out
Power=
syntax: scontrol show partition <partition>
scontrol show partition cpu
output
PartitionName=cpu
AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
AllocNodes=ALL Default=NO QoS=cpu
DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO
MaxNodes=UNLIMITED MaxTime=7-00:00:00 MinNodes=0 LLN=NO MaxCPUsPerNode=96
Nodes=compute[1-2]
PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=NO
OverTimeLimit=NONE PreemptMode=OFF
State=UP TotalCPUs=256 TotalNodes=2 SelectTypeParameters=NONE
JobDefaults=(null)
DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED
TRES=cpu=256,mem=4000000M,node=2,billing=256,gres/gpu=16
srun <option> <executable_path>
srun --partition=gpu --ntasks-per-node=2 --gres=gpu:1 python3 test.py
srun <option> --pty bash
srun --partition=gpu --ntasks-per-node=2 --gres=gpu:1 --pty bash
option
Full | Short |
---|---|
--partition=name_partition |
-p name_partition |
--nodes=num_node |
-N num_node |
--ntasks=num_task |
-n num_task |
--ntasks-per-node=num_task |
|
--cpus-per-task=num_cores |
-c num_cores |
--mem=num_mem |
|
--time=hh:mm:ss |
-t hh:mm:ss |
--gres=gpu:num_gpu |
Syntax: sbatch <file slurm script>
$sbatch test.sh
Output
Submitted batch job <job-id>
คำสั่งต่าง ๆ bash script ของการสร้างไฟล์ Slurm
man sbatch
หรือsbatch -help
หรือ sbatch documentation
$ vi script.sh
#!/bin/bash
#SBATCH --job-name=test ## ชื่อของงาน
#SBATCH --output=test_%j.out ## ชื่อไฟล์ Output (%j = Job-ID)
#SBATCH --error=test_%j.err ## ชื่อไฟล์ error (%j = Job-ID)
#SBATCH --time=10:00 ## เวลาที่ใช้รันงาน
#SBATCH --ntasks=1 ## จำนวน tasks ที่ต้องการใช้ในการรัน
#SBATCH --cpus-per-task=1 ## จำนวน code ที่ต้องการใช้ในการรัน
#SBATCH --partition=cpu ## ระบุ partition ที่ต้องการใช้งาน
##module purge ## unload module ทั้งหมด เพราะว่าอาจจะมีการ load module ไว้ก่อนหน้านั้น
##module load anaconda3 ## load module ที่ต้องการใช้งาน ตัวอย่างนี้คือ Anaconda
python --version ## สั่งรัน code
หมายเหตุ
- การ Submit งานที่ใช้ thread ให้กำหนด #SBATCH --cpus-per-task= ตามจำนวน threads ที่ใช้งาน
- การ Submit งานที่เป็น MPI ให้กำหนด #SBATCH --ntasks= ตามจำนวน Process ที่ต้องการ
- การ Submit งานที่ใช้ GPU เป็นหลัก ที่ partition GPU ให้กำหนด #SBATCH --cpus-per-task ตามความเหมาะสม หากงาน ไม่ได้แตก thread ให้กำหนดเป็น 1 หากแตก thread กำหนดได้ระหว่าง 2-4 threads เพื่อแบ่งปันคอร์ที่เหลือกับการ์ดใบอื่น ๆ จะได้ใช้งานระบบได้อย่างเต็มความสามารถ
$ sbatch script.sh
Sbatch option | Description |
---|---|
-J, --job-name=<job_name> |
กำหนดชื่อให้กับงาน |
-o, --output=<filename_pattern> |
ไฟล์ output %x : Job name %j : Job-ID %t : Task identifier. %N : Short hostname. |
-e, --error=<filename_pattern> |
ไฟล์ error |
Sbatch option | Description |
---|---|
--mail-user=<email> |
รับการแจ้งเตือนทางอีเมล |
--mail-type=[TYPE\|ALL\|NONE] |
ประเภทการส่งอีเมลล์ BEGIN, END, FAIL. --mail-type BEGIN, END, FAIL |
Sbatch option | Description |
---|---|
--time=<time> |
กำหนดเวลาสูงสุดสำหรับการทำงานของงาน |
-b, --begin=<time> |
กำหนดเวลาเริ่มต้นที่ต้องการจัดสรรงาน |
Sbatch option | Description |
---|---|
--mem=<size>[units] |
กำหนดหน่วยความจำที่ต้องการต่อโหนด |
--mem-per-cpu=<size>[units] |
กำหนดหน่วยความจำที่ต้องการต่อ CPU |
--mem-per-gpu=<size>[units] |
กำหนดหน่วยความจำที่ต้องการต่อ GPU |
Sbatch option | Description |
---|---|
-n, --ntasks=<number> |
จำนวน task / process |
-N, --nodes=<minnodes>[-maxnodes] |
จำนวนโหนด |
--ntasks-per-node=<ntasks> |
รันงานจำนวน ntasks ต่อโหนด |
-c, --cpus-per-task=<ncpus> |
รันงานจำนวน cpu ต่อ task / process |
-p, --partition=<partition_names> |
ระบุใช้พาร์ทิชันที่ต้องการใช้งาน |
-w, --nodelist=<node_name_list> |
ระบุโหนดที่ต้องการใช้งาน |
Sbatch option | Description |
---|---|
--gpus=[type:]<number> |
กำหนดจำนวน GPU ทั้งหมดที่ต้องการสำหรับงาน |
--gpus-per-node=[type:]<number> |
กำหนดจำนวน GPU ที่ต้องการสำหรับงานบนแต่ละโหน |
ในระบบ HPC Erawan ได้มีการติดตั้งโปรแกรมมาให้แล้วเบื้องต้น สามารถตรวจสอบรายชื่อโปรแกรมที่มีในระบบได้ด้วยคำสั่ง
$ module avail
# or
$ ml av
คำสั่ง: module load [ชื่อโปรแกรม]
$ module load anaconda3
คำสั่ง: module list
หรือ ml
$ module list
คำสั่ง: module unload [ชื่อโปรแกรม]
module unload anaconda3
สามารถลงโปรแกรมเองได้ที่พื้นที่ส่วนตัวของแต่ละคนได้ (/home หรือ /project) แต่โปรแกรมต้องถูกลิขสิทธิ์
นอกจากคำสั่ง sinfo และ squeue แล้ว จะมีคำสั่งสำหรับดู Resource และ Process การทำงานของเครื่อง
คำสั่งมี 2 แบบ
htopcX
nvtopcX
*หมายเหตุ แทนค่า X ด้วยตัวเลขของเครื่อง (ในระบบ Erawan มี 3 เครื่อง c1-c3)
ตัวอย่าง การใช้คำสั่งในการดูการทำงานของ CPU & Memory
$ htopc1
ตัวอย่าง การใช้คำสั่งในการดูการทำงานของ GPU
สามารถดูได้ว่างานของตัวเองที่รันอยู่ใช้ GPU มากหรือน้อยจากแถบล่างสุด
$ nvtopc2
conda create -n testenv python=3.10 # สร้าง env lesiy[dkimflv[
conda activate testenv # activate การใช้งาน env ที่ชื่อว่า testenv
---- Check version env ----------------
python
exit()
---- End check version env ------------
conda deactivate # ยกเลิกการใช้งาน env
---- Check version with out env --------
python
exit()
---- End check version with out env ----
1.1 Python file
mkdir ex1_env # สร้าง Directory ที่ชื่อว่า ex1_env
cd ex1_env # change directory ไปที่ ex1_env
touch checkversion.py # สร้างไฟล์ที่ชื่อว่า checkversion.py
vim checkversion.py # แก้ไขไฟล์ที่ชื่อว่า checkversion.py
ไฟล์ checkversion.py
import sys
print(sys.version)
ออกจากหน้า vim กด esc แล้วกด shift+: (Colon) จะมีเครื่องหมาย ":" ตรงด้านซ้ายล่าง
จากนั้นใช้คำสั่ง wq เพื่อ save แล้ว ออกโปรแกรม vim
ถ้าต้องการออกโดยไม่ save ใช้คำสั่ง q!
1.2 Slurm script
vim run.sh
#!/bin/bash
#SBATCH --job-name=E0
#SBATCH --partition=cpu
#SBATCH --output=%j.out
#SBATCH --error=%j.err
source $HOME/.bashrc
conda activate testenv
python3 checkversion.py
mkdir ex2_Pytorch
cd ex2_Pytorch
ทดสอบ RUN แบบ Interactive ด้วยคำสั่ง
srun -p gpu --gres=gpu:1 --cpus-per-task=1 --pty bash
python3
import torch
torch.cuda.device_count()
torch.cuda.is_available()
torch.cuda.get_device_name(0)
X_train = torch.FloatTensor([0., 1., 2.])
X_train = X_train.cuda()
print(X_train)
ถ้ารันไม่ได้หรือไม่เจอ GPU
1.check env หน้า account ต้องไม่ขึ้น (base)
2.ถ้าขึ้น (base) ให้ทำการ conda deactivate
และ conda config --set auto_activate_base False #กำหนด ให้ไม่ auto activate base environment
vim runPytorch.py
import torch
print(torch.cuda.device_count())
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0))
X_train = torch.FloatTensor([0., 1., 2.])
X_train = X_train.cuda()
print(X_train)
vim run.slurm
#!/bin/bash
#SBATCH --job-name=E1
#SBATCH --output=%j.out
#SBATCH --error=%j.err
#SBATCH --cpus-per-task=1
#SBATCH --partition=gpu
#SBATCH --gpus=1
python3 runPytorch.py
**ถ้ามีการสร้าง evn ให้เพิ่ม code ใน slurm script ก่อน run **
source $HOME/.bashrc conda activate testpytorch
sbatch run.slurm
ระบบ Container ที่ใช้งานบนระบบ HPC ซึ่งทำงานคล้าย Docker
แหล่งเว็บไซต์
NGC ที่เป็นแหล่งรวม container ของ nvidia https://ngc.nvidia.com/catalog/containers
Docker hub แหล่งรวม container ของ Docker https://hub.docker.com/
- Tensorflow
cd HPC_Workshop_9May/S2_Tensorflow
module load singularity
singularity pull tensorflow.sif docker://nvcr.io/nvidia/tensorflow:22.12-tf1-py3
vim test_tensorflow.py
test_tensorflow.py
import tensorflow as tf
# Check for GPU availability
if tf.config.list_physical_devices('GPU'):
# Configure TensorFlow to use the first available GPU
physical_devices = tf.config.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(physical_devices[0], True)
logical_devices = tf.config.list_logical_devices('GPU')
print("Using GPU: {}".format(logical_devices[0]))
else:
print("No GPU available, defaulting to CPU.")
# Define some sample data
x = tf.constant([[1., 2.], [3., 4.]], dtype=tf.float32)
y = tf.constant([[5., 6.], [7., 8.]], dtype=tf.float32)
# Perform matrix multiplication on GPU (if available)
with tf.device("/GPU:0" if tf.config.list_physical_devices('GPU')
else "/CPU:0"): z = tf.matmul(x, y)
# Print the result
print(z.numpy())
vim run.sh
run.sh
#!/bin/bash
#SBATCH -J testTen
#SBATCH -o %j.out
#SBATCH -e test_%j.err
#SBATCH -c 1
#SBATCH -p gpu
#SBATCH --gpus=1
module purge
module load singularity
singularity run --nv /opt/ohpc/pub/apps/singularity/tensorflow_latest-gpu.sif python test_tensorflow.py
##singularity exec --nv tensorflow_23.sif python tensorflow.py
jupyter.sh
vim jupyter.sh
#!/bin/bash
#SBATCH --job-name=jupyter
#SBATCH --gpus=1
#SBATCH --time=02:00:00
cat /etc/hosts
port=$(shuf -i 6000-9999 -n 1)
jupyter lab --ip=0.0.0.0 --port=$port
พอร์ต
$port
คือกำหนดว่าให้ jupyterhub รันที่พอร์ตไหน
อาจจะทำการเซตตัวเลยเอง โดยให้เปลี่ยนไม่ให้ซ้ำ ตั้งสูง ๆ ไว้เพราะพอร์ตหมายเลขน้อย ๆ อาจจะไปชนกับ service อื่น ๆ โดยเฉพาะที่ต่ำกว่า 1024
หรือใช่สูตรในการใช้ portport=$(shuf -i 6000-9999 -n 1)
sbatch jupyter.sh
ssh -L 9999:10.98.4.1x:<port> <cmu account>@erawan.cmu.ac.th
Example code
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
Add the virtualenv as a jupyter kernel
conda activate [env-name]
ipython kernel install --user --name=[env-name]