GPU untuk riset ML · Pembayaran kripto tanpa KYC
IteraGPU
Metode 01 · Dari estimasi ke pengukuran

Mengapa puncak memori melebihi estimasi Anda?

Rumus bobot menggambarkan penyimpanan parameter; puncak menggambarkan suatu eksekusi, dengan masukan dan alokasi sementaranya. Untuk menjelaskan selisihnya, pertahankan satuan yang sama, ukur setiap fase, dan pisahkan memori yang dialokasikan, memori yang direservasi, dan pemakaian kartu. Folder IteraGPU Lab v1 menyediakan perhitungan yang dapat direproduksi dan latihan kecil yang terinstrumentasi. Angka ilustratif di bawah ini adalah hasil perhitungan, bukan pengukuran GPU yang dipublikasikan.

01 /

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.
02 /

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.

Perkiraan bobot dalam GiB = parameter × bit per parameter ÷ 8 ÷ 1.073.741.824
Perhitungan ilustratif untuk 7.000.000.000 parameter; bukan hasil eksekusi.
Asumsi penyimpananByte terhitungPerkiraan GiB
32 bit seragam28 000 000 00026,08
16 bit seragam14 000 000 00013,04
4 bit padat, di luar metadata3 500 000 0003,26

Sumber teknis: NIST — prefiks biner dan perbandingan GB/GiB · Hugging Face — format dan modul terkuantisasi dengan bitsandbytes

03 /

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

04 /

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.

KV dense dalam byte ≈ 2 × lapisan × kepala KV × dimensi kepala × token yang dipertahankan × sekuens × byte per nilai

Sumber teknis: Hugging Face — strategi cache, alokasi statis, dan jendela

05 /

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.

Empat penghitung, semuanya dalam byte, yang perlu dicatat untuk perangkat yang sama.
PenghitungPertanyaan yang dijawabnyaKesalahan yang harus dihindari
memory_allocatedBerapa banyak memori yang ditempati tensor pada titik pembacaan ini?Menganggapnya sebagai seluruh pemakaian kartu.
memory_reservedBerapa banyak yang dikelola alokator pada titik pembacaan ini?Menambahkannya ke allocated.
max_memory_allocatedPuncak tensor apa yang terpantau selama periode tersebut?Mengacaukannya dengan nilai di akhir fase.
max_memory_reservedPuncak 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

06 /

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.

Dua keadaan buatan untuk menjelaskan perhitungan; tabel ini bukan rekaman GPU.
Waktu ilustratifAllocatedReservedReserved − allocated pada saat itu
A8 GiB10 GiB2 GiB
B6 GiB12 GiB6 GiB

Sumber teknis: PyTorch — definisi dan batas max_memory_reserved

07 /

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

08 /

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.

09 /

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.

shell
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
10 /

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.

Menghubungkan gejala dengan langkah verifikasi berikutnya, tanpa diagnosis otomatis.
ObservasiVerifikasi yang bergunaUji coba berikutnya
Gagal saat pemuatanFormat yang dimuat, penempatan bobot, dan memori yang sudah terpakai.Mereproduksi pemuatan saja dalam proses yang baru.
Pemuatan berhasil, backward tidak mungkinMicrobatch, input, aktivasi yang dipertahankan, dan status loop.Mengurangi satu dimensi lalu mengulang langkah penuh.
Hanya evaluasi yang gagalBatch evaluasi, output yang ditahan, dan konteks komputasi.Mengukur evaluasi dengan batasnya sendiri.
Allocated meningkat dari satu pengulangan ke pengulangan berikutnyaReferensi yang dipertahankan dalam daftar, cache aplikasi, atau graf.Periksa masa hidupnya sebelum menyalahkan alokator.
Reserved tetap tinggi setelah komputasiTensor yang masih hidup dan kebijakan cache.Bandingkan nilai saat ini, tanpa menjumlahkan penghitung.
Sebuah alat sistem menunjukkan lebih banyakCakupan 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

11 /

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

12 /

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