saran untuk mengelola simulasi berjalan?

9

Pertanyaan-pertanyaan ini mungkin agak di luar topik di komputer. jika diperlukan tolong sarankan di mana itu cocok dengan.

Pertanyaannya adalah tentang bagaimana mengelola semua simulasi berjalan secara efisien.

katakanlah, misalnya, simulasi memerlukan perbaikan 2 parameter yang harus ditentukan pada rentang nilai yang disarankan.

Untuk menemukan hasil yang lebih baik yang dihasilkan oleh sepasang dari dua parameter (dengan membandingkan hasil simulasi dengan data eksperimental, misalnya), seseorang dapat melakukan analisis sensitivitas dengan menentukan tiga nilai untuk setiap parameter, kemudian merumuskan 9 run.

sebelumnya saya menggunakan sed untuk mengubah input untuk setiap proses, dan menandai setiap proses dengan menuliskan nilai dan nama parameter pada folder yang menyimpan input dan hasil dari proses ini. tapi saya menemukan ini sangat tidak efisien setelah jumlah parameter bertambah (mis. akses nama folder dalam skrip untuk merencanakan).

kemudian saya memutuskan untuk menggunakan nomor sederhana sebagai nama folder dan menyimpan detailnya dengan beberapa spreadsheet lainnya. cara ini ok sejauh ini tetapi membutuhkan kerja keras. juga dengan pertumbuhan berlari, menjadi umum untuk melakukan kesalahan, seperti melakukan lari lain yang telah dilakukan beberapa hari yang lalu.

Apakah Anda punya ide bagus tentang mengelola proses ini? Saya pikir itu akan sangat penting bagi seseorang yang melakukan analisis Monte Carlo?

Terima kasih sebelumnya!

Chenming Zhang
sumber
2
Saya biasanya menggunakan skrip Python sederhana untuk tugas seperti itu. Mereka menghasilkan data, menjalankan simulasi dan mengelola hasil yang dihasilkan. Dengan menggunakan alat-alat seperti numpy / scipy / matplotlib, Anda juga dapat langsung menganalisis dan merencanakan sampai batas tertentu. Kadang-kadang saya melangkah lebih jauh dan secara otomatis menghasilkan input yang diperlukan untuk menguji terhadap solusi buatan langsung menggunakan sympy dan menggunakan hasilnya sebagai input dalam kode simulasi saya. Saya dapat merekomendasikan buku Langtangen "Python Scripting for Computational Science" sebagai titik awal. Di sini beberapa tugas tipikal dijumpai di comp. sains ditunjukkan menggunakan Python.
Christian Waluga
Pertanyaan ini tampaknya sangat pada topik. Ini adalah hal ilmu komputasi roti dan mentega. Saya pikir setiap ilmuwan komputasi pemula harus melalui apa yang sedang dialami Chenming di beberapa titik. Untuk satu saya sangat tertarik untuk melihat bagaimana orang lain telah mendekati rasa sakit di mana-mana di pantat.
telepon

Jawaban:

5

TLDR
Gunakan Python untuk mengelola / memodifikasi input Anda dan menambahkan output Anda, dan menggunakan HDF5 untuk mengatur / menyimpan data Anda. Sekompleks kelihatannya pada awalnya itu masih akan lebih sederhana daripada SQL-apa pun.

Jawaban yang lebih panjang + Contoh
Saya pribadi menggunakan kombinasi skrip Python dan format file HDF5 untuk menangani situasi semacam ini. Skrip python dapat menangani substitusi teks yang diperlukan untuk mengubah runfile Anda (dan dapat memeriksa duplikat run), dan dengan beberapa skrip lainnya Anda dapat mengambil data output dari program Anda dan memasukkannya ke file HDF5.

Sangat mudah untuk menganggap HDF5 kurang lebih persis seperti sistem file normal (yaitu sekumpulan direktori dan subdirektori pada komputer Anda), tetapi yang dapat dengan mudah diubah ke set data besar. Setiap direktori / subdirektori dapat ditandai dengan metadata (dalam kasus Anda, hanya parameter yang Anda variasikan, atau seluruh rangkaian parameter). Ketika tiba saatnya untuk menganalisis data Anda, Anda dapat mencari berdasarkan data metadata.

Berikut adalah contoh singkat bagaimana ini akan bekerja berdasarkan pada beberapa data simulasi saya (sudah dalam format HDF5) yang terlihat seperti ini:

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.hdf5adalah file HDF5, dan masing-masing Runxx adalah subdirektori yang menyimpan data output dari simulasi yang diberikan, dan yang ditandai dengan metadata terkait. Skrip python yang mencari melalui proses dan mengembalikan daftar orang-orang dengan metadata yang diinginkan akan terlihat seperti ini:

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

Jadi jika saya berada di baris perintah di direktori yang berisi mydata.hdf5saya bisa menjalankan skrip di atas seperti:

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

yang akan memberi tahu skrip untuk menemukan menjalankan dengan metadata sebagian atau seluruhnya cocok {'maxSteps':'1e7', 'size':'13'}. Skrip kemudian dapat memanipulasi data tersebut sesuai keinginan Anda (di bagian "lakukan sesuatu di sini"), dan kemudian akan mencetak daftar yang akan terlihat seperti ini:

["Run01", "Run03"]

Namun satu catatan adalah bahwa HDF5 akan menghadirkan pemetaan yang benar-benar alami untuk data Anda hanya jika memungkinkan untuk merepresentasikan data Anda sebagai satu set array n-dimensi. Ini cukup umum untuk output simulasi berada dalam semacam array, jadi ini mungkin tidak akan menjadi masalah.

Poin awal yang bagus
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/

tel
sumber
2

Saya pikir kita perlu tahu sedikit lebih banyak tentang alur kerja Anda untuk membuat rekomendasi serius.

Saya sarankan memperlakukan run Anda seperti toko kunci-nilai. Buat database sederhana untuk semua metadata Anda untuk setiap proses, dan kemudian hash informasi yang relevan dari proses Anda ke kunci yang Anda tetapkan untuk setiap output.

Dalam situasi paling sederhana, Anda akan menggunakan file teks untuk toko metadata Anda, dan menambahkan garis-garis metadata dengan aman tentang setiap lari ke file teks Anda. Anda kemudian dapat menyimpan keluaran Anda berjalan sesuka Anda (satu direktori, cadangan dengan daftar konten, dll ...)

Anda bisa menerapkan strategi ini dalam bahasa apa pun yang Anda suka, tetapi ini sepele dengan Python. Anda juga bisa memanfaatkan beberapa fitur bagus sebagai kemampuan Python untuk membaca dan menulis data JSON atau berinteraksi dengan database SQL.

Pendekatan ini mengimplementasikan basis data ringan yang sangat sederhana. Ada strategi yang lebih berat yang memberikan lebih banyak jaminan keamanan, yang baru Anda mungkin tertarik adalah SciDB . Basis data memberikan jaminan yang lebih kuat tentang data Anda dan membantu Anda mengukur pendekatan Anda untuk kumpulan data yang lebih besar.

Aron Ahmadia
sumber