ข้อเสนอแนะสำหรับการจัดการการจำลองการทำงาน?


9

คำถามนี้อาจเป็นหัวข้อนอกเรื่องใน comp-sci หากมีความจำเป็นโปรดแนะนำสถานที่ที่เหมาะสมกับมัน

คำถามเกี่ยวกับวิธีการจัดการการจำลองทั้งหมดทำงานได้อย่างมีประสิทธิภาพ

ตัวอย่างเช่นการจำลองต้องการการแก้ไขพารามิเตอร์ 2 ตัวซึ่งจะต้องมีการกำหนดในช่วงค่าที่แนะนำ

เพื่อหาผลลัพธ์ที่ดีกว่าที่ผลิตโดยคู่ของพารามิเตอร์สองตัว (โดยการเปรียบเทียบผลการจำลองกับข้อมูลการทดลองตัวอย่าง) เราสามารถทำการวิเคราะห์ความอ่อนไหวโดยการกำหนดสามค่าสำหรับแต่ละพารามิเตอร์จากนั้นกำหนดสูตร 9 รัน

ก่อนหน้านี้ฉันใช้sedเพื่อเปลี่ยนอินพุตสำหรับการทำงานแต่ละครั้งและติดแท็กการทดสอบแต่ละครั้งโดยการเขียนค่าและชื่อพารามิเตอร์ในโฟลเดอร์ที่เก็บอินพุตและผลลัพธ์ของการทำงานนี้ แต่ฉันพบว่าสิ่งนี้ไม่มีประสิทธิภาพมากเมื่อจำนวนพารามิเตอร์เพิ่มขึ้น (เช่นเข้าถึงชื่อของโฟลเดอร์ในสคริปต์สำหรับการพล็อต)

จากนั้นฉันตัดสินใจที่จะใช้หมายเลขแบบง่ายเป็นชื่อโฟลเดอร์และเก็บรายละเอียดโดยสเปรดชีตอื่น ๆ วิธีนี้ก็โอเค แต่ต้องใช้งานลำบาก เช่นเดียวกันกับการเติบโตของการวิ่งมันเป็นเรื่องปกติที่จะทำผิดพลาดเช่นทำการวิ่งอีกครั้งซึ่งได้ทำไปแล้วเมื่อสองสามวันก่อน

คุณมีความคิดที่ดีเกี่ยวกับการจัดการการวิ่งเหล่านี้หรือไม่? ฉันคิดว่ามันจะมีความสำคัญอย่างยิ่งสำหรับคนที่ทำการวิเคราะห์ Monte Carlo?

ขอบคุณล่วงหน้า!


2
ฉันมักจะใช้สคริปต์ Python แบบง่ายสำหรับงานดังกล่าว พวกเขาสร้างข้อมูลเรียกใช้แบบจำลองและจัดการผลลัพธ์ที่ได้ การใช้เครื่องมือเช่น numpy / scipy / matplotlib คุณสามารถวิเคราะห์และวางแผนได้โดยตรง บางครั้งฉันไปได้มากขึ้นและสร้างอินพุตที่ต้องการโดยอัตโนมัติเพื่อทดสอบกับโซลูชันที่ผลิตโดยตรงโดยใช้ sympy และใช้ผลลัพธ์เป็นอินพุตในรหัสจำลองของฉัน ฉันสามารถแนะนำหนังสือของ Langtangen "Python Scripting for Computational Science" เป็นจุดเริ่มต้น ที่นี่มีงานทั่วไปที่พบในคอมพ์ วิทยาศาสตร์แสดงให้เห็นถึงการใช้ Python
Christian Waluga

