Mizu – Paylaşımlı Bellek Üzerinden Sıfır Kopyalamalı Paralel R ve Python
Kaynak: Hacker News
İç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,pandasveduckdbile veri kopyalama maliyeti olmadan entegrasyon sağlar. - Doğrudan
concurrent.futures.Executoruyumluluğu: GerçekFuturenesneleri,wait,as_completedveasyncio.wrap_futuredesteği ile mevcut kodlara kolayca adapte edilir. - Olay güdümlü (event-driven)
asyncio: Görevleri ve haritalamalarıawaitile bekleme, kanallardaasync forverecv_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