SLURM `srun` so với` sbatch` và các thông số của chúng


96

Tôi đang cố gắng hiểu sự khác biệt giữa SLURM's srunsbatchcác lệnh. Tôi sẽ hài lòng với lời giải thích chung chung, thay vì câu trả lời cụ thể cho các câu hỏi sau, nhưng đây là một số điểm nhầm lẫn cụ thể có thể là điểm khởi đầu và đưa ra ý tưởng về những gì tôi đang tìm kiếm.

Theo tài liệu , srunlà để nộp công việc và sbatchlà để nộp công việc để thực hiện sau này, nhưng sự khác biệt thực tế đối với tôi là không rõ ràng và hành vi của họ dường như giống nhau. Ví dụ, tôi có một cụm có 2 nút, mỗi nút có 2 CPU. Nếu tôi thực hiện srun testjob.sh &5x liên tiếp, nó sẽ xếp hàng công việc thứ năm một cách độc đáo cho đến khi CPU khả dụng, cũng như thực thi sbatch testjob.sh.

Để làm cho câu hỏi cụ thể hơn, tôi nghĩ một nơi tốt để bắt đầu có thể là: Một số điều tôi có thể làm với cái này mà tôi không thể làm với cái kia, và tại sao?

Nhiều đối số cho cả hai lệnh đều giống nhau. Những người mà dường như có liên quan nhất là --ntasks, --nodes, --cpus-per-task, --ntasks-per-node. Chúng liên quan với nhau như thế nào, và chúng khác nhau như thế nào đối srunvới vs sbatch?

Một sự khác biệt đặc biệt là srunsẽ gây ra một lỗi nếu testjob.shkhông có thực thi phép tức là chmod +x testjob.shtrong khi sbatchhạnh phúc sẽ chạy nó. Điều gì đang xảy ra "dưới mui xe" gây ra trường hợp này?

Tài liệu này cũng đề cập đến cách srunthường được sử dụng bên trong các sbatchtập lệnh. Điều này dẫn đến câu hỏi: Chúng tương tác với nhau như thế nào, và usecase "chuẩn" cho mỗi chúng là gì? Cụ thể, tôi có bao giờ sử dụng srunchính nó không?

Câu trả lời:


111

Tài liệu cho biết

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

trong khi

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

Cả hai đều chấp nhận thực tế cùng một bộ tham số. Sự khác biệt chính srunlà tương tác và chặn (bạn nhận được kết quả trong thiết bị đầu cuối của mình và bạn không thể viết các lệnh khác cho đến khi kết thúc), trong khi sbatchlà xử lý hàng loạt và không chặn (kết quả được ghi vào một tệp và bạn có thể gửi các lệnh khác ngay lập tức).

Nếu bạn sử dụng sruntrong nền có &dấu hiệu, thì bạn loại bỏ tính năng 'chặn' của tính năng này, tính năng srunnày sẽ trở thành tương tác nhưng không chặn. Tuy nhiên, nó vẫn tương tác, có nghĩa là đầu ra sẽ làm lộn xộn thiết bị đầu cuối của bạn và các srunquy trình được liên kết với thiết bị đầu cuối của bạn. Nếu bạn ngắt kết nối, bạn sẽ mất quyền kiểm soát đối với chúng, hoặc chúng có thể bị giết (tùy thuộc vào việc chúng có sử dụng stdouthay không về cơ bản). Và họ sẽ bị giết nếu máy mà bạn kết nối để gửi công việc được khởi động lại.

Nếu bạn sử dụng sbatch, bạn gửi công việc của mình và nó được xử lý bởi Slurm; bạn có thể ngắt kết nối, giết thiết bị đầu cuối của mình, v.v. mà không gây hậu quả gì. Công việc của bạn không còn được liên kết với một quy trình đang chạy.

Một số điều tôi có thể làm với cái mà tôi không thể làm với cái kia là gì, và tại sao?

Một tính năng có sẵn sbatchvà không sruncó là các nhóm công việc . Vì sruncó thể được sử dụng trong một sbatchtập lệnh, không có gì mà bạn không thể làm với sbatch.

Chúng liên quan với nhau như thế nào và chúng khác nhau như thế nào đối với srun và sbatch?

Tất cả các thông số --ntasks, --nodes, --cpus-per-task, --ntasks-per-nodecó nghĩa tương tự trong cả hai lệnh. Điều đó đúng với gần như tất cả các tham số, ngoại trừ --exclusive.

Điều gì đang xảy ra "dưới mui xe" gây ra trường hợp này?

srunngay lập tức thực thi tập lệnh trên máy chủ từ xa, trong khi sbatchsao chép tập lệnh trong bộ nhớ trong và sau đó tải lên trên nút tính toán khi công việc bắt đầu. Bạn có thể kiểm tra điều này bằng cách sửa đổi tập lệnh gửi của mình sau khi nó đã được gửi; các thay đổi sẽ không được tính đến (xem phần này ).

Chúng tương tác với nhau như thế nào, và usecase "chuẩn" cho mỗi chúng là gì?

Bạn thường sử dụng sbatchđể gửi một công việc và sruntrong kịch bản gửi để tạo các bước công việc như Slurm gọi chúng. srunđược sử dụng để khởi chạy các quy trình. Nếu chương trình của bạn là một chương trình MPI song song, hãy srunquan tâm đến việc tạo tất cả các quy trình MPI. Nếu không, srunsẽ chạy chương trình của bạn nhiều lần như được chỉ định bởi --ntaskstùy chọn. Có rất nhiều trường hợp sử dụng tùy thuộc vào việc chương trình của bạn là song song hay không, có một thời gian dài chạy hay không, bao gồm một đơn thực thi hay không, vv Trừ khi có quy định khác, srunkế thừa theo mặc định các tùy chọn thích hợp trong những sbatchhay sallocmà nó chạy dưới (từ đây ).

