SLURM "srun" เทียบกับ "sbatch" และพารามิเตอร์


95

ฉันพยายามทำความเข้าใจว่าความแตกต่างระหว่าง SLURM srunและsbatchคำสั่งคืออะไร ฉันจะพอใจกับคำอธิบายทั่วไปมากกว่าคำตอบเฉพาะสำหรับคำถามต่อไปนี้ แต่ต่อไปนี้เป็นประเด็นเฉพาะของความสับสนที่อาจเป็นจุดเริ่มต้นและให้ความคิดเกี่ยวกับสิ่งที่ฉันกำลังมองหา

อ้างอิงถึงเอกสาร , srunมีไว้เพื่อส่งงานและsbatchสำหรับการส่งงานสำหรับการดำเนินการในภายหลัง แต่ความแตกต่างในทางปฏิบัติก็ไม่มีความชัดเจนให้ฉันและพฤติกรรมของพวกเขาดูเหมือนว่าจะเป็นแบบเดียวกัน ตัวอย่างเช่นฉันมีคลัสเตอร์ที่มี 2 โหนดแต่ละโหนดมี CPU 2 ตัว ถ้าผมดำเนินการsrun testjob.sh &5x ในแถวมันอย่างจะคิวงานที่ห้าจน CPU sbatch testjob.shที่สามารถใช้งานได้เป็นจะดำเนินการ

เพื่อให้คำถามเป็นรูปธรรมมากขึ้นฉันคิดว่าจุดเริ่มต้นที่ดีอาจเป็น: มีสิ่งใดบ้างที่ฉันสามารถทำได้กับคำถามที่ฉันไม่สามารถทำได้กับอีกคำถามและเพราะเหตุใด

อาร์กิวเมนต์จำนวนมากของทั้งสองคำสั่งเหมือนกัน คนที่ดูเหมือนที่เกี่ยวข้องมากที่สุดคือ--ntasks, --nodes, ,--cpus-per-task สิ่งเหล่านี้เกี่ยวข้องกันอย่างไรและต่างกันอย่างไรสำหรับvs ?--ntasks-per-nodesrunsbatch

ความแตกต่างอย่างหนึ่งคือsrunจะทำให้เกิดข้อผิดพลาดหากtestjob.shไม่มีสิทธิ์ปฏิบัติการเช่นchmod +x testjob.shในขณะที่sbatchจะรันอย่างมีความสุข เกิดอะไรขึ้น "ภายใต้ประทุน" ที่ทำให้เป็นเช่นนี้?

เอกสารประกอบยังกล่าวถึงที่srunมักใช้ภายในsbatchสคริปต์ สิ่งนี้นำไปสู่คำถาม: พวกเขามีปฏิสัมพันธ์กันอย่างไรและอะไรคือ "หลักการใช้" สำหรับพวกเขาแต่ละคน? โดยเฉพาะฉันจะใช้srunเองหรือไม่?

คำตอบ:


110

เอกสารระบุว่า

srun is used to submit a job for execution in real time

ในขณะที่

sbatch is used to submit a job script for later execution.

ทั้งสองยอมรับพารามิเตอร์ชุดเดียวกัน ความแตกต่างที่สำคัญsrunคือการโต้ตอบและการบล็อก (คุณได้รับผลลัพธ์ในเทอร์มินัลของคุณและคุณไม่สามารถเขียนคำสั่งอื่น ๆ ได้จนกว่าจะเสร็จสิ้น) ในขณะที่sbatchกำลังประมวลผลแบบแบตช์และไม่ปิดกั้น (ผลลัพธ์จะถูกเขียนลงในไฟล์และคุณสามารถส่งคำสั่งอื่น ๆ ทันที).

หากคุณใช้srunเป็นพื้นหลังพร้อมกับ&เครื่องหมายแสดงว่าคุณลบคุณลักษณะ "การปิดกั้น" srunซึ่งจะกลายเป็นแบบโต้ตอบ แต่ไม่ใช่การปิดกั้น แม้ว่าจะยังคงเป็นแบบโต้ตอบซึ่งหมายความว่าเอาต์พุตจะเกะกะเทอร์มินัลของคุณและsrunกระบวนการต่างๆเชื่อมโยงกับเทอร์มินัล หากคุณตัดการเชื่อมต่อคุณจะสูญเสียการควบคุมหรืออาจถูกฆ่า (ขึ้นอยู่กับว่าพวกเขาใช้ stdoutหรือไม่โดยพื้นฐาน) และจะถูกฆ่าหากเครื่องที่คุณเชื่อมต่อเพื่อส่งงานถูกรีบูต

หากคุณใช้sbatchคุณจะส่งงานของคุณและ Slurm ได้รับการจัดการ คุณสามารถตัดการเชื่อมต่อฆ่าเทอร์มินัล ฯลฯ โดยไม่มีผลใด ๆ งานของคุณไม่ได้เชื่อมโยงกับกระบวนการทำงานอีกต่อไป

