Proyek deep learning jarang berhenti pada satu paket: NumPy, PyTorch, TensorFlow, matplotlib, dan belasan paket pendukung lainnya saling bergantung dalam satu lingkungan. Tanpa pencatatan yang disiplin, lingkungan yang berfungsi hari ini tidak dapat dibangun ulang besok — di komputer rekan kerja, di server pelatihan, maupun di sistem CI. Disiplin ini bernama manajemen dependensi: mencatat paket apa saja dan versi mana saja yang dipakai proyek, lalu memastikan daftar tersebut cukup untuk membangun ulang lingkungan yang identik. Chapter ini mempraktikkan dua format utama — requirements.txt dan pyproject.toml — lalu mengenalkan uv sebagai alat modern yang mempercepat seluruh siklusnya.

Membekukan Versi ke requirements.txt #

Format paling tua sekaligus paling luas dipakai adalah requirements.txt: daftar paket dengan versi persis hasil pembekuan lingkungan. Kita buktikan siklusnya lengkap di mesin uji, mulai dari proyek kecil dengan dua paket:

bash
mkdir /tmp/manajemen-demo && cd /tmp/manajemen-demo
python3 -m venv .venv
source .venv/bin/activate
pip install numpy requests

Output yang Dihasilkan:

text
Successfully installed certifi-2026.7.22 charset-normalizer-3.5.2 idna-3.20 numpy-2.5.4 requests-2.34.2 urllib3-2.8.0

Perhatikan bahwa memasang dua paket menghasilkan enam paket terpasang — certifi, charset-normalizer, idna, dan urllib3 adalah dependensi transitif milik requests. Pembekuan dengan pip freeze menangkap seluruh pohon tersebut:

bash
pip freeze > requirements.txt
cat requirements.txt

Output yang Dihasilkan:

text
certifi==2026.7.22
charset-normalizer==3.5.2
idna==3.20
numpy==2.5.4
requests==2.34.2
urllib3==2.8.0

Berkas inilah yang dibagikan ke rekan kerja atau diserahkan ke server CI. Uji reproduksi terakhir: venv baru dibuat dari nol, lalu seluruh daftar dipasang kembali:

bash
python3 -m venv /tmp/manajemen-verifikasi
/tmp/manajemen-verifikasi/bin/pip install -r /tmp/manajemen-demo/requirements.txt

Output yang Dihasilkan:

text
Successfully installed certifi-2026.7.22 charset-normalizer-3.5.2 idna-3.20 numpy-2.5.4 requests-2.34.2 urllib3-2.8.0

Enam paket yang sama terpasang kembali dengan versi yang sama persis. Memanggil numpy.__version__ di venv baru mengembalikan 2.5.4 — identik dengan lingkungan asal, sehingga hasil pelatihan model dapat direproduksi orang lain.

Mendeklarasikan Proyek di pyproject.toml #

requirements.txt merekam keadaan, sedangkan pyproject.toml mendeklarasikan niat. Format ini adalah standar resmi modern untuk metadata proyek Python: kita menuliskan dependensi langsung beserta rentang versinya, lalu membiarkan resolver menghitung sisa pohon dependensi:

toml Contoh pyproject.toml proyek deep learning
[project]
name = "proyek-klasifikasi"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
    "numpy>=2.1,<3",
    "torch==2.14.*",
    "tensorflow==2.21.*",
]

Penulisan "numpy>=2.1,<3" berarti NumPy 2.1 sampai sebelum 3.0 boleh dipakai, sementara "torch==2.14.*" mengunci rilis besar PyTorch tanpa menyetel angka patch. Perbedaan kedua format ini dirangkum pada tabel berikut:

Aspekrequirements.txtpyproject.toml
Isiseluruh paket terpasang, versi persisdependensi langsung, rentang versi
Kegunaan utamamereproduksi lingkunganmendeklarasikan proyek dan membangun paket
Paket transitifikut tercatatdihitung ulang oleh resolver saat pemasangan
Alat pembacanyapip install -rpip install ., uv, build tools

Spesifikasi lengkap kedua format didokumentasikan di packaging.python.org . Pola yang umum di proyek serius: mendeklarasikan niat di pyproject.toml, lalu menghasilkan berkas requirements.txt terkunci dari deklarasi tersebut untuk keperluan reproduksi.

uv sebagai Alternatif Modern #

uv adalah manajer paket dan proyek yang ditulis dalam Rust dari Astral; dokumentasinya ada di docs.astral.sh/uv . Keunggulan utamanya adalah kecepatan: cache agresif dan pemasangan paralel membuat siklus venv-pasang-bekukan terasa hampir seketika. Pemasangan uv mengikuti panduan resminya — pada mesin uji Course, uv 0.13.1 dipasang ke venv sementara lewat pip install uv dan seluruh perintah berikut dijalankan nyata:

bash
uv --version

Output yang Dihasilkan:

text
uv 0.13.1 (x86_64-unknown-linux-gnu)

Membuat venv dengan uv tidak lagi memerlukan python3 -m venv:

bash
uv venv uv-demo

Output yang Dihasilkan:

text
Using CPython 3.12.15
Creating virtual environment at: uv-demo
Activate with: source uv-demo/bin/activate

Pemasangan paket memakai subperintah uv pip install yang antarmukanya meniru pip:

bash
uv pip install numpy

Output yang Dihasilkan (dua baris progres berisi durasi telah disingkat karena nilainya berubah setiap eksekusi):

text
 + numpy==2.5.4

Pembekuan daftar paket memakai uv pip freeze dan hasilnya berformat sama dengan pip:

bash
uv pip freeze

Output yang Dihasilkan:

text
numpy==2.5.4

Resolusi Versi dan Konflik #

pip dan uv sama-sama menjalankan resolver: mesin pencari kombinasi versi yang memenuhi seluruh syarat dependensi sekaligus. Konflik terjadi ketika dua paket mensyaratkan rentang versi berbeda untuk paket bersama — misalnya satu paket meminta numpy>=2.5 sementara paket lain terkunci pada numpy<2.3. Resolver akan mencoba berbagai kombinasi mundur, dan bila tidak ada yang memenuhi, pemasangan berakhir dengan galat ResolutionImpossible beserta daftar syarat yang bertentangan.

Untuk memeriksa versi yang sedang terpasang di lingkungan aktif, standard library sudah menyediakan jalur yang rapi tanpa shell tambahan:

python
from importlib.metadata import version

for nama_paket in ("numpy", "torch", "tensorflow"):
    print(f"{nama_paket:<12}: {version(nama_paket)}")

Output yang Dihasilkan:

text
numpy       : 2.1.3
torch       : 2.14.1+cpu
tensorflow  : 2.21.0

Mari kita telaah kode di atas baris per baris:

  1. Baris 1 (from importlib.metadata import version): mengimpor fungsi pembaca versi dari metadata paket yang terpasang di site-packages — bagian dari standard library sejak Python 3.8.
  2. Baris 3 (for nama_paket in (...)): mengiterasi tiga paket utama Course; cukup tambahkan nama paket lain ke tuple untuk memeriksanya.
  3. Baris 4 (f"{nama_paket:<12}"): format string dengan lebar 12 karakter rata kiri sehingga kolom versi rapi sejajar.
  4. Fungsi version(nama_paket): membaca berkas metadata .dist-info milik paket, bukan memuat paketnya — jadi pemeriksaan ini cepat dan tidak menjalankan kode impor framework yang berat.

Ringkasan #

Pada Chapter ini kita membekukan lingkungan menjadi requirements.txt dan membuktikan bahwa venv baru dapat membangun ulang keenam paket dengan versi identik, mendeklarasikan dependensi langsung di pyproject.toml, menguji uv sebagai alternatif cepat, lalu memahami cara resolver menangani konflik versi. Dengan Python, venv, Jupyter, kedua framework, pemeriksaan perangkat, dan disiplin dependensi di tangan, perangkat persiapan kita lengkap. Section berikutnya menyegarkan fondasi Python yang paling relevan bagi deep learning sebelum kita membangun neural network pertama dari nol.