Untuk C ++, kita dapat menggunakan OpenMP untuk melakukan pemrograman paralel; Namun, OpenMP tidak akan berfungsi untuk Python. Apa yang harus saya lakukan jika saya ingin memparalelkan beberapa bagian dari program python saya?
Struktur kode dapat dianggap sebagai:
solve1(A)
solve2(B)
Di mana solve1
dan solve2
dua fungsi independen. Bagaimana menjalankan kode semacam ini secara paralel dan bukan secara berurutan untuk mengurangi waktu berjalan? Semoga ada yang bisa membantu saya. Terima kasih banyak sebelumnya. Kode tersebut adalah:
def solve(Q, G, n):
i = 0
tol = 10 ** -4
while i < 1000:
inneropt, partition, x = setinner(Q, G, n)
outeropt = setouter(Q, G, n)
if (outeropt - inneropt) / (1 + abs(outeropt) + abs(inneropt)) < tol:
break
node1 = partition[0]
node2 = partition[1]
G = updateGraph(G, node1, node2)
if i == 999:
print "Maximum iteration reaches"
print inneropt
Di mana setinner dan setouter adalah dua fungsi independen. Di situlah saya ingin paralel ...
python
parallel-processing
ilovecp3
sumber
sumber
Jawaban:
Anda dapat menggunakan multiprocessing modul . Untuk kasus ini saya mungkin menggunakan kumpulan pemrosesan:
Ini akan menelurkan proses yang dapat melakukan pekerjaan umum untuk Anda. Karena kami tidak lulus
processes
, itu akan menelurkan satu proses untuk setiap inti CPU pada mesin Anda. Setiap inti CPU dapat menjalankan satu proses secara bersamaan.Jika Anda ingin memetakan daftar ke satu fungsi Anda akan melakukan ini:
Jangan gunakan utas karena GIL mengunci operasi apa pun pada objek python.
sumber
pool.map
menerima kamus sebagai args? Atau hanya daftar sederhana?Ini bisa dilakukan dengan sangat elegan bersama Ray .
Untuk memparalelkan contoh Anda, Anda harus mendefinisikan fungsi Anda dengan
@ray.remote
dekorator, dan kemudian memohonnya.remote
.Ada beberapa kelebihan dari hal ini dibandingkan modul multiprosesor .
Panggilan fungsi ini dapat disusun bersama, misalnya,
Perhatikan bahwa Ray adalah kerangka kerja yang telah saya bantu kembangkan.
sumber
pip
. Saya sarankan mencobapip install --upgrade pip
. Jika Anda perlu menggunakansudo
sama sekali maka ada kemungkinan bahwa versipip
yang Anda gunakan untuk menginstalray
tidak sama dengan yang ditingkatkan. Anda bisa memeriksanyapip --version
. Juga, Windows saat ini tidak didukung jadi jika Anda menggunakan Windows itu mungkin masalahnya.CPython menggunakan Global Interpreter Lock yang membuat pemrograman paralel sedikit lebih menarik daripada C ++
Topik ini memiliki beberapa contoh dan deskripsi tantangan yang berguna:
Solusi Python Global Interpreter Lock (GIL) pada sistem multi-core menggunakan tasket di Linux?
sumber
Solusinya, seperti yang orang lain katakan, adalah menggunakan banyak proses. Namun kerangka mana yang lebih tepat tergantung pada banyak faktor. Selain yang sudah disebutkan, ada juga charm4py dan mpi4py (saya adalah pengembang charm4py).
Ada cara yang lebih efisien untuk menerapkan contoh di atas daripada menggunakan abstraksi kumpulan pekerja. Loop utama mengirimkan parameter yang sama (termasuk grafik lengkap
G
) berulang kali ke pekerja di masing-masing dari 1000 iterasi. Karena setidaknya satu pekerja akan berada pada proses yang berbeda, ini melibatkan menyalin dan mengirimkan argumen ke proses lain. Ini bisa sangat mahal tergantung pada ukuran benda. Sebagai gantinya, masuk akal untuk meminta pekerja menyimpan status dan hanya mengirim informasi yang diperbarui.Misalnya, dalam charm4py ini dapat dilakukan seperti ini:
Perhatikan bahwa untuk contoh ini kita hanya perlu satu pekerja. Loop utama dapat menjalankan salah satu fungsi, dan meminta pekerja mengeksekusi yang lain. Tetapi kode saya membantu mengilustrasikan beberapa hal:
result_a.get()
diblokir menunggu hasil, pekerja A melakukan perhitungan dalam proses yang sama.sumber
Dalam beberapa kasus, dimungkinkan untuk secara otomatis menyejajarkan loop menggunakan Numba , meskipun itu hanya bekerja dengan subset kecil dari Python:
Sayangnya, tampaknya Numba hanya bekerja dengan array Numpy, tetapi tidak dengan objek Python lainnya. Secara teori, mungkin juga untuk mengkompilasi Python ke C ++ dan kemudian secara otomatis memparalelasinya menggunakan kompiler Intel C ++ , meskipun saya belum mencobanya.
sumber
Anda dapat menggunakan
joblib
pustaka untuk melakukan komputasi paralel dan multiprosesing.Anda cukup membuat fungsi
foo
yang ingin Anda jalankan secara paralel dan berdasarkan pada potongan kode berikut yang mengimplementasikan pemrosesan paralel:Di mana
num_cores
dapat diperoleh darimultiprocessing
perpustakaan sebagai berikut:Jika Anda memiliki fungsi dengan lebih dari satu argumen input, dan Anda hanya ingin mengulangi salah satu argumen dengan daftar, Anda dapat menggunakan
partial
fungsi darifunctools
pustaka sebagai berikut:Anda dapat menemukan penjelasan lengkap tentang python dan R multiprocessing dengan beberapa contoh di sini .
sumber