Görev grafikleri ve zamanlama yöntemleri

Python ile Dask ile Paralel Programlama

James Fulton

Climate Informatics Researcher

Görev grafiğini görselleştirme

# 2 gecikmeli nesne oluştur
delayed_num1 = delayed(my_square_function)(3)
delayed_num2 = delayed(my_square_function)(4)

# Topla
result = delayed_num1 + delayed_num2

# Görev grafiğini çizdir result.visualize()

Sonucu hesaplamak için gereken adımları gösteren bir diyagram. my-square-function iki kez çalışır ve iki çıktı add fonksiyonuna gönderilir. Bu, tek bir çıktı döndürür.

Python ile Dask ile Paralel Programlama

Örtüşen görev grafiği

delayed_intermediate = delayed(my_square_function)(3)

# Bu iki sonuç aynı delayed_intermediate_result'u kullanır
delayed_result1 = delayed_intermediate - 5
delayed_result2 = delayed_intermediate + 4
Python ile Dask ile Paralel Programlama

Örtüşen görev grafiği

delayed_result1.visualize()

Sonuç 1 için görev grafiğini gösteren bir diyagram.

delayed_result2.visualize()

Sonuç 2 için görev grafiğini gösteren bir diyagram.

Python ile Dask ile Paralel Programlama

Örtüşen görev grafiği

# Görev grafiğini çizdir
dask.visualize(delayed_result1, delayed_result2)

Sonuç 1 ve sonuç 2'nin ortak bir ara sonucu paylaştığını gösteren bir görev grafiği.

Python ile Dask ile Paralel Programlama

Çoklu iş parçacığı vs. paralel işleme

Veriyi taşıma

Paralel işleme
  • Süreçlerin kendi RAM alanı vardır
Çoklu iş parçacığı (multi-threading)
  • İş parçacıkları aynı RAM alanını kullanır
Python ile Dask ile Paralel Programlama

Çoklu iş parçacığı vs. paralel işleme

# İki büyük dizide toplam çalıştır
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# Süreçlerle hesapla
dask.compute(sum1, sum2)
  • Paralel işlemeyle yavaş

Diyagram, bir Python sürecinden çıkan iki dizinin iki başka Python sürecine gönderilmesi gerektiğini gösterir.

Python ile Dask ile Paralel Programlama

Çoklu iş parçacığı vs. paralel işleme

# İki büyük dizide toplam çalıştır
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# İş parçacıklarıyla hesapla
dask.compute(sum1, sum2)
  • Çoklu iş parçacığıyla hızlı

Diyagram, iki dizinin hiç kopyalanmasına gerek olmadığını gösterir.

Python ile Dask ile Paralel Programlama

GIL

Global yorumlayıcı kilidi (GIL) - Aynı anda yalnızca bir iş parçacığı Python betiğini okuyabilir

def sum_to_n(n):
    """0'dan n'e kadar sayıları toplar"""
    total = 0
    for i in range(n+1):
        total += i
    return total
  • Burada çoklu iş parçacığı fayda sağlamaz
  • Paralel işleme sağlar
sum1 = delayed(sum_to_n)(1000)
sum2 = delayed(sum_to_n)(1000)
Python ile Dask ile Paralel Programlama

Örnek süreler - GIL

Üç Gantt grafiği, basit bir Python fonksiyonunun 16 kez çalıştırılmasına ait süreleri gösterir. Üç farklı zamanlama yönteminden en hızlısı süreçlerdir.

Python ile Dask ile Paralel Programlama

GIL'i serbest bırakan fonksiyonlar

  • Örn. pd.read_csv() GIL'i serbest bırakır
df1 = delayed(pd.read_csv)('file1.csv')
df2 = delayed(pd.read_csv)('file2.csv')
Python ile Dask ile Paralel Programlama

Örnek süreler - Veri yükleme

Üç Gantt grafiği, bir CSV'den veri yükleyen bir fonksiyonun 16 kez çalıştırılmasına ait süreleri gösterir. Üç zamanlama yönteminden en hızlısı iş parçacıklarıdır.

Python ile Dask ile Paralel Programlama

Özet

İş parçacıkları

  • Başlatması çok hızlıdır
  • Ana oturumla bellek alanını paylaşır
  • Bellek aktarımı gerekmez
  • Kodu aynı anda bir iş parçacığının okumasına izin veren GIL ile sınırlıdır

Süreçler

  • Kurulum için zaman ve bellek gerekir
  • Ayrı bellek havuzları vardır
  • Birbirleri ve ana Python oturumu arasında veri aktarımı çok yavaştır
  • Her birinin kendi GIL'i vardır; kodu okumak için sıra beklemezler
Python ile Dask ile Paralel Programlama

Haydi pratik yapalım!

Python ile Dask ile Paralel Programlama

Preparing Video For Download...