このブログ投稿では、大規模なPytorchモデルをロードするための効率的なメモリ管理技術を調査します。特に、限られたGPUまたはCPUリソースを扱う際に有益です。著者はtorch.save(model.state_dict(), "model.pth")
を使用してモデルが保存されるシナリオに焦点を当てています。例では大規模な言語モデル(LLM)を使用していますが、手法はあらゆるPytorchモデルに適用できます。
効率的なモデル負荷のための重要な戦略:
この記事では、モデルの読み込み中にメモリ使用量を最適化するためのいくつかの方法について説明します。
シーケンシャルウェイトロード:この手法により、モデルアーキテクチャがGPUにロードされ、CPUメモリからGPUへの個々の重量を繰り返しコピーします。これにより、GPUメモリ内の完全なモデルと重みの両方の同時存在を防ぎ、ピークメモリの消費を大幅に削減します。
メタデバイス: Pytorchの「メタ」デバイスは、即時のメモリ割り当てなしでテンソル作成を可能にします。モデルはメタデバイスで初期化され、GPUに転送され、重みがGPUに直接ロードされ、CPUメモリの使用が最小化されます。これは、CPU RAMが限られているシステムに特に役立ちます。
mmap=True
in torch.load()
:このオプションは、メモリマップされたファイルI/Oを使用して、PytorchがすべてをRAMにロードするのではなく、ディスクオンデマンドからモデルデータを直接読み取ることができます。これは、CPUメモリが限られているシステムと高速ディスクI/Oに最適です。
個々の重量の節約と読み込み:非常に限られたリソースの最後の手段として、この記事では、各モデルパラメーター(テンソル)を別のファイルとして保存することを提案しています。その後、ロードは一度に1つのパラメーターが発生し、いつでもメモリフットプリントを最小限に抑えます。これは、I/Oオーバーヘッドの増加を犠牲にします。
実用的な実装とベンチマーク:
この投稿では、GPUおよびCPUメモリの使用を追跡するためのユーティリティ関数を含む、各手法を示すPythonコードスニペットを提供します。これらのベンチマークは、各方法によって達成されるメモリの節約を示しています。著者は、各アプローチのメモリ使用量を比較し、メモリ効率と潜在的なパフォーマンスへの影響とのトレードオフを強調しています。
結論:
この記事は、特に大規模なモデルでは、メモリ効率の高いモデル負荷の重要性を強調することで締めくくります。特定のハードウェアの制限(CPU RAM、GPU VRAM)およびI/O速度に基づいて、最も適切な手法を選択することをお勧めします。 mmap=True
アプローチは、限られたCPU RAMでは一般的に好まれますが、個々の重量荷重は非常に制約された環境の最後の手段です。シーケンシャルロード方法は、多くのシナリオに適したバランスを提供します。
以上がPytorchのメモリ効率の高いモデル重量荷重の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。