Nonmem parallel problem

อันนี้เป็นข้อความของปัญหาการใช้งาน Nonmem 7.2 แบบขนาน ที่เกิดหลังจากที่ลงระบบของ cluster ใหม่ด้วย  Rocks 6.1(Emerald Boa) ครับ

USING PARALLEL PROFILE /home/XXX/run1/mpilinux8.pnm

MPI TRANSFER TYPE SELECTED

Exit status = 1

IN MPI

/share/apps/nm72/mpi/mpi_ling/libmpich.a: could not read symbols: File in wrong format

collect2: ld returned 1 exit status

No nonmem execution.

ซึ่งผมพบว่าตัว libmpich.a ที่มากับ Nonmem นั้นจะเก่ากว่าตัวที่มีอยู่ใน cluster วิธีการแก้ปัญหานี้ผมก็เพียง copy ตัวที่มีอยู่แล้ว (จาก /opt/mpich2/gnu/lib) มาแทนที่ตัวที่ Nonmem ให้มาครับ ปัญหาก็จบเลย

 

 

 

การติดตั้งและใช้งาน 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

เกี่ยวกับ AppendTo Sow Reap

ดูเหมือนว่าการใช้ AppendTo ในการเก็บค่าของตัวแปรที่สนใจจะทำให้การคำนวณช้าลงเมื่อ list ของตัวแปรมีขนาดใหญ่ขึ้นเรื่อย ๆ

แนะนำว่าควรจะใช้ Sow และ Reap ช่วยจะดีกว่า ซึ่งก็ช่วยได้ เร็วขึ้นมาจริง (รู้สึกได้)

ถ้าต้องการจะใช้ Sow แบบ Parallel ก็ทำแบบนี้ได้ครับ

SetSharedFunction[ParallelSow]
ParallelSow[expr_]:=Sow[expr]