Tipps für PyTorch zum einfachen Speichern von Videospeicher


Vorwort

Heutzutage ist die Entwicklung des Deep Learning in vollem Gange. Ich glaube, dass jeder in allen Lebensbereichen mehr oder weniger mit dem Wissen des Deep Learning vertraut ist. Ich glaube, dass viele Leute beim Ausführen des Modells die folgende Aussage gesehen haben:
RuntimeError: CUDA out of memory.
Unzureichender Videospeicher bereitet vielen Menschen Kopfschmerzen. Schließlich gibt es immer noch einige Labore mit viel Videospeicher, und das aktuelle Modell ist größer geworden größer. Die Menge an Modellparametern und Datensätzen wird ebenfalls immer größer. Wenn die Batchgröße anderer Leute 32 oder sogar 64 oder mehr beträgt, arbeiten wir immer noch hart daran, einen Batch zu erzwingen.

Hier sind einige Tipps, wie Sie den Videospeicher von PyTorch schonen können. Obwohl die Verbesserung nicht groß ist, kann sie Ihnen helfen, die Passlinie zu erreichen, die kaum laufen kann.

1. Reduzieren Sie die Videospeichernutzung erheblich

Wenn Sie die Speichernutzung stark reduzieren möchten, müssen Sie die speicherintensivsten Aspekte reduzieren, nämlich Modelle und Daten .

1. Modell

In Bezug auf das Modell besteht die Hauptmethode darin, das Backbone in ein leichtes Netzwerk umzuwandeln oder die Anzahl der Netzwerkschichten zu reduzieren, wodurch die Anzahl der Modellparameter erheblich reduziert und dadurch die Speichernutzung verringert werden kann.

2. Daten

In Bezug auf Daten besteht die Hauptmethode zur Reduzierung der Speichernutzung darin, eine kleine BatchSize zu verwenden oder die Größe der Eingabedaten auf eine kleinere Größe zu ändern.

2. Reduzieren Sie die Videospeichernutzung leicht

Manchmal möchten wir das Modell vielleicht nicht ändern, haben aber zufällig ein wenig Videospeicher oder möchten so viel BatchSize wie möglich herausquetschen. Es gibt einige Tricks, um ein wenig Videospeicher herauszuholen.

1. An Ort und Stelle verwenden

Einige Funktionen in PyTorch, wie ReLU, LeakyReLU usw., verfügen über inplaceParameter, die den eingehenden Tensor vor Ort ändern können, um die Belegung von redundantem Videospeicher zu reduzieren.

2. Laden, Speichern usw. können die CPU und niemals die GPU nutzen

Der GPU-Speicherplatz ist kostbar, und wir können uns dafür entscheiden, die CPU für eine sinnvolle gemeinsame Nutzung zu verwenden. Obwohl die Datenübertragung einige Zeit verschwendet, kann der Austausch von Zeit gegen Speicherplatz von der Situation abhängen. Beim Laden von Modellen, z. B. Torch.load_state_dict, laden Zuerst und dann Wenn Sie model.cuda() verwenden, kann es, insbesondere bei der Wiederaufnahme des Trainings an Resume-Haltepunkten, zu einem Fehler wegen unzureichendem Videospeicher kommen. Das Gleiche gilt für das Laden von Daten, die an die GPU gesendet werden, bevor sie dem Modell zugeführt werden. Auch die übrige Datenzwischenverarbeitung kann diesem Prinzip folgen.

3. Berechnung mit geringer Genauigkeit

Sie können die gemischte Float16-Berechnung mit halber Genauigkeit verwenden, wodurch auch die Speichernutzung effektiv reduziert werden kann. Sie sollten jedoch auf einige Überlaufsituationen wie Mittelwert und Summe achten.

4. Torch.no_grad

Wenn bp und rückwärts nicht benötigt werden, wie z. B. eval, kann es verwendet werden . Es gibt einige Unterschiede zwischen with torch.no_gradthis und it , wodurch ein Teil der Videospeichernutzung reduziert werden kann.model.eval()

5. Bereinigen Sie nicht verwendete Variablen rechtzeitig

Einige verwendete Variablen sollten delrechtzeitig gelöscht werden, z. B. Verlust nach Rückwärtsgang, Cache torch.cuda.empty_cache()usw.

6. Segmentberechnung

Mit der Show-Operation können wir das Modell oder die Daten segmentweise berechnen.

  1. Modellsegmentierung: Verwenden Sie checkpointdas Modell, um die Berechnung zu segmentieren

    # 首先设置输入的input=>requires_grad=True
    # 如果不设置可能会导致得到的gradient为0
    input = torch.rand(1, 10, requires_grad=True)
    layers = [nn.Linear(10, 10) for _ in range(1000)]
    
    # 定义要计算的层函数,可以看到我们定义了两个
    # 一个计算前500个层,另一个计算后500个层
    def run_first_half(*args):
        x = args[0]
        for layer in layers[:500]:
            x = layer(x)
        return x
    
    def run_second_half(*args):
        x = args[0]
        for layer in layers[500:-1]:
            x = layer(x)
        return x
    
    # 引入checkpoint
    from torch.utils.checkpoint import checkpoint
    
    x = checkpoint(run_first_half, input)
    x = checkpoint(run_second_half, x)
    # 最后一层单独执行
    x = layers[-1](x)
    x.sum.backward()
    
  2. Bei der Datensegmentierung wurden beispielsweise die Daten, die ursprünglich 64 Stapel erforderten, einmal weitergeleitet und dann einmal rückwärts, jetzt werden die Daten von 32 Stapeln jedoch zweimal weitergeleitet und dann einmal rückwärts.

Zusammenfassen

Oben sind einige Tipps für PyTorch zum Speichern von Videospeicher aufgeführt, die ich zusammengefasst habe. Ich hoffe, dass sie allen helfen können. Wenn es andere gute Methoden gibt, können Sie diese gerne mit mir besprechen.

おすすめ

転載: blog.csdn.net/lucifer479/article/details/125849933
おすすめ