In Situationen mit hohem Speicherdruck tritt Folgendes häufig auf:
Aufgrund des Speicherdrucks besteht eine gängige Problemumgehung darin, zuerst Folgendes zu tun:
s = torch.load('my_file.pt', map_location=lambda storage, loc: storage)
Laden Sie dann s
in model
.
Dies ist ein sehr häufiges Szenario, das wir vermeiden sollten, und dieses Szenario könnte einige Fallstricke haben: Was passiert bei Teil-GPU-Teil-CPU-Modellen, was passiert bei Multi-GPU-Modellen ...
Wenn load_state_dict direkt einen Dateinamen verwendet, kann es seine vorhandenen Parameterspeicher löschen und sie im laufenden Betrieb auf den neuen setzen, wodurch kein zusätzlicher Speicher benötigt wird.
dasselbe gilt für den Optimierer state_dicts. Bei einigen Optimierern wie Adagrad sind die Prüfpunkte groß, und wir können die gleiche Speicherdrucksituation haben. Optimierer haben nicht einmal ein .cuda()
, also müssen wir zuerst manuell state_dict auf die CPU laden und dann Teile manuell auf die GPU kopieren.
Ich bin heute darauf gestoßen, als ich @aszlam geholfen habe.
Wenn load_state_dict
einen Dateinamen verwendet, sollten wir auch den Parameter map_location
zulassen. Eine häufige Situation für mich ist, einen Prüfpunkt auf einem Cluster-Computer zu speichern und ihn dann auf mein MacBook zu laden (daher müssen Parameter auf die CPU geladen werden).
Ich und @szagoruyko sind Fans des HDF5-Formats für serialisierte Modelle, vielleicht könnte es mit diesem Vorschlag gut zurechtkommen
Hilfreichster Kommentar
Wenn
load_state_dict
einen Dateinamen verwendet, sollten wir auch den Parametermap_location
zulassen. Eine häufige Situation für mich ist, einen Prüfpunkt auf einem Cluster-Computer zu speichern und ihn dann auf mein MacBook zu laden (daher müssen Parameter auf die CPU geladen werden).