đề nghị quản lý chạy mô phỏng?


9

Câu hỏi này có thể hơi lạc đề trong comp-sci. nếu cần thiết xin vui lòng đề nghị nơi phù hợp với.

Câu hỏi liên quan đến cách quản lý tất cả các mô phỏng chạy hiệu quả.

giả sử, ví dụ, một mô phỏng yêu cầu sửa 2 tham số phải được xác định ở một phạm vi giá trị được đề xuất nhất định.

Để tìm kết quả tốt hơn được tạo bởi một cặp hai tham số (ví dụ bằng cách so sánh kết quả mô phỏng với dữ liệu thử nghiệm), người ta có thể phân tích độ nhạy bằng cách xác định ba giá trị cho mỗi tham số, sau đó xây dựng 9 lần chạy.

trước đây tôi sử dụng sed để thay đổi đầu vào cho mỗi lần chạy và gắn thẻ cho mỗi lần chạy bằng cách ghi giá trị và tên tham số vào thư mục lưu trữ đầu vào và kết quả của lần chạy này. nhưng tôi thấy điều này rất không hiệu quả khi số lượng tham số tăng lên (ví dụ: truy cập tên của các thư mục trong tập lệnh để vẽ đồ thị).

sau đó tôi quyết định sử dụng các số đơn giản làm tên thư mục và lưu trữ chi tiết bằng một số bảng tính khác. cách này là ok cho đến nay nhưng đòi hỏi một số công việc tốn nhiều công sức. cũng với sự tăng trưởng của các lần chạy, việc mắc lỗi trở nên phổ biến, chẳng hạn như tiến hành một cuộc chạy khác đã được thực hiện vài ngày trước.

Bạn có bất cứ ý tưởng tốt về việc quản lý các hoạt động này? Tôi nghĩ nó sẽ cực kỳ quan trọng đối với người thực hiện phân tích Monte Carlo?

Cảm ơn trước!


2
Tôi thường sử dụng các kịch bản Python đơn giản cho các tác vụ như vậy. Họ tạo dữ liệu, chạy mô phỏng và quản lý kết quả đầu ra. Sử dụng các công cụ như numpy / scipy / matplotlib, bạn cũng có thể trực tiếp phân tích và vẽ đồ thị ở một mức độ nào đó. Đôi khi tôi còn đi xa hơn và tự động tạo đầu vào cần thiết để kiểm tra trực tiếp các giải pháp được sản xuất bằng cách sử dụng sympy và sử dụng kết quả làm đầu vào trong mã mô phỏng của tôi. Tôi có thể giới thiệu cuốn sách "Python Scripting for Computational Science" của Langtangen làm điểm khởi đầu. Ở đây một số nhiệm vụ điển hình gặp phải trong comp. khoa học được chứng minh bằng Python.
Christian Waluga

Câu hỏi này có vẻ cực kỳ về chủ đề. Đây là công cụ khoa học tính toán bánh mì và bơ. Tôi nghĩ rằng mọi nhà khoa học tính toán khởi đầu đều trải qua những gì Chenming đang trải qua vào lúc này hay lúc khác. Tôi cho một người rất quan tâm để xem làm thế nào những người khác đã tiếp cận nỗi đau phổ biến này ở mông.
tel

Câu trả lời:


5

TLDR
Sử dụng Python để quản lý / sửa đổi đầu vào của bạn và san lấp đầu ra của bạn và sử dụng HDF5 để sắp xếp / lưu trữ dữ liệu của bạn. Đầu tiên có vẻ phức tạp, nó vẫn đơn giản hơn SQL-mọi thứ.

Câu trả lời dài hơn + Ví dụ
cá nhân tôi sử dụng kết hợp tập lệnh Python và định dạng tệp HDF5 để xử lý các loại tình huống này. Tập lệnh Python có thể xử lý các thay thế văn bản cần thiết để thay đổi các tệp runfiles của bạn (và có thể kiểm tra các lần chạy trùng lặp) và với một số tập lệnh khác, bạn có thể lấy dữ liệu đầu ra từ chương trình của mình và đưa nó vào tệp HDF5.

Dễ dàng nhất khi nghĩ về HDF5 giống hoặc ít hơn chính xác như một hệ thống tệp thông thường (nghĩa là tập hợp các thư mục và thư mục con trên máy tính của bạn), nhưng dễ dàng chia tỷ lệ thành các tập dữ liệu lớn. Mỗi thư mục / thư mục con có thể được gắn thẻ bằng siêu dữ liệu (trong trường hợp của bạn chỉ là các tham số mà bạn đang thay đổi hoặc toàn bộ bộ tham số). Khi đến lúc phân tích dữ liệu của bạn, bạn có thể tìm kiếm thông qua dữ liệu đó dựa trên siêu dữ liệu.

Đây là một ví dụ ngắn về cách thức hoạt động của nó dựa trên một số dữ liệu mô phỏng của tôi (đã ở định dạng HDF5) trông như thế này:

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.hdf5là tệp HDF5 và mỗi Runxx là thư mục con chứa dữ liệu đầu ra từ một mô phỏng nhất định và được gắn thẻ với siêu dữ liệu liên quan. Một tập lệnh python tìm kiếm trong các lần chạy và trả về một danh sách những tập lệnh có siêu dữ liệu mong muốn sẽ trông như thế này:

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

Vì vậy, nếu tôi ở một dòng lệnh trong một thư mục chứa mydata.hdf5tôi có thể chạy đoạn script trên như vậy:

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

mà sẽ cho kịch bản tìm bất kỳ lần chạy nào với siêu dữ liệu khớp một phần hoặc toàn bộ {'maxSteps':'1e7', 'size':'13'}. Tập lệnh sau đó có thể thao tác dữ liệu đó theo cách bạn thích (trong phần "làm gì đó ở đây") và sau đó nó sẽ in một danh sách trông giống như thế này:

["Run01", "Run03"]

Mặc dù vậy, một lưu ý là HDF5 sẽ chỉ hiển thị ánh xạ hoàn toàn tự nhiên cho dữ liệu của bạn nếu có thể biểu thị dữ liệu của bạn dưới dạng một tập hợp các mảng n chiều. Điều khá phổ biến là đầu ra của các mô phỏng nằm trong một loại mảng nào đó, vì vậy điều này có lẽ sẽ không thành vấn đề.

Điểm khởi đầu tốt
Python: http://www.openbookproject.net/thinkcs/python/english2e/
HDF5: http://www.h5py.org/docs/


2

Tôi nghĩ rằng chúng ta cần biết thêm một chút về quy trình làm việc của bạn để đưa ra bất kỳ khuyến nghị nghiêm túc nào.

Tôi khuyên bạn nên xử lý các hoạt động của bạn như một cửa hàng khóa-giá trị. Tạo một cơ sở dữ liệu đơn giản cho tất cả các siêu dữ liệu của bạn cho mỗi lần chạy và sau đó băm mọi thông tin liên quan từ lần chạy của bạn vào một khóa mà bạn gán cho mỗi đầu ra.

Trong tình huống đơn giản nhất, bạn sẽ sử dụng tệp văn bản cho cửa hàng siêu dữ liệu của mình và nối các dòng siêu dữ liệu một cách an toàn về mỗi lần chạy vào tệp văn bản của bạn. Sau đó, bạn có thể lưu trữ đầu ra của mình chạy theo cách bạn muốn (một thư mục duy nhất, sao lưu với danh sách nội dung, v.v ...)

Bạn có thể thực hiện chiến lược này bằng bất kỳ ngôn ngữ nào bạn thích, nhưng điều này sẽ không quan trọng bằng Python. Bạn cũng có thể tận dụng một số tính năng hay như khả năng đọc và ghi dữ liệu JSON của Python hoặc tương tác với cơ sở dữ liệu SQL.

Cách tiếp cận này thực hiện một cơ sở dữ liệu trọng lượng nhẹ rất đơn giản. Có những chiến lược nặng hơn cung cấp nhiều đảm bảo an toàn hơn, một chiến lược mới mà bạn có thể quan tâm là SciDB . Cơ sở dữ liệu cung cấp sự đảm bảo mạnh mẽ hơn về dữ liệu của bạn và giúp bạn mở rộng quy mô của mình cho các bộ dữ liệu lớn hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.