00:00:00これはDeepSpeed。PyTorchに直接組み込んでメモリ不足という根本的な問題を解決する、Microsoftのオープンソースライブラリです。
00:00:07これを使えば、通常なら即座にクラッシュしてしまうようなモデルでも、1枚のGPUでオーバーロードさせることなく動かせます。巨大なモデルが失敗するのは、速度が遅いからではありません。
00:00:14オプティマイザの状態、勾配、パラメータがVRAMを使い果たしてしまうからです。DeepSpeedの秘訣は、学習状態を分散させる「ZeRO」にあります。
00:00:23これですべての場所に同じデータを保存する必要がなくなります。今後も動画を投稿していくので、ぜひチャンネル登録をお願いします。
00:00:30では、さっそく動かしてみましょう。私はMacのM4 Proを使っているので、今回はすべてGoogle Colab上で実行します。
00:00:40NVIDIAのGPUを持っていないので少し厄介なのですが、Colabを使えば問題ありません。まずは、
00:00:46GPUの状況を素早くチェックしてから、必要なパッケージをすべてpipでインストールします。
00:00:51PyTorch、Hugging Face、DeepSpeedなどをインストールし、次に「ds_report」を実行してCUDAとコンパイラの設定を最終確認します。
00:00:59スムーズに動作させるために、さらにいくつか追加でインストールを行います。
00:01:02次に、DeepSpeedを設定するためのconfig.jsonファイルを作成します。この設定ファイルこそが、成否を分ける鍵となります。
00:01:09まずは「ZeRO Stage 2」から始めましょう。これはオプティマイザの状態と勾配を複数のGPUに分散させます。
00:01:14モデルのパラメータは複製したまま、メモリ使用量を大幅に削減できます。ここは悩みすぎないでください、私もかなり苦労した部分なので。
00:01:22まずは公式ドキュメント通りに始め、一度に一箇所だけ変更するようにしましょう。あれこれ設定を詰め込みたくなる衝動は抑えてください。
00:01:28設定内容はHugging FaceとDeepSpeed両方のドキュメントに記載されています。
00:01:34今回のPythonスクリプトの大部分も、それらのドキュメントを参考にしています。
00:01:37ただし、自分のMac環境でより適切に動作するように、いくつか微調整を加えました。
00:01:42もしこの段階で失敗するなら、そこで止まってください。DeepSpeedの問題の多くはモデルではなく、CUDAの不一致が原因だからです。
00:01:48では、これらを実行して動作を確認してみましょう。
00:01:51今回は実行を早くするために、インポートした小規模なデータセットを使用します。
00:01:58数分後、うまくいきました。各ステップの推移や、GPUメモリのピーク使用量も確認できます。
00:02:03今回の実行では、トレーニングロスに大きな変化や低下は見られませんでした。
00:02:08ですが、設定を最適化したり、より大きなデータセットを使えばロスは改善されます。
00:02:13ここで、多くの人が陥りがちな「結局メモリ不足になる」ケースについて説明します。
00:02:16ZeROには複数のステージがあり、各ステージは「1枚のGPUで何を保存しなくて済むか」という問いに答えるものです。
00:02:24ステージ1はオプティマイザの状態を分散し、ステージ2はそれに加えて勾配も分散します。
00:02:30これで、密かにメモリを食いつぶしていた要素をさらに削ぎ落とせます。そして「ZeRO Stage 3」です。
00:02:36これが決定版です。オプティマイザの状態、勾配、そしてパラメータのすべてを分散させます。
00:02:40メモリ節約において最大の効果を発揮しますが、それでも足りない場合があります。
00:02:45モデルが収まらない場合、「ZeRO-Infinity」を使えばCPUやNVMeにまでオフロード(退避)できます。
00:02:50速度を犠牲にして規模を取る形になりますが、まずは「モデルを動かすこと」自体が勝利である場合も多いのです。
00:02:56「メモリだけが問題じゃない」とお考えの方、その通りです。DeepSpeedはデータ、パイプライン、テンソルの「3D並列化」もサポートしています。
00:03:04さらに、Mixture of Experts(MoE)モデルのネイティブサポートも備えています。
00:03:09そのため、スパース(疎)モデルでも計算リソースを浪費しません。
00:03:12これで選択肢がぐっと広がりました。DeepSpeedはHugging FaceやAccelerateと非常にうまく連携します。
00:03:19すべてをゼロから構築する必要はありません。
00:03:21基本的には必要な機能だけを取り入れ、残りは無視して構いません。ベンチマークは環境に大きく左右されるので、
00:03:27宣伝文句の大きな数字を鵜呑みにしないようにしましょう。私も何度か試しましたが、
00:03:30やはりM4 Pro環境では、この基本的なモデルをこれ以上最適化することはできませんでした。
00:03:36断言は難しいですが、他のDeepSpeedプロジェクトでは、特にメモリが制限要因だった場合にスループットが大幅に向上しています。
00:03:41WindowsやLinuxユーザーにとっては、非常に大きなメリットになるはずです。
00:03:46まずは試してみるのが一番です。まずは公式の設定から始めてみてください。
00:03:51今回私もそうしました。Mac向けに少し変更し、CUDAの問題を修正しただけです。
00:03:56オフロードを有効にするならCPUメモリに注意し、将来的にマルチGPUにするなら、
00:04:01Accelerateが役に立つでしょう。DeepSpeedは、いわば「今日は絶対にメモリ不足を許さないボタン」のようなものです。
00:04:07ZeROとオフロードの仕組みを理解すれば、限られたハードウェアでも巨大なモデルを実用的に扱えるようになります。
00:04:14最初はセットアップで混乱するかもしれませんが、
00:04:17この動画が役に立った、あるいは開発ツールが好きだという方は、ぜひ登録をお願いします。また次の動画でお会いしましょう。