Menetapkan beban sebelum memilih penghitung
"Model 7B" tidak menyebutkan representasi bobot maupun pekerjaan yang harus dilakukan. Catat revisinya, framework-nya, versi ekstensinya, format yang benar-benar dimuat, dan operasinya: pelatihan, adaptasi, atau generasi. Untuk teks, catat panjang masukan dan keluaran; untuk visi, resolusi dan jumlah gambar. Model multimodal menuntut Anda menyimpan kedua dimensi ini.
Siapkan satu masukan biasa, satu masukan panjang tetapi masih wajar, dan satu yang mendekati batas fungsional Anda. Simpan semuanya selama perbandingan. Periksa bentuk setelah tokenisasi, padding, pengelompokan, atau pengubahan ukuran: nilai yang tertulis dalam konfigurasi tidak membuktikan bentuk yang benar-benar diproses.
Tetapkan juga apa yang tetap berada di memori secara bersamaan: satu sekuens, satu microbatch, beberapa permintaan, atau evaluasi yang dijalankan setelah pelatihan. Pertanyaan Anda menjadi dapat diverifikasi: apakah beban lengkap ini muat pada setiap perangkat yang digunakan, termasuk selama tahapnya yang paling menuntut?
- Identitas uji coba: model atau kode, revisi, himpunan masukan, dan seed bila relevan.
- Dimensi: batch, konteks, token yang dihasilkan, resolusi, atau jumlah permintaan bersamaan.
- Lingkungan: GPU terpilih, driver, Python, PyTorch, backend CUDA atau HIP/ROCm, dan pengaturan alokator.
- Cakupan: pemuatan, komputasi, transfer, evaluasi, ekspor; lintasan pertama atau lintasan setelah pemanasan.
Menghitung bobot tanpa mencampur GB dan GiB
Satu GB sama dengan 1.000.000.000 byte; satu GiB sama dengan 1.073.741.824 byte. Penghitung PyTorch yang digunakan di sini mengembalikan nilai dalam byte. Simpan nilai mentah tersebut di berkas hasil, lalu terapkan satu konversi saja untuk membandingkan baris. Label komersial sebuah kartu tidak menggantikan kapasitas yang benar-benar dideklarasikan oleh perangkat.
Untuk kumpulan dense berisi tujuh miliar parameter yang disimpan dalam dua byte masing-masing, bobotnya mewakili 14.000.000.000 byte: 14 GB, atau sekitar 13,04 GiB. Perhitungan ini tidak mencakup aktivasi, gradien, cache KV, maupun status optimizer. Menambahkan cadangan 4 GiB menghasilkan sekitar 17,04 GiB sebagai hipotesis persiapan; ini tidak membuktikan bahwa suatu beban akan muat dalam amplop tersebut.
Pembagian teoretis pada empat bit mengasumsikan penyimpanan padat yang seragam. Pemuatan terkuantisasi yang sebenarnya dapat menambahkan skala dan informasi lain, serta mempertahankan sebagian modul pada presisi lain. Karena itu, format penyimpanan bobot dan format komputasi harus muncul secara terpisah di lembar catatan Anda.
| Asumsi penyimpanan | Byte terhitung | Perkiraan GiB |
|---|---|---|
| 32 bit seragam | 28 000 000 000 | 26,08 |
| 16 bit seragam | 14 000 000 000 | 13,04 |
| 4 bit padat, di luar metadata | 3 500 000 000 | 3,26 |
Sumber teknis: NIST — prefiks biner dan perbandingan GB/GiB · Hugging Face — format dan modul terkuantisasi dengan bitsandbytes
Dalam pelatihan, ukur satu langkah penuh
Bobot berdampingan dengan objek lain: gradien, status optimizer, aktivasi yang diperlukan untuk lintasan mundur, dan tensor sementara. Ukurannya bergantung pada loop, presisi, dan dimensi beban. Konstanta universal dalam byte per parameter justru akan menyembunyikan pengaruh microbatch dan input.
Instrumentasikan lintasan maju, perhitungan loss, propagasi balik, dan pembaruan. Untuk mengamati status yang benar-benar dibuat oleh optimizer Anda, jangan berhenti pada pemuatan model. Pertahankan juga pengukuran langkah penuh pertama: pemanasan yang berhasil bisa saja sudah melakukan inisialisasi yang harus mampu Anda biayai dalam memori saat mulai.
Tambahkan evaluasi dan ekspor yang dibutuhkan proyek Anda. Jika kegagalan terjadi selama evaluasi, mengurangi batch pelatihan saja tidak memperbaiki fase tersebut. Adaptasi yang hanya melatih sedikit parameter masih dapat mempertahankan model dasar dan aktivasi berukuran besar.
Sumber teknis: Hugging Face — kategori memori selama pelatihan
Dalam inferensi, pantau konteks dan konkurensi
Dalam generasi autoregresif dengan attention, cache KV menyimpan status yang terkait dengan token. Untuk cache dense yang seragam, ukurannya bergantung pada lapisan, kepala KV, dimensinya, token yang dipertahankan, dan sekuens yang hadir bersamaan. Gunakan kepala KV model, bukan secara otomatis kepala query-nya.
Contoh aritmetika: 32 lapisan, 8 kepala KV, dimensi 128, 8.192 token, dua byte per nilai, dan satu sekuens menghasilkan 1.073.741.824 byte, yaitu 1 GiB untuk K dan V digabung. Empat sekuens identik menghasilkan 4 GiB hanya untuk pos ini. Perhitungan ini tidak mengukur throughput maupun pemakaian GPU secara keseluruhan.
Sesuaikan rumus dengan cache yang benar-benar digunakan. Jendela geser tidak selalu mempertahankan seluruh riwayat; cache statis dapat mengalokasikan kapasitas maksimumnya di muka. Cache terkuantisasi dan yang dialihkan juga mengubah persoalannya. Ukur secara terpisah pemrosesan awal input dan generasi, tanpa secara otomatis mengaitkan seluruh selisihnya pada cache.
Sumber teknis: Hugging Face — strategi cache, alokasi statis, dan jendela
Allocated dan reserved: dua bacaan yang tidak boleh dijumlahkan
memory_allocated menggambarkan byte yang ditempati tensor yang dilacak PyTorch di perangkat. memory_reserved menggambarkan memori yang dikelola oleh alokatornya dengan cache, termasuk yang sudah dipakai untuk tensor tersebut. Menjumlahkan keduanya berarti menghitung sebagian memori dua kali. Simpan keduanya dalam dua kolom terpisah.
Varian max masing-masing mencatat puncak sejak awal pemantauan atau sejak reset terakhirnya. Ini adalah puncak absolut selama periode tersebut, yang mencakup alokasi yang sudah ada sejak awal. Hasilnya tidak otomatis mewakili hanya objek yang dibuat oleh fase tersebut.
Pembacaan sistem dapat memiliki cakupan yang lebih luas. Alokasi yang dilakukan langsung oleh pustaka CUDA, misalnya beberapa komunikasi NCCL, tidak semuanya terlihat di alokator PyTorch. Jadi perbedaan dengan alat sistem, dengan sendirinya, tidak membuktikan adanya kebocoran.
| Penghitung | Pertanyaan yang dijawabnya | Kesalahan yang harus dihindari |
|---|---|---|
| memory_allocated | Berapa banyak memori yang ditempati tensor pada titik pembacaan ini? | Menganggapnya sebagai seluruh pemakaian kartu. |
| memory_reserved | Berapa banyak yang dikelola alokator pada titik pembacaan ini? | Menambahkannya ke allocated. |
| max_memory_allocated | Puncak tensor apa yang terpantau selama periode tersebut? | Mengacaukannya dengan nilai di akhir fase. |
| max_memory_reserved | Puncak reservasi apa yang dilaporkan alokator? | Mengasumsikan bahwa puncak itu terjadi pada saat yang sama dengan puncak lainnya. |
Sumber teknis: PyTorch — memory_allocated · PyTorch — memory_reserved · PyTorch — max_memory_allocated · PyTorch — alokasi di luar alokatornya
Mengapa selisih antara kedua puncak tidak mengukur cache
Mari kita hanya perhatikan dua waktu fiktif dalam tabel. Puncak allocated bernilai 8 GiB dan puncak reserved 12 GiB. Selisihnya, 4 GiB, bukanlah selisih yang teramati pada salah satu dari kedua waktu tersebut: selisih itu masing-masing bernilai 2 dan 6 GiB. Dua nilai maksimum tidak selalu menggambarkan keadaan yang sama.
Untuk mempelajari selisih keduanya pada suatu waktu tertentu, catat allocated dan reserved pada titik pemeriksaan yang sama, setelah sinkronisasi dan tanpa operasi baru yang disengaja di antara pembacaan. Anda memperoleh selisih penghitung pada saat itu, bukan pengukuran cache KV model, dan bukan pula jaminan bahwa seluruh selisih tersebut dapat memenuhi alokasi berikutnya.
Simpan juga backend alokator dalam laporan. Dokumentasi PyTorch 2.14 menyatakan bahwa, dengan cudaMallocAsync, max_memory_reserved dapat menggabungkan level tertinggi dari dua pool dan memberikan batas atas puncak simultan. Hal ini memperkuat perlunya menyimpan nama dan cakupan penghitung.
| Waktu ilustratif | Allocated | Reserved | Reserved − allocated pada saat itu |
|---|---|---|---|
| A | 8 GiB | 10 GiB | 2 GiB |
| B | 6 GiB | 12 GiB | 6 GiB |
Sumber teknis: PyTorch — definisi dan batas max_memory_reserved
Membatasi setiap fase sebelum mencatat puncaknya
Operasi GPU dapat diantrekan sebelum selesai. Untuk pengukuran per fase, selesaikan pekerjaan sebelumnya sebelum mereset puncak ke nol, lalu tunggu hingga fase berakhir sebelum pembacaan. torch.cuda.synchronize menunggu kernel dari semua stream pada perangkat terpilih; pilihan ini menetapkan batas eksplisit untuk protokol ini.
reset_peak_memory_stats mengatur ulang pemantauan puncak mulai dari keadaan saat ini; fungsi ini tidak melepaskan tensor program. Catat dulu level awalnya. Di akhir, simpan kedua puncak absolut dan kedua level saat itu. Jangan menyajikan pengurangan level awal sebagai volume pasti dari semua tensor sementara: objek sebelumnya juga bisa saja telah dilepaskan selama fase berlangsung.
Instrumentasi ini dapat mengubah tumpang tindih fase yang biasa terjadi. Gunakan untuk melokalisasi masalah, lalu verifikasi juga siklus lengkap dengan penjadwalannya yang sebenarnya. Pada multi-kartu, ulangi pembacaan untuk setiap perangkat; pengukuran pada cuda:0 tidak menggambarkan GPU lainnya.
- 1. Beri nama pada fase dan catat inputnya secara persis.
- 2. Sinkronkan perangkat, lalu catat allocated dan reserved awal.
- 3. Panggil reset_peak_memory_stats pada perangkat yang sama.
- 4. Jalankan fase yang telah ditentukan dengan menyimpan output yang diperlukan untuk langkah berikutnya.
- 5. Sinkronkan, catat puncak dan level akhir, lalu catat berhasil atau gagal.
- 6. Simpan hasil mentah, dimensi, dan konfigurasi; jangan mengisi pengukuran yang hilang dengan nol.
Sumber teknis: PyTorch — sinkronisasi perangkat · PyTorch — reset statistik puncak
Membedakan lintasan pertama dan lintasan setelah pemanasan
Percobaan pertama dan loop yang sudah disiapkan tidak menjawab pertanyaan yang sama. Simpan jejak pemuatan dan lintasan pertama, lalu dokumentasikan jumlah iterasi pemanasan sebelum pengulangan. Jangan hapus kegagalan inisialisasi dengan alasan bahwa lintasan berikutnya lebih ringan.
Skrip IteraGPU membedakan model_load, inputs, cold_forward, warmup, dan warm_forward. cold_forward adalah lintasan pertama model kecil setelah inisialisasi perangkat. Ini tidak mengukur seluruh permulaan server, driver, atau layanan. Pengulangan warm_forward tetap berada dalam proses yang sama dan memanfaatkan statusnya yang sudah ada.
Untuk model Anda, mulailah rangkaian baru dalam proses baru ketika Anda mengubah suatu kondisi yang berpotensi meninggalkan objek atau reservasi sebelumnya. Catat urutan percobaan dan kebijakan pemanasan. Menjalankan lima kali loop yang sama dan menjalankan lima proses bukanlah protokol yang sama.
Menggunakan notebook dan skrip IteraGPU Lab v1
Mulailah dari README, lalu unduh notebook mandiri atau skrip Python. Perhitungan estimate menggunakan pustaka standar. Pengukuran memerlukan PyTorch yang terpasang dengan backend GPU yang kompatibel dan perangkat yang dapat diakses; ini tidak mengunduh model maupun paket. Notebook memerlukan lingkungan yang mampu membaca berkas ipynb.
Latihan pengukuran menggunakan jaringan dense kecil yang orisinal dan input sintetis. Opsi batch, context, dan width mendeskripsikan tensor-nya; context di sini bukanlah panjang LLM sungguhan dengan cache KV. Sarana ini berfungsi untuk menelaah metode pengukuran dan memvariasikan satu dimensi. Ini tidak membuktikan kemampuan sebuah kartu untuk model riset Anda.
Jalankan perintah di bawah ini dari folder yang berisi skrip. Periksa dulu laporan environment. Jika PyTorch atau GPU tidak ada, measure harus berhenti secara eksplisit dengan kode 2; tidak ada hasil CPU yang boleh ditafsirkan sebagai pengukuran GPU. JSON keluaran dari pengukuran yang berhasil dihasilkan di lingkungan Anda. Pilih nama berkas baru untuk setiap rangkaian: skrip menolak menimpa hasil yang sudah ada.
Perintah pertama mengulang perhitungan bobot dan cadangan hipotetis 4 GiB. Untuk perintah berikutnya, gunakan perangkat yang Anda berwenang untuk dibebani dan pertahankan dimensi yang sederhana pada awalnya. Catat versi PyTorch yang benar-benar digunakan: referensi teknis di halaman ini khususnya menjelaskan versi 2.14, tanpa mewajibkan versi itu terpasang di tempat Anda.
Cara kerja skrip telah diverifikasi pada kasus kecil: RTX 5070 lokal di luar katalog, driver 610.62, Python 3.14.6, dan PyTorch 2.11.0+cu128. Percobaan tersebut menggunakan batch 1, context 16, width 64, float32, satu pemanasan, dan dua pengulangan. Ini memvalidasi jalur eksekusi tersebut, tanpa mengkualifikasi sebuah LLM, pelatihan, atau GPU yang ditawarkan untuk disewa. Notebook disertakan tanpa keluaran dan tabel perbandingan tanpa hasil; pengaman saat PyTorch tidak ada juga telah diverifikasi di lingkungan terpisah.
python mesure_memoire.py estimate --parameters 7000000000 --bits 16 --reserve-gib 4
python mesure_memoire.py environment --device cuda:0
python mesure_memoire.py measure --device cuda:0 --batch 2 --context 128 --width 1024 --dtype float32 --warmup 3 --repeats 5 --output mesures.json- Notebook perhitungan dan pengukuran
Notebook mandiri untuk dibuka, ditelaah, dan dijalankan di lingkungan Anda.
- Skrip mesure_memoire.py
Perhitungan tanpa dependensi eksternal, pemeriksaan lingkungan, dan pengukuran GPU yang eksplisit.
- Petunjuk penggunaan folder
Prasyarat, perintah, cakupan fase, dan batas penafsiran.
- Arsip IteraGPU Lab v1
Sumber daya berversi yang dihimpun, beserta petunjuk penggunaan dan lisensinya.
- Lisensi sumber daya
Ketentuan penggunaan kembali berkas yang disediakan.
Menafsirkan kegagalan sebelum mengganti kartu
Percobaan yang tidak tuntas tetap merupakan observasi yang berguna. Simpan fase, dimensi yang diminta, pesan kesalahan, dan nilai terakhir yang tersedia. Puncak sebagian sebelum saturasi bukanlah kebutuhan memori dari eksekusi yang lengkap. Kurangi satu dimensi saja untuk membangun kasus yang berhasil, lalu cari batas antara keberhasilan dan kegagalan.
empty_cache membebaskan blok yang tidak terpakai dari cache alokator, tanpa membebaskan tensor yang masih hidup. Ini bukan koreksi universal untuk beban yang terlalu besar. Memanggilnya di antara setiap pengulangan mengubah kondisi: dokumentasikan pilihan ini alih-alih mencampur uji coba tersebut dengan yang mempertahankan cache.
Jika penghitung sederhana tidak menjelaskan situasinya, sebuah jejak memori dapat membantu mengidentifikasi alokasi seiring waktu. Cakupannya tetap sebatas alokasi yang terlihat oleh PyTorch. Puncak allocated yang rendah karena itu tidak mengecualikan adanya alokasi eksternal atau pengguna lain pada kartu tersebut.
| Observasi | Verifikasi yang berguna | Uji coba berikutnya |
|---|---|---|
| Gagal saat pemuatan | Format yang dimuat, penempatan bobot, dan memori yang sudah terpakai. | Mereproduksi pemuatan saja dalam proses yang baru. |
| Pemuatan berhasil, backward tidak mungkin | Microbatch, input, aktivasi yang dipertahankan, dan status loop. | Mengurangi satu dimensi lalu mengulang langkah penuh. |
| Hanya evaluasi yang gagal | Batch evaluasi, output yang ditahan, dan konteks komputasi. | Mengukur evaluasi dengan batasnya sendiri. |
| Allocated meningkat dari satu pengulangan ke pengulangan berikutnya | Referensi yang dipertahankan dalam daftar, cache aplikasi, atau graf. | Periksa masa hidupnya sebelum menyalahkan alokator. |
| Reserved tetap tinggi setelah komputasi | Tensor yang masih hidup dan kebijakan cache. | Bandingkan nilai saat ini, tanpa menjumlahkan penghitung. |
| Sebuah alat sistem menunjukkan lebih banyak | Cakupan alat, konteks GPU, proses lain, dan pustaka. | Isolasi beban dan cocokkan pembacaan yang diambil pada saat yang sama. |
Sumber teknis: PyTorch — apa yang dibebaskan empty_cache · PyTorch — jejak dan batas visibilitas memori
Membangun margin dari beban yang sebanding
Hindari persentase margin yang disajikan sebagai universal. Margin harus mencakup variasi yang teridentifikasi: input lebih panjang, batch yang diizinkan, evaluasi, ekspor, versi pustaka, atau pemakaian kartu lainnya. Uji kasus batas yang diharapkan, lalu catat apa yang tetap di luar cakupan. Eksekusi yang berhasil pada satu input kecil saja tidak memvalidasi beban maksimum.
Ubah satu variabel pada satu waktu: batch 1 lalu 2 dengan konteks tetap, atau konteks 2.048 lalu 4.096 dengan batch tetap. Pertahankan konten dan aturan penyiapan yang sama. Pemotongan yang menghilangkan informasi penting membuat tugasnya berbeda, meskipun mengurangi puncak.
Jika bobot mendominasi, pelajari format lain sambil mengontrol kualitas. Jika aktivasi mendominasi, microbatch atau checkpointing aktivasi dapat menjadi jalur. Yang terakhir menukar memori dengan komputasi ulang: ukur juga durasinya dan verifikasi hasilnya. Jika cache KV mendominasi, periksa konteks, konkurensi, dan strategi cache. Berkas perbandingan melengkapi pendekatan ini dengan aturan kualitas yang sama.
Sumber teknis: PyTorch — checkpointing aktivasi dan komputasi ulang
Beralih dari jejak ke keputusan konfigurasi
Keluaran yang Anda harapkan adalah lembar singkat: estimasi bobot, beban maksimum yang diuji, fase yang berhasil atau gagal, empat penghitung beserta satuannya, lingkungan, dan pilihan yang diambil. Lampirkan hasil mentah pada lembar ini. Pisahkan apa yang Anda hitung, apa yang Anda amati, dan apa yang masih Anda duga.
Selanjutnya bandingkan kebutuhan dengan kapasitas setiap kartu, dengan tetap memperhatikan batasan perangkat lunak. Beberapa GPU menuntut pembagian kerja dan data; keberadaannya tidak secara otomatis menciptakan satu kolam memori tunggal untuk aplikasi. Kegagalan pada satu kartu dapat tetap berlanjut meskipun ada memori bebas pada kartu lain.
Protokol PyTorch menggunakan antarmuka torch.cuda; build HIP/ROCm dari PyTorch menggunakan kembali nama tersebut. Identifikasi backend yang benar-benar terpasang sebelum membandingkan dua keluarga perangkat keras. Penggunaan fungsi Python yang sama tidak membuktikan bahwa kernel, presisi, atau hasilnya setara.
Alat penghitung ukuran memungkinkan Anda melanjutkan asumsi awal; lembar GPU memungkinkan Anda membandingkan kapasitas. Kemudian kembali ke kasus kerja yang sama untuk memverifikasi pilihan. Jaringan kecil dari unduhan tetap menjadi latihan instrumentasi: hanya eksekusi beban Anda, dalam lingkungannya yang terdokumentasi, yang dapat memvalidasi margin Anda sendiri.
Sumber teknis: NVIDIA — pembagian kerja pada beberapa GPU · PyTorch — antarmuka torch.cuda pada build HIP/ROCm