2013-06-11 18 views
22

Tôi biết điều này có vẻ như một câu hỏi vô lý, nhưng tôi phải chạy công việc thường xuyên trên máy chủ mà tôi chia sẻ với những người khác trong bộ và khi tôi bắt đầu 10 công việc, tôi thực sự muốn chỉ cần 10 lõi và không nhiều hơn; Tôi không quan tâm nếu phải mất một chút thời gian với một lõi duy nhất cho mỗi lần chạy: Tôi chỉ không muốn nó xâm lấn vào lãnh thổ của người khác, điều này đòi hỏi tôi phải đổi mới công việc và vân vân. Tôi chỉ muốn có 10 lõi rắn và đó là tất cả.Python: Làm thế nào để bạn ngừng numpy từ đa luồng?

Cụ thể hơn, tôi đang sử dụng Enthought 7.3-1 trên Redhat, dựa trên Python 2.7.3 và 1.6.1 một lần, nhưng câu hỏi là tổng quát hơn. Tôi đã googling cho một số loại câu trả lời cho câu hỏi này trong nhiều giờ để avail không có, vì vậy nếu ai đó biết về một chuyển đổi trong gumpy có thể tắt đa luồng, xin vui lòng cho tôi biết.

+1

Tôi khá chắc chắn rằng numpy không làm bất kỳ đa luồng, không có gì để tắt. –

+2

đặt ái lực cpu cho các quy trình – jfs

+8

@WinstonEwert: không chính xác. Hãy thử 'np.dot' với ma trận lớn trên cpu đa lõi.Các thư viện mà nó sử dụng có thể sử dụng nhiều hơn một cpu – jfs

Trả lời

10

Đặt biến môi trường MKL_NUM_THREADS thành 1. Như bạn có thể đã đoán, biến môi trường này kiểm soát hành vi của Thư viện hạt nhân toán học được bao gồm như một phần của bản dựng numpy của Enthought.

Tôi chỉ làm điều này trong tệp khởi động của mình, .bash_profile, với export MKL_NUM_THREADS=1. Bạn cũng có thể làm điều đó từ bên trong kịch bản của bạn để có nó được xử lý cụ thể.

+0

Cảm ơn. Điều đó làm cho cuộc sống dễ dàng hơn nhiều so với việc đặt từng quy trình. – MasDaddy

5

Tôi đã để lại điều này làm nhận xét về câu trả lời của Bi Rico nhưng tôi không có đặc quyền cần thiết. Trong các phiên bản gần đây hơn của tôi đã tìm thấy nó cần thiết để thiết lập NUMEXPR_NUM_THREADS = 1

Trong tay, điều này là đủ mà không cần thiết lập MKL_NUM_THREADS = 1, nhưng trong một số trường hợp bạn có thể cần phải đặt cả hai.

+1

Fwiw, tôi cần thiết đặt 'OMP_NUM_THREADS' (cf https://stackoverflow.com/a/31622299/1666398) – dtk

-3

Đối với tôi, giải pháp rất đơn giản như tôi đã ngừng sử dụng numpy.dot:

import numpy as np 

a = np.random.rand(1e6) 
b = np.random.rand(1e6, 10) 

# potentially uses multiple threads 
dotted = np.dot(a, b) 

# single-thread 
summed = np.sum(a[:, np.newaxis] * b, axis=0) 

assert np.all(dotted == summed) 
2

Trong trường hợp bạn muốn thiết lập số lượng bài tự động, chứ không phải trên toàn cầu thông qua một biến môi trường, bạn cũng có thể làm:

import mkl 
mkl.set_num_threads(2) 
1

Chỉ hy vọng điều này sẽ khắc phục tất cả các tình huống và hệ thống mà bạn có thể đang sử dụng.

  1. Sử dụng numpy.__config__.show() để xem nếu bạn đang sử dụng OpenBLAS hoặc MKL

Từ lúc này trở đi có một vài cách bạn có thể làm điều này.

2.1. Các tuyến đường terminal export OPENBLAS_NUM_THREADS=1 hoặc export MKL_NUM_THREADS=1

2,2 (Đây là cách ưa thích của tôi) Trong kịch bản python của bạn import os và thêm dòng os.environ['OPENBLAS_NUM_THREADS'] = '1' hoặc os.environ['MKL_NUM_THREADS'] = '1'.

LƯU Ý khi đặt os.environ[VAR] số lượng chủ đề phải là một chuỗi!

Có lẽ các tùy chọn khác ngoài openBLAS hoặc MKL nhưng bước 1 sẽ giúp bạn tìm ra điều đó.

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