Cụ thể, tôi có bao giờ sử dụng srun một mình không?

Ngoài các thử nghiệm nhỏ, không. Cách sử dụng phổ biến là srun --pty bashlấy shell trên một công việc tính toán.


5
Cảm ơn bạn đã trả lời, điều này tốt hơn bất cứ điều gì tôi có thể hy vọng. Một phần tiếp theo, vì đây là một trong những điểm nhầm lẫn ban đầu của tôi: tại sao phải gọi srunbên trong tập lệnh gửi? Có lẽ tôi đang nhầm lẫn về ý nghĩa của "bước công việc". Ví dụ: nếu tôi có một tập lệnh được gọi là runjob.shchứa #!/bin/bash srun myjob.sh, có sự khác biệt thực tế giữa việc gọi (a) sbatch runjob.shvs (b) sbatch myjob.shvs (c) srun myjob.shvs (d) srun runjob.shkhông? (Rõ ràng cái cuối cùng là ngớ ngẩn, nhưng tôi tò mò).
dkv

3
có thể bạn có thể duyệt qua các trang trình bày của một buổi đào tạo mà tôi đã cung cấp gần đây để biết ý tưởng về cách srun được sử dụng trong tập lệnh gửi: cism.ucl.ac.be/Services/Formations/slurm/2016/slurm.pdf
damienfrancois

4
Có vẻ như tất cả các ví dụ trong các trang trình bày (cũng như hướng dẫn trên trang CECI) đều sử dụng srunbên trong sbatchtập lệnh gửi. Tuy nhiên, tôi thấy rằng các lệnh không có sruntrong tập lệnh gửi sẽ chạy theo cùng một cách. Thực sự có sự khác biệt giữa bốn cách gọi mà tôi đã đề cập ở trên không?
dkv

8
Tất cả các ví dụ của bạn sẽ chạy theo cùng một cách chỉ khi (1) phân bổ là cho một CPU và (2) chương trình hoàn toàn là tuần tự. Để thấy sự khác biệt, hãy yêu cầu nhiều hơn một nhiệm vụ. Khác biệt nữa là nếu bạn không sử dụng srun trong sbatch, lệnh sstat sẽ không trả lại bất kỳ thông tin hữu ích
damienfrancois

1
@Atcold phiên bản sức mạnh này uptodate hơn: github.com/damienfrancois/slurm-helper/blob/master/slurm.vim
damienfrancois

5

Điều này không thực sự trả lời đầy đủ cho câu hỏi, nhưng đây là một số thông tin khác mà tôi tìm thấy có thể hữu ích cho ai đó trong tương lai:


Từ một chuỗi liên quan, tôi đã tìm thấy một câu hỏi tương tự:

Tóm lại, sbatch và salloc phân bổ tài nguyên cho công việc, trong khi srun khởi chạy các tác vụ song song trên các tài nguyên đó. Khi được gọi trong một phân bổ công việc, srun sẽ khởi chạy các nhiệm vụ song song trên một số hoặc tất cả các tài nguyên được phân bổ. Trong trường hợp đó, srun kế thừa theo mặc định các tùy chọn thích hợp của sbatch hoặc salloc mà nó chạy theo. Sau đó, bạn có thể (thường) cung cấp các tùy chọn khác nhau sẽ ghi đè những gì nó nhận được theo mặc định. Mỗi lệnh gọi srun trong một công việc được gọi là một bước công việc.

srun cũng có thể được gọi bên ngoài phân bổ công việc. Trong trường hợp đó, srun yêu cầu tài nguyên và khi các tài nguyên đó được cấp, khởi chạy các nhiệm vụ trên các tài nguyên đó như một công việc và bước công việc duy nhất.

Có một trang web tương đối mới đi vào chi tiết hơn về các tùy chọn -B và - độc quyền.

doc / html / cpu_management.shtml


Thông tin bổ sung từ trang Câu hỏi thường gặp về SLURM .

Lệnh srun có hai chế độ hoạt động khác nhau. Đầu tiên, nếu không chạy trong một công việc hiện có (tức là không trong một phân bổ công việc Slurm được tạo bởi salloc hoặc sbatch), thì nó sẽ tạo một phân bổ công việc và sinh ra một ứng dụng. Nếu chạy trong phân bổ hiện có, lệnh srun chỉ tạo ứng dụng. Đối với câu hỏi này, chúng tôi sẽ chỉ giải quyết chế độ hoạt động đầu tiên và so sánh việc tạo phân bổ công việc bằng cách sử dụng lệnh sbatch và srun.

Lệnh srun được thiết kế để sử dụng tương tác với người giám sát đầu ra. Đầu ra của ứng dụng được coi là đầu ra của lệnh srun, thường là tại thiết bị đầu cuối của người dùng. Lệnh sbatch được thiết kế để gửi một tập lệnh để thực thi sau này và đầu ra của nó được ghi vào một tệp. Các tùy chọn lệnh được sử dụng trong phân bổ công việc gần như giống hệt nhau. Sự khác biệt đáng chú ý nhất trong các tùy chọn là lệnh sbatch hỗ trợ khái niệm mảng công việc, trong khi srun thì không. Một sự khác biệt đáng kể khác là khả năng chịu lỗi. Các lỗi liên quan đến các công việc sbatch thường dẫn đến công việc được sắp xếp lại và thực thi lại, trong khi các lỗi liên quan đến srun thường dẫn đến một thông báo lỗi được tạo ra với kỳ vọng rằng người dùng sẽ phản hồi theo cách thích hợp.


Một cuộc trò chuyện có liên quan khác tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.