Jestem przyzwyczajony do rozpoczęcia skryptu Sbatch w klastrze, w którym węzły mają 32 procesory i gdzie mój kod wymaga mocy 2 liczby procesorów.

Na przykład robię to:

#SBATCH -N 1
#SBATCH -n 16
#SBATCH --ntasks-per-node=16

Lub

#SBATCH -N 2
#SBATCH -n 64
#SBATCH --ntasks-per-node=32

Muszę jednak teraz użyć innego klastra, w którym każdy węzeł ma 40 procesorów. W tej chwili używam tylko jednego węzła i 32 procesów do testowania:

#SBATCH --ntasks=32
#SBATCH --ntasks-per-node=32

(Dostałem ten późniejszy skrypt z dokumentacji klastra. Nie używają w tym przykładzie linii #SBATCH -N, nie wiem dlaczego, ale może dlatego, że jest to przykład)

Jednak będę musiał wykonać większe symulacje z 512 procesorów. Bliższa bliższa liczba węzłów będę musiał użyć 13 (tzn. 40 * 13 = 520 procesorów). Teraz problem polega na tym, że liczba zadań na węzeł nie będzie (technicznie) integera.

Myślę, że rozwiązanie będzie poprosić o 13 węzłów, w których w pełni użyję 12 i tylko nie będę w pełni użyć ostatniego.

Moje pytanie brzmi, jak to zrobić? Czy istnieje inny sposób robienia tego bez zmiany kodu? (Nie będzie możliwe, aby zmienić kod, jest ogromnym kodem).

A symulacja z 512 PROM zajmie 10 godzin minimum, więc wykonanie większej symulacji z 32 procami zajmie tygodniowo. I nie tylko potrzebuję jednej symulacji, ale co najmniej 20 na chwilę.

Innym rozwiązaniem będzie poprosić o 16 węzłów (32 * 16 = 512) i używać tylko 32 procesów na węzeł. Jednak będzie to strata procesorów i liczby godzin, które mam dozwolone w klastrze.

1
Gundro 29 październik 2020, 12:30

1 odpowiedź

Najlepsza odpowiedź

OK odpowiedź jest prosta, ale zależy od maszyny, którą pracujesz. Ale myślę, że powinien działać za każdym razem.

W przypadku drugiego klastra nie muszę określić linii --ntasks-per-node=512. Wystarczy powiedzieć maszynie, ile zadań potrzebuję w sumie --tasks=512, automatycznie przydziela odpowiednią liczbę węzłów niezbędnych do wykonywania tych zadań.

WAŻNE: Jeśli twój ntasks nie jest wielokrotnością procesorów na węzeł, ostatni węzeł nie będzie całkowicie używany. Na przykład w moim przypadku potrzebuję 512 zadań, odpowiada to 13 procesorom 520. Pierwsze 12 procesorów są w pełni używane, ale ostatni nie jest i pozostawia 8 procesorów pustych.

Należy pamiętać, że może to spowodować pewne problemy z optymalizacją w niektórych kodów, ponieważ procesy w ostatnim węźle będą musiały komunikować się z większością procesów w pozostałych węzłach. Dla mnie nie stanowi problemu, ale znam inny kod, w którym jest problem.

1
Gundro 6 listopad 2020, 16:00