SLURM `srun` vs` sbatch` dan parameternya


95

Saya mencoba untuk memahami apa perbedaan antara SLURM srundan sbatchperintah. Saya akan senang dengan penjelasan umum, daripada jawaban spesifik untuk pertanyaan-pertanyaan berikut, tetapi berikut adalah beberapa poin kebingungan spesifik yang dapat menjadi titik awal dan memberi gambaran tentang apa yang saya cari.

Menurut dokumentasi , srunadalah untuk mengirimkan pekerjaan, dan sbatchuntuk mengirimkan pekerjaan untuk eksekusi nanti, tetapi perbedaan praktisnya tidak jelas bagi saya, dan perilaku mereka tampaknya sama. Misalnya, saya memiliki cluster dengan 2 node, masing-masing dengan 2 CPU. Jika saya mengeksekusi srun testjob.sh &5x berturut-turut, itu akan dengan baik mengantri pekerjaan kelima sampai CPU tersedia, seperti yang akan dieksekusi sbatch testjob.sh.

Untuk membuat pertanyaan lebih konkret, saya pikir tempat yang baik untuk memulai mungkin: Apa saja hal yang dapat saya lakukan dengan satu hal yang tidak dapat saya lakukan dengan yang lain, dan mengapa?

Banyak argumen untuk kedua perintah itu sama. Orang-orang yang tampaknya paling relevan adalah --ntasks, --nodes, --cpus-per-task, --ntasks-per-node. Bagaimana ini terkait satu sama lain, dan apa perbedaannya untuk srunvs sbatch?

Satu perbedaan khusus adalah yang srunakan menyebabkan kesalahan jika testjob.shtidak memiliki izin yang dapat dieksekusi yaitu chmod +x testjob.shsedangkan sbatchakan dengan senang hati menjalankannya. Apa yang terjadi "di bawah tenda" yang menyebabkan hal ini terjadi?

Dokumentasi juga menyebutkan yang srunbiasa digunakan di dalam sbatchskrip. Hal ini mengarah pada pertanyaan: Bagaimana mereka berinteraksi satu sama lain, dan apa kasus penggunaan "kanonik" untuk masing-masing mereka? Secara khusus, apakah saya akan pernah menggunakannya srunsendiri?

Jawaban:


110

Dokumentasinya mengatakan

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

sementara

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

Keduanya menerima sekumpulan parameter yang praktis sama. Perbedaan utamanya srunadalah interaktif dan memblokir (Anda mendapatkan hasilnya di terminal Anda dan Anda tidak dapat menulis perintah lain sampai selesai), sedangkan sbatchpemrosesan batch dan non-pemblokiran (hasil ditulis ke file dan Anda dapat mengirimkan perintah lain segera).

Jika Anda menggunakan srundi latar belakang dengan &tanda, maka Anda menghapus fitur 'pemblokiran' srun, yang menjadi interaktif tetapi tidak memblokir. Ini masih interaktif, yang berarti bahwa output akan mengacaukan terminal Anda, dan srunprosesnya terhubung ke terminal Anda. Jika Anda memutuskan sambungan, Anda akan kehilangan kendali atas mereka, atau mereka mungkin terbunuh (tergantung pada apakah mereka stdoutpada dasarnya menggunakan atau tidak). Dan mereka akan dimatikan jika mesin yang Anda hubungkan untuk mengirimkan pekerjaan di-boot ulang.

Jika Anda menggunakan sbatch, Anda mengirimkan pekerjaan Anda dan itu ditangani oleh Slurm; Anda dapat memutuskan sambungan, mematikan terminal Anda, dll. tanpa konsekuensi. Pekerjaan Anda tidak lagi terkait dengan proses yang sedang berjalan.

Apa saja yang dapat saya lakukan dengan yang satu tetapi tidak dapat saya lakukan dengan yang lain, dan mengapa?

Sebuah fitur yang tersedia untuk sbatchdan bukan untuk srunadalah susunan pekerjaan . Seperti yang srundapat digunakan dalam sbatchskrip, tidak ada yang tidak dapat Anda lakukan sbatch.

Bagaimana ini terkait satu sama lain, dan apa perbedaannya untuk srun vs sbatch?

Semua parameter --ntasks, --nodes, --cpus-per-task, --ntasks-per-nodememiliki arti yang sama di kedua perintah. Itu benar untuk hampir semua parameter, dengan pengecualian --exclusive.

Apa yang terjadi "di bawah tenda" yang menyebabkan hal ini terjadi?

srunsegera mengeksekusi skrip pada host jarak jauh, sementara sbatchmenyalin skrip di penyimpanan internal dan kemudian mengunggahnya ke node komputasi saat pekerjaan dimulai. Anda dapat memeriksanya dengan mengubah skrip pengiriman Anda setelah dikirim; perubahan tidak akan diperhitungkan (lihat ini ).

Bagaimana mereka berinteraksi satu sama lain, dan apa kegunaan "kanonik" untuk masing-masing mereka?

