· kaynak Hacker News – Front Page (hnrss.org)
uv, wheel çıkarma sırasında hashing buffer'larını yeniden kullanarak soğuk kurulum sürelerini yüzde 9,5'e varan oranda kısaltıyor
uv'de açılan bir pull request, wheel dosyalarını çıkarırken ve hash'lerken dosya başına buffer ayırmak yerine tek bir 64 KiB'lık buffer'ı yeniden kullanıyor ve soğuk kurulum benchmarklarını yüzde 9,5'e varan oranda hızlandırıyor.
Astral'ın Python paket yükleyicisi uv'deki bir performans yaması, wheel kurulumu sırasındaki küçük ama tekrarlanan bir maliyeti ortadan kaldırıyor: bir arşivi açarken hash'lediği her dosya için yeni bir buffer ayırmak yerine, uv artık wheel'in tamamı boyunca tek bir buffer'ı yeniden kullanıyor. Charlie Marsh tarafından uv'nin GitHub deposunda açılan pull request'e göre bu değişiklik, benchmark için kullanılan PyTorch wheel'i için hashing buffer ayırma sayısını 11.120'den bire düşürüyor ve yazarın ölçümlerinde soğuk kurulum sürelerini yaklaşık yüzde 7 ila 9,5 oranında kısaltıyor. Bu çalışma Hacker News'in ana sayfa akışında ortaya çıktı.
Ne değişti
Content hashing etkinleştirildiğinde — uv'nin content-addressed önbellekleme sisteminin arkasındaki mod — uv bir wheel'i çıkarma sırasında akış halinde işler, her dosyayı diske yazar ve baytlar geçerken hash'ler. Önceki uygulama, işlenen her dosya için yeni bir 64 KiB'lık buffer oluşturup sıfırlıyordu; dolayısıyla binlerce küçük dosyadan oluşan wheel'ler, yalnızca hash'leyiciye veri sağlamak için sürekli bir ayırma ve sıfırlama yükü ödüyordu.
Yama, bir wheel'in çıkarılması süresince tek bir buffer'ı canlı tutuyor ve onu dosya dosya yeniden kullanıyor. PR'ye göre buffer boyutu aktif wheel başına 64 KiB olarak kalıyor, yani değişiklik anlamlı bir bellek maliyeti eklemiyor — yalnızca ayırma sayısı düşüyor. Tasarruf dosya sayısıyla ölçeklendiğinden, PyTorch gibi çok sayıda dosya içeren paketler en çok yararlananlar oluyor.
Benchmark sayıları
Ölçümler Linux'ta alındı; taban ve aday çalışmaları dönüşümlü olarak yürütüldü, content-addressed önbellekleme etkin biçimde yerel HTTP üzerinden sunulan sabitlenmiş wheel'ler kullanıldı. Soğuk kurulum sonuçları:
| Senaryo | Önce | Sonra | Değişim |
|---|---|---|---|
| AnyIO | 110 ms | 107 ms | -%2,6 |
| SymPy | 845 ms | 775 ms | -%8,3 |
| NumPy | 627 ms | 567 ms | -%9,5 |
| PyTorch CPU | 6,50 s | 5,99 s | -%7,8 |
| 14 paketlik ortam, eşzamanlılık 4 | 6,95 s | 6,47 s | -%7,0 |
Bireysel paket sonuçları 16 eşleştirilmiş tur kullanırken, tam 14 paketlik ortam 12 tur kullandı. AnyIO, SymPy ve NumPy, ilk AnyIO zamanlamaları gürültülü olduğu için ilk 20 çiftlik geçişten sonra yeniden çalıştırıldı; PR, ilk SymPy ve NumPy iyileşmelerinin sırasıyla yüzde 7,8 ve 6,9 olduğunu belirtiyor. İlk çalışmalar, tekrarlar ve kontroller genelinde, ısınma ve önbellek hazırlama hariç 672 kurulum ölçüldü.
Uyarılar
Karşılaştırma tabanı uv'nin main dalı değil. PR, sayıların buffer-yeniden-kullanım optimizasyonu main üzerine taşınmadan önce, a188b8e commit'indeki deduplication çalışması ile üzerine bu optimizasyonun uygulandığı sürüm arasındaki karşılaştırmayı verdiğini belirtiyor; dolayısıyla main'e göre nihai kazançlar farklı olabilir. Önbelleğe alınmış kurulumlar ve yerel wheel kontrol çalışmaları tutarlı bir değişim göstermedi; bu da optimizasyonun yalnızca soğuk kurulumların devreye soktuğu çıkarma-ve-hash'leme yolunu hedeflemesiyle uyumlu.
Neden önemli
Hız, uv'nin pip ve diğer Python araçlarına karşı temel satış noktası ve content-addressed önbellekleme, uv'nin bütünlüğü doğrulamasını ve özdeş dosyaları ortamlar arasında paylaşmasını sağlayan şey. Bu güvenliğin bir CPU bedeli var: kurulan her wheel'in her baytı hash'leniyor. Hash'leme döngüsünü neredeyse ayırmasız hale getiren bir değişiklik, davranışı değiştirmeden veya bellek baskısı eklemeden bu dengesizliğin büyük kısmını ortadan kaldırıyor.
Kazançlar ayrıca Python kurulumlarının en çok canını yakan yerde ortaya çıkıyor. PyTorch ve NumPy gibi büyük bilimsel ve makine öğrenmesi paketleri tam da binlerce dosyaya sahip olanlar ve bu benchmarklarda en büyük iyileşmeyi onlar gösterdi — soğuk kurulumlarda sırasıyla yüzde 7,8 ve 9,5. Sürekli entegrasyon hatlarında ve container derlemelerinde, önbellekler genellikle boş olduğundan ve tam ortamlar sıfırdan kurulduğundan, bu yüzdeler her çalışmada katlanıyor.
Son olarak, bu PR küçük bir değişiklik için özenli benchmark'ın bir örneği: eşleştirilmiş dönüşümlü çalışmalar, gürültü tespit edildikten sonra tekrarlanan ölçümler, etkinin nerede görünüp nerede görünmemesi gerektiğini doğrulayan kontrol senaryoları ve taban commit'in tam olarak açıklanması. Bu şeffaflık, öne çıkan sayılara güvenmeyi kolaylaştırıyor.
- #python
- #uv
- #package-management
- #performance
- #open-source