Koila memecahkan
CUDA error: out of memory errortanpa rasa sakit. Perbaiki hanya dengan satu baris kode, dan lupakan.

Cabang utama adalah struktur ulang yang lengkap dari proyek (yang saat ini sebagian besar kosong karena saya tidak memiliki cukup waktu untuk menyelesaikannya). Untuk melihat kode kerja, periksa tag v0.1.1 untuk bukti konsep (yang tidak memiliki dukungan penuh atas semua operasi dan tidak cocok untuk produksi). Untuk menggunakannya, unduh rilis v0.1.1 di sini.
? Mencegah CUDA error: out of memory error dengan satu baris kode tunggal.
⚗️ Secara otomatis mengumpulkan gradien ketika ukuran batch terlalu besar.
? Malas mengevaluasi kode Pytorch untuk menghemat daya komputasi.
✂️ Secara otomatis terbagi sepanjang dimensi batch ke lebih banyak angka ramah GPU (kekuatan 2) untuk mempercepat eksekusi.
? API minimal (membungkus semua input akan cukup).
Pernah ditemui RuntimeError: CUDA error: out of memory ? Kita semua menyukai PyTorch karena kecepatan, efisiensinya, dan transparansi, tetapi itu berarti tidak melakukan hal -hal tambahan. Hal -hal seperti mencegah kesalahan yang sangat umum yang telah mengganggu banyak pengguna sejak 2017.
Perpustakaan ini bertujuan untuk mencegahnya dengan menjadi pembungkus ringan di atas PyTorch asli. Ketika tensor dibungkus, perpustakaan secara otomatis menghitung jumlah memori GPU yang tersisa dan menggunakan ukuran batch yang tepat , menghemat semua orang dari harus menyempurnakan secara manual ukuran batch setiap kali model digunakan.
Juga, perpustakaan secara otomatis menggunakan ukuran batch yang tepat untuk GPU. Tahukah Anda bahwa menggunakan batch yang lebih besar tidak selalu mempercepat pemrosesan? Ini ditangani secara otomatis di perpustakaan ini juga.
Karena kode Koila adalah kode PyTorch , karena menjalankan PyTorch di bawah kap, Anda dapat menggunakan keduanya bersama -sama tanpa kompatibilitas yang mengkhawatirkan.
Oh, dan semua itu dalam 1 baris kode! ?
Koila tersedia di PYPI. Untuk menginstal, jalankan perintah berikut.
pip install koila Penggunaannya sangat sederhana. Misalnya, Anda memiliki kode PyTorch berikut (disalin dari tutorial PyTorch )
Tentukan input, label, dan model:
# A batch of MNIST image
input = torch . randn ( 8 , 28 , 28 )
# A batch of labels
label = torch . randn ( 0 , 10 , [ 8 ])
class NeuralNetwork ( Module ):
def __init__ ( self ):
super ( NeuralNetwork , self ). __init__ ()
self . flatten = Flatten ()
self . linear_relu_stack = Sequential (
Linear ( 28 * 28 , 512 ),
ReLU (),
Linear ( 512 , 512 ),
ReLU (),
Linear ( 512 , 10 ),
)
def forward ( self , x ):
x = self . flatten ( x )
logits = self . linear_relu_stack ( x )
return logitsTentukan fungsi kerugian, hitung output dan kerugian.
loss_fn = CrossEntropyLoss ()
# Calculate losses
out = nn ( t )
loss = loss_fn ( out , label )
# Backward pass
nn . zero_grad ()
loss . backward () Oke. Bagaimana cara menyesuaikan kode untuk menggunakan fitur Koila ?
Anda menambahkan baris kode ini (pada v0.1.1):
# Wrap the input tensor and label tensor.
# If a batch argument is provided, that dimension of the tensor would be treated as the batch.
# In this case, the first dimension (dim=0) is used as batch's dimension.
( input , label ) = lazy ( input , label , batch = 0 )Selesai. Anda tidak akan kehabisan memori lagi.
CUDA error: out of memory umumnya terjadi di Forward Pass, karena variabel sementara perlu disimpan dalam memori.
Koila adalah pembungkus tipis di sekitar PyTorch . Ini terinspirasi oleh evaluasi statis/malas TensorFlow. Dengan membangun grafik terlebih dahulu, dan menjalankan model hanya jika harus, model memiliki akses ke semua informasi yang harus menentukan berapa banyak sumber daya yang benar -benar perlu menghitung model.
Dalam hal penggunaan memori, hanya bentuk variabel sementara yang diperlukan untuk menghitung penggunaan memori dari variabel -variabel yang digunakan dalam model . Misalnya, + mengambil dua tensor dengan ukuran yang sama, dan mengeluarkan tensor dengan ukuran yang sama dengan ukuran input, dan log mengambil satu tensor, dan mengeluarkan tensor lain dengan bentuk yang sama. Penyiaran membuatnya sedikit lebih rumit dari itu, tetapi ide -ide umumnya sama. Dengan melacak semua bentuk ini, orang dapat dengan mudah memberi tahu berapa banyak memori yang digunakan dalam umpan ke depan. Dan pilih ukuran batch optimal yang sesuai.
TIDAK . Memang, menghitung bentuk dan menghitung ukuran dan penggunaan memori seperti banyak pekerjaan. Namun, perlu diingat bahwa bahkan model raksasa seperti GPT-3, yang memiliki 96 lapisan, hanya memiliki beberapa ratus node dalam grafik komputasi. Karena algoritma Koila berjalan dalam waktu linier, komputer modern mana pun akan dapat menangani grafik seperti ini secara instan.
Sebagian besar komputasi dihabiskan untuk menghitung tensor individu, dan mentransfer tensor di seluruh perangkat. Dan ingatlah bahwa cek itu terjadi di Vanilla PyTorch . Jadi tidak, tidak lambat sama sekali.
Proyek ini awalnya bernama Koala , spesies paling malas di dunia, dan proyek ini adalah tentang evaluasi tegang yang malas. Namun, karena nama itu diambil di PYPI, saya tidak punya pilihan selain menggunakan nama lain. Koila adalah kata yang dibuat oleh saya, diucapkan mirip dengan voila (itu kata Prancis), jadi terdengar seperti koala.
Jika Anda menyukai apa yang Anda lihat, pertimbangkan untuk memberikan bintang ini (★)!
Mengapa saya mengalami masalah dan membangun proyek ini, meskipun banyak perpustakaan serupa di internet?
Pencarian ukuran batch bukanlah hal baru. Bahkan, kilat populer yang perkasa memilikinya.
Pencarian ukuran batch Lightning sangat terintegrasi dalam ekosistemnya sendiri. Anda harus menggunakan DataLoader , subkelas dari model mereka, dan melatih model Anda sesuai. Sementara refactoring tugas belajar yang diawasi untuk menggunakan petir relatif mudah, sangat menyakitkan untuk melakukan hal yang sama dengan basis kode pembelajaran penguatan, di mana berinteraksi dengan lingkungan adalah suatu keharusan.
Sebagai perbandingan, karena Koila adalah pembungkus Pytorch yang sangat ringan, ia bekerja ketika Pytorch bekerja, sehingga memberikan fleksibilitas maksimum dan perubahan minimal pada kode yang ada.
Namun, perhatikan bahwa dalam kasus di mana Anda menulis kode baru, Lightning direkomendasikan karena menegakkan pola gaya kode yang lebih baik, yang akan menguntungkan modularitas dalam jangka panjang.
Demikian juga, melewati tensor kosong untuk membangun grafik komputasi (alias grafik statis ) bukanlah ide baru, tetapi dieksplorasi secara menyeluruh di perpustakaan TensorFlow yang populer, dan perpustakaan pembungkus PyTorch yang serupa Keops. Perpustakaan ini menderita fakta bahwa program debugging di dalamnya tidak perlu rumit. Misalnya, TensorFlow dikenal karena kemudahan penyebaran tetapi rasa sakit dalam pengembangan, sampai -sampai pengguna beralih ke PyTorch . Selama debugging, orang suka melihat apa yang ada di dalam variabel, untuk melihat apakah itu berisi nilai yang salah. Namun, karena grafik statis hanya mendefinisikan hubungan, nilai -nilai tidak dihitung, sehingga membuat debugging menjadi sulit.
Koila menyelesaikannya dengan dengan penuh semangat mengevaluasi ketika dikonversi menjadi string, bilangan bulat, atau nilai Python apa pun. Ini memungkinkan debugging yang mulus sambil mempertahankan kemampuan untuk melakukan manajemen memori yang tidak tersedia untuk program PyTorch yang lebih lurus ke depan, yang secara dinamis (bila diperlukan) mengalokasikan dan membebaskan memori dengan cepat.
Tensor S dan LazyTensor S). Kode ini bekerja pada banyak kasus, tetapi masih merupakan pekerjaan yang sedang berlangsung. Ini bukan (belum) perpustakaan yang sepenuhnya PyTorch karena waktu yang terbatas. Hindari menggunakannya di lingkungan produksi!
Keterbukaan dan inklusif ditanggapi dengan sangat serius. Kode ini tersedia di bawah lisensi Apache. Harap ikuti kode perilaku berikut.