Graf tugas dan metode penjadwalan

Pemrograman Paralel dengan Dask di Python

James Fulton

Climate Informatics Researcher

Memvisualisasikan graf tugas

# Buat 2 objek delayed
delayed_num1 = delayed(my_square_function)(3)
delayed_num2 = delayed(my_square_function)(4)

# Jumlahkan
result = delayed_num1 + delayed_num2

# Plot graf tugas result.visualize()

Diagram yang menunjukkan langkah untuk menghitung hasil. my-square-function dijalankan dua kali, dan dua keluarannya dimasukkan ke fungsi add. Ini mengembalikan satu keluaran.

Pemrograman Paralel dengan Dask di Python

Graf tugas yang tumpang tindih

delayed_intermediate = delayed(my_square_function)(3)

# Kedua hasil ini memakai delayed_intermediate_result
delayed_result1 = delayed_intermediate - 5
delayed_result2 = delayed_intermediate + 4
Pemrograman Paralel dengan Dask di Python

Graf tugas yang tumpang tindih

delayed_result1.visualize()

Diagram yang menunjukkan graf tugas untuk hasil 1.

delayed_result2.visualize()

Diagram yang menunjukkan graf tugas untuk hasil 2.

Pemrograman Paralel dengan Dask di Python

Graf tugas yang tumpang tindih

# Plot graf tugas
dask.visualize(delayed_result1, delayed_result2)

Graf tugas yang menunjukkan hasil 1 dan hasil 2 berbagi hasil antara.

Pemrograman Paralel dengan Dask di Python

Multi-threading vs. pemrosesan paralel

Memindahkan data

Pemrosesan paralel
  • Proses punya ruang RAM sendiri
Multi-threading
  • Thread memakai RAM yang sama
Pemrograman Paralel dengan Dask di Python

Multi-threading vs. pemrosesan paralel

# Menjumlahkan dua array besar
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# Komputasi memakai proses
dask.compute(sum1, sum2)
  • Lambat dengan pemrosesan paralel

Diagram menunjukkan dua array yang berasal dari satu proses Python harus dikirim ke dua proses Python lain.

Pemrograman Paralel dengan Dask di Python

Multi-threading vs. pemrosesan paralel

# Menjumlahkan dua array besar
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# Komputasi memakai thread
dask.compute(sum1, sum2)
  • Cepat dengan multi-threading

Diagram menunjukkan kedua array tidak perlu disalin.

Pemrograman Paralel dengan Dask di Python

GIL

Global interpreter lock - hanya satu thread yang dapat membaca skrip Python pada satu waktu

def sum_to_n(n):
    """Menjumlahkan angka dari 0 hingga n"""
    total = 0
    for i in range(n+1):
        total += i
    return total
  • Multi-threading tidak membantu di sini
  • Pemrosesan paralel membantu
sum1 = delayed(sum_to_n)(1000)
sum2 = delayed(sum_to_n)(1000)
Pemrograman Paralel dengan Dask di Python

Contoh waktu - GIL

Tiga bagan Gantt yang menunjukkan waktu menjalankan fungsi Python sederhana 16 kali. Dari tiga metode penjadwalan tugas, proses paling cepat.

Pemrograman Paralel dengan Dask di Python

Fungsi yang melepaskan GIL

  • Mis. fungsi pd.read_csv() melepaskan GIL
df1 = delayed(pd.read_csv)('file1.csv')
df2 = delayed(pd.read_csv)('file2.csv')
Pemrograman Paralel dengan Dask di Python

Contoh waktu - Memuat data

Tiga bagan Gantt yang menunjukkan waktu menjalankan fungsi pemuatan data dari CSV sebanyak 16 kali. Dari tiga metode penjadwalan tugas, thread paling cepat.

Pemrograman Paralel dengan Dask di Python

Ringkasan

Thread

  • Sangat cepat diinisiasi
  • Berbagi ruang memori dengan sesi utama
  • Tidak perlu transfer memori
  • Dibatasi GIL: hanya satu thread membaca kode sekaligus

Proses

  • Butuh waktu dan memori untuk disiapkan
  • Punya kolam memori terpisah
  • Sangat lambat mentransfer data antarproses dan ke sesi Python utama
  • Masing-masing punya GIL sendiri, jadi tidak perlu bergiliran membaca kode
Pemrograman Paralel dengan Dask di Python

Ayo berlatih!

Pemrograman Paralel dengan Dask di Python

Preparing Video For Download...