Anda biasanya menggunakan sbatchuntuk mengirimkan pekerjaan dan srundalam skrip pengiriman untuk membuat langkah-langkah pekerjaan seperti yang disebut Slurm. srundigunakan untuk meluncurkan proses. Jika program Anda adalah program MPI paralel, urus srunpembuatan semua proses MPI. Jika tidak, srunakan menjalankan program Anda sebanyak yang ditentukan oleh --ntasksopsi. Ada banyak kasus penggunaan tergantung pada apakah program Anda diparalelkan atau tidak, memiliki waktu berjalan lama atau tidak, terdiri dari satu yang dapat dieksekusi atau tidak, dll. Kecuali ditentukan lain, srunsecara default mewarisi opsi terkait dari sbatchatau sallocyang dijalankan di bawah (dari sini ).

Secara khusus, apakah saya pernah menggunakan srun dengan sendirinya?

Selain untuk tes kecil, tidak. Penggunaan yang umum adalah srun --pty bashmendapatkan shell pada pekerjaan komputasi.


5
Terima kasih atas jawabannya, ini lebih baik dari apapun yang saya harapkan. Satu tindak lanjut, karena ini adalah salah satu poin kebingungan awal saya: mengapa repot-repot menelepon ke srundalam skrip pengiriman? Mungkin saya bingung tentang arti "langkah kerja". Misalnya, jika saya memiliki skrip yang disebut runjob.shyang berisi #!/bin/bash srun myjob.sh, apakah ada perbedaan praktis antara memanggil (a) sbatch runjob.shvs (b) sbatch myjob.shvs (c) srun myjob.shvs (d) srun runjob.sh? (Jelas yang terakhir konyol, tapi saya penasaran).
dkv

3
mungkin Anda bisa menelusuri slide sesi pelatihan yang saya sampaikan baru-baru ini untuk mendapatkan ide tentang bagaimana srun digunakan di dalam skrip pengiriman: cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf
damienfrancois

4
Sepertinya semua contoh di slide (serta tutorial di halaman CECI) digunakan srundi dalam sbatchskrip pengiriman. Namun, saya telah menemukan bahwa perintah tanpa srunskrip pengiriman akan berjalan dengan cara yang sama. Apakah sebenarnya ada perbedaan antara keempat doa yang saya sebutkan di atas?
dkv

8
Semua contoh Anda akan berjalan dengan cara yang sama hanya jika (1) alokasinya untuk satu CPU dan (2) programnya murni berurutan. Untuk melihat perbedaan, minta lebih dari satu tugas. Perbedaan lainnya adalah jika Anda tidak menggunakan srun di sbatch, perintah sstat tidak akan mengembalikan informasi yang berguna
damienfrancois


5

Ini sebenarnya tidak sepenuhnya menjawab pertanyaan, tetapi berikut adalah beberapa informasi lainnya yang saya temukan yang mungkin berguna untuk seseorang di masa depan:


Dari utas terkait saya temukan dengan pertanyaan serupa:

Singkatnya, sbatch dan salloc mengalokasikan sumber daya ke tugas, sementara srun meluncurkan tugas paralel di seluruh sumber daya tersebut. Saat dipanggil dalam alokasi pekerjaan, srun akan meluncurkan tugas paralel di beberapa atau semua sumber daya yang dialokasikan. Dalam hal ini, srun mewarisi secara default opsi terkait dari sbatch atau salloc yang dijalankannya. Anda kemudian dapat (biasanya) menyediakan opsi berbeda srun yang akan menimpa apa yang diterimanya secara default. Setiap permintaan srun dalam suatu pekerjaan dikenal sebagai langkah pekerjaan.

srun juga dapat dijalankan di luar alokasi pekerjaan. Dalam hal ini, srun meminta sumber daya, dan ketika sumber daya tersebut diberikan, meluncurkan tugas di seluruh sumber daya tersebut sebagai satu pekerjaan dan langkah pekerjaan.

Ada halaman web yang relatif baru yang membahas lebih detail tentang opsi -B dan --exclusive.

doc / html / cpu_management.shtml


Informasi tambahan dari halaman FAQ SLURM .

Perintah srun memiliki dua mode operasi yang berbeda. Pertama, jika tidak dijalankan dalam pekerjaan yang sudah ada (yaitu tidak dalam alokasi pekerjaan Slurm yang dibuat oleh salloc atau sbatch), maka itu akan membuat alokasi pekerjaan dan menelurkan aplikasi. Jika dijalankan dalam alokasi yang sudah ada, perintah srun hanya memunculkan aplikasi. Untuk pertanyaan ini, kami hanya akan membahas mode operasi pertama dan membandingkan pembuatan alokasi pekerjaan menggunakan perintah sbatch dan srun.

Perintah srun dirancang untuk penggunaan interaktif, dengan seseorang memantau hasilnya. Keluaran aplikasi dilihat sebagai keluaran dari perintah srun, biasanya di terminal pengguna. Perintah sbatch dirancang untuk mengirimkan skrip untuk dieksekusi nanti dan keluarannya ditulis ke file. Opsi perintah yang digunakan dalam alokasi pekerjaan hampir sama. Perbedaan yang paling mencolok dalam opsi adalah bahwa perintah sbatch mendukung konsep susunan pekerjaan, sementara srun tidak. Perbedaan signifikan lainnya adalah pada toleransi kesalahan. Kegagalan yang melibatkan pekerjaan sbatch biasanya menghasilkan pekerjaan yang diminta ulang dan dieksekusi lagi, sementara kegagalan yang melibatkan srun biasanya menghasilkan pesan kesalahan yang dihasilkan dengan harapan bahwa pengguna akan merespons dengan cara yang sesuai.


Percakapan relevan lainnya di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.