มีอะไรบ้างที่ฉันสามารถทำได้กับสิ่งที่ฉันไม่สามารถทำได้และเพราะเหตุใด

คุณลักษณะที่มีให้sbatchและไม่ให้srunเป็นarrrays งาน ในฐานะที่srunสามารถนำมาใช้ภายในสคริปต์มีอะไรที่คุณไม่สามารถทำอะไรกับsbatchsbatch

สิ่งเหล่านี้เกี่ยวข้องกันอย่างไรและ srun vs sbatch ต่างกันอย่างไร

พารามิเตอร์ทั้งหมด--ntasks, --nodes, --cpus-per-task, --ntasks-per-nodeมีความหมายเหมือนกันในคำสั่งทั้ง --exclusiveนั่นคือความจริงเกือบทุกพารามิเตอร์ด้วยความทึ่งยกเว้น

เกิดอะไรขึ้น "ภายใต้ประทุน" ที่ทำให้เป็นเช่นนี้?

srunเรียกใช้สคริปต์บนรีโมตโฮสต์ทันทีในขณะที่sbatchคัดลอกสคริปต์ในที่จัดเก็บข้อมูลภายในจากนั้นอัปโหลดไปยังโหนดคอมพิวท์เมื่องานเริ่มทำงาน คุณสามารถตรวจสอบสิ่งนี้ได้โดยแก้ไขสคริปต์การส่งของคุณหลังจากที่ส่งไปแล้ว การเปลี่ยนแปลงจะไม่ถูกนำมาพิจารณา (ดูสิ่งนี้ )

พวกเขามีปฏิสัมพันธ์กันอย่างไรและอะไรคือกรณีการใช้งาน "มาตรฐาน" สำหรับพวกเขาแต่ละคน

โดยทั่วไปคุณจะใช้sbatchในการส่งงานและsrunในสคริปต์การส่งเพื่อสร้างขั้นตอนงานตามที่ Slurm เรียกพวกเขา srunใช้เพื่อเปิดใช้งานกระบวนการ หากโปรแกรมของคุณเป็นโปรแกรม MPI คู่ขนานให้srunดูแลการสร้างกระบวนการ MPI ทั้งหมด หากไม่เป็นเช่นsrunนั้นจะเรียกใช้โปรแกรมของคุณหลาย ๆ ครั้งตามที่--ntasksตัวเลือกระบุ มีหลายกรณีการใช้งานขึ้นอยู่กับว่าโปรแกรมของคุณขนานกันหรือไม่มีเวลาทำงานที่ยาวนานหรือไม่ประกอบด้วยโปรแกรมปฏิบัติการเดียวหรือไม่ ฯลฯ เว้นแต่จะระบุไว้เป็นอย่างอื่นsrunสืบทอดโดยค่าเริ่มต้นตัวเลือกที่เกี่ยวข้องของsbatchหรือsallocที่รัน ภายใต้ (จากที่นี่ )

โดยเฉพาะฉันจะใช้ srun ด้วยตัวเองหรือไม่?

นอกเหนือจากการทดสอบขนาดเล็กไม่มี การใช้งานทั่วไปคือsrun --pty bashการรับเชลล์ในงานคำนวณ


5
ขอบคุณสำหรับคำตอบนี้ดีกว่าทุกสิ่งที่ฉันหวังไว้ การติดตามผลหนึ่งครั้งเนื่องจากนี่เป็นหนึ่งในจุดเริ่มต้นของความสับสนของฉัน: ทำไมต้องโทรsrunเข้าไปในสคริปต์การส่ง? บางทีฉันอาจสับสนเกี่ยวกับความหมายของ "ขั้นตอนงาน" ตัวอย่างเช่นถ้าฉันมีสคริปต์ที่เรียกrunjob.shว่า#!/bin/bash srun myjob.shมีความแตกต่างในทางปฏิบัติระหว่างการเรียก (a) sbatch runjob.shvs (b) sbatch myjob.shvs (c) srun myjob.shvs (d) srun runjob.shหรือไม่ (เห็นได้ชัดว่าคนสุดท้ายงี่เง่า แต่ฉันก็สงสัย)
dkv

3
บางทีคุณอาจเรียกดูสไลด์ของเซสชันการฝึกอบรมที่ฉันส่งไปเมื่อเร็ว ๆ นี้เพื่อดูแนวคิดเกี่ยวกับวิธีใช้ srun ในสคริปต์การส่ง: cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf
damienfrancois

4
ดูเหมือนว่าตัวอย่างทั้งหมดในสไลด์ (เช่นเดียวกับบทช่วยสอนในหน้า CECI) จะใช้srunภายในsbatchสคริปต์การส่ง อย่างไรก็ตามฉันพบว่าคำสั่งที่ไม่มีsrunในสคริปต์การส่งจะทำงานในลักษณะเดียวกัน มีความแตกต่างระหว่างการเรียกร้องทั้งสี่ที่ฉันกล่าวถึงข้างต้นหรือไม่
dkv

