シミュレーション実行を管理するための提案?


9

この質問はcomp-sciのトピックから少し外れるかもしれません。必要な場合は、どこに適合するか提案してください。

問題は、すべてのシミュレーション実行を効率的に管理する方法に関するものです。

たとえば、シミュレーションで、特定の推奨値の範囲で定義する必要がある2つのパラメーターを修正する必要があるとします。

(シミュレーション結果を実験データと比較するなどして)2つのパラメーターのペアによって生成されるより良い結果を見つけるには、各パラメーターに3つの値を定義し、9回の実行を公式化することにより、感度分析を実行できます。

以前は、sedを使用して各実行の入力を変更し、この実行の入力と結果を格納するフォルダーに値とパラメーター名を書き込むことで、各実行にタグを付けていました。しかし、パラメーターの数が増えると、これは非常に非効率的であることがわかりました(たとえば、プロット用のスクリプトでフォルダーの名前にアクセスします)。

その後、フォルダ名として単純な数字を使用し、他のいくつかのスプレッドシートで詳細を保存することにしました。この方法は今のところ問題ありませんが、いくつかの面倒な作業が必要です。また、ランの成長に伴い、数日前にすでに実行されている別のランを実行するなど、ミスを犯すこともよくあります。

これらの実行の管理について何か良いアイデアはありますか?モンテカルロ分析をする人にとってそれは非常に重要だと思いますか?

前もって感謝します!


2
通常、このようなタスクには単純なPythonスクリプトを使用します。彼らはデータを生成し、シミュレーションを実行し、結果の出力を管理します。numpy / scipy / matplotlibなどのツールを使用して、ある程度まで直接分析してプロットすることもできます。さらに進んで、sympyを使用して直接、製造されたソリューションに対してテストするために必要な入力を自動的に生成し、その結果をシミュレーションコードの入力として使用します。Langtangenの著書「計算科学のためのPythonスクリプト」を出発点としてお勧めします。ここでは、コンプで遭遇するいくつかの典型的なタスクです。科学はPythonを使用して示されます。
Christian Waluga 2013年

この質問は非常に話題のようです。これは、パンとバターの計算科学に関するものです。私は、最初のすべての計算科学者が、Chenmingがどこかで経験したことを経験したと思います。私は、他の人々がこのお尻のいたるところにある痛みにどのように取り組んだかを見るのに非常に興味があります。
Tel

回答:


5

TLDR
Pythonを使用して入力を管理/変更し、出力をコーラルし、HDF5を使用してデータを整理/保存します。一見複雑に見えるかもしれませんが、SQLなんでもよりも簡単です。

より長い回答+例
私は個人的に、PythonスクリプトとHDF5ファイル形式の組み合わせを使用して、このような状況に対処しています。Pythonスクリプティングは、ランファイルの変更に必要なテキスト置換を処理でき(重複ランをチェックできます)、さらにいくつかのスクリプティングを使用して、プログラムから出力データを取得し、HDF5ファイルに書き込むことができます。

HDF5は、通常のファイルシステム(コンピュータ上のディレクトリとサブディレクトリのセット)とほぼ同じであると考えるのが最も簡単ですが、大きなデータセットに簡単に拡張できます。各ディレクトリ/サブディレクトリは、メタデータでタグ付けできます(この場合、変更するパラメーターのみ、またはパラメーターのセット全体)。データを分析するときは、メタデータに基づいてデータを検索できます。

これは、次のようなシミュレーションデータ(既にHDF5形式)に基づいてこれがどのように機能するかを示す短い例です。

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.hdf5はHDF5ファイルであり、各Runxxは特定のシミュレーションからの出力データを保持するサブディレクトリであり、関連するメタデータでタグ付けされています。実行を検索し、目的のメタデータを持つ実行のリストを返すPythonスクリプトは、次のようになります。

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

そのため、ディレクトリが含まれているコマンドラインにいる場合はmydata.hdf5、上記のスクリプトを次のように実行できます。

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

これは、メタデータが部分的または完全に一致する実行を見つけるようにスクリプトに指示します{'maxSteps':'1e7', 'size':'13'}。その後、スクリプトはそのデータを(「ここで何かを行う」セクションで)好きなように操作し、次のようなリストを出力します。

["Run01", "Run03"]

ただし、HDF5は、データをn次元配列のセットとして表すことができる場合にのみ、データに対して完全に自然なマッピングを提示することに注意してください。シミュレーションの出力が何らかの配列になることはかなり一般的であるため、これはおそらく問題にはなりません。

良い出発点
Python:http:
//www.openbookproject.net/thinkcs/python/english2e/ HDF5:http : //www.h5py.org/docs/


2

真剣な提案をするには、ワークフローについてもう少し知る必要があると思います。

実行をKey-Valueストアのように扱うことをお勧めします。実行ごとにすべてのメタデータの単純なデータベースを作成し、実行からの関連情報を、各出力に割り当てるキーにハッシュします。

最も単純な状況では、メタデータストアにテキストファイルを使用し、各実行に関するメタデータの行をテキストファイルに安全に追加します。その後、出力ランを好きなように保存できます(単一のディレクトリ、内容のリストを含むバックアップなど)。

この戦略は任意の言語で実装できますが、Pythonでは簡単です。また、PythonがJSONデータを読み書きしたり、SQLデータベースとやり取りしたりするための優れた機能を利用することもできます。

このアプローチは、非常にシンプルで軽量なデータベースを実装します。より安全な保証を提供するより重い戦略があり、あなたが興味を持つかもしれない新しい戦略はSciDBです。データベースは、データについてより強力な保証を提供し、大規模なデータセットへのアプローチのスケーリングに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.