Python and Multi-CPU-Arch – Towards AI

Python and Multi-CPU-Arch – Towards AI

Pengarang: Murli Sivashanmugam

Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda sedang membangun produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan untuk menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.

Memperbaiki kerusakan rantai alat python di mac M1/M2 dengan andal

Foto oleh Christopher Gower di Unsplash

pengantar

Salah satu tujuan desain python adalah menjadi platform agnostik dan menjalankan skrip tanpa modifikasi di seluruh lingkungan. Python melakukan pekerjaan yang cukup baik untuk memastikan kompatibilitas ini selama aplikasi dan pustaka ditulis menggunakan skrip python. Seiring popularitas dan adaptasi python meningkat, semakin banyak perpustakaan mulai menggunakan ekstensi python untuk memasukkan kode yang dipatuhi secara asli untuk meningkatkan kinerja dan efisiensi. Pustaka python populer seperti pandas dan NumPy dapat menangani data dalam jumlah besar secara efisien berkat ekstensi asli mereka. Karena semakin banyak pustaka python mulai menggunakan kode yang dipatuhi secara asli, masalah kompatibilitas platform mulai muncul di lingkungan python. Jika seseorang menggunakan MacBook berbasis Mx(M1/M2), kemungkinan besar telah menyaksikan masalah kompatibilitas platform di lingkungan python. Artikel ini berbicara tentang bagaimana pengelola perpustakaan python seperti pip dan conda mengelola binari yang bergantung pada platform, mengapa mereka rusak, dan bagaimana cara mengatasinya di pengaturan Mac M1/M2 dengan cara yang lebih sederhana, lebih andal, dan dapat direplikasi.

Binari Python, seperti biner lainnya, dikompilasi secara terpisah untuk arsitektur dan platform CPU yang berbeda (Windows/Mac/Linux). Saat python menginstal pustaka Python dalam sistem, ia mengumpulkan dan memproses metadata yang khusus untuk CPU dan platform lokal. Jika pustaka python menyertakan ekstensi asli apa pun, pustaka tersebut perlu dikompilasi ke dalam CPU dan biner khusus platform untuk dijalankan secara lokal. Pemahaman singkat tentang bagaimana manajer paket python seperti ‘PIP’ dan ‘conda’ mengelola dependensi CPU dan platform akan membantu memahami kekurangannya dan cara mengatasinya.

Dukungan Multi-Arch PIP

PIP menggunakan standar pengemasan ‘roda’ untuk mendistribusikan paket python. ‘Wheel’ adalah sistem pengemasan untuk mengemas skrip python murni dan ekstensi asli baik dalam kode sumber maupun format biner terkompilasi. Untuk mendapatkan perspektif yang lebih baik tentang bagaimana PIP mempertahankan format distribusi yang berbeda, kunjungi halaman web ‘pip’ dari perpustakaan pilihan Anda dan klik “Unduh File”. Pada halaman ini bagian “Distribusi Sumber” mencantumkan paket yang tersedia dalam format sumber, dan bagian “Distribusi Terbangun” mencantumkan semua paket yang tersedia dalam format biner yang dibuat sebelumnya. Misalnya, tautan halaman ini menunjukkan sumber dan distribusi bawaan untuk pustaka ‘panda’. Paket distribusi ini mengikuti konvensi penamaan seperti yang ditentukan di bawah ini.

{dist}-{version}(-{build})?-{python}-{abi}-{platform}.whl

Setiap bagian dalam {brackets} adalah tag atau komponen dari nama roda yang memiliki arti tentang isi roda dan di mana roda akan berfungsi atau tidak. Contoh:

pandas-1.5.0-cp311-cp311-macosx_11_0_arm64.whl

pandas — adalah nama perpustakaannya
1.5.0 — adalah versi perpustakaan
cp11 — Diperlukan versi python minimum
cp11 — Antarmuka biner aplikasi minimum (ABI) diperlukan
macosx_11_0_arm64 — Tag platform yang lagi-lagi dibagi lagi menjadi berikut ini:
– macosx — Sistem operasi
– 11_0 — Versi MacOS SDK minimum yang diperlukan
– arm64 — arsitektur CPU

