การติดตั้งและใช้งาน Mathematica บนระบบ Rocks Clusters

พอดีมีโอกาสได้ติดตั้งและทดลองใช้งาน Mathematica บนระบบ Cluster ของหน่วยงานหนึ่ง ก็เลยจะมาเล่าให้ฟังครับ ระบบ Cluster ที่พูดถึงนี้ใช้ระบบ Rocks Clusters (www.rocksclusters.org) ซึ่งก็คือ Linux ที่มีการเพิ่มความสามารถการจัดการ Cluster เข้าไป งานที่ระบบ Cluster นี้ถูกใช้จะเป็นงานคำนวณด้วย software หลักๆอย่าง Gromacs, NAMD, NONMEM, R และก็ที่หน่วยงานนี้เขียนขึ้นกันเองโดยใช้ mpi บ้าง

license ของ Mathematica ที่ได้มานี้เป็นแบบ network ครับ นั่นหมายความว่าเราต้องทำการติดตั้ง Mathematica License Manager หรือ mathlm ก่อน  ซึ่งผมก็ได้ลง mathlm ไว้บน server อีกตัวซึ่งเป็นระบบ Windows server 2008 ที่หน่วยงานนี้เค้าใช้เป็น license server สำหรับโปรแกรมตัวอื่นๆด้วย ในการลงก็ไม่ได้ยุ่งยากอะไรครับเพียงแต่ตอบคำถามไปเรื่อยๆ 🙂  พอลงเสร็จ Mathlm มันก็จะ start ตัวมันเองอัตโนมัติครับ (ลองดูรายละเอียดเพิ่มเติมที่http://reference.wolfram.com/mathematica/tutorial/InstallingMathLM.html)

มาที่ตัว head node หรือตัวหลักของ cluster ผมก็ติดตั้ง Mathematica โดยใช้ตัวติดตั้งสำหรับ Linux  ซึ่งไฟล์ที่ผมได้มาเป็นไฟล์ขนาดประมาณ 1.2 GB ชื่อ Mathematica_8.0.4_LINUX_MachineSpecific.sh ในการติดตั้งผมก็เพียงแค่พิมพ์

./ Mathematica_8.0.4_LINUX_MachineSpecific.sh

ที่terminal ครับ จากนั้นก็ตอบคำถามไปเรื่อยโดยผมให้ตัว Mathematica นี้ติดตั้งตัวมันเองที่ /share/apps/Wofram/Mathematica/8.0 (/share/apps นี้เป็นdirectory ที่ทุกเครื่องใน cluster จะมองเห็น) และตัวคำสั่งในการเรียกใช้งาน (เช่น mathematica, math, MathKernel) ให้ติดตั้งไว้ที่ /share/apps/Wolfram/Mathematica/8.0/bin ในตอนที่ต้องใส่รหัสผมก็เลือกติดตั้งแบบ network โดยระบุชื่อของ license server ที่เราลง mathlm ไป

หลังจากนั้นเพื่อที่จะให้ users ทุกคนสามารถเรียกใช้งานได้ ผมก็สร้างไฟล์ชื่อ mathx.sh ไว้ที่ /share/apps/profile/ (จริงๆแล้วสร้างไว้ที่ไหนก็ได้ครับ) โดยในไฟล์นี้จะมีบรรทัดนี้อยู่ครับ

export PATH=”/share/apps/Wolfram/Mathematica/8.0/bin/:$PATH”

หลังจากนั้นก็ copy ไปไว้ที่ /etc/profile.d/ ของทุกเครื่องใน cluster ซึ่งการ copy ไฟล์ไปยังเครื่องลูก หรือ compute nodes นั้นในระบบของ rocks clusters เราสามารถใช้คำสั่งนี้ได้เลยครับ

rocks run host “cp /share/apps/profile/mathx.sh /etc/profile.d/”

ในการเรียกใช้งาน Mathematica เราก็เลือกจากเมนูหรือจะพิมพ์ Mathematica ที่ terminal ได้เลยครับ

 

การใช้งานคำนวณแบบ parallel หรือแบบขนานใน Mathematica นั้นไม่ยากเลยครับ คำสั่งหลักๆก็พวกที่ขึ้นต้นด้วย Parallel ทั้งหลายครับ ตัวอย่างที่ผมทดลองด้านล่างนี้ผมก็เอามาจากตัวอย่างใน Mathematica ครับ โดยอันแรกนี้ทดลองเรียกใช้งานโดยใช้คำสั่ง ParallelEvaluate ซึ่งมันจะโหลด Mathematica kernel เพื่อรันในแต่ล่ะ cpu core ของตัว head node ของ cluster หรือ local ซึ่งมี 8 cpu cores (Mathematica เรียก kernel ที่ถูกรันบนแต่ละ core ของ CPU แบบนี้ว่า subkernel ครับ โดยที่ตัว kernel หลักหรือ master kernel จะมี KernelID=0 ครับ)

การคำนวณแบบ parallel บนระบบของ cluster อย่างเช่น Rocks clusters นี้เราต้องทำการโหลด subkernel ไปไว้บนทุกๆ cpu cores ในแต่ละ compute node (เครื่องลูก) ที่เราต้องการใช้งาน ตัวอย่างอันที่สองนี้ผมทดลองเรียก subkernel โดยใช้ คำสั่ง LaunchKernels[RemoteMaching[]] จาก package ชื่อ SubKernels`RemoteKernels ซึ่งมากับ Mathematica (รายละเอียดสามารถดูได้จาก help ของ Mathematica เองครับ) เพื่อรัน subkernel จำนวนทั้งหมด 96 subkernels ในเครื่อง compute nodes จำนวน 8 เครื่องโดยมีจำนวน subkernels ที่ต้องการแตกต่างกันไปในแต่ล่ะเครื่อง

ซึ่งพอหลังจากที่เราโหลด subkernel เรียบร้อยแล้วเราก็สามารถใช้คำสั่งพวก parallel ทั้งหลายได้ครับ

ส่วนในกรณีที่จะใช้งานในแบบ text mode ผ่าน SGE ก็สามารถทำได้ง่ายๆตามนี้ครับ
ก็สร้างไฟล์ SGE สำหรับไว้ส่งไปรันเช่น run.job

#!/bin/bash
#$ -pe mpich 16
#$ -S /bin/bash
#$ -cwd
#$  -j y
cp -v $TMPDIR/machines TMP_machines
/share/apps/Mathematica/8.0/bin/math -run “<< testrun.math”

 

โดยที่ testrun.math ก็คือ Mathematica codes ที่ต้องการคำนวณ เช่น

Needs[“SubKernels`RemoteKernels`”]

$RemoteCommand= “ssh `1` -n -l `3` \”/share/apps/Mathematica/9.0/bin/math -mathlink -linkmode Connect `4` -linkname `2` -subkernel -noinit >& /dev/null &\””

hosts=Import[“TMP_machines”,”List”]

imin=2;
imax=Length[hosts];

Table[
Print[“starting Kernel: “,i,” on “,hosts[[i]]];
LaunchKernels[RemoteMachine[hosts[[i]]]];,
{i,imin,imax}]

id=ParallelEvaluate[$ProcessID];
AppendTo[$Echo,”stdout”]
Print[“Kernels: “, id//Length]
Print[“Prime Number Test – Parallel”]

data=Parallelize[Table[PrimeQ[n! + 1],{n,400,550}]]//AbsoluteTiming;

data2=Table[PrimeQ[n! + 1],{n,400,550}]//AbsoluteTiming;

Print[“Parallel: “,data[[1]]]
Print[“Not Parallel; “,data2[[1]]]

Exit[]

ซึ่งในกรณีของตัวอย่างนี้ Mathematica จะรันตัว subkernel เองอัตโนมัติบน CPU ที่ SGE กำหนด ตามจำนวนที่เราต้องการ ด้วยคำสั่ง LaunchKernels[n]  โดยที่ n นี้ก็คือจำนวน subkernels ที่เราต้องการใช้ในการคำนวน ซึ่งจะต้องเท่ากับจำนวน CPU ที่เรากำหนดในบรรทัด

#$ -pe mpich n