- Python steering council menyatakan niat untuk menyetujui PEP 703, yang menjadikan GIL sebagai opsi selama beberapa rilis, dan syarat akhirnya masih dalam penyesuaian
- Build
--disable-gilpada CPython 3.13 disiapkan sebagai eksperimen, dan stable ABI serta kompatibilitas wheel modul ekstensi muncul sebagai isu teknis terbesar - Wheel
abi3yang ada mungkin tidak langsung cocok dengan CPython 3.13 tanpa GIL, sehingga adopsiabi4, perubahan limited C API, dan peralihan makro reference count menjadi pemanggilan fungsi sedang dibahas - Ada kekhawatiran bahwa
pipbisa salah memilih wheel untuk build dengan GIL dan build tanpa GIL; instalasi keliru yang terjadi diam-diam lebih berbahaya daripada kegagalan instalasi biasa - Untuk nama build tanpa GIL, free-threading diusulkan alih-alih
nogil, tetapi hal ini juga harus diselesaikan bersama nama executable, shebang, instalasi paralel, dan packaging distribusi
Posisi PEP 703 dan CPython tanpa GIL saat ini
- Python steering council pada akhir Juli menyatakan niat untuk menyetujui PEP 703, dan PEP ini berisi perubahan yang menjadikan global interpreter lock (GIL) sebagai opsi di CPython
- Syarat persetujuan rinci belum difinalkan, tetapi diskusi implementasi terkait dan persiapan ekosistem sudah berjalan
- Dalam jangka panjang, arahnya membayangkan satu versi CPython tanpa GIL, tetapi untuk saat ini tahapnya adalah menguji perilaku tanpa GIL pada interpreter yang dibangun dengan opsi
--disable-gil - CPython 3.13 dijadwalkan pada Oktober 2024, dan build tanpa GIL pada versi ini bersifat eksperimental
Stable ABI dan kompatibilitas modul ekstensi
- Sam Gross membahas bagaimana PEP 703 dan stable ABI CPython saling berkaitan di Python discussion forum
- Stable ABI digunakan agar modul ekstensi dapat berjalan sebagai wheel biner yang sama di beberapa versi CPython, sehingga tidak perlu dibangun ulang untuk setiap rilis CPython baru
- Ekstensi yang dibangun untuk stable ABI mungkin tidak langsung berjalan pada build CPython 3.13 tanpa GIL
- Untuk menyelesaikan hal ini, beberapa penambahan dan perubahan pada limited C API diusulkan
- Ekstensi yang hanya menggunakan limited C API dapat membuat biner yang memakai stable ABI
- Usulan perubahan mencakup rencana yang sudah ada untuk mengubah sebagian makro yang menaikkan dan menurunkan reference count objek menjadi pemanggilan fungsi
- Tujuannya adalah memungkinkan biner ekstensi yang dapat berjalan baik pada build dengan GIL maupun build tanpa GIL
abi3, abi4, dan masalah pemilihan wheel
- Victor Stinner menilai bahwa agar eksperimen tanpa GIL berhasil, diperlukan solusi sederhana untuk ekstensi yang berjalan pada kedua jenis interpreter
- Karena ekstensi yang dibangun untuk stable ABI pada CPython 3.12 ke bawah tidak kompatibel dengan build tanpa GIL pada 3.13 dan setelahnya, muncul opsi membuat versi ABI baru, yaitu abi4
- Stable ABI saat ini adalah
abi3 - Nomor ABI dan nomor versi mayor CPython tidak harus selalu saling terhubung
- Stable ABI saat ini adalah
- Gross menilai ekstensi yang ingin mendukung tanpa GIL sampai batas tertentu dapat menerima beban membuat dua wheel biner
- Ia lebih khawatir jika proyek tanpa GIL terlalu terikat pada perbaikan C API dan stable ABI
- Alex Gaynor juga memiliki beberapa paket wheel
abi3, tetapi menilai bahwa membuat dua wheel satu kali bukan beban yang terlalu besar- Namun, yang penting adalah apakah
pipyang ada dan yang akan datang memilih wheel yang tepat di antara keduanya
- Namun, yang penting adalah apakah
- Brett Cannon menilai logika
pipsaat ini tidak dapat membedakan kedua versi, sehingga tanpa perubahan sepertiabi4,pipyang ada dan versi lama tidak akan berjalan dengan benar
Kekhawatiran terhadap perilaku salah pip yang diam-diam
- Gross menilai dukungan untuk
piplama pada build eksperimental--disable-gildi CPython 3.13 tidak perlu terlalu dikhawatirkan- Alasannya,
piplama cukup sering rusak pada versi Python baru - Sebagai contoh, ia menyebut kasus
pip==23.1.1ke bawah yang rusak di CPython 3.13 karena tidak adanyapkgutil.ImpImporter
- Alasannya,
- Maintainer
pip, Paul Moore, menilai rusak secara eksplisit dan menginstal paket yang salah secara diam-diam adalah masalah yang berbeda- Ada pengguna yang memakai
piplama - Kegagalan eksplisit dan kesalahan diam-diam memiliki dampak berbeda bagi pengguna
- Ada pengguna yang memakai
- Moore khawatir pengguna yang ingin mencoba build tanpa GIL atau free-threaded akan kehilangan semangat jika harus men-debug masalah kompatibilitas ABI
- Gaynor juga menilai jika
pipberperilaku salah secara diam-diam pada paket yang terdampak, issue bisa membanjir
Instalasi paralel dan nama executable
- Barry Warsaw bertanya apakah ada rencana untuk memasang build dengan GIL dan build tanpa GIL bersama-sama pada sistem yang sama
- Gross menjawab bahwa situasi ini sama seperti memasang versi Python yang berbeda
- Cannon menilai pendekatan memasukkan dua biner ke dalam satu wheel “fat” juga mungkin
- Namun, nama biner di dalam wheel harus berbeda
- Diskusi nama executable berlanjut ke thread terpisah
- Paul Moore menilai pengguna harus dapat dengan mudah menguji mode tanpa GIL dan memilih salah satu dari GIL/tanpa GIL
- Jika proses ini sulit di Windows, macOS, Linux, dan lainnya, hal itu dapat berdampak negatif pada proyek tanpa GIL
- Pengguna harus bisa mencobanya dengan mudah agar muncul permintaan terhadap build tanpa GIL, dan agar maintainer paket juga mendapat tekanan untuk menyediakan wheel yang kompatibel dengan tanpa GIL
Perdebatan nama nogil dan free-threading
- Barry Scott menilai nama executable penting karena baris shebang harus menunjukkan interpreter mana yang akan dipanggil
- Ia memberi contoh nama seperti
python-nogil3,python-nogil3.13
- Ia memberi contoh nama seperti
- Gregory P. Smith menyampaikan pendapat pribadi bahwa karena build tanpa GIL pada CPython 3.13 adalah fitur eksperimental, distribusi tidak seharusnya menaruhnya di
$PATHdefault- Ia juga menilai situasi ketika nama executable yang panjang tertinggal lama di shebang tidak diinginkan
- Ia mengusulkan untuk menunda keputusan nama instalasi sampai setelah 3.14
- Petr Viktorin, developer Fedora, menunjukkan bahwa distribusi kemungkinan besar ingin mem-package interpreter tanpa GIL untuk eksperimen pengguna
- Moore menilai ia ingin menentukan build free-threaded dalam bentuk seperti
#!/usr/bin/env python3.13-nogil- Ini adalah kebutuhan untuk menghindari hardcoding path yang panjang dan tidak intuitif
- Dalam thread terkait installer Windows yang dimulai Steve Dower, Smith menyatakan steering council ingin menghindari nama
nogil- Alasannya, nama itu tidak tersampaikan dengan baik kepada sebagian besar developer non-core, tidak ada kebutuhan untuk mengetahui apa itu GIL, dan mengandung ekspresi negatif
- Sebagai alternatif, istilah free-threading diusulkan
- Gross menilai
free-threadingjuga tidak mudah dipahami orang luar dan bukan istilah yang digunakan secara luas - Dalam diskusi sebenarnya, preferensi terhadap nama pendek cukup kuat, dan dari sisi itu
nogiladalah kandidat terkuat - Perubahan konkret yang tercermin adalah penggantian tag ABI build tanpa GIL dari
nmenjadittberarti threading
Usulan abi4 dan pekerjaan yang tersisa
- Gross dan Viktorin membahas titik-titik bermasalah dalam usulan perubahan API, dan umpan balik itu mengarah pada usulan ABI baru, yaitu abi4
- Gross telah membuat prototipe untuk ABI baru tersebut
- Viktorin secara umum setuju dengan pendekatannya, tetapi menilai detailnya masih perlu dibereskan lebih lanjut
- Stinner menilai diperlukan PEP untuk abi4, dan Viktorin menerima ini sebagai diskusi pre-PEP
- Ada kebingungan tentang jaminan kompatibilitas yang diberikan oleh kombinasi versi limited C API dan
abi3, dan bagian ini juga memengaruhi arahabi4 - Penyelidikan terkait masih terus berjalan, dan ada kemungkinan diskusi tatap muka dilakukan dalam core developer sprint pada pertengahan Oktober
Rumusan persetujuan final dan dampak jangka panjang
- Pekerjaan CPython tanpa GIL atau free-threaded terus berjalan, tetapi persetujuan final PEP 703 masih menunggu
- Keterlambatannya memang agak panjang, tetapi PEP 703 dan dampak ikutannya kemungkinan akan sangat memengaruhi pengembangan CPython dan ekosistemnya selama lebih dari 5 tahun ke depan
- Steering council berupaya memperjelas kriteria persetujuan
- Thomas Wouters menyatakan bahwa ia sedang memoles rumusan persetujuan yang tepat dan berupaya memperjelas beberapa keputusan
- Sebagian pekerjaan juga dapat berlangsung dalam core developer sprint
1 komentar
Pendapat di Hacker News
Melihat komputer modern, saya jadi berpikir bahwa paralelisme eksplisit mungkin merupakan unsur ilmu komputer yang lebih fundamental daripada yang sedang populer di buku teks
Mungkin sekarang kita sudah berada pada tahap di mana kita harus selalu menulis kode paralel secara eksplisit
Misalnya, loop
fordigantikan oleh operasi sepertiforeach,map, danfilter. Ekspresi semacam ini memberi tahu compiler/interpreter bahwa kita ingin menerapkan suatu pekerjaan ke semua item dalam struktur data, lalu menyerahkan apakah dan bagaimana memparalelkannya kepada compiler/runtimeDalam menjalankan layanan web, tiap request sudah cukup cepat, dan manfaat paralelisme yang sebenarnya ada pada pemrosesan banyak request secara berdampingan. Di sinilah No-GIL cocok
Jika ada banyak sub-request dalam satu request, biasanya itu ditangani dengan kode asinkron, tetapi sering kali alasannya bukan karena keuntungan performa async, melainkan karena membuat thread itu mahal atau thread pool merepotkan. Async bagus untuk throughput, tetapi buruk untuk latensi, dan ketika memparalelkan request layanan, biasanya latensi lebih menjadi kekhawatiran. Async menang terutama karena kemudahan penggunaan
Bentuk paralelisme lain terlihat pada pekerjaan offline berskala besar. Contohnya MapReduce atau Presto, dan umumnya bentuknya mirip masalah divide-and-conquer. Pelatihan model GPU juga mirip dengan ini
Yang tidak terjadi adalah algoritma lokal yang sangat paralel. Di layanan web, ukuran datanya kecil sehingga keuntungan latensinya kecil, implementasinya kompleks, dan biaya koordinasi antar-thread menjadi besar. Pengecualian kecilnya adalah algoritma tervectorisasi, tetapi ini berjalan di satu core sehingga tidak ada overhead koordinasi, dan inferensi online juga kembali sangat kuat tervectorisasi
Seiring waktu, keduanya membaik. Seperti makin banyak bahasa dan library yang secara default menjadi aman, kini makin banyak hal yang secara default bersifat paralel. Masih ada jalan panjang, tetapi saya rasa untung kita tidak melakukannya terlalu dini. Sebab teknologinya jauh membaik selama 10 tahun terakhir
Misalnya, kita bisa membandingkan apa yang dapat dilakukan secara aman dengan Rayon di Rust dengan apa yang dulu dilakukan secara tidak aman menggunakan OpenMP di C++
Lebih jauh di luar itu ada hal-hal seperti ini yang saya kerjakan: https://legion.stanford.edu/, https://regent-lang.org/, https://github.com/nv-legate/cunumeric
Karena ini adalah detail implementasi, jika bisa diabstraksikan agar lebih mudah dimanfaatkan, maka seharusnya begitu
Sebagai perbandingan, mutex sekitar 25 nanodetik dan akan bertambah jika ada contention, tetapi mutex adalah sinkronisasi point-to-point
Hal bagus dari Disruptor adalah beberapa thread dapat menerima pesan yang sama tanpa banyak usaha tambahan
https://github.com/LMAX-Exchange/disruptor/wiki/Performance-...
https://gist.github.com/rmacy/2879257
Saya memimpikan bahasa yang mirip Smalltalk, tetapi tetap single-thread sampai paralelisasi benar-benar masuk akal
Saya sedang mencari masalah paralelisme yang bukan big data. Paralelisme lebih mirip menambahkan lebih banyak mobil ke jalan daripada meningkatkan kecepatan mobil. Namun saya masih mencari tahu pekerjaan apa yang perlu dilakukan pengguna desktop atau mobile secara lokal dengan memanfaatkan kekuatan matematis komputer
Sebagai ide paralelisme, saya juga memikirkan arsitektur Itanium dan VLIW
Pakai saja
-ng. Bisa berarti no-gil atau next-generationAda flag compiler baru, flag linker baru, menautkan library berbeda, bahkan sampai memakai perintah compiler yang sama sekali berbeda. AIX khususnya begitu
Untuk masalah shebang, sepertinya lebih baik mengandalkan konvensi Python yang sudah ada:
from __future__ import nogilPada titik itu, interpreter bisa di-hot-swap
from __future__ importbukan pernyataan runtime, melainkan pernyataan khusus yang menunjukkan flaghttps://docs.python.org/3/reference/simple_stmts.html#future...
Pernyataan future berlaku per modul, dan GIL/no-GIL tidak mudah masuk ke model itu
Setiap kali melihat usulan ini, saya bertanya-tanya bagaimana menjamin program tetap berjalan dengan benar. Banyak kode Python multithread yang ada ditulis dengan cara yang tidak aman
Masalahnya terutama adalah data race yang berulang kali saya lihat di codebase berbagai perusahaan dan proyek open source. Program-program seperti ini tidak rusak hanya karena secara implisit bergantung pada fakta bahwa GIL hanya mengizinkan satu thread berjalan pada satu waktu
Jika GIL hilang, program-program seperti ini akan rusak. Karena Python adalah bahasa bertipe dinamis, saya sangat meragukan akan ada static analyzer yang bisa menemukan masalah seperti ini pada program Python yang sudah ada
Yang lebih mungkin terjadi adalah bug halus yang muncul secara nondeterministik saat runtime. Akan lebih baik kalau langsung crash, tetapi bug jenis ini kemungkinan besar berujung pada perilaku yang salah
Mungkin usulan tanpa GIL ini memang bukan untuk dipakai di sebagian besar program. Bisa jadi ini adalah alat yang sangat terspesialisasi untuk segelintir situasi ketika programmer tahu bahwa tidak ada GIL dan bisa menulis kode sesuai kondisi itu
GIL hanya berarti satu thread pada satu waktu dapat mengeksekusi bytecode Python. Interpreter yang memiliki GIL pun dapat berpindah thread di antara bytecode, dan banyak operasi Python membutuhkan beberapa bytecode. Ini termasuk metode bawaan pada tipe bawaan yang banyak orang anggap “atomik”
Karena itu Python saat ini tetap menyediakan hal seperti lock, mutex, dan semaphore meskipun ada GIL
Thread yang berebut GIL sudah bisa saling merebut GIL pada waktu yang buruk dan menimbulkan kekacauan
Jika program hanya berjalan tanpa GIL ketika semua dependensi mengizinkannya, seharusnya ada cukup waktu untuk memperbaiki bug semacam itu
Jadi masalah ini mungkin baru akan ditangani dalam skala besar mendekati tahun 2030. Saya juga jarang melihat produksi yang langsung menaikkan runtime yang dipakai ke rilis terbaru
Saya tidak ingin terdengar kasar, tetapi Steering Council sudah mengatakan mereka tidak menginginkan migrasi lain seperti dari 2 ke 3, jadi orang tidak akan memperbarui dengan enteng. Sebagian besar materi yang ada online sekarang bisa berbahaya jika sekadar disalin-tempel
Dalam kode Python nyata ada sangat banyak bug threading
Bukankah OCaml juga mengalami evolusi serupa? Saya penasaran apakah ada hal yang bisa dibandingkan di antara kedua proyek itu
Jadi API thread lama membuat thread di dalam domain saat ini dan dapat mengisolasi kode yang mengharapkan adanya lock. Kode baru bisa membuat domain baru yang dimulai dengan satu thread. Keduanya juga bisa sengaja dipakai bersama sebagai bentuk scheduling
Python sedang mencoba membuat lock secara global menjadi sepenuhnya opsional di luar kendali penulis library. Namun lock di Python tampaknya dijamin hanya melindungi runtime itu sendiri, sehingga sebagian besar kode yang bergantung pada lock itu kemungkinan besar memang sudah memiliki bug, dan karena itu rencana Python juga terlihat bisa dijalankan
Kalau ada kesamaan, mungkin sebatas harus menemukan dan memperbaiki shared state yang tak terduga di seluruh codebase runtime, serta merevisi C ABI
Sekarang Python juga punya kesempatan mengejar Tcl dalam performa multithread: https://www.hammerdb.com/blog/uncategorized/why-tcl-is-700-f...
Saya lebih ingin mem-porting kode Python ke Mojo untuk mendapatkan multithreading, SIMD, dan peningkatan kecepatan lain
Tidak ingin memindahkan kode Python ke Python nogil? Kalau begitu didownvote, kira-kira begitu
Kalau harus diberi nama, opsi seperti
python4,python3-gilfoil,python3-gilfreebisa sajaArus yang saat ini berfokus pada Python tanpa GIL terasa cukup aneh. Tim Faster CPython memasang target ambisius untuk meningkatkan performa CPython sebesar 50% di setiap rilis
Di 3.11 memang ada peningkatan nyata, tetapi masih jauh dari 50%, dan dalam banyak pengujian kami, 3.12 hasilnya mirip atau malah lebih lambat. Multithreading sungguhan tentu bagus, tetapi kami jauh lebih menginginkan performa single-thread ditingkatkan terlebih dahulu
Tentu, saya mengakui bahwa kebutuhan kami belum tentu mewakili semua orang, dan saya berterima kasih atas semua pekerjaan yang membuat Python menjadi bahasa yang hebat. Namun tetap saja saya penasaran, apa yang saya lewatkan?
Saat ini penggunaan banyak core dilakukan lewat multiprocessing, tetapi ada banyak keterbatasan. Saya paham bahwa beberapa interpreter bisa hadir bersama hal-hal seperti coroutine, tetapi tetap saja saya lebih menyukai opsi multithreading sungguhan
Di Python nogil, misalnya, beberapa thread dapat memanggil kode C dengan shared state yang dapat diakses sebagai objek Python. Ini cukup penting untuk machine learning, dan faktanya bentuk PEP saat ini berasal dari tim PyTorch
Performa single-thread juga penting, tetapi untuk bagian yang kritis, sudah ada workaround yang cukup baik seperti numba, Cython, dan Mojo
Urutan juga penting. Jika nogil diperkenalkan, sebagian besar pekerjaan faster CPython bisa saja sepenuhnya dibuang, jadi tim-timnya harus berkoordinasi
Di dunia ideal, bentuknya adalah ada mode nogil sekaligus peningkatan performa single-thread. Guido juga mengisyaratkan bahwa ia sedang mempertimbangkan JIT yang canggih
Python membuat abstraksi level rendah sangat nyaman ditangani dari bahasa yang levelnya lebih tinggi. Jadi sebagai pengembang Python lama, saya tidak terlalu stres soal GIL
Jika harus memilih salah satu, saya setuju bahwa untuk sebagian besar use case, kode single-thread yang lebih cepat memang lebih cocok. Namun tidak ada alasan kita tidak bisa memiliki keduanya
Kalau dilihat dengan hindsight memang jelas, tetapi seandainya pihak Python tahu betapa panjang dan menyakitkannya transisi dari 2 ke 3, rasanya mereka akan merombak internal interpreter jauh lebih besar
Setelah transisi 12 tahun, performa single-thread masih saja buruk, dan untuk mencapai multithreading sungguhan masih ada beberapa transisi menyakitkan lagi yang tersisa
Saya tahu kita harus bersikap baik terhadap pengembangan open source, tetapi saya bertanya-tanya, mulai titik mana boleh menyebut ini bahasa yang dikelola dengan sangat buruk?
Bagian terburuk Python adalah bagian-bagian yang sulit diubah karena Python terlalu populer dan ekosistemnya terlalu besar. Karena itu, segala jenis perubahan menjadi lebih sulit akibat kompatibilitas mundur
Ada kecenderungan terlalu cepat membela Python. Penting untuk melihatnya secara objektif tanpa bias
Proyek yang menginginkan performa dan sintaks Python bisa pindah ke sana. Python saat ini tampak seperti terseok-seok di antara banyak tujuan dan tidak benar-benar mencapai satu pun dengan baik
Perl 5/6 disebut sebagai contoh. Bahkan ketika sudah jelas bahwa tidak ada yang beralih, masih butuh sekitar 5 tahun lagi sampai ada upaya untuk membuatnya lebih mudah