suggestion pour la gestion des cycles de simulation?

9

Ces questions peuvent être un peu hors sujet dans comp-sci. s'il est nécessaire, veuillez suggérer où il s'intègre.

La question est de savoir comment gérer efficacement toutes les exécutions de simulation.

disons, par exemple, une simulation nécessite de fixer 2 paramètres qui doivent être définis à une certaine plage de valeurs suggérée.

Pour trouver un meilleur résultat produit par une paire des deux paramètres (en comparant le résultat de la simulation avec des données expérimentales, par exemple), on peut faire une analyse de sensibilité en définissant trois valeurs pour chaque paramètre, puis en formulant 9 analyses.

auparavant, j'utilise sed pour modifier les entrées de chaque exécution et marquer chaque exécution en écrivant la valeur et le nom du paramètre dans le dossier qui stocke les entrées et les résultats de cette exécution. mais j'ai trouvé que c'est très inefficace une fois que le nombre de paramètres augmente (par exemple accéder au nom des dossiers dans les scripts pour le traçage).

puis j'ai décidé d'utiliser des nombres simples comme noms de dossier et de stocker les détails dans d'autres feuilles de calcul. cette façon est ok jusqu'à présent, mais nécessite un travail laborieux. aussi avec la croissance des descentes, il devient courant de faire des erreurs, comme effectuer une autre descente qui a déjà été faite il y a quelques jours.

Avez-vous une bonne idée de la gestion de ces runs? Je pense que ce serait extrêmement important pour quelqu'un qui fait une analyse Monte Carlo?

Merci d'avance!

Chenming Zhang
la source
2
J'utilise généralement de simples scripts Python pour de telles tâches. Ils génèrent les données, exécutent les simulations et gèrent les résultats obtenus. En utilisant des outils comme numpy / scipy / matplotlib, vous pouvez également directement analyser et tracer dans une certaine mesure. Parfois, je vais encore plus loin et je génère automatiquement les entrées nécessaires pour tester directement les solutions fabriquées en utilisant sympy et utiliser les résultats comme entrées dans mon code de simulation. Je peux recommander le livre de Langtangen "Python Scripting for Computational Science" comme point de départ. Voici quelques tâches typiques rencontrées en comp. la science est démontrée en utilisant Python.
Christian Waluga
Cette question semble extrêmement sur le sujet. C'est du pain et du beurre, des trucs de science informatique. Je pense que chaque scientifique débutant en informatique est passé par ce que Chenming vit à un moment ou à un autre. Pour ma part, je suis très intéressé de voir comment d'autres personnes ont abordé cette douleur omniprésente dans le cul.
tel

Réponses:

5

TLDR
Utilisez Python pour gérer / modifier vos entrées et corail vos sorties, et utilisez HDF5 pour organiser / stocker vos données. Aussi complexe que cela puisse paraître à première vue, il sera toujours plus simple que SQL-n'importe quoi.

Réponse plus longue + Exemple
J'utilise personnellement une combinaison de scripts Python et du format de fichier HDF5 pour faire face à ce genre de situations. Les scripts Python peuvent gérer les substitutions de texte nécessaires pour modifier vos fichiers d'exécution (et peuvent vérifier les exécutions en double), et avec un peu plus de scripts, vous pouvez prendre les données de sortie de votre programme et les placer dans un fichier HDF5.

Il est plus facile de penser à HDF5 comme étant plus ou moins exactement comme un système de fichiers normal (c'est-à-dire l'ensemble des répertoires et sous-répertoires de votre ordinateur), mais qui s'adapte facilement aux grands ensembles de données. Chaque répertoire / sous-répertoire peut être étiqueté avec des métadonnées (dans votre cas, soit uniquement les paramètres que vous modifiez, soit l'ensemble des paramètres). Lorsque vient le temps d'analyser vos données, vous pouvez les parcourir en fonction des métadonnées.

Voici un bref exemple de la façon dont cela fonctionnerait sur la base de certaines de mes données de simulation (déjà au format HDF5) qui ressemblent à ceci:

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.hdf5est le fichier HDF5, et chacun de Runxx est un sous-répertoire qui contient les données de sortie d'une simulation donnée, et qui est étiqueté avec les métadonnées associées. Un script python qui recherche dans les exécutions et renvoie une liste de ceux avec les métadonnées souhaitées ressemblerait à ceci:

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

Donc, si j'étais sur une ligne de commande dans un répertoire contenant mydata.hdf5je pourrais exécuter le script ci-dessus comme ceci:

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

qui indiquerait au script de trouver toutes les exécutions avec des métadonnées correspondant partiellement ou entièrement {'maxSteps':'1e7', 'size':'13'}. Le script pourrait alors manipuler ces données comme vous le souhaitez (dans la section "faire quelque chose ici"), puis il imprimerait une liste qui ressemblerait à ceci:

["Run01", "Run03"]

Une note cependant est que HDF5 ne présentera une cartographie totalement naturelle pour vos données que s'il est possible de représenter vos données comme un ensemble de tableaux à n dimensions. Il est assez courant que la sortie des simulations soit dans une sorte de tableau, donc ce ne sera probablement pas un problème.

Bons points de départ
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/

tel
la source
2

Je pense que nous aurions besoin d'en savoir un peu plus sur votre flux de travail pour faire des recommandations sérieuses.

Je suggère de traiter vos courses comme un magasin de valeurs-clés. Créez une base de données simple pour toutes vos métadonnées pour chaque exécution, puis hachez toutes les informations pertinentes de votre exécution dans une clé que vous attribuez à chaque sortie.

Dans la situation la plus simple, vous devez utiliser un fichier texte pour votre magasin de métadonnées et ajouter en toute sécurité des lignes de métadonnées sur chaque exécution à votre fichier texte. Vous pouvez ensuite stocker vos sorties de sortie comme bon vous semble (un seul répertoire, des sauvegardes avec une liste du contenu, etc ...)

Vous pouvez implémenter cette stratégie dans n'importe quel langage que vous aimez, mais ce serait trivial en Python. Vous pouvez également profiter de certaines fonctionnalités intéressantes comme la capacité de Python à lire et à écrire des données JSON ou à interagir avec des bases de données SQL.

Cette approche met en œuvre une base de données légère très simple. Il existe des stratégies plus lourdes qui offrent plus de garanties de sécurité, une nouvelle qui pourrait vous intéresser est SciDB . Les bases de données offrent des garanties plus solides sur vos données et vous aident à adapter votre approche pour des ensembles de données plus volumineux.

Aron Ahmadia
la source