tham số scikit-learn n_jobs về mức sử dụng & bộ nhớ CPU


11

Trong hầu hết các công cụ ước tính trên scikit-learn, có một n_jobstham số trong fit/ predictphương thức để tạo các công việc song song bằng cách sử dụng joblib. Tôi nhận thấy rằng thiết lập nó để -1tạo ra chỉ 1 quá trình Python và tối đa hóa các lõi, khiến việc sử dụng CPU đạt 2500% trên đầu trang. Điều này hoàn toàn khác với việc đặt nó thành một số nguyên dương> 1, tạo ra nhiều quy trình Python với mức sử dụng ~ 100%.

Làm thế nào để thiết lập nó ảnh hưởng đến việc sử dụng CPU & lõi trên máy chủ Linux đa CPU? (ví dụ: nếu n_jobs=88 CPU bị khóa hoàn toàn hoặc CPU vẫn dự trữ một số lõi cho các tác vụ / quy trình khác?)

Ngoài ra, tôi MemoryErrorthỉnh thoảng nhận được khi cài đặt n_jobs=-1cho các bộ dữ liệu lớn. Tuy nhiên, việc sử dụng bộ nhớ thường dao động ở mức khoảng 30-40% cho quy trình Python đơn. Dữ liệu & bộ nhớ được quản lý / sao chép như thế nào tùy thuộc vào giá trị của n_jobs?


1
Hãy nhớ rằng bạn có thể đặt nó thành -2, sẽ sử dụng tất cả trừ 1 trong số các lõi có sẵn, khiến máy của bạn ít nhất hoạt động được. Hoàn toàn chính xác rằng các vấn đề về bộ nhớ thường bắt đầu cắn cho nhiều lõi, đặc biệt là nếu bộ dữ liệu lớn
Ken Syme

Câu trả lời:


4

Tôi có thể tưởng tượng một giá trị -1tiêu thụ tất cả các tài nguyên có sẵn và khi chúng trở nên có sẵn. Tùy thuộc vào chức năng mà bạn đang nói đến, có vẻ như dữ liệu được sao chép cho từng công việc, điều này có thể dẫn đến các vấn đề về bộ nhớ nếu tập dữ liệu đủ lớn. Đây là một đoạn thông tin từ chuỗi docSearch của GridSearchCV :

If `n_jobs` was set to a value higher than one, the data is copied for each
point in the grid (and not `n_jobs` times). This is done for efficiency
reasons if individual jobs take very little time, but may raise errors if
the dataset is large and not enough memory is available.  A workaround in
this case is to set `pre_dispatch`. Then, the memory is copied only
`pre_dispatch` many times. A reasonable value for `pre_dispatch` is `2 *
n_jobs`.

Vì vậy, nó có thể là một ý tưởng tốt để sử dụng pre_dispatchđể đặt giới hạn trên cho mức tiêu thụ bộ nhớ của bạn.

Nếu không, tại sao bạn lại đặt nó -1? Bạn chỉ nên đặt nó thành số lõi vật lý trên máy của mình, hoặc có thể gấp 2 lần số đó, nếu tác vụ có thể đa luồng.

BIÊN TẬP:

Có vẻ như thiết lập n_jobs=-1thực sự chỉ cần chọn tất cả các lõi vật lý và tối đa hóa việc sử dụng chúng. Hãy xem các ý kiến ​​trong câu trả lời này trên StackOverflow .

Nếu bạn chưa thiết lập pre_dispatch, tất nhiên nó sẽ cố gắng sao chép thật nhiều. Đây là lý do tại sao bạn hết bộ nhớ. Nếu bạn có 4 lõi, theo mặc định, 8 bản sao của bộ dữ liệu được tạo ra (như được mô tả ở trên trong trích dẫn).

Đây là một chủ đề khác , nhìn nhiều hơn về phía hiệu suất


1
vì vậy chúng tôi sử dụng pre_dispatch để giới hạn các bản sao của dữ liệu, nhưng tại sao lại được đặt thành -1 có vấn đề về bộ nhớ?

1
@sweetyBaby - vui lòng xem các liên kết được thêm vào. Cài đặt n_jobs = -1sẽ không xem xét bộ nhớ của bạn, chỉ có số lượng lõi trên CPU của bạn, điều này tất nhiên có thể dẫn đến các vấn đề về bộ nhớ.
n1k31t4
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.