8
ตัวอย่างทั้งหมดของคุณจะทำงานในลักษณะเดียวกันก็ต่อเมื่อ (1) การจัดสรรสำหรับ CPU หนึ่งตัวและ (2) โปรแกรมเป็นแบบลำดับเท่านั้น หากต้องการดูความแตกต่างให้ขอมากกว่าหนึ่งงาน ข้อแตกต่างอีกประการหนึ่งคือถ้าคุณไม่ใช้ srun ใน sbatch คำสั่ง sstat จะไม่ส่งคืนข้อมูลที่เป็นประโยชน์
damienfrancois

1
@Atcold เวอร์ชันนี้อาจอัปเดตมากขึ้น: github.com/damienfrancois/slurm-helper/blob/master/slurm.vim
damienfrancois

5

สิ่งนี้ไม่ได้ตอบคำถามได้อย่างแท้จริง แต่นี่คือข้อมูลเพิ่มเติมที่ฉันพบซึ่งอาจเป็นประโยชน์สำหรับใครบางคนในอนาคต:


จากกระทู้ที่เกี่ยวข้องฉันพบคำถามที่คล้ายกัน:

โดยสรุป sbatch และ salloc จะจัดสรรทรัพยากรให้กับงานในขณะที่ srun จะเปิดใช้งานคู่ขนานกับทรัพยากรเหล่านั้น เมื่อเรียกใช้ภายในการจัดสรรงาน srun จะเปิดใช้งานคู่ขนานกับทรัพยากรที่จัดสรรบางส่วนหรือทั้งหมด ในกรณีนั้น srun จะสืบทอดโดยค่าเริ่มต้นตัวเลือกที่เกี่ยวข้องของ sbatch หรือ salloc ที่รันภายใต้ จากนั้นคุณสามารถ (โดยปกติ) ให้ srun ตัวเลือกต่างๆซึ่งจะแทนที่สิ่งที่ได้รับตามค่าเริ่มต้น การเรียกใช้ srun ภายในงานแต่ละครั้งเรียกว่าขั้นตอนงาน

นอกจากนี้ยังสามารถเรียกใช้ srun นอกการจัดสรรงาน ในกรณีนั้น srun ร้องขอรีซอร์สและเมื่อได้รับอนุญาตให้รีซอร์สเหล่านั้นจะเรียกใช้งานในรีซอร์สเหล่านั้นเป็นงานเดียวและขั้นตอนงาน

มีหน้าเว็บที่ค่อนข้างใหม่ซึ่งจะให้รายละเอียดเพิ่มเติมเกี่ยวกับตัวเลือก -B และ - แบบพิเศษ

doc / html / cpu_management.shtml


ข้อมูลเพิ่มเติมจากหน้าคำถามที่พบบ่อยของ SLURM

คำสั่ง srun มีโหมดการทำงานที่แตกต่างกันสองโหมด ขั้นแรกหากไม่ได้รันภายในงานที่มีอยู่ (เช่นไม่อยู่ในการจัดสรรงาน Slurm ที่สร้างโดย salloc หรือ sbatch) งานนั้นจะสร้างการจัดสรรงานและวางไข่แอปพลิเคชัน หากรันภายในการจัดสรรที่มีอยู่คำสั่ง srun จะเรียกใช้แอ็พพลิเคชันเท่านั้น สำหรับคำถามนี้เราจะกล่าวถึงโหมดการทำงานแรกเท่านั้นและเปรียบเทียบการสร้างการจัดสรรงานโดยใช้คำสั่ง sbatch และ srun

คำสั่ง srun ถูกออกแบบมาสำหรับการใช้งานแบบโต้ตอบโดยมีคนคอยตรวจสอบผลลัพธ์ ผลลัพธ์ของแอ็พพลิเคชันถูกมองว่าเป็นเอาต์พุตของคำสั่ง srun โดยทั่วไปจะอยู่ที่เทอร์มินัลของผู้ใช้ คำสั่ง sbatch ได้รับการออกแบบมาเพื่อส่งสคริปต์สำหรับการดำเนินการในภายหลังและเอาต์พุตจะถูกเขียนลงในไฟล์ ตัวเลือกคำสั่งที่ใช้ในการจัดสรรงานแทบจะเหมือนกัน ความแตกต่างที่เห็นได้ชัดเจนที่สุดในตัวเลือกคือคำสั่ง sbatch สนับสนุนแนวคิดของอาร์เรย์งานในขณะที่ srun ไม่ทำ ความแตกต่างที่สำคัญอีกประการหนึ่งคือความทนทานต่อความผิดพลาด ความล้มเหลวที่เกี่ยวข้องกับงาน sbatch โดยทั่วไปจะส่งผลให้งานถูกร้องขอและดำเนินการอีกครั้งในขณะที่ความล้มเหลวที่เกี่ยวข้องกับ srun มักส่งผลให้เกิดข้อความแสดงข้อผิดพลาดขึ้นโดยคาดหวังว่าผู้ใช้จะตอบสนองในรูปแบบที่เหมาะสม


การสนทนาอื่นที่เกี่ยวข้องที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.