管理模拟运行的建议?


9

在comp-sci中,这个问题可能有点偏离主题。如果需要,请提出适合的地方。

问题是关于如何有效管理所有模拟运行。

比方说,例如,模拟需要固定2个参数,这些参数必须在某个建议值范围内定义。

为了找到由两个参数中的一个对产生的更好结果(例如,通过将模拟结果与实验数据进行比较),可以通过为每个参数定义三个值然后进行9次运行来进行灵敏度分析。

以前,我使用sed更改每次运行的输入,并通过在存储此运行的输入和结果的文件夹中写入值和参数名称来标记每次运行。但是我发现,一旦参数数量增加(例如,访问脚本中的文件夹名称以进行绘图),效率将非常低下。

然后我决定使用简单数字作为文件夹名称,并通过其他一些电子表格存储详细信息。到目前为止,这种方式还可以,但是需要一些费力的工作。而且随着运行次数的增加,经常会犯错误,例如进行几天前已经完成的另一次运行。

您对管理这些运行有什么好主意吗?我认为这对于进行蒙特卡洛分析的人来说非常重要?

提前致谢!


2
我通常将简单的Python脚本用于此类任务。他们生成数据,运行模拟并管理结果输出。使用numpy / scipy / matplotlib之类的工具,您还可以在某种程度上直接进行分析和绘图。有时,我甚至走得更远,直接使用sympy来自动生成针对制造解决方案进行测试所需的输入,并将结果用作我的仿真代码中的输入。我可以推荐Langtangen的书“计算科学的Python脚本”作为起点。这里是comp中遇到的一些典型任务。使用Python演示了科学。
克里斯蒂安·瓦卢加

这个问题似乎是个话题。这是计算的科学基础。我认为每位新进的计算科学家都会经历过Chenming正在经历的某个时刻。我非常感兴趣地看到其他人如何应对这种无处不在的痛苦。
2013年

Answers:


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

我认为我们需要对您的工作流程有更多了解,以便提出任何认真的建议。

我建议将您的运行视为键值存储。为每个运行的所有元数据创建一个简单的数据库,然后将运行中的所有相关信息散列到分配给每个输出的键中。

在最简单的情况下,您将为元数据存储区使用文本文件,并将关于每次运行的元数据行安全地附加到文本文件中。然后,您可以根据需要存储输出运行(单个目录,带有内容列表的备份等)。

您可以使用任何喜欢的语言来实现此策略,但这在Python中是微不足道的。您还可以利用一些不错的功能,例如Python读取和写入JSON数据或与SQL数据库进行交互的功能。

这种方法实现了一个非常简单的轻量级数据库。有更重的策略可以提供更多的安全保证,SciDB是您可能感兴趣的新策略。数据库为您的数据提供了更有力的保证,并帮助您扩展适用于更大数据集的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.