คำถามนี้ดูเหมือนจะอยู่ในหัวข้ออย่างมาก นี่คือวิทยาศาสตร์การคำนวณแบบขนมปังและเนย ฉันคิดว่านักวิทยาศาสตร์การคำนวณเริ่มต้นทุกคนต้องผ่านสิ่งที่เฉินหมิงกำลังเผชิญอยู่ ณ จุดใดจุดหนึ่ง ฉันคนหนึ่งสนใจมากที่จะเห็นว่าคนอื่น ๆ ได้เข้าใกล้ความเจ็บปวดที่แพร่หลายนี้ในลา
โทร

คำตอบ:


5

TLDR
ใช้ Python เพื่อจัดการ / แก้ไขอินพุตและจัดเรียงเอาต์พุตของคุณและใช้ HDF5 เพื่อจัดระเบียบ / เก็บข้อมูลของคุณ ซับซ้อนเท่าที่ดูในตอนแรกมันจะง่ายกว่า SQL-nothing

ตอบอีกต่อไป + ตัวอย่าง
ฉันใช้การรวมกันของ Python scripting และรูปแบบไฟล์ HDF5 เพื่อจัดการกับสถานการณ์ประเภทนี้ การเขียนสคริปต์ Python สามารถจัดการการแทนที่ข้อความที่จำเป็นสำหรับการแก้ไข runfiles ของคุณ (และสามารถตรวจสอบการทำงานซ้ำ) และด้วยการเขียนสคริปต์เพิ่มเติมคุณสามารถนำข้อมูลที่ส่งออกจากโปรแกรมของคุณและใส่ลงในไฟล์ 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-Dim เป็นเรื่องปกติที่ผลลัพธ์ของการจำลองจะอยู่ในอาร์เรย์บางประเภทดังนั้นสิ่งนี้อาจไม่เป็นปัญหา

จุดเริ่มต้นที่ดี
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/


2

ฉันคิดว่าเราต้องรู้เพิ่มเติมเกี่ยวกับเวิร์กโฟลว์ของคุณอีกเล็กน้อยเพื่อให้คำแนะนำที่จริงจัง

ฉันขอแนะนำให้รักษาการวิ่งของคุณเหมือนที่เก็บคีย์ - ค่า สร้างฐานข้อมูลอย่างง่ายสำหรับข้อมูลเมตาทั้งหมดของคุณสำหรับการทำงานแต่ละครั้งและแฮชข้อมูลที่เกี่ยวข้องใด ๆ จากการทำงานของคุณไปยังคีย์ที่คุณกำหนดให้กับแต่ละเอาต์พุต

ในสถานการณ์ที่ง่ายที่สุดคุณจะใช้ไฟล์ข้อความสำหรับที่เก็บข้อมูลเมตาของคุณและเพิ่มบรรทัดของข้อมูลเมตาเกี่ยวกับการทำงานแต่ละครั้งในไฟล์ข้อความของคุณ จากนั้นคุณสามารถจัดเก็บเอาต์พุตของคุณตามที่คุณต้องการ (ไดเรกทอรีเดียวสำรองข้อมูลพร้อมรายการเนื้อหา ฯลฯ ... )

คุณสามารถใช้กลยุทธ์นี้ในภาษาใดก็ได้ที่คุณต้องการ แต่สิ่งนี้จะเป็นเรื่องเล็กน้อยใน Python นอกจากนี้คุณยังสามารถใช้ประโยชน์จากฟีเจอร์ที่ยอดเยี่ยมเช่นความสามารถของ Python ในการอ่านและเขียนข้อมูล JSON หรือโต้ตอบกับฐานข้อมูล SQL

วิธีนี้ใช้ฐานข้อมูลน้ำหนักเบาง่ายมาก มีกลยุทธ์ที่หนักกว่าที่ให้การรับประกันความปลอดภัยมากขึ้นเป็นหนึ่งใหม่ที่คุณอาจจะสนใจในการเป็นSciDB ฐานข้อมูลให้การรับประกันที่แข็งแกร่งยิ่งขึ้นเกี่ยวกับข้อมูลของคุณและช่วยให้คุณขยายแนวทางสำหรับชุดข้อมูลที่มีขนาดใหญ่ขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.