Konvensi penamaan PIP juga mendukung ‘wildcard’ untuk mengoptimalkan bundel paket. Misalnya, ‘chardet-3.0.4-py2.py3-none-any.whl’ mendukung python2 dan python3 dan tidak memiliki ketergantungan pada ABI, dan dapat diinstal pada platform dan arsitektur CPU apa pun. Banyak pustaka python menggunakan opsi wildcard ini untuk mengoptimalkan jumlah bundel paket. Untuk informasi lebih lanjut tentang ‘roda’ dan PIP Python, silakan lihat Apa Itu Roda Python dan Mengapa Anda Harus Peduli?

Mengapa instalasi PIP gagal?

Sebagian besar waktu, instalasi PIP gagal karena dua alasan utama. Pertama, jika pustaka yang dibuat sebelumnya tidak tersedia di repositori, PIP akan mengkompilasi kode sumber ekstensi asli pada sistem host. Untuk melakukan itu, alat build dan library dependen lainnya akan tersedia di host. Terkadang ini menjadi tantangan untuk menginstal dependensi build secara lokal, terutama ketika pohon dependensi tumbuh lebih dalam.

Kedua, karena ‘wildcard’ dalam nama paket wheel. MacBook memperkenalkan arsitektur CPU ‘M1/M2’ berbasis lengan baru-baru ini. Beberapa paket roda lama untuk macOS terdaftar sebagai ‘apa saja’ untuk arsitektur CPU karena x86 adalah satu-satunya arsitektur yang didukung saat itu. Jika PIP menyelesaikan ketergantungan paket ke salah satu versi yang lebih lama ini, PIP akan menginstal paket ini pada arsitektur CPU yang lebih baru, dengan asumsi itu akan berjalan. Contoh masalah ini adalah dengan paket ‘Azure-eventhub’. Pustaka ini bergantung pada pustaka lain yang disebut ‘uamqp’. Pustaka ini mencantumkan paket universal/wildcard untuk macOS yang tidak kompatibel dengan prosesor arm64 M1/M2. Jika Anda menginstal ‘Azure-eventhub’ pada M1/M2, orang akan melihat bahwa paket tersebut akan berhasil diinstal tetapi akan mengeluarkan pengecualian runtime saat mengimpor paket ini.

Dukungan Multi-Arch Conda

Conda mengambil satu langkah lebih jauh dalam memastikan portabilitas platform. Conda mengemas tidak hanya pustaka python tetapi juga pustaka dependen, binari, kompiler, dan interpreter python sendiri untuk sistem operasi dan arsitektur CPU yang berbeda. Dengan cara ini memastikan seluruh toolchain portabel di seluruh lingkungan. Karena semua binari dependen juga dikemas dengan pustaka python, ia tidak mengharapkan dependensi apa pun pada sistem lokal kecuali untuk pustaka C standar. Jadi, jika conda memberikan portabilitas yang lebih baik dan memperbaiki kekurangan PIP, apa yang bisa salah? Masalahnya tidak semua paket python tersedia di Conda. Biasanya menggunakan pip dalam lingkungan conda untuk menginstal paket python yang tidak tersedia di conda; karenanya, seseorang terkena kekurangan PIP. Sekali lagi (bukan untuk nitpick) paket ‘Azure-eventhub’ adalah contoh yang sama.

Jika seseorang mengalami masalah kompatibilitas platform seperti itu dan ketika mencari solusi di forum, seseorang akan menemukan opsi yang berbeda seperti menginstal versi python atau perpustakaan tertentu, menginstal perpustakaan melalui sistem pengemasan lain seperti ‘brew’ atau menginstal paket alternatif, dll. Banyak dari perbaikan tersebut tidak dapat diandalkan untuk produksi dan mungkin tidak dapat direplikasi di seluruh sistem lain. Dikurasi di bawah ini adalah tiga opsi yang lebih sederhana, andal, dan dapat direplikasi untuk mengatasi masalah kompatibilitas platform python. Mereka:

Instal Pip dari Source Conda & Rosetta Docker Multi-Arch Builds

Instal Pip dari Sumber

Jika dependensi build untuk kode asli suatu paket minimal, seseorang dapat mengkompilasi ulangnya di sistem host. Ketika rantai alat python (perpustakaan) gagal dipasang, kemungkinan besar, itu bukan paket tingkat atas yang akan rusak tetapi paket dependen yang bersarang di pohon ketergantungan. Seseorang dapat menggunakan perintah berikut untuk menginstruksikan pip untuk tidak menginstal versi biner dari paket. Misalnya, perintah berikut akan melewatkan versi pip biner dari ‘uamqp’ dan mengompilasinya dari sumbernya.

instal pip –no-binary uamqp Azure-eventhub

Conda & Rosetta

Pendekatan lain untuk mengatasi masalah ini adalah dengan memanfaatkan ‘Rosetta’. Opsi paling sederhana untuk menjalankan python versi x86 di atas Rosetta adalah dengan menggunakan opsi conda platform override. Contoh

CONDA_SUBDIR=osx-64 conda create -n myenv_x86 python=3.10
conda aktifkan myenv_x86
conda config –env –set subdir osx-64 #Config menggunakan python versi platform x86_64
python -c “import platform;print(platform.machine())”

Variabel lingkungan “CONDA_SUBDIR” menimpa arsitektur CPU conda saat menjalankan perintah pembuatan lingkungan conda. Perintah conda config menimpa arsitektur CPU di lingkungan baru sepanjang waktu sehingga seseorang tidak perlu mengatur “CONDA_SUBDIR” untuk semua perintah lebih lanjut di lingkungan itu. Setelah membuat lingkungan baru dengan platform conda diganti ke x86, ia berperilaku seperti lingkungan conda lainnya. Seseorang dapat melakukan instalasi PIP di lingkungan ini, dan itu akan menginstal pustaka python versi x86. Beralih di antara beberapa lingkungan conda mulus di terminal yang sama, dan bahkan alat lain seperti VS Code bekerja dengan mulus tanpa masalah.

Docker Multi-Arch

Opsi ketiga lagi-lagi memanfaatkan Rosetta tapi lewat ‘docker’. Ini adalah opsi paling portabel dan mulus untuk bekerja di berbagai lingkungan dan pengguna. Fitur Multi-Platform Docker dapat digunakan untuk memaksa membangun gambar buruh pelabuhan x86 di MacBook M1/M2. Ketika docker run disajikan dengan image docker x86, ia secara internal menggunakan Rosetta untuk menjalankan image. Berikut adalah langkah-langkah untuk membangun gambar buruh pelabuhan lintas platform x86.

Contoh Dockerfile:

DARI gratis
JALANKAN pembaruan apt-get
JALANKAN apt-get install -y python3
CMD [“/usr/bin/python3”, “-c”, “import platform; print(“Platform:”, platform.machine())”]

Bangun gambar buruh pelabuhan x86:

$ docker build –platform linux/AMD64 . -t img_x86

Jalankan gambar buruh pelabuhan x86:

$ docker run –platform linux/AMD64 -it img_x86
Platform: x86_64

Untuk portabilitas yang lebih baik di banyak pengguna dan lingkungan, opsi “platform” dalam perintah FROM dari Dockerfile dapat digunakan. Ini memastikan gambar x86 digunakan bahkan jika opsi ” — platform” dari perintah build tidak ditentukan oleh pengguna.

Contoh Dockerfile:

DARI –platform=linux/amd64 ubuntu RUN apt-get update
JALANKAN apt-get install -y python3
CMD [“/usr/bin/python3”, “-c”, “import platform; print(“Platform:”, platform.machine())”]

File buruh pelabuhan ini akan membuat gambar buruh pelabuhan x86 tanpa opsi pembangunan buruh pelabuhan “ — platform”.

$ membangun buruh pelabuhan. -t img_x86
$ docker run -itu img_x86
Platform: x86_64

Kesimpulan

Opsi yang disebutkan di atas mungkin bukan satu-satunya cara untuk memperbaiki masalah kompatibilitas platform python dengan andal, tetapi saya yakin mereka akan berfungsi sebagai pendekatan umum yang mudah bagi banyak dari kita untuk dengan cepat mengatasi masalah seperti itu dan menghindari frustrasi dan menghemat waktu mencari kustom larutan. Mudah-mudahan, dalam waktu dekat ekosistem Python akan lebih berkembang dan matang untuk menangani multi CPU dan platform dengan mulus tanpa keterlibatan tambahan dari pengguna.

Python dan Multi-CPU-Arch awalnya diterbitkan di Towards AI on Medium, di mana orang-orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Menuju AI

Author: Jonathan Kelly