предложение по управлению прогонами симуляции?


9

Эти вопросы могут быть немного не по теме в comp-sci. если это необходимо, пожалуйста, предложите, где это подходит.

Вопрос касается того, как эффективно управлять всеми симуляциями.

скажем, например, моделирование требует фиксации 2 параметров, которые должны быть определены в определенном предложенном диапазоне значений.

Чтобы найти лучший результат, полученный с помощью пары из двух параметров (например, путем сравнения результатов моделирования с экспериментальными данными), можно выполнить анализ чувствительности, определив три значения для каждого параметра, а затем составив 9 прогонов.

ранее я использовал sed для изменения входных данных для каждого прогона и помечал каждый прогон, записывая значение и имя параметра в папку, в которой хранятся входные данные и результаты этого прогона. но я обнаружил, что это очень неэффективно, когда число параметров увеличивается (например, доступ к имени папок в сценариях для построения).

Затем я решил использовать простые числа в качестве имен папок и сохранить детали в некоторых других электронных таблицах. пока что это нормально, но требует кропотливой работы. также с ростом пробегов становится обычным делать ошибки, например, проводить еще один пробег, который уже был сделан пару дней назад.

У вас есть хорошая идея об управлении этими пробегами? Я думаю, это было бы чрезвычайно важно для кого-то, кто делает анализ Монте-Карло?

Заранее спасибо!


2
Я обычно использую простые Python-скрипты для таких задач. Они генерируют данные, запускают симуляции и управляют полученными результатами. Используя такие инструменты, как numpy / scipy / matplotlib, вы также можете напрямую анализировать и строить графики в некоторой степени. Иногда я иду еще дальше и автоматически генерирую входные данные, необходимые для непосредственного тестирования на основе готовых решений, используя sympy, и использую результаты в качестве входных данных в моем коде моделирования. Я могу порекомендовать книгу Лангтангена "Сценарии Python для вычислительной науки" в качестве отправной точки. Здесь некоторые типичные задачи, встречающиеся в комп. наука демонстрируется с использованием Python.
Кристиан Валуга

Этот вопрос кажется чрезвычайно по теме. Это вычислительная наука о хлебе с маслом. Я думаю, что каждый начинающий специалист по вычислительной технике прошел через то, через что проходит Ченминг в тот или иной момент. Мне, например, очень интересно посмотреть, как другие люди подошли к этой вездесущей боли в заднице.
тел

Ответы:


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 . Базы данных обеспечивают более надежные гарантии ваших данных и помогают вам масштабировать ваш подход для больших наборов данных.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.