2012-09-02 44 views
8

Tôi đang phát triển một mạng nơron nhỏ có thông số cần tối ưu hóa rất nhiều, vì vậy rất nhiều thời gian xử lý. Tôi đã lược tả tập lệnh của mình với cProfile và thời gian xử lý chiếm 80% là chức năng NumPy dot, phần còn lại là ma trận đảo ngược với hàm numpy.linalg.solve. Phiên bản sử dụng gọn gàng hiện tại của tôi blas hoặc có vẻ như là do numpy.core._dotblas.dot xuất hiện dưới dạng hàm chiếm 80% tổng thời gian xử lý.Làm thế nào để tăng tốc ma trận nhân trong Python?

Vì nó là cốt lõi của mạng thần kinh của tôi và vì tôi phải chạy rất nhiều, bất kỳ tăng tốc độ nhỏ nào cũng có thể giúp tôi tiết kiệm rất nhiều thời gian cho việc tối ưu hóa nhiều tham số lặp đi lặp lại.

Các góc độ khác: phép nhân ma trận trên ma trận có hình dạng tối thiểu 100 * 100 đến 500 * 500. Tôi có một máy tính với 12 lõi và sử dụng chúng cho đến nay để chạy tối ưu hóa các thông số mạng neural khác nhau song song, nhưng có thể nhân ma trận có thể được thực hiện song song?

Cảm ơn bạn đã dành thời gian!

Trả lời:

Tôi đã dành vài ngày thử nghiệm và cài đặt thư viện gỡ bỏ cài đặt ... Đây là kết quả của những gì tôi đã thử nghiệm: Theo mặc định trên phiên bản của tôi về Ubuntu (12.04) và respository cài đặt phiên bản numpy, các Thư viện BLAS là thư viện ATLAS. Tôi đã thực hiện một số thử nghiệm phản ánh sự cải thiện ĐẶC BIỆT trên các tính toán mà tôi quan tâm, vì vậy các kết quả này không được hiểu là câu trả lời cuối cùng. Những tính toán này liên quan đến phép nhân (ma trận) trong một vòng lặp lặp 55000, với ma trận 500 * 500 và 1000 * 1000. Tôi sử dụng một máy trạm HP Z800 với Xeon X5675 @ 3.07GHZ với 12 lõi. Tất cả các kết quả (phần trăm) là sự so sánh giữa điều kiện được mô tả và tham chiếu mà ở đây là thư viện ATLAS được đóng gói.

  • Scipy.sparse module: Tôi không biết nếu tôi đặt nó một cách chính xác nhưng với một thưa thớt 10%, sử dụng mô-đun này trở nên hữu ích bắt đầu từ 1500 * 1500 ma trận với OpenBLAS và MKL. Nếu bạn có gợi ý về cách sử dụng chúng đúng cách tôi quan tâm!
  • Với OpenBlas tôi nhận được tốc độ tăng 33% cho 500 * 500 ma trận nhưng 160% cho 1000 * 1000. Nhưng với OpenBLAS, mô-đun scipy.sparse không hoạt động tốt hơn nhưng tệ hơn trong thực tế.
  • Người chiến thắng lớn ở đây là thư viện MKL. Gia tốc lên tới 230% với các ma trận 1000 * 1000 từ các thư viện ATLAS gốc! Đối với các ma trận 500 * 500, gia tốc là khiêm tốn hơn (100%) nhưng vẫn rất tốt. Hơn nữa với việc biên dịch với OpenMP, phép nhân ma trận có thể chạy trên 12 bộ vi xử lý của tôi và ở đây nó nhanh gấp hai lần so với một bộ xử lý với các thư viện MKL. Nhưng nó là một sự lãng phí sức mạnh xử lý, nó là hiệu quả hơn nhiều để sử dụng các mô-đun đa xử lý để chạy các kịch bản/ma trận nhân song song.

Trả lời

7

Nếu bạn chưa có, bạn có thể thử liên kết NumPy thư viện rất tối ưu hóa BLAS như Intel MKL (đó là free-as-in-beer for non-commercial use hoặc discounted for academic use, mà dường như không được tính là phi thương mại; instructions from Intel for using it with numpy) hoặc OpenBLAS (miễn phí -as-in-speech). Ngoài ra còn có các Enthought Python Distribution, được liên kết trước với MKL và miễn phí-như-trong-bia cho các học giả. Điều đó có thể song song tự động nhân bản ma trận của bạn và có thể nhanh hơn nhiều so với cài đặt BLAS/ATLAS tham chiếu điển hình trên hầu hết các bản phân phối Linux hoặc bất kỳ thứ gì bạn đang sử dụng.

Nếu không, điều duy nhất tôi biết rằng bạn có thể làm sẽ là một số thủ thuật toán học để không phải tính toán nhiều phép nhân/giải quyết.Nếu không biết chính xác những gì bạn đang làm thì thật khó để đưa ra bất kỳ gợi ý nào ở đó.

Tôi giả định rằng ma trận của bạn dày đặc, vì chúng thường nằm trong lưới thần kinh, nhưng nếu bạn đang làm điều gì đó bất thường scipy.sparse cũng có thể hữu ích.

+0

Openblas có thể là tùy chọn miễn phí tốt có thể tăng tốc độ đáng kể. Nó nên được khá dễ dàng có sẵn trên hầu hết các hệ thống Linux cho ví dụ. – seberg

+0

Tôi đã không nhận ra rằng MKL không phải là miễn phí (như trong bia); [OpenBLAS] (http://xianyi.github.com/OpenBLAS/) có lẽ là một lựa chọn tốt. EPD là miễn phí cho các học giả. – Dougal

+0

Lưới thần kinh của tôi thực sự thưa thớt (kết nối 10%), tôi tăng tốc 20%, không nhiều nhưng tốt hơn là không có gì. Bạn nói về OpenBLAS, nó có chạy nhanh hơn phiên bản hiện tại của tôi về việc sử dụng phiên bản BLAS không? – PierreE

4

Numpy sử dụng các thuật toán và biểu diễn nội bộ thực sự nhanh chóng dựa trên thư viện của bên thứ ba (chẳng hạn như BLAS, như bạn đặt tên) đã sử dụng tối ưu hóa SSE trong số các thư viện khác. Bởi vì BLAS ban đầu là một chút chậm (vì nó nhằm mục đích thực hiện tham chiếu, tập trung vào độ chính xác hơn là hiệu suất), bạn có thể muốn sử dụng một hương vị khác tập trung vào hiệu suất, chẳng hạn như OpenBLAS. Để sử dụng OpenBLAS, bạn cần phải tìm một gói Numpy được kích hoạt sẵn có OpenBLAS hoặc biên dịch lại một phiên bản được liên kết với OpenBLAS. Một khi bạn đang sử dụng một thực thi BLAS hiệu quả, bạn sẽ không tìm thấy một tùy chọn tăng tốc tốt hơn trong python tinh khiết, trừ khi bạn viết một thư viện trong C và mất nhiều thời gian để tối ưu hóa nó.

Mặt khác, bạn có thể kiểm tra xem thư viện Numpy và BLAS của bạn có được biên dịch hiệu quả nhất có thể trên kiến ​​trúc của bạn hay không. Ví dụ, nếu bạn có thể kích hoạt thư viện OpenMP trên biên dịch Numpy, nó sẽ cho phép nhiều lõi xử lý vấn đề của bạn bằng cách sử dụng song song mức dữ liệu. Đây có thể là một nguồn tăng tốc đáng kể nếu bạn có nhiều lõi trên máy tính của bạn và các tính toán của bạn là CPU bị ràng buộc. Nếu loại vấn đề của bạn cho phép, bạn thậm chí có thể sử dụng thư viện lập trình song song dựa trên nhiệm vụ (SCOOP [Disclamer: Tôi đã viết nó], Celery, v.v.) để truyền bá công việc của bạn trên nhiều máy tính.

Như một phương sách cuối cùng, một khả năng khác là mua phần cứng mới. Nó làm cho phần mềm có khả năng đi nhanh hơn mà không thay đổi một dòng mã.

+0

Cảm ơn, tôi sẽ kiểm tra phiên bản Blas đã được cài đặt và thử biên dịch với OpenMP được kích hoạt. Nó phức tạp thế nào? – PierreE

+0

@pierotiste: Nó không phải là khó khăn trên một hệ thống * nix dựa trên. Nó sẽ bao gồm biên dịch lại Numpy trong khi liên kết với các thư viện và/hoặc cờ mới. Bạn nên kiểm tra trực tuyến các blog hoặc hướng dẫn sử dụng Numpy để biết thêm chi tiết. Tùy thuộc vào các thư viện bạn chọn, nó có thể thay đổi các bước cần thiết. – Soravux