sugestia do zarządzania przebiegami symulacji?

9

Te pytania mogą być nieco nie na temat w comp-sci. jeśli to konieczne, proszę wskazać, gdzie to pasuje.

Pytanie dotyczy tego, jak skutecznie zarządzać wszystkimi przebiegami symulacji.

powiedzmy, na przykład, że symulacja wymaga ustalenia 2 parametrów, które należy zdefiniować w pewnym sugerowanym zakresie wartości.

Aby znaleźć lepszy wynik uzyskany przez parę dwóch parametrów (na przykład przez porównanie wyniku symulacji z danymi eksperymentalnymi), można przeprowadzić analizę wrażliwości, definiując trzy wartości dla każdego parametru, a następnie formułując 9 przebiegów.

poprzednio używam sed do zmiany danych wejściowych dla każdego uruchomienia i oznaczenia każdego uruchomienia, pisząc wartość i nazwę parametru w folderze przechowującym dane wejściowe i wyniki tego uruchomienia. ale okazało się, że jest to bardzo nieefektywne, gdy liczba parametrów rośnie (np. dostęp do nazw folderów w skryptach do kreślenia).

potem postanowiłem użyć prostych liczb jako nazw folderów i zapisać szczegóły w innych arkuszach kalkulacyjnych. ten sposób jest do tej pory w porządku, ale wymaga trochę pracochłonnej pracy. także wraz ze wzrostem liczby biegów często popełniane są błędy, takie jak przeprowadzenie kolejnego cyklu, który został już wykonany kilka dni temu.

Czy masz jakiś dobry pomysł na zarządzanie tymi biegami? Myślę, że byłoby to niezwykle ważne dla kogoś, kto robi analizę Monte Carlo?

Z góry dziękuję!

Chenming Zhang
źródło
2
Zwykle używam prostych skryptów Python do takich zadań. Generują dane, przeprowadzają symulacje i zarządzają wynikowymi wynikami. Korzystając z narzędzi takich jak numpy / scipy / matplotlib, możesz także w pewnym stopniu bezpośrednio analizować i kreślić. Czasami idę nawet dalej i automatycznie generuję dane wejściowe potrzebne do testowania bezpośrednio wyprodukowanych rozwiązań przy użyciu sympy i wykorzystuję wyniki jako dane wejściowe w moim kodzie symulacyjnym. Jako punkt wyjścia mogę polecić książkę Langtangena „Python Scripting for Computational Science”. Oto niektóre typowe zadania napotkane w komp. nauka jest demonstrowana przy użyciu Pythona.
Christian Waluga
To pytanie wydaje się niezwykle na temat. To jest nauka obliczeniowa typu chleb powszedni. Myślę, że każdy początkujący naukowiec obliczeń przechodził przez to, przez co przechodzi Chenming w pewnym momencie. Z jednej strony jestem bardzo zainteresowany, aby zobaczyć, jak inni ludzie podeszli do tego wszechobecnego bólu w dupie.
tel

Odpowiedzi:

5

TLDR
Użyj Pythona do zarządzania / modyfikowania danych wejściowych i łączenia danych wyjściowych, a HDF5 do organizowania / przechowywania danych. Choć początkowo może się to wydawać skomplikowane, nadal będzie prostsze niż SQL-cokolwiek.

Dłuższa odpowiedź + przykład
Osobiście używam kombinacji skryptów Python i formatu pliku HDF5, aby poradzić sobie z tego rodzaju sytuacjami. Skrypty w języku Python mogą obsługiwać podstawienia tekstu niezbędne do zmiany plików wykonywalnych (i mogą sprawdzać, czy są duplikaty), a przy odrobinie skryptów możesz pobrać dane wyjściowe z programu i umieścić je w pliku HDF5.

Najłatwiej jest myśleć o HDF5 jako mniej więcej tak jak normalnym systemie plików (tj. Zestawie katalogów i podkatalogów na komputerze), ale takim, który łatwo skaluje się do dużych zbiorów danych. Każdy katalog / podkatalog może być otagowany metadanymi (w twoim przypadku albo parametry, które zmieniasz, albo cały zestaw parametrów). Kiedy przychodzi czas na analizę danych, możesz je przeszukiwać na podstawie metadanych.

Oto krótki przykład tego, jak to działałoby na podstawie niektórych moich danych symulacyjnych (już w formacie HDF5), który wygląda następująco:

mydata.hdf5
|___Run01(metadata: {size:13, maxSteps:1e7, maxTime:inf})
|___Run02(metadata: {size:10, maxSteps:1e6, maxTime:inf})
|___Run03(metadata: {size:13, maxSteps:1e7, maxTime:inf})
|___Run04(metadata: {size:9, maxSteps:1e7, maxTime:inf})

mydata.hdf5jest plikiem HDF5, a każdy z Runxx jest podkatalogiem, który przechowuje dane wyjściowe z danej symulacji i jest oznaczony powiązanymi metadanymi. Skrypt Pythona, który przeszukuje przebiegi i zwraca listę tych z pożądanymi metadanymi, wyglądałby tak:

import sys
import h5py    #the python module that interfaces with HDF5

def GetRuns(hdfRoot, attributeValuePairs):
    return [subdir for subdir in hdfRoot.values() if not(attributeValuePairs.viewitems() - dict(subdir.attrs).viewitems())]

if __name__=="__main__":
    attributeValuePairs = dict(zip(sys.argv[2::2], sys.argv[3::2]))
    with h5py.File(sys.argv[1]) as hdfRoot:
        runs = GetRuns(hdfRoot, attributeValuePairs)

        #do something here with runs...

        print runs

Więc gdybym był w wierszu poleceń w katalogu zawierającym mydata.hdf5, mógłbym uruchomić powyższy skrypt w następujący sposób:

python myscript.py mydata.hdf5 maxSteps 1e7 size 13

co powiedziałoby skryptowi, aby znalazł wszystkie przebiegi z metadanymi częściowo lub całkowicie pasującymi {'maxSteps':'1e7', 'size':'13'}. Skrypt może następnie manipulować tymi danymi w dowolny sposób (w sekcji „zrób coś tutaj”), a następnie wydrukuje listę wyglądającą mniej więcej tak:

["Run01", "Run03"]

Jedna uwaga jest jednak taka, że ​​HDF5 przedstawi całkowicie naturalne odwzorowanie dla twoich danych tylko wtedy, gdy będzie możliwe przedstawienie ich jako zestawu tablic n-wymiarowych. Dość często wyniki symulacji są w jakiejś tablicy, więc prawdopodobnie nie będzie to problemem.

Dobre punkty wyjścia
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/

tel
źródło
2

Myślę, że musielibyśmy dowiedzieć się nieco więcej o twoim przepływie pracy, aby przedstawić jakieś poważne rekomendacje.

Proponuję traktować twoje biegi jak sklep z kluczowymi wartościami. Utwórz prostą bazę danych dla wszystkich swoich metadanych dla każdego uruchomienia, a następnie zaszyfruj wszelkie istotne informacje ze swojego uruchomienia do klucza przypisanego do każdego wyniku.

W najprostszej sytuacji użyjesz pliku tekstowego do sklepu z metadanymi i bezpiecznie dodasz wiersze metadanych dotyczące każdego uruchomienia do pliku tekstowego. Następnie możesz zapisać swoje wyniki wyjściowe w dowolny sposób (pojedynczy katalog, kopie zapasowe z listą zawartości itp.)

Możesz wdrożyć tę strategię w dowolnym języku, który ci się podoba, ale byłoby to banalne w Pythonie. Możesz również skorzystać z kilku fajnych funkcji, takich jak zdolność Pythona do odczytu i zapisu danych JSON lub interakcji z bazami danych SQL.

Podejście to implementuje bardzo prostą lekką bazę danych. Istnieją cięższe strategie, które zapewniają więcej gwarancji bezpieczeństwa, nową, którą możesz być zainteresowany, jest SciDB . Bazy danych zapewniają silniejsze gwarancje dotyczące danych i pomagają skalować podejście do większych zbiorów danych.

Aron Ahmadia
źródło