- Bu yazı, saf Python kodunu önceden derleme (AOT) ile çapraz platform çalıştırılabilir dosyalara dönüştürmeye yönelik bir girişim ve tasarımı, örnekler üzerinden anlatıyor
- Temel fikir; yeni bir JIT geliştirmek ya da her şeyi C++ ile baştan yazmak yerine, sembolik izleme → IR → C++ kod üretimi → çoklu hedef derleme hattıyla optimize edilmiş çekirdekler üretmek
- PEP 484 tip notasyonları ile tip yayılımı başlatılıyor, yapay zeka kod üretimi ile yüzlerce C++ operatörü otomatik uygulanarak Numpy, OpenCV, PyTorch gibi geniş kütüphane çağrıları kapsanıyor
- Aynı Python fonksiyonu için farklı uygulama yolları büyük ölçekte üretilip dağıtılıyor ve gerçek ölçüm telemetrisi ile en hızlı varyantı seçen ampirik performans optimizasyonu stratejisi benimseniyor
- Amaç, konteynere bağımlı olmayan küçük, hızlı ve taşınabilir ikili dosyalar sağlayarak bunları sunucu, masaüstü, mobil ve web dahil her yerde çalışabilen bir dağıtım birimi haline getirmek
Foreword
- Python'ın sadeliği ve üretkenliği güçlü yanları olsa da, yüksek yük işlerinde performans ve taşınabilirlik sınırları bulunuyor
- Konuk yazar Yusuf Olokoba'nın bu yazısı, orijinal Python'u koruyarak hızlı ve taşınabilir çalıştırılabilir dosyalar üreten bir derleyici tasarımını tanıtıyor
- Yaklaşım, JIT eklemeden veya her şeyi C++'a yeniden yazmadan bir hat kurup çekirdek optimizasyonu sağlamayı amaçlıyor
Introduction
- Hedef, değiştirilmemiş Python'u tam AOT ile derleyip yorumlayıcı olmadan çalışan, C/C++'a yakın hızda ve tüm platformlarda çalışabilen hale getirmek
- Mevcut girişimlerden (Jython, RustPython, Numba, PyTorch, Mojo vb.) farklı olarak yaklaşım, dil veya çalışma zamanı değiştirmek yerine kod dönüştürme ve çekirdek üretimini seçiyor
- Bu şekilde derlenmiş Python fonksiyonları halihazırda her ay binlerce cihazda kullanılıyor
Containers Are the Wrong Way to Distribute AI
- Gerçek dağıtım senaryolarında konteynerler, yorumlayıcı, paketler ve OS anlık görüntüleri gibi aşırı yük taşıyarak başlatma gecikmesi ve taşınabilirlik kısıtları yaratıyor
- Alternatif, yalnızca modeli içeren kendi kendine yeterli çalıştırılabilir dosyalar; bu yaklaşım daha küçük boyut, daha hızlı açılış ve sunucu, masaüstü, mobil, web genelinde çalışabilme sunuyor
- Temel fikir, dağıtım birimini bir OS anlık görüntüsünden kendi başına çalışan bir ikiliye dönüştürmek
Arm64, Apple, and Unity: How It All Began
- Apple'ın arm64 geçişi sırasında Unity'nin CIL'i C++'a çeviren IL2CPP yaklaşımı sayesinde tüm hedeflere derleme yapabilmesi örnek alınıyor
- Aynı fikir Python'a uygulanarak, her yerde çalışabilen kod yolları elde etme vizyonu kuruluyor
Sketching Out a Python Compiler
- Üst düzey tasarım, Python girişi → sembolik iz (IR) → C++ üretimi → çoklu hedef derleme adımlarından oluşuyor
- IR'den doğrudan nesne koduna gitmek yerine C++'ın ara çıktı olarak seçilmesinin nedeni, CUDA, MLX, TensorRT, AMX gibi hızlandırma yollarını azami ölçüde kullanabilmek
- Hedef, donanıma özgü en iyi yolların kolayca eklenebildiği genişletilebilir bir tasarım kurmak
Building a Symbolic Tracer for Python
- İlk PyTorch FX tabanlı izleme yaklaşımı, çalıştırma gereksinimi ve yalnızca PyTorch işlemleriyle sınırlı kalması nedeniyle yetersiz kaldı
- Bunun yerine AST ayrıştırma tabanlı bir sembolik izleyici kurularak kontrol akışı ve çağrı çözümleme IR'ye dönüştürülüyor
- Mevcut izleyici şu anda statik analiz, kısmi değerlendirme ve sandbox tabanlı canlı değer gözlemi gibi yetenekler sunuyor
Lowering to C++ via Type Propagation
- Python'ın dinamik tip sisteminden, C++'ın statik tip sistemine köprü kurmak için tip yayılımı kullanılıyor
- Girdi bağımsız değişkenlerinin tipleri verildiğinde, ara değişken tipleri operatör tanımlarına göre deterministik olarak çıkarılabiliyor
- Her Python işlemi, karşılık gelen C++ uygulamasına eşleniyor ve fonksiyon genelinde tipler yayılıyor
Seeding the Type Propagation Process
- Tip yayılımını başlatmak için PEP 484 tip notasyonları kullanılıyor
- Bu, orijinal kodu değiştirmeme ilkesiyle çelişse de, özlü arayüz ve uyumluluk adına kabul edilebilir bir ödün olarak görülüyor
- Ayrıca fonksiyon imzasındaki tip sayısını sınırlamak gibi kısıtlarla basit bir tüketici arayüzü garanti ediliyor
Building a Library of C++ Operators
- Tüm fonksiyonları doğrudan C++ ile yazmak yerine, yalnızca izlenemeyen yaprak işlemler için elle/otomatik uygulama gerekiyor
- Pek çok Python kodu, az sayıdaki temel işlemin bileşiminden oluştuğu için, kapsanması gereken operatör kümesi görece küçük kalıyor
- LLM tabanlı kod üretimi ile birlikte kısıtlama, test ve koşullu derleme altyapısı kullanılarak Numpy, OpenCV, PyTorch gibi ekosistemler için yüzlerce fonksiyon uygulaması otomatikleştiriliyor
Performance Optimization via Exhaustive Search
- Performans optimizasyonunun her zaman ampirik olduğu kabul edilerek, farklı uygulama varyantlarının tamamı üretiliyor ve gerçek ölçüm karşılaştırmasıyla en iyisi seçiliyor
- Örneğin Apple Silicon'da yalnızca resize işlemi için bile Accelerate, vImage, Core Image, Metal gibi birden çok yol üretiliyor ve aynı işlevin çoklu ikilileri dağıtılıyor
- Ayrıntılı telemetri ile yol bazlı gecikmeler toplanıyor, ardından istatistiksel modellerle en hızlı varyant tahmin edilip seçiliyor
- Kullanıcı açısından sonuç, zaman geçtikçe kendiliğinden hızlanan bir çalışma deneyimi sunmak
Designing a User Interface for the Compiler
- Geliştirici deneyimini neredeyse sıfır öğrenme eğrisiyle sunmak için arayüz olarak PEP 318 dekoratörü
@compile seçiliyor
- CLI, dekoratörü giriş noktası kabul edip bağımlı kod grafiğini tarıyor ve derliyor
- Dekoratör parametreleri olarak tag, description, sandbox, metadata alınıyor; böylece ortamın yeniden üretimi ve arka uç seçimi (ONNXRuntime, TensorRT, CoreML, IREE, QNN vb.) destekleniyor
Closing Thoughts
- İstisnalar, lambda, özyineleme ve sınıflar gibi özelliklerde kısmi destek veya destek eksikliği var; özellikle bileşik tipler ve yüksek mertebeden tiplerde tip yayılımının genişletilmesi gerekiyor
- Hata ayıklama deneyimi, optimize derleme nedeniyle sembol bilgisinin azalmasıyla iz sürmeyi zorlaştıran bir sorun olmaya devam ediyor
- C++20 içindeki
std::span, concepts ve coroutines temel yapı taşları; C++23 içindeki std::generator, <stdfloat>, <stacktrace> ise akış işleme, half/bfloat16 ve istisna izleme tarafında katkı sağlayacak
- Nihai hedef, konteynersiz, küçük, hızlı ve güvenli çalıştırılabilir dosyalarla gömme ve algılama gibi yapay zeka iş yüklerini her yerde çalıştırılabilir bir dağıtım birimi haline getirmek
1 yorum
APE gibi bir şey sanmıştım ama o değilmiş.