시뮬레이션 실행 관리를위한 제안?


9

이 질문은 comp-sci에서 약간 주제가 아닐 수 있습니다. 필요한 경우 어디에 맞는지 제안하십시오.

문제는 모든 시뮬레이션 실행을 효율적으로 관리하는 방법에 관한 것입니다.

예를 들어, 시뮬레이션에는 특정 제안 된 값 범위에서 정의되어야하는 2 개의 매개 변수를 수정해야합니다.

예를 들어 시뮬레이션 결과와 실험 데이터를 비교하여 두 매개 변수 쌍으로 생성 된 더 나은 결과를 찾으려면 각 매개 변수에 대해 3 개의 값을 정의한 다음 9 개의 런을 공식화하여 감도 분석을 수행 할 수 있습니다.

이전에는 sed 를 사용 하여 각 실행에 대한 입력을 변경 하고이 실행의 입력 및 결과를 저장하는 폴더에 값과 매개 변수 이름을 작성하여 각 실행에 태그를 지정합니다. 그러나 매개 변수 수가 증가하면 (예 : 플로팅을 위해 스크립트의 폴더 이름에 액세스) 이것이 매우 비효율적이라는 것을 알았습니다.

그런 다음 간단한 숫자를 폴더 이름으로 사용하고 다른 스프레드 시트로 세부 정보를 저장하기로 결정했습니다. 이 방법은 지금까지는 괜찮지 만 약간의 노력이 필요합니다. 또한 달리기의 성장과 함께 이미 며칠 전에 이미 수행 된 또 다른 달리기와 같은 실수를하는 것이 일반적입니다.

이러한 실행 관리에 대한 좋은 아이디어가 있습니까? 몬테카를로 분석을하는 사람에게는 이것이 매우 중요하다고 생각합니까?

미리 감사드립니다!


2
나는 일반적으로 그러한 작업에 간단한 파이썬 스크립트를 사용합니다. 데이터를 생성하고 시뮬레이션을 실행하며 결과 출력을 관리합니다. numpy / scipy / matplotlib와 같은 도구를 사용하여 어느 정도 직접 분석하고 플롯 할 수 있습니다. 때로는 더 나아가서 sympy를 사용하여 직접 제조 된 솔루션을 테스트하는 데 필요한 입력을 생성하고 결과를 시뮬레이션 코드의 입력으로 사용합니다. Langtangen의 저서 인 "Python Scripting for Computational Science"를 출발점으로 추천 할 수 있습니다. 다음은 comp에서 발생하는 몇 가지 일반적인 작업입니다. 과학은 파이썬을 사용하여 시연됩니다.
Christian Waluga

이 질문은 매우 주제에 관한 것 같습니다. 이것은 빵과 버터 같은 계산 과학 재료입니다. 나는 모든 시작 계산 과학자가 어느 시점에서 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 차원 배열 집합으로 나타낼 수있는 경우에만 데이터에 대해 완전히 자연스러운 매핑을 제공한다는 것입니다. 시뮬레이션의 출력이 어떤 종류의 배열에있는 것이 일반적이므로 문제가되지 않을 것입니다.

좋은 시작점
파이썬 : http://www.openbookproject.net/thinkcs/python/english2e/
HDF5 : http://www.h5py.org/docs/


2

심각한 권장 사항을 만들기 위해서는 워크 플로에 대해 조금 더 알아야 할 것 같습니다.

달리기를 키-값 저장소처럼 취급하는 것이 좋습니다. 각 실행에 대한 모든 메타 데이터에 대한 간단한 데이터베이스를 생성 한 다음 실행의 관련 정보를 각 출력에 할당하는 키로 해시하십시오.

가장 간단한 상황에서는 메타 데이터 저장소에 텍스트 파일을 사용하고 각 실행에 대한 메타 데이터 줄을 텍스트 파일에 안전하게 추가하는 것입니다. 그런 다음 원하는대로 출력을 저장할 수 있습니다 (단일 디렉토리, 내용 목록이 포함 된 백업 등).

이 전략은 원하는 언어로 구현할 수 있지만 파이썬에서는 쉽지 않습니다. Python이 JSON 데이터를 읽고 쓰거나 SQL 데이터베이스와 상호 작용할 수있는 기능과 같은 멋진 기능을 활용할 수도 있습니다.

이 방법은 매우 간단한 경량 데이터베이스를 구현합니다. 더 많은 안전 보장을 제공하는 더 무거운 전략이 있습니다. 관심있는 새로운 전략은 SciDB 입니다. 데이터베이스는 데이터에 대한 강력한 보증을 제공하고 더 큰 데이터 세트에 대한 접근 방식을 확장하는 데 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.