Prometheus:Mathematica
Mathematica 10.2.0
Przygotowanie inputów
1. Należy się zalogować na wybrany klaster korzystając z polecenia ssh z opcją -X:
ssh -X nazwa_uzytkownika@promehteus.cyfronet.pl
W przypadku korzystania z systemu Windows, połączenie należy nawiąząc przy pomocy programu putty http://www.putty.org oraz należy zainstalować i uruchomić program Xming https://sourceforge.net/projects/xming/
Konfiguracja putty: !putty_new_session.png! !putty_x11.png! !putty_session_zapis.png!
Użytkownik jest wtedy połączony z maszyną dostepową.
2. Następnie przez polecenie
module load plgrid/apps/mathematica
należa zładować domyślną wersję Mathematici. Jeżeli istnieje potrzeba załadowania innej dostępnej wersji Mathematici, najpierw należy sprawdzić dostępne wersje na wybranym klastrze
module avail mathematica
lub
module avail plgrid/apps/mathematica
lub
module spider mathematica
a potem załadować wybrany moduł, np.
module load plgrid/apps/mathematica/9.0
3. W celu uruchomienia Mathematici w trybie graficznym w konsoli należy wpisać
mathematica
4. Utworzenie nowego pliku wsadowego W oknie powitalnym Mathematici należy kliknąć na
"New Document\Package"(Mathematica 10) lub "Create New\Other\Package"(Wcześniejsze wersje Mathematica).
Otwiera się edytor, gdzie można umieszczać polecenia Mathematici.
5. Mathematica wspierw obliczenia równolgełe Dokumentacja: https://reference.wolfram.com/language/guide/ParallelComputing.html
6. Po przygotowaniu pliku należy zapisać plik z rozszerzeniem .m (Mathematica Package). Należy kliknąć:
File\Save as\test1.m
Domyślny katalog docelowy Mathematici to ~/Wolfram Mathematica. Można sprawdzić zawaratość katalogu przez polecenie w konsoli
ls ~/Wolfram\ Mathematica
7. Kończymy pracę z Mathematicą w trybie graficznym zamykając edytor i okno powitalne.
8. Odpinanie modułu
module unload plgrid/apps/mathematica
lub jeżeli była załadowana inna wersja Mathematici niż domyslna to (odnośnie wcześniejszego przykładu)
module unlod plgrid/apps/mathematica/9.0
ewentualnie w celu odpięcia wszystkich modułów załadowanych przez użytkownika
module purge
9. Przygotowanie pliku sbatch (np. o nazwie mathematica_test_task) do uruchomienia zadania na klastrze. Przykładowy skrypt do uruchomienia zadania dla Mathematici można przygotować w dowolnym edytorze tekstu: gedit, nano lub vim
#!/bin/bash #SBATCH -N 1 #SBATCH -n 24 #SBATCH -p plgrid #SBATCH --time 01:00:00 #SBATCH --ntasks-per-node=24 #SBATCH -J mathematica-test1 #SBATCH --mail-type=FAIL,END #SBATCH --mail-user=nazwa_uzytkownika@domena module load plgrid/apps/mathematica cd $SLURM_SUBMIT_DIR math -script mathematica_test_task.m
więcej: https://kdm.cyfronet.pl/portal/Prometheus:Podstawy srun https://computing.llnl.gov/linux/slurm/srun.html
Najprościej jest umieścić plik wsadowy Mathematici w tym samym katalogu co skrypt do uruchomienia zadania
10. Uruchomienie zadania. Będąc zalogowanym na maszynie dostępowej należy przejść do katalogu gdzie znajduje się plik do uruchamiania zadania i w konsoli wpisać
sbatch mathematica_test_task
Przykłady
Przykładowy skrypt wykonujący mnożenie macierzy w pętli 10k
(* Generowanie macierzy 50x50 *) a=RandomReal[{-10,10},{50,50}]; b=RandomReal[{-10,10},{50,50}]; (* Pomiar czasu wykonania pętli 10k w której mnożone są macierze a i b *) time = AbsoluteTiming[Do[a.b;,{n,10000}];]; (* Zapis czasu do pliku *) Export["test1.txt",time];
Zmierzony czas to ok. 5.3 [s].
To samo zadanie ale w trybie równoległym.
(* Pobranie informacji o ilości dosępnych rdzeni *) (* cores = $ProcessorCount; *) (* Uruchamianie kerneli *) (* LaunchKernels[cores]; *) (* Bezpieczniej jest napisać jak poniżej, wtedy uruchomią się kernele na dostępnych rdzeniach i tyle na ile pozwala licencja *) (* LaunchKernels[]; *) (* lub wpisać liczbę kerneli *) LaunchKernels[4]; a=RandomReal[{-10,10},{50,50}]; b=RandomReal[{-10,10},{50,50}]; (* Pomiar czasu wykonania pętli 10k dla operacji mnożenia macierzy a i b w trybie zrównoleglonym *) time = AbsoluteTiming[Parallelize[Do[a.b;,{n,10000}];];]; Export["test2.txt",time]; CloseKernels[]; (* Kończenie pracy kerneli *)
Zmierzony czas to ok. 0.43 [s].
Można równiez użyć automatycznych funkcji do obliczeń równoległych takich jak np. ParallelTable, ParallelDo. Funkcje te automatycznie uruchamiają kernele.
Poniższy przykład pokazuje jak użyć ParallelTable
a=RandomReal[{-10,10},{50,50}]; b=RandomReal[{-10,10},{50,50}]; time = AbsoluteTiming[ParalleTable[Do[a.b;,{n,2500}];,{i,4}];]; Export["test3.txt",time];
Zmierzony czas to ok. 1.2 [s].
Funkcje wbudowane takie jak mnożenie macierzy są automatycznie zrównleglone i nie trzeba pisać dodatkowego kodu. Powyższy przykład pokazuje jak można zrównoleglić obliczenia w Mathematice dla przypadku gdy obliczenia mogą być przeprowadzone w sposób nie zależny od siebie.
Źródło: https://reference.wolfram.com/language/guide/ParallelComputing.html