7

tôi chạy vào các vấn đề sau đây khi viết mã khoa học với Python:thu hoạch sức mạnh của máy tính cao song song với trăn đang khoa học

  • Thông thường, bạn viết mã lặp đi lặp lại, như một kịch bản mà thực hiện một số tính toán.
  • Cuối cùng, nó hoạt động; bây giờ bạn muốn chạy nó với nhiều đầu vào và tham số và tìm thấy nó mất quá nhiều thời gian.
  • Nhớ lại bạn làm việc cho một viện học thuật tốt và có quyền truy cập vào một máy ~ 100 CPU, bạn đang bối rối làm thế nào để thu hoạch sức mạnh này. Bạn bắt đầu bằng cách chuẩn bị các kịch bản shell nhỏ chạy mã gốc với các đầu vào khác nhau và chạy chúng theo cách thủ công.

Là kỹ sư, tôi biết tất cả về kiến ​​trúc phù hợp cho điều này (với các mục công việc được xếp hàng đợi và chuỗi công việc hoặc kết quả công việc xếp hàng và ghi vào lưu trữ liên tục); nhưng tôi không muốn tự mình thực hiện điều này. Vấn đề có vấn đề nhất là cần phải chạy lại do thay đổi mã hoặc các vấn đề hệ thống tạm thời (ví dụ: bộ nhớ ngoài).

Tôi muốn tìm một số khung mà tôi sẽ cung cấp các đầu vào mong muốn (ví dụ: với một tệp có một dòng cho mỗi lần chạy) và sau đó tôi có thể bắt đầu nhiều trường hợp của một số tác nhân được cung cấp khung. ma cua toi. Nếu có sự cố xảy ra với sự cố (ví dụ: vấn đề hệ thống tạm thời hoặc bị loại trừ do lỗi), tôi sẽ có thể xóa kết quả và chạy thêm một số tác nhân khác. Nếu tôi lấy quá nhiều tài nguyên, tôi sẽ có thể giết một số đại lý mà không sợ dữ liệu không nhất quán, và các nhân viên khác sẽ lấy các vật phẩm khi họ tìm thấy thời gian.

Bất kỳ giải pháp hiện có nào? Bất cứ ai cũng muốn chia sẻ mã của mình mà làm điều đó? Cảm ơn!

+0

Tôi không tự mình sử dụng, nhưng [python for mpi] (http://mpi4py.scipy.org/docs/usrman/index.html) thường được sử dụng cho loại điều này. Vì mpi đã rất lớn trong không gian tính toán khoa học, nó có thể phù hợp với kiến ​​trúc hiện tại của bạn. – tdelaney

+1

* Là một kỹ sư, tôi biết tất cả ... nhưng tôi không muốn thực hiện điều này bản thân mình. * Đọc giống như một người quản lý với tôi. Máy của bạn có cài đặt hệ thống quản lý công việc không? –

+0

@High Performance Mark: Ouch .. Tôi thích gọi nó là tập trung hơn. :) Nhưng thực sự, mã khoa học không giống như mã sản xuất; nếu viết một số mã thử nghiệm mất nửa ngày thì không sao, sẽ mất thêm nửa ngày nữa để nó chạy trên một cụm, đó là trường hợp của tôi ngày hôm nay. –

Trả lời

2

Trước hết, tôi muốn nhấn mạnh rằng vấn đề mà Uri mô tả trong câu hỏi của ông thực sự phải đối mặt với nhiều người làm máy tính khoa học. Nó có thể không dễ dàng để xem nếu bạn làm việc với một cơ sở mã phát triển có một phạm vi được xác định rõ ràng - mọi thứ không thay đổi nhanh như trong tính toán khoa học hoặc phân tích dữ liệu. This page có một mô tả tuyệt vời tại sao người ta muốn có một giải pháp đơn giản để song song các đoạn mã.

Vì vậy, this project là một nỗ lực rất thú vị để giải quyết vấn đề. Tôi chưa thử sử dụng nó, nhưng có vẻ rất hứa hẹn!

+0

Tôi đồng ý. Câu trả lời chính xác. –

2

Nếu bạn có "have access to a ~100 CPUs machines" nghĩa là bạn có quyền truy cập 100 máy có nhiều CPU và trong trường hợp bạn muốn hệ thống đủ chung cho các loại ứng dụng khác nhau, thì tốt nhất có thể (và theo ý kiến ​​của tôi) giải pháp là có một lớp quản lý giữa các nguồn lực của bạn và đầu vào công việc của bạn. Điều này không có gì đặc trưng cho Python, nó được áp dụng theo nghĩa tổng quát hơn nhiều. Lớp như vậy quản lý tài nguyên máy tính, gán nhiệm vụ cho các đơn vị tài nguyên đơn lẻ và giám sát toàn bộ hệ thống cho bạn. Bạn sử dụng các tài nguyên thông qua một giao diện được xác định rõ như được cung cấp bởi hệ thống quản lý. Chẳng hạn như hệ thống quản lý thường được gọi là "hệ thống lô" hoặc "hệ thống xếp hàng công việc". Các ví dụ phổ biến là SLURM, Sun Grid Engine, Torque, .... Việc thiết lập từng mẫu trong số đó không hề nhỏ nhặt chút nào, nhưng yêu cầu của bạn cũng không hề nhỏ nhặt.

Các giải pháp "song song" dựa trên Python thường dừng ở mức một máy thông qua multiprocessing. Thực hiện song song ngoài một máy duy nhất theo kiểu tự động yêu cầu một cụm tài nguyên được cấu hình tốt. Nó thường liên quan đến các cơ chế mức cao hơn như giao diện truyền thông điệp (MPI), dựa trên một hệ thống tài nguyên được cấu hình đúng. Cấu hình tương ứng được thực hiện trên hệ điều hành và thậm chí là mức phần cứng trên mỗi máy đơn lẻ có liên quan đến nhóm tài nguyên. Cuối cùng, một môi trường tính toán song song liên quan đến nhiều máy đơn lẻ có tính đồng nhất hoặc không đồng nhất đòi hỏi phải thiết lập một "hệ thống lô" như vậy để được sử dụng một cách tổng quát.

Bạn nhận ra rằng bạn không nhận được xung quanh nỗ lực trong việc triển khai đúng cách một nhóm tài nguyên như vậy. Nhưng những gì bạn có thể làm là hoàn toàn cô lập nỗ lực này tạo thành lớp ứng dụng của bạn. Bạn đã từng triển khai một nhóm tài nguyên được quản lý như vậy theo kiểu chung, sẵn sàng để sử dụng bởi bất kỳ ứng dụng nào từ một giao diện chung. Giao diện này thường được thực hiện ở cấp dòng lệnh bằng cách cung cấp các lệnh gửi, giám sát, xóa, lệnh công việc. Đó là vào bạn để xác định những gì một công việc là gì và những nguồn lực cần tiêu thụ.Nó tùy thuộc vào hệ thống xếp hàng công việc để chỉ định công việc của bạn cho các máy cụ thể và tùy thuộc vào hệ điều hành (cấu hình đúng) và thư viện MPI để đảm bảo rằng giao tiếp giữa các máy đang hoạt động. Trong trường hợp bạn cần sử dụng phần cứng được phân phối giữa nhiều máy cho một ứng dụng duy nhất và giả sử rằng các máy có thể nói chuyện với nhau thông qua TCP/IP, có những giải pháp dựa trên Python thực hiện như vậy để nói các hệ thống xếp hàng công việc ít phổ biến hơn. Bạn có thể muốn xem http://python-rq.org/ hoặc http://itybits.com/pyres/intro.html (có rất nhiều hệ thống có thể so sánh khác trên mạng, tất cả đều dựa trên một cá thể nhắn tin/xếp hàng độc lập như Redis hoặc ZeroMQ).

5

Tôi có thể sai, nhưng chỉ cần sử dụng tiện ích dòng lệnh GNU, như parallel, hoặc thậm chí xargs, có vẻ phù hợp với tôi trong trường hợp này. Cách sử dụng có thể trông như thế này:

cat inputs | parallel ./job.py --pipe > results 2> exceptions 

này sẽ thực hiện job.py cho mỗi dòng inputs trong, đầu ra kết quả thành công song song vào results, và thất bại trong những để exceptions. Rất nhiều ví dụ về cách sử dụng (cũng cho các tập lệnh Python khoa học) có thể được tìm thấy trong số Biostars thread này.

Và, cho đầy đủ, Parallel documentation.

+0

Đó là một giải pháp tốt đẹp và đơn giản cho bất kỳ máy nào không có lớp quản lý. Cảm ơn! –

2
  • Thông thường, bạn viết mã lặp đi lặp lại, như một kịch bản mà thực hiện một số tính toán.

Điều này làm cho tôi nghĩ rằng bạn thực sự muốn ipython notebooks

Một máy tính xách tay là một tập tin mà có một cấu trúc mà là một sự pha trộn giữa một tài liệu và một thông dịch viên python tương tác. Khi bạn chỉnh sửa các phần python của tài liệu, chúng có thể được thực thi và đầu ra được nhúng trong tài liệu. Đó là chương trình thực sự tốt khi bạn khám phá không gian vấn đề và muốn ghi chú khi bạn đi.

Nó cũng được tích hợp rất nhiều với matplotlib, vì vậy bạn có thể hiển thị đồ thị nội tuyến. Bạn có thể nhúng nội tuyến toán học Latex và nhiều loại đối tượng phương tiện như hình ảnh và video.

Dưới đây là một basic example, và một flashier one

  • Cuối cùng, nó hoạt động; bây giờ bạn muốn chạy nó với nhiều đầu vào và tham số và tìm thấy nó mất quá nhiều thời gian.
  • Nhớ lại bạn làm việc cho một viện học thuật tốt và có quyền truy cập vào một máy ~ 100 CPU, bạn đang bối rối làm thế nào để thu hoạch sức mạnh này. Bạn bắt đầu bằng cách chuẩn bị các kịch bản shell nhỏ chạy mã gốc với các đầu vào khác nhau và chạy chúng theo cách thủ công.

Điều này làm cho tôi nghĩ rằng bạn thực sự muốn ipython clusters

cụm IPython cho phép bạn chạy các chương trình song song trên nhiều máy tính. Chương trình có thể là SIMD (có vẻ như trường hợp của bạn) hoặc kiểu MIMD. Chương trình có thể được chỉnh sửa và gỡ lỗi tương tác.

Có một số cuộc hội đàm về iPython tại sự kiện SciPy gần đây. Đi vào PyVideo.org và tìm kiếm cho nhiều video, bao gồm:

Tôi không theo dõi tất cả trong số này, nhưng chúng có thể là một tốt điểm khởi đầu.