İçeriğe geç
edumintsBlog
Yazılım3 dk okuma

Mizu – Paylaşımlı Bellek Üzerinden Sıfır Kopyalamalı Paralel R ve Python

Kaynak: Hacker News

Paylaş
YazılımEdumints Blog
İçindekiler 5 başlık

pymizu: İş Parçacığı Hızında Asenkron ve Paralel Python#

pymizu, paylaşımlı bellek (shared memory) üzerinden iş parçacığı (thread) hızında asenkron ve paralel Python çalıştırmayı sağlayan yenilikçi bir kütüphanedir. Soketler üzerinden yaklaşık 100 µs süren bir görev gidiş-dönüş (round trip) süresi pymizu ile 1 µs seviyesine düşer; böylece iş yüklerini tıpkı iş parçacıklarında olduğu gibi çok küçük parçalara bölebilirsiniz. Listeler, sözlükler, NumPy dizileri ve Arrow tabloları gibi yaygın veri yapıları, Python ve R arasında sıfır kopyalama (zero-copy) görünümleri olarak paylaşılabilir.

Varsayılan CPython yapısında GIL (Global Interpreter Lock), CPU yoğunluklu iş parçacıklarını aynı anda tek bir çekirdekte çalıştırır. Bu nedenle Python'da hesaplama paralelliği genellikle çoklu süreç (multiprocess) kullanımı anlamına gelir. Süreçler aynı zamanda hataları izole eder: Çöken bir işçi süreç (worker), ana sistemi beraberinde çökertmez. Kanallar ve iş çalma (work-stealing) görev havuzları, POSIX paylaşımlı belleği (Linux, macOS) veya Win32 dosya eşlemeleri (Windows) üzerinde çalışır. Kilitsiz (lock-free) tek üreticili tek tüketicili halkalar, toplu yayınlama, sıcak yolda (hot path) çekirdek (kernel) dışına çıkmayan bekleme mekanizması ve bir süreç sonlandığında işletim sistemi bildirimi gibi mimari avantajlar sunar.

pymizu, kilitsiz paylaşımlı bellek süreçler arası iletişimi (IPC) için geliştirilmiş bir C kütüphanesi olan libmizu üzerine inşa edilmiştir. mizu aynı çekirdeği R dili için bağlar; böylece Python ve R birbirleriyle doğrudan ve yüksek hızda konuşabilir.

Temel Özellikler#

  • Sıfır kopyalamalı NumPy dizileri ve Arrow değişimi: pyarrow, polars, pandas ve duckdb ile veri kopyalama maliyeti olmadan entegrasyon sağlar.
  • Doğrudan concurrent.futures.Executor uyumluluğu: Gerçek Future nesneleri, wait, as_completed ve asyncio.wrap_future desteği ile mevcut kodlara kolayca adapte edilir.
  • Olay güdümlü (event-driven) asyncio: Görevleri ve haritalamaları await ile bekleme, kanallarda async for ve recv_async() kullanımı; yoklama (polling) iş parçacıkları olmadan veri geldiği anda uyanma sağlar.
  • Tekrarlanabilir paralel rastgele sayılar (seed=): İşçi sayısı veya iş çalma sırası ne olursa olsun her çalıştırmada birebir aynı sonuçları üretir.
  • İç içe (nested) paralel haritalamalar: Bir görev, kilitlenme (deadlock) riski olmadan kendi havuzu üzerinde tekrar haritalama yapabilir.

Yaşam Döngüsü: Deneysel (experimental). API henüz tam olarak kararlı değildir ve geri bildirimlere göre değişiklik gösterebilir.

Kurulum#

PyPI üzerinden kurulum:

pip install pymizu

Veya GitHub üzerinden geliştirme sürümü:

pip install git+https://github.com/shikokuchuo/pymizu

64-bit platformda Python 3.10 veya daha yeni bir sürüm gerektirir. Eklenti, kendi içinde barındırdığı C çekirdeğini derlediği için harici bir sistem kütüphanesine ihtiyaç duymaz.

İsteğe bağlı ekstralar:

  • pymizu[numpy]: Sıfır kopyalamalı dizi görünümleri ve ham katmanlı dizi hazırlama.
  • pymizu[cloudpickle]: Havuz görevleri olarak lambda ifadeleri, kapanışlar (closures) ve yerel fonksiyonların kullanımı.

GitHub kurulumunda ekstra bir özellik talep etmek için pip install "pymizu[numpy] @ git+https://github.com/shikokuchuo/pymizu" komutunu kullanabilirsiniz.

Hızlı Başlangıç (Quickstart)#

import pymizu

with pymizu.Pool.create(4) as pool:
    task = pool.submit(pow, 2, 16)
    print(task.collect(timeout=5))

Kıyaslamalar (Benchmarks) ve Pratik Çıkarımlar#

Apple M4 Pro üzerinde yapılan kıyaslamalarda pymizu, standart kütüphanedeki concurrent.futures havuzlarına kıyasla iletişim ek yükünü (overhead) radikal biçimde azaltır. Yazılım geliştirme ve veri bilimi projelerinde büyük veri setlerini süreçler arasında serileştirme (pickling) maliyeti olmadan taşımak, özellikle yüksek performanslı veri işleme boru hatlarında ve R-Python hibrit mimarilerinde ciddi bir hız ve bellek avantajı sağlar. Standart Executor arayüzünü desteklemesi sayesinde mevcut paralel Python kodlarınızı minimum değişiklikle hızlandırabilirsiniz.

Kaynak ve atıf

Bu yazı, Hacker News üzerinde yayımlanan içerikten yararlanılarak Edumints tarafından yapay zekâ desteğiyle Türkçe hazırlandı. Ayrıntılar ve yazarların kendi anlatımı için orijinaline bakabilirsin:

  • github.com/shikokuchuo/pymizu