


Menyahpepijat isu kebocoran memori Pytorch menggunakan penghias konteks
Penghias ialah pelaksanaan khusus pengurus konteks python. Artikel ini akan menggambarkan cara menggunakannya melalui contoh penyahpepijatan GPU pytorch. Walaupun ia mungkin tidak berfungsi dalam setiap keadaan, saya dapati ia sangat berguna.
Menyahpepijat Isu Kebocoran Memori
Terdapat banyak cara untuk nyahpepijat kebocoran memori. Artikel ini akan menunjukkan kaedah yang berguna untuk mengenal pasti baris bermasalah dalam kod anda. Kaedah ini boleh membantu mencari lokasi tertentu dengan cara yang ringkas.
Penyahpepijat manual baris demi baris
Jika anda menghadapi masalah, kaedah klasik dan biasa digunakan ialah menggunakan penyahpepijat untuk menyemak baris demi baris, seperti contoh berikut:
- Cari coretan kod tentang cara mengira jumlah bilangan semua tensor dalam pytorch dalam enjin carian, seperti: tensor-counter-snippet
- Tetapkan titik putus dalam kod
- Gunakan tensor-counter -snippet untuk mendapatkan jumlah kiraan tensor
- Gunakan penyahpepijat untuk melakukan langkah seterusnya
- Jalankan semula tensor-counter-snippet dan semak sama ada kiraan tensor meningkat
- Ulangi Langkah di atas
Ia berfungsi, tetapi ia kelihatan seperti banyak masalah. Kita boleh merangkumnya ke dalam fungsi, yang boleh dipanggil apabila diperlukan, jadi hampir tidak perlu mengubah suai kod sedia ada, yang membawa kita untuk memperkenalkan fungsi penghias.
Python Decorators
Dekorator boleh dibungkus dalam mana-mana bahagian kod. Di sini kita menggunakan alat penghias untuk memeriksa sama ada terdapat tensor tambahan Selain itu, kita juga memerlukan pembilang kerana bilangan tensor perlu dikira sebelum dan selepas pelaksanaan. Coraknya kelihatan seperti ini:
def memleak_wrapper(func): def wrap(*args, **kwargs): print("num tensors start is ...") out = func(*args, **kwargs) print("num tensors end is ...") return out return wrap@memleak_wrapper def function_to_debug(x): print(f"put line(s) of code here. Input is {x}") out = x + 10 return outout = function_to_debug(x=1000) print(f"out is {out}") #输入类似这样 #num tensors start is ... #put line(s) of code here. Input is 1000 #num tensors end is ... #outis 1010
Untuk menjalankan kod ini, kita perlu meletakkan baris kod yang ingin kita semak ke dalam fungsi (function_to_debug). Tetapi ini bukanlah yang terbaik kerana kita masih perlu memasukkan banyak kod secara manual. Perkara lain ialah jika blok kod menjana lebih daripada satu pembolehubah, anda perlu mencari penyelesaian tambahan untuk menggunakan pembolehubah hiliran ini.
Penghias konteks
Untuk menyelesaikan masalah di atas, kita boleh menggunakan pengurus konteks dan bukannya penghias fungsi. Contoh pengurus konteks yang paling banyak digunakan ialah membuat konteks menggunakan pernyataan dengan. Yang paling biasa digunakan ialah:
with open("file") as f: …
Menggunakan perpustakaan contextlib Python, pengguna Python boleh membuat pengurus konteks mereka sendiri dengan mudah. Jadi dalam artikel ini kami akan menggunakan ContextDecorator untuk menyelesaikan kerja yang kami cuba gunakan penghias di atas. Kerana ia lebih mudah untuk dibangunkan dan lebih mudah digunakan:
from contextlib import ContextDecorator class check_memory_leak_context(ContextDecorator): def __enter__(self): print('Starting') return self def __exit__(self, *exc): print('Finishing') return False
ContextDecorator mempunyai 2 kaedah: enter() dan exit() , yang dipanggil apabila kita masuk atau keluar dari konteks. Parameter *exc dalam __exit__ mewakili sebarang pengecualian masuk.
Sekarang mari gunakannya untuk menyelesaikan masalah yang dinyatakan di atas.
Gunakan ContextDecorator untuk mencari kebocoran memori
Oleh kerana kita perlu mengira jumlah bilangan tensor, kita merangkum proses pengiraan ke dalam fungsi get_n_tensors(), supaya tensor boleh dikira pada permulaan dan akhir konteks Kuantiti amaun:
class check_memory_leak_context(ContextDecorator): def __enter__(self): self.start = get_n_tensors() return self def __exit__(self, *exc): self.end = get_n_tensors() increase = self.end — self.start if increase > 0: print(f”num tensors increased with" f"{self.end — self.start} !”) else: print(”no added tensors”) return False
Jika terdapat peningkatan, cetak ke konsol.
get_n_tensor() menggunakan pemungut sampah (gc) dan disesuaikan untuk pytorch, tetapi boleh diubah suai dengan mudah untuk perpustakaan lain:
import gc def get_n_tensors(): tensors= [] for obj in gc.get_objects(): try: if (torch.is_tensor(obj) or (hasattr(obj, ‘data’) and torch.is_tensor(obj.data))): tensors.append(obj) except: pass return len(tensors)
Ia sedia untuk digunakan sekarang, kami Gunakan ini konteks untuk mana-mana baris (atau blok) kod:
x = arbitrary_operation(x) ... with check_memory_leak_context(): y = x[0].permute(1, 2, 0).cpu().detach().numpy() x = some_harmless_operation() ... x = another_arbitrary_operation(x)
Jika tensor baharu dicipta dalam baris yang dibalut oleh penghias konteks, ia akan dicetak.
Ringkasan
Ini adalah coretan kod yang sangat bagus yang boleh anda letakkan dalam fail berasingan semasa pembangunan Berikut ialah kod lengkap untuk artikel ini:
https://. gist.github.com/MarkTension/4783697ebd5212ba500cdd829b364338
Akhir sekali, saya harap artikel kecil ini dapat membantu anda memahami maksud pengurus konteks, cara menggunakan penghias konteks dan cara menggunakannya untuk menyahpepijat pytorch .
Atas ialah kandungan terperinci Menyahpepijat isu kebocoran memori Pytorch menggunakan penghias konteks. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Hadidb: Pangkalan data Python yang ringan, tinggi, Hadidb (Hadidb) adalah pangkalan data ringan yang ditulis dalam Python, dengan tahap skalabilitas yang tinggi. Pasang HadIdb menggunakan pemasangan PIP: Pengurusan Pengguna PipInstallHadidB Buat Pengguna: CreateUser () Kaedah untuk membuat pengguna baru. Kaedah pengesahan () mengesahkan identiti pengguna. dariHadidb.OperationImportuserer_Obj = user ("admin", "admin") user_obj.

Tidak mustahil untuk melihat kata laluan MongoDB secara langsung melalui Navicat kerana ia disimpan sebagai nilai hash. Cara mendapatkan kata laluan yang hilang: 1. Tetapkan semula kata laluan; 2. Periksa fail konfigurasi (mungkin mengandungi nilai hash); 3. Semak Kod (boleh kata laluan Hardcode).

Anda boleh mempelajari konsep pengaturcaraan asas dan kemahiran Python dalam masa 2 jam. 1. Belajar Pembolehubah dan Jenis Data, 2.

Panduan Pengoptimuman Prestasi Pangkalan Data MySQL Dalam aplikasi yang berintensifkan sumber, pangkalan data MySQL memainkan peranan penting dan bertanggungjawab untuk menguruskan urus niaga besar-besaran. Walau bagaimanapun, apabila skala aplikasi berkembang, kemunculan prestasi pangkalan data sering menjadi kekangan. Artikel ini akan meneroka satu siri strategi pengoptimuman prestasi MySQL yang berkesan untuk memastikan aplikasi anda tetap cekap dan responsif di bawah beban tinggi. Kami akan menggabungkan kes-kes sebenar untuk menerangkan teknologi utama yang mendalam seperti pengindeksan, pengoptimuman pertanyaan, reka bentuk pangkalan data dan caching. 1. Reka bentuk seni bina pangkalan data dan seni bina pangkalan data yang dioptimumkan adalah asas pengoptimuman prestasi MySQL. Berikut adalah beberapa prinsip teras: Memilih jenis data yang betul dan memilih jenis data terkecil yang memenuhi keperluan bukan sahaja dapat menjimatkan ruang penyimpanan, tetapi juga meningkatkan kelajuan pemprosesan data.

Python digunakan secara meluas dalam bidang pembangunan web, sains data, pembelajaran mesin, automasi dan skrip. 1) Dalam pembangunan web, kerangka Django dan Flask memudahkan proses pembangunan. 2) Dalam bidang sains data dan pembelajaran mesin, numpy, panda, scikit-learn dan perpustakaan tensorflow memberikan sokongan yang kuat. 3) Dari segi automasi dan skrip, Python sesuai untuk tugas -tugas seperti ujian automatik dan pengurusan sistem.

Sebagai profesional data, anda perlu memproses sejumlah besar data dari pelbagai sumber. Ini boleh menimbulkan cabaran kepada pengurusan data dan analisis. Nasib baik, dua perkhidmatan AWS dapat membantu: AWS Glue dan Amazon Athena.

Tidak, MySQL tidak dapat menyambung terus ke SQL Server. Tetapi anda boleh menggunakan kaedah berikut untuk melaksanakan interaksi data: Gunakan middleware: data eksport dari MySQL ke format pertengahan, dan kemudian mengimportnya ke SQL Server melalui middleware. Menggunakan Pangkalan Data Pangkalan Data: Alat perniagaan menyediakan antara muka yang lebih mesra dan ciri -ciri canggih, pada dasarnya masih dilaksanakan melalui middleware.

Langkah -langkah untuk memulakan pelayan Redis termasuk: Pasang Redis mengikut sistem operasi. Mulakan perkhidmatan Redis melalui Redis-server (Linux/macOS) atau redis-server.exe (Windows). Gunakan redis-cli ping (linux/macOS) atau redis-cli.exe ping (windows) perintah untuk memeriksa status perkhidmatan. Gunakan klien Redis, seperti redis-cli, python, atau node.js untuk mengakses pelayan.
