ติดตั้ง Slurm แบบเด็กจบใหม่

//Blank
5 min readFeb 5, 2019

สำหรับคนที่สนใจเรื่อง Hpc จะมีตัวจัดการ job ที่น่าสนใจอีกตัวนึงคือ Slurm วันนี้ผมจะมาอธิบายคร่าวๆรวมถีงการติดตั้ง slurm ในแบบของเด็กจบใหม่ อาจมีผิดพลาดในการอธิบายบ้างรบกวนช่วยบอกกล่าวด้วยนะครับ

รูปจาก https://en.wikipedia.org/wiki/Slurm_Workload_Manager

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 กลุ่ม

  1. Controller deamons ( Slurmctld , Slurmdbd )
  2. 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)

หลักการทำงานของระบบ

  1. เริ่มแรกเมื่อหลังจากเรา ตั้งค่างานและกดสั่งงานเข้าไปในระบบที่ Headnode ตัว Headnode ก็จะดูว่าเราต้องการหลักการทำงานแบบไหน เช่น ประมวลผลงานบนเครื่องเดียว ประมวลผลบนเครื่องที่เรามีอยู่ทั้งหมด ด้วยจำนวน core cpu แต่ละเครื่องเท่าไหร่ พร้อมทั้ง คอยเช็คว่าคนที่เราสั่งการทำงานนั้นสามารถ ตั้งค่าแบบนั้นได้ไหม (สมมุติมีการตั้งขีดความสามารถของแต่ละ user ตามข้อมูลจากคำสั่ง sacct ที่เก็บในดาต้าเบส)
  2. เมื่อทุกอย่างพร้อมเครื่อง Headnode ก็จะกระจายงานออกไปยังเครื่องต่างๆที่ ทรัพยากรเพียงพอ ด้วยการสื่อสารข้ามเครื่องที่เราเรียกว่า MPI (Message Passing Interface) อ่านเพิ่มเติมเรื่อง MPI คลิ๊ก
  3. เครื่อง Compute แต่ละตัวที่ได้รับงานมาก็จะประมวลผลพร้อมกัน งานใครงานมันเมื่อเสร็จแล้วก็ส่งผลการประมวลผลกลับไปยัง Headnode
  4. Headnode จะเช็คว่าเครื่อง Compute ที่ส่งงานไปให้นั้นทำเสร็จเรียบร้อยหมดรึยัง ถ้าเรียบร้อยก็ทำการรวบรวมผลลัพท์ที่ได้แล้วแสดงออกมา

การติดตั้ง

ในตัวอย่างนี้จะขอสมมุติว่าในระบบเรามีคอมพิวเตอร์อยู่ 3 เครื่องโดยให้เครื่องแรกที่ชื่อว่า headnode จะลง slurmctld และ slurmdbd ส่วน computenode[1–2] ลง slurmd มีระบบปฏิบัติการเป็น Centos7

  1. สร้าง 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
เมื่อสร้าง User และ Group เสร็จแล้วลองเช็คดูว่าถูกต้องไหม

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
ทำการส่ง key ไปยังเครื่องต่างๆในระบบของเรา

x คือเครื่องของเราในตัวอย่างนี้คือ compute1 และ compute2 อย่าลืมว่าเราต้องเขียนไฟล์ที่ /etc/hosts ก่อนนะ หรือไม่งั้นก็ ให้ x เป็น ip ปลายทางไปเลย

เขียนไฟล์ hosts ที่ /etc/hosts ไว้ด้วยจะได้เขียน hostname เครื่องไปเลยไม่ต้องเขียน 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

sinfo คือดูว่าใน Cluster เรามีอะไรบ้าง Partition ไหนบ้าง และ scontrol show node ก็แสดง node ที่อยู่ในระบบของเรา
scontrol show partition แสดงข้อมูล partition ทั้งหมดของเรา
ลองรันคำสั่ง bash ง่ายๆ (hostname) และใช้ slrum ส่งคำสั่งไปยัง 2 เครื่องของเรา ( -n2 คือส่งไป 2 node )

เนื้อหาเพิ่มเติม และ คำสั่งการใช้งานต่าง ๆ

--

--