2013-10-31 20 views
12

Tôi đã gặp sự cố, trong đó Python thoát đột ngột, khi chạy đa xử lý có nhiều nút. Tôi đã cô lập các vấn đề, vì vậy mà tôi bây giờ có thể khẳng định rằng đa hoạt động hoàn hảo khi chạy mã được nêu dưới đây:Quá trình xử lý đa phần có thể làm cho Python thoát bất ngờ trên OSX

import numpy as np 
from multiprocessing import Pool, Process 
import time 
import cPickle as p 

def test(args): 
    x,i = args 
    if i == 2: 
     time.sleep(4) 
    arr = np.dot(x.T,x) 
    print i 

if __name__ == '__main__': 
    x = np.random.random(size=((2000,500))) 
    evaluations = [(x,i) for i in range(5)] 
    p = Pool() 
    p.map_async(test,evaluations) 
    p.close() 
    p.join() 

Vấn đề xảy ra khi tôi cố gắng để đánh giá các mã dưới đây. Điều này làm cho Python thoát đột ngột:

import numpy as np 
from multiprocessing import Pool, Process 
import time 
import cPickle as p 

def test(args): 
    x,i = args 
    if i == 2: 
     time.sleep(4) 
    arr = np.dot(x.T,x) 
    print i 

if __name__ == '__main__': 
    x = np.random.random(size=((2000,500))) 
    test((x,4)) # Added code 
    evaluations = [(x,i) for i in range(5)] 
    p = Pool() 
    p.map_async(test,evaluations) 
    p.close() 
    p.join() 

Hãy giúp đỡ ai đó. Tôi đang mở cho tất cả các đề xuất. Cảm ơn. Lưu ý: Tôi đã thử hai máy khác nhau và cùng một vấn đề xảy ra.

+0

tôi chạy mã của bạn trên Windows7/64bit sử dụng WinPython. Cả hai trường hợp được thực hiện và thoát mà không có lỗi. – alandarev

+0

Xin lỗi vì điều đó. Thú vị là nó hoạt động trên Windows. Bất kỳ người dùng Apple nào có thể giải thích cho tôi tại sao điều này xảy ra? – Maal

+0

Tôi có thể đã đánh lừa bạn, khi làm cho cơn thịnh nộ của tôi bình luận về Apple bằng cách sử dụng "bất ngờ" hạn ở khắp mọi nơi. Tôi hightly nghi ngờ vấn đề của bạn là hệ điều hành cụ thể. Bạn có thể thử chạy tập lệnh bạn đã đăng với Python sạch bằng cài đặt gọn gàng để xem sự cố có tiếp diễn không? – alandarev

Trả lời

5

Tôi đã tìm ra cách giải quyết vấn đề. Vấn đề xảy ra khi Numpy được sử dụng cùng với BLAS trước khi khởi tạo một ví dụ đa xử lý. Cách giải quyết của tôi chỉ đơn giản là đặt mã Numpy (chạy BLAS) vào một quy trình duy nhất và sau đó chạy các trường hợp đa xử lý sau đó. Đây không phải là một phong cách mã hóa tốt, nhưng nó hoạt động. Xem ví dụ dưới đây:

Tiếp theo sẽ thất bại - Python sẽ bỏ:

import numpy as np 
from multiprocessing import Pool, Process 

def test(x): 
    arr = np.dot(x.T,x) # On large matrices, this calc will use BLAS. 

if __name__ == '__main__': 
    x = np.random.random(size=((2000,500))) # Random matrix 
    test(x) 
    evaluations = [x for _ in range(5)] 
    p = Pool() 
    p.map_async(test,evaluations) # This is where Python will quit, because of the prior use of BLAS. 
    p.close() 
    p.join() 

Tiếp theo sẽ thành công:

import numpy as np 
from multiprocessing import Pool, Process 

def test(x): 
    arr = np.dot(x.T,x) # On large matrices, this calc will use BLAS. 

if __name__ == '__main__': 
    x = np.random.random(size=((2000,500))) # Random matrix 
    p = Process(target = test,args = (x,)) 
    p.start() 
    p.join() 
    evaluations = [x for _ in range(5)] 
    p = Pool() 
    p.map_async(test,evaluations) 
    p.close() 
    p.join() 
6

Đây là một vấn đề được biết đến với đa và NumPy trên hệ điều hành MacOS X, và một chút của một bản sao của:

segfault using numpy's lapack_lite with multiprocessing on osx, not linux

http://mail.scipy.org/pipermail/numpy-discussion/2012-August/063589.html

Câu trả lời có vẻ là để sử dụng một BLAS khác nhau khác so với khung tăng tốc của Apple khi liên kết Numpy ... không may: (

+2

Như @ogrisel đã lưu ý trong một nhận xét về liên kết đầu tiên ở đó, cũng có một chế độ 'forkserver' trong các phiên bản đa xử lý mới có thể hoạt động xung quanh vấn đề. – Dougal

Các vấn đề liên quan