สำหรับคนที่สนใจเรื่อง Hpc จะมีตัวจัดการ job ที่น่าสนใจอีกตัวนึงคือ Slurm วันนี้ผมจะมาอธิบายคร่าวๆรวมถีงการติดตั้ง slurm ในแบบของเด็กจบใหม่ อาจมีผิดพลาดในการอธิบายบ้างรบกวนช่วยบอกกล่าวด้วยนะครับ
Simple Linux Utility for Resource Management หรืออีกชื่อคือ Slurm หน้าที่ของมันคือคอยจัดการ jobs ต่างๆ ใน cluster ให้เราไม่ว่า ระบบcluster ของเราจะใหญ่หรือเล็กก็ตาม ช่วยให้การทำ HPC ของเราสะดวกขึ้นมาก
จุดเด่นของ slurm หรอ ? เยอะมาก !
ถ้าเทียบกับความเล็กของ package ตัวมันแล้วละก็ slurm มีจุดเด่นมากกับความสามารถของมัน จะยกตัวอย่างคร่าวๆที่ได้ศึกษามาแล้วว้าวกับมันมาก
- Slurm requires no kernel modifications
- Free and open-source software (GNU General Public License)
- Highly scalable (schedules up to 100,000 independent jobs on the 100,000 sockets of IBM Sequoia)
- High performance (up to 1000 job submissions per second and 600 job executions per second)
- Fair-share scheduling with hierarchical bank accounts
ที่มา : https://en.wikipedia.org/wiki/Slurm_Workload_Manager
ระบบของ Slurm เป็นแบบไหน แต่ละส่วนมีหน้าที่อย่างไร ?
โครงสร้างของระบบ จะแบ่งเป็น 2 กลุ่ม
- Controller deamons ( Slurmctld , Slurmdbd )
- Compute node deamons ( Slurmd)
- Slurmctld (Slurm Controller daemons) มีหน้าที่คอยจัดการงานที่ได้รับมอบหมาย จัดการทรัพยากรของแต่ละ Compute อารมณ์เหมือนหัวหน้าใหญ่ของงาน(Headnode) และยังสามารถมี Slurmctld อีกตัวคอยเป็น Backup ได้อีกด้วย (สามารถทำ HA)
- Slurmdbd (Slurm database deamons) มีหน้าที่ตามชื่อเลย คือเป็น Database ให้สำหรับ cluster ของเรา หรือ ร่วมกับ cluster อื่นๆได้อีกด้วย ถ้าไม่มีก็ได้ แต่ไม่สามารถใช้บางคำสั่งของ slurm ได้
- Slurmd (Slurm deamons) มีหน้าเป็นเครื่อง Compute node (ประมวลผล) สำหรับงานต่างๆที่ถูกจ่ายมาจาก Slurmctld (Headnode)
หลักการทำงานของระบบ
- เริ่มแรกเมื่อหลังจากเรา ตั้งค่างานและกดสั่งงานเข้าไปในระบบที่ Headnode ตัว Headnode ก็จะดูว่าเราต้องการหลักการทำงานแบบไหน เช่น ประมวลผลงานบนเครื่องเดียว ประมวลผลบนเครื่องที่เรามีอยู่ทั้งหมด ด้วยจำนวน core cpu แต่ละเครื่องเท่าไหร่ พร้อมทั้ง คอยเช็คว่าคนที่เราสั่งการทำงานนั้นสามารถ ตั้งค่าแบบนั้นได้ไหม (สมมุติมีการตั้งขีดความสามารถของแต่ละ user ตามข้อมูลจากคำสั่ง sacct ที่เก็บในดาต้าเบส)
- เมื่อทุกอย่างพร้อมเครื่อง Headnode ก็จะกระจายงานออกไปยังเครื่องต่างๆที่ ทรัพยากรเพียงพอ ด้วยการสื่อสารข้ามเครื่องที่เราเรียกว่า MPI (Message Passing Interface) อ่านเพิ่มเติมเรื่อง MPI คลิ๊ก
- เครื่อง Compute แต่ละตัวที่ได้รับงานมาก็จะประมวลผลพร้อมกัน งานใครงานมันเมื่อเสร็จแล้วก็ส่งผลการประมวลผลกลับไปยัง Headnode
- Headnode จะเช็คว่าเครื่อง Compute ที่ส่งงานไปให้นั้นทำเสร็จเรียบร้อยหมดรึยัง ถ้าเรียบร้อยก็ทำการรวบรวมผลลัพท์ที่ได้แล้วแสดงออกมา
การติดตั้ง
ในตัวอย่างนี้จะขอสมมุติว่าในระบบเรามีคอมพิวเตอร์อยู่ 3 เครื่องโดยให้เครื่องแรกที่ชื่อว่า headnode จะลง slurmctld และ slurmdbd ส่วน computenode[1–2] ลง slurmd มีระบบปฏิบัติการเป็น Centos7
- สร้าง Global user กันก่อน
เนื่องจาก slurm และ munge (Authentication service ที่ slurm ต้องใช้) ต้องการ UID และ GID เพื่อติดต่อกันข้าม node ใน cluster ของเรา ดังนั้นเราต้องสร้างในทุก ๆ node
- export MUNGEUSER=991
- groupadd -g $MUNGEUSER munge
- useradd -m -c “MUNGE Uid ’N’ Gid Emporium” -d /var/lib/munge -u $MUNGEUSER -g munge -s /sbin/nologin munge
- export SLURMUSER=992
- groupadd -g $SLURMUSER slurm
- useradd -m -c “SLURM workload manager” -d /var/lib/slurm -u $SLURMUSER -g slurm -s /bin/bash slurm
2. ติดตั้ง Munge
ทำการติดตั้ง Munge บนทุก node โดย
- yum install munge munge-libs munge-devel
ถ้าหา package ไม่เจอลอง yum install epel-release ดูนะครับ เมื่อลงเรียบร้อยแล้ว
ทำการ generate key ขึ้นมาจากเครื่อง “Headnode เครื่องเดียวเท่านั้น” ด้วยคำสั่ง
- dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key
- chown munge: /etc/munge/munge.key
- chmod 400 /etc/munge/munge.key
เรียบร้อยแล้วให้เราทำการก็อบปี้ key ของเราไปยัง เครื่องอื่นๆทุกเครื่อง ด้วยคำสั่ง
- scp /etc/munge/munge.key {x} :/etc/munge/munge.key
x คือเครื่องของเราในตัวอย่างนี้คือ compute1 และ compute2 อย่าลืมว่าเราต้องเขียนไฟล์ที่ /etc/hosts ก่อนนะ หรือไม่งั้นก็ ให้ x เป็น ip ปลายทางไปเลย
ทำให้มั่นใจว่าเราตั้งสถานะเจ้าของ และ File permission modes ถูกต้อง
- chown -R munge: /etc/munge/ /var/log/munge/
- chmod 0700 /etc/munge/ /var/log/munge/
สุดท้ายแล้วเราก็เปิดใช้งาน service munge ขึ้นมา
- systemctl enable munge
- systemctl start munge
3. Build Slurm
ทำการติดตั้ง Mariadb ก่อน Build slurm
- yum install mariadb-server mariadb-devel
แล้วดาวน์โหลด slurm มาเก็บไว้ยังเครื่อง Headnode จาก >>> ลิ้งค์นี้ <<<
ด้วยท่าไหนก็แล้วแต่ ในครั้งนี้ผมโหลดตัว 18.08.5–2 มาใช้เนื่องจากตอนผมเขียนมันบอกว่าใหม่และเสถียรสุด อย่างเช่นผม ผมก็
ลงมาเก็บไว้ในโฟลเดอร์ไหนสักที่หนึ่ง แล้วทำการ build slurm-x.tar.bz2 นั้น (x คือเวอร์ชั่นที่ท่านโหลดมา) ด้วยการ
- rpmbuild -ta slurm-18.08.5–2.tar.bz2
เมื่อเรียบร้อยแล้วไฟล์ที่ได้จะไปโพล่ที่ directory ของท่าน ตอนนี้ผมมี user เป็น root ดังนั้นมันจะไปโพล่ที่ /root/rpmbuild/RPMS/x86_64 แล้วท่านให้ท่านทำการแชร์ไฟล์ในนั้นไปยังเครื่องต่างๆ ด้วยกัน scp หรือท่านจะทำไดเรกทอรี่ไหนสักที่ให้ Set NFS นั้นกับเครื่องทุกเครื่อง ในที่นี้ผมให้ไดเรกทอรี่ /nfs/slurm-rpms ของ headnode เป็น NFS ของระบบ หน้าตาของไดเรกทอรี่ผมจะเป็นแบบนี้
บนเครื่อง ทุกเครื่อง ลง package ต่อไปนี้ ด้วยการ
- yum install slurm-18.08.5–2.el7.x86_64.rpm slurm-devel-18.08.5–2.el7.x86_64.rpm slurm-perlapi-18.08.5–2.el7.x86_64.rpm slurm-torque-18.08.5–2.el7.x86_64.rpm slurm-example-configs-18.08.5–2.el7.x86_64.rpm
ในที่นี้ผมให้ Slurmctld อยู่บน Headnode
- yum install slurm-slurmctld-18.08.5–2.el7.x86_64.rpm
ในที่นี้ผมให้ Slurmdbd อยู่บน Headnode เช่นเดียวกับ Slurmctld
- yum install slurm-slurmdbd-18.08.5–2.el7.x86_64.rpm
บนเครื่อง Compute1 และ 2 ลง Slurmd
- yum install slurm-pam_slurm-18.08.5–2.el7.x86_64.rpm slurm-libpmi-18.08.5–2.el7.x86_64.rpm slurm-slurmd-18.08.5–2.el7.x86_64.rpm
หลังจากนั้นให้ enable ทุกตัวด้วย
- systemctl enable slurmctld (บน Headnode)
- systemctl enable slurmdbd (บน Headnode)
- systemctl enable slurmd (บน compute1–2)
4. เขียนไฟล์ Conf
เราต้องเขียนไฟล์ Slurm.conf เพื่อให้ระบบของเรารู้ว่าเราต้องการอะไรอย่างไร โดยให้เราก็อบปี้ Slurm.conf.example มาใช้แก้ไข
- cp /etc/slurm/slurm.conf.example /etc/slurm/slurm.conf
หรือเราจะเขียนเบื้องต้นจาก >>> เว็บนี้ <<< โดยมี เนื้อหา ตามนี้นะครับ ส่วนของผมจะเขียนคร่าวๆประมาณนี้
- ClusterName= ชื่อที่เราต้องการ
- ControlMachine=เครื่องไหนที่ควบคุมระบบของเรา
- ControlAddr=ip เครื่องMachine
- SlurmUser=slurm <<ที่เราสร้างไว้
- AuthType=auth/munge เราAuthด้วย munge
- SlurmctldLogfile = ที่เก็บlog ของ slurmctld
- SlurmdLogfile = ที่เก็บlog ของ slurmd
- AccountingStorageType=ใช้ slurmdbd ในการเก็บข้อมูล
- AccountingStorageHost=เครื่องไหนที่เป็น slurmdbd
- NodeName= ประกาศเครื่อง slurmd ที่เรามี option เพิ่มเติมมีอยู่ใน เนื้อหา เพิ่มเติม
- PartitionName= ชื่อ partition ที่เราต้องการ มี node อะไรอยู่ใน parition นี้บ้าง
ทำการก็อบปี้ไฟล์ไปยังเครื่องต่างๆ
- scp /etc/slurm/slurm.conf compute1:/etc/slurm/slum.conf
- scp /etc/slurm/slurm.conf compute2:/etc/slurm/slum.conf
สร้าง Folder เก็บ Log ตามที่เราเขียนไว้ใน slurm.conf
บน Headnode
- mkdir /var/spool/slurmctld
- chown slurm: /var/spool/slurmctld
- chmod 755 /var/spool/slurmctld
- touch /var/log/slurmctld.log
- chown slurm: /var/log/slurmctld.log
- touch /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log
- chown slurm: /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log
บน Compute
- mkdir /var/spool/slurmd
- chown slurm: /var/spool/slurmd
- chmod 755 /var/spool/slurmd
- touch /var/log/slurmd.log
- chown slurm: /var/log/slurmd.log
หลังจากนั้นให้เราเขียนไฟล์ slurmdbd.conf ทำเหมือนข้างบนเลยโดย
- cp /etc/slurm/slurmdbd.conf.example /etc/slurm/slurmdbd.conf
- DbdAddr=ip เครื่อง slurmdbd
- DbdHost=ชื่อเครื่อง slurmdbd
- StorageUser=ชื่อ user ที่เราให้ใช้ database
- StoragePass = Password ของ user นั้น
- StorageLoc= StorageLocation
หลังจากนั้นเราทำการ setup MariaDB
- mysql -p
- mysql> grant all on slurm_acct_db.* TO ‘slurm’@’localhost’ identified by ‘some_pass’ with grant option; (‘some_pass’ คือรหัสผ่านของเรา)
- mysql> create database slurm_acct_db;
- mysql> quit;
เมื่อติดตั้ง MariaDB เรียบร้อยแล้วก็ทำการ start service
- systemctl status slurmdbd
- systemctl start slurmdbd
5. ทำการ start service ทุกตัว
- systemctl start slurmd (Compute1–2)
- systemctl start slurmdbd (Headnode)
- systemctl start slurmctld (Headnode)
ลองเช็คสถานะการทำงานของระบบเราบนเครื่อง Headnode
เนื้อหาเพิ่มเติม และ คำสั่งการใช้งานต่าง ๆ