สามารถเข้าสู่ระบบได้ 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 [cmu account]@erawan.cmu.ac.th
ตัวอย่าง: ssh pornnapa.p@cmu.ac.th@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
การเข้าสู่ระบบโดยผ่าน Jupyter Notebook สามารถเข้าผ่าน https://erawan.cmu.ac.th:8000
Sign in with CMU Account
เพื่อเข้าสู่ระบบการยืนยันตัวตนด้วย CMU AccountAccept
เพื่อขอสิทธิ์ในการเข้าถึงข้อมูลTerminal
สร้างไฟล์หรือแก้ไข Text
, Python
, Python Notebook
และสร้าง Folder ได้ไม่ควรรันงานขนาดใหญ่ หรือ python ผ่านทาง notebook โดยตรงเนื่องจากงานนั้นจะถูกรันงานไว้ที่เครื่อง Login node ซึ่งจะทำให้มีการทำงานช้าลงและกระทบต่อการใช้งานของผู้อื่น
(ข้อควรระวังในการใช้งาน) ซึ่งควรรันงานผ่าน Slurm บน notebook (การใช้งาน Slurm ผ่าน JupyterLab)
รูปแบบคำสั่ง
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
%load_ext slurm_magic
ทดสอบการใช้งาน slurm command
sinfo
squeue
ทดสอบการใช้งาน slurm script
%%sbatch
#!/bin/bash
#SBATCH --job-name=test
#SBATCH --output=test_%j.out
#SBATCH --error=test_%j.err
#SBATCH --cpus-per-task=1
#SBATCH --partition=cpu
python --version
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
Download Workshop
git clone https://github.com/Pornnapa-Panyadee/HPC_Workshop_9May.git
conda create -n testenv python=3.10
conda activate testenv
---- Check version env ----------------
python
exit()
---- End check version env ------------
conda deactivate
---- Check version with out env --------
python
exit()
---- End check version with out env ----
Test env with slurm script
cd HPC_Workshop_9May/E0_Create_env
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
เข้าไปใน Folder E1_Pytorch
cd HPC_Workshop_9May/E1_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
ref. Multi-GPUs Training with PyTorch on LANTA -- Distributed Data-Parallel (DDP)
เข้าไปใน Folder E2_MultiGPU_Pytorch
cd ../E2_MultiGPU_Pytorch
module load anaconda3
conda create -n testpytorch python=3.10 torchvision torchaudio pytorch-cuda=12.1 -c pytorch-nightly -c nvidia
vim DDP.py
def setup(rank, world_size):
# initialize the process group
dist.init_process_group("nccl", rank=rank, world_size=world_size)
def main():
****-----------------------------------------------------------------------------
world_size = int(os.environ["WORLD_SIZE"])
rank = int(os.environ["SLURM_PROCID"])
gpus_per_node = int(os.environ["SLURM_GPUS_ON_NODE"])
****-----------------------------------------------------------------------------
assert gpus_per_node == torch.cuda.device_count()
print(f"Hello from rank {rank} of {world_size} on {gethostname()} where there are" \
f" {gpus_per_node} allocated GPUs per node.", flush=True)
setup(rank, world_size)
if rank == 0: print(f"Group initialized? {dist.is_initialized()}", flush=True)
local_rank = rank - gpus_per_node * (rank // gpus_per_node)
torch.cuda.set_device(local_rank)
print(f"host: {gethostname()}, rank: {rank}, local_rank: {local_rank}")
train_sampler = torch.utils.data.distributed.DistributedSampler(dataset1, num_replicas=world_size, rank=rank)
****-----------------------------------------------------------------------------
train_loader = torch.utils.data.DataLoader(dataset1, batch_size=args.batch_size, sampler=train_sampler,num_workers=int(os.environ["SLURM_CPUS_PER_TASK"]), pin_memory=True)
test_loader = torch.utils.data.DataLoader(dataset2, **test_kwargs)
****-----------------------------------------------------------------------------
The world_size
is actually the total number of GPUs available on the required node(s)
conda activate testpytorch
(testpytorch) $ python3
>>> import torch
>>> from torchvision import datasets, transforms
>>> transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
>>> dataset1 = datasets.MNIST('data', train=True, download=True, transform=transform)
>>> exit()
vim run.slurm
#!/bin/bash
#SBATCH --job-name=E2
#SBATCH --partition=mixed
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=2
#SBATCH --gpus=1
#SBATCH --output=%j.out
#SBATCH --error=%j.err
export MASTER_PORT=$(expr 10000 + $(echo -n $SLURM_JOBID | tail -c 4))
echo "MASTER_PORT="$MASTER_PORT
export WORLD_SIZE=1 #$SLURM_NNODES * $SLURM_NTASKS_PER_NODE
echo "WORLD_SIZE="$WORLD_SIZE
master_addr=$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1)
export MASTER_ADDR=$master_addr
echo "MASTER_ADDR="$MASTER_ADDR
python3 DDP.py
**ถ้าไม่มีการสร้าง evn ให้ทำการ comment code ใน slurm script ก่อน run **
##source $HOME/.bashrc ##conda activate testpytorch
sbatch run.slurm
output
MASTER_PORT=14365
WORLD_SIZE=1
MASTER_ADDR=compute3
Hello from rank 0 of 1 on compute3.localdomain where there are 1 allocated GPUs per node.
Group initialized? True
host: compute3.localdomain, rank: 0, local_rank: 0
Train Epoch: 1 [0/60000 (0%)] Loss: 2.318261
Train Epoch: 1 [640/60000 (1%)] Loss: 1.257489
Train Epoch: 1 [1280/60000 (2%)] Loss: 0.740961
Train Epoch: 1 [1920/60000 (3%)] Loss: 0.504051
Train Epoch: 1 [2560/60000 (4%)] Loss: 0.323792
Train Epoch: 1 [3200/60000 (5%)] Loss: 0.330681
Train Epoch: 1 [3840/60000 (6%)] Loss: 0.297750
Train Epoch: 1 [4480/60000 (7%)] Loss: 0.213747
Train Epoch: 1 [5120/60000 (9%)] Loss: 0.206334
Train Epoch: 1 [5760/60000 (10%)] Loss: 0.176185
Train Epoch: 1 [6400/60000 (11%)] Loss: 0.523220
Train Epoch: 1 [7040/60000 (12%)] Loss: 0.159854
.
.
.
Train Epoch: 14 [55680/60000 (93%)] Loss: 0.007110
Train Epoch: 14 [56320/60000 (94%)] Loss: 0.039843
Train Epoch: 14 [56960/60000 (95%)] Loss: 0.001957
Train Epoch: 14 [57600/60000 (96%)] Loss: 0.006067
Train Epoch: 14 [58240/60000 (97%)] Loss: 0.051391
Train Epoch: 14 [58880/60000 (98%)] Loss: 0.004421
Train Epoch: 14 [59520/60000 (99%)] Loss: 0.006927
Test set: Average loss: 0.0267, Accuracy: 9914/10000 (99%)
cd HPC_Workshop_9May/E3_Gromacs
module load gromacs_gpu
gmx grompp -f pme_verlet.mdp -o pme_verlet.tpr
vim gromac.slurm
#!/bin/bash
#SBATCH -J gromacs
#SBATCH --gpus=1
#SBATCH -p gpu
#SBATCH -o %j.out
#SBATCH --cpus-per-task=4
module load gromacs_gpu
gmx mdrun -deffnm pme_verlet -v -nsteps 100000
sbatch gromac.slurm
ระบบ Container ที่ใช้งานบนระบบ HPC ซึ่งทำงานคล้าย Docker
แหล่งเว็บไซต์
NGC ที่เป็นแหล่งรวม container ของ nvidia https://ngc.nvidia.com/catalog/containers
Docker hub แหล่งรวม container ของ Docker https://hub.docker.com/
สามารถดูรายการที่ Download ให้เรียบร้อยได้ที่ ls /opt/ohpc/pub/apps/singularity
- Quantum ESPRESSO
คือโปรแกรมคอมพิวเตอร์สำหรับ จำลองเชิงอะตอม (atomistic simulations) ในด้านเคมีควอนตัมและฟิสิกส์สถานะของแข็ง ซึ่งสามารถจำลองระบบต่างๆ ได้หลากหลาย
cd HPC_Workshop_9May/S1_QE
vim qe.sh
qe.sh
#!/bin/bash
#SBATCH --gpus=1
#SBATCH -w compute2
#SBATCH --job-name=qegpu
#SBATCH -p gpu
#SBATCH -o %j.out
#SBATCH --ntasks=1
singularity run --nv /opt/ohpc/pub/apps/singularity/quantum_espresso_qe-7.1.sif mpirun pw.x -inp input.in > output.out
sbatch qe.sh
- 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]