0Pricing
Learn AI with Python · レッスン

AMPによる混合精度学習

torch.cuda.amp.autocast()、GradScaler、FP16とBF16の違い、メモリ削減、速度向上について学習します。

「AMPによる混合精度学習」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。

混合精度とは

混合精度学習では、ほとんどの演算を32ビット浮動小数点(FP32)ではなく16ビット浮動小数点(FP16)で実行します。FP16はメモリ使用量が半分になり、最新のGPUのTensor Coreでより高速に実行できます。一方、数値的に敏感な一部の演算は、安定性を保つためFP32のまま実行します。

メリット

混合精度には次のメリットがあります。

  • メモリを約2倍節約でき、より大きなバッチやモデルを使用できます
  • Tensor Coreで行列乗算を高速化できます
  • 正しく使用すれば、最終的なモデル精度の低下はほとんど、またはまったくありません

FP16のアンダーフロー問題

FP16の値域は狭いという特徴があります。小さな勾配値がアンダーフローしてゼロになると、学習が気付かないうちに停止します。これが混合精度で解決すべき中心的な課題であり、すべてを単純にFP16へ変換できない理由です。

torch.cuda.amp

PyTorchのAutomatic Mixed Precision(AMP)は、2つのツールでこの処理を行います。autocastは演算ごとに精度を選択し、GradScalerは勾配のアンダーフローを防ぎます。

import torch
from torch.cuda.amp import autocast, GradScaler

autocastコンテキスト

フォワードパスをautocast()で囲みます。その内部では、PyTorchが各演算を最も安全な精度で自動的に実行します。行列乗算はFP16で、softmaxや損失のような集約演算はFP32で実行されます。

with autocast():
    output = model(x)
    loss = criterion(output, y)

GradScalerの導入

GradScalerは、バックプロパゲーションの前に損失へ大きなスケール係数を掛けることで、アンダーフローを防ぎます。これにより、小さな勾配をFP16で表現可能な範囲へ移し、オプティマイザのステップ前にスケールを元に戻します。

scaler = GradScaler()

損失のスケーリング

scaler.scale(loss).backward()は損失を大きくしてから、バックプロパゲーションを実行します。結果として得られる勾配もスケーリングされるため、小さな値が消失するのを防げます。

scaler.scale(loss).backward()

scaler.step

scaler.step(optimizer)は、まず勾配を本来の大きさに戻し、その後optimizer.step()を呼び出します。ただし、infやNaNが発生していない場合に限ります。勾配がオーバーフローした場合は、ステップをスキップします。

scaler.step(optimizer)

scaler.update

scaler.update()は、次の反復に向けてスケール係数を調整します。ステップが成功するとスケールを大きくし、オーバーフローが発生すると小さくします。この適応的なスケーリングにより、学習の安定性が自動的に保たれます。

scaler.update()

AMPを使った完全なループ

これらの要素を組み合わせると、混合精度学習の完全なステップになります。

scaler = GradScaler()
for x, y in loader:
    x, y = x.cuda(), y.cuda()
    optimizer.zero_grad()
    with autocast():
        out = model(x)
        loss = criterion(out, y)
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

実践的なヒント

次の点を覚えておきましょう。

  • スケーリングした損失に対してのみbackward()を呼び出します
  • autocastで囲むのはフォワードパスだけです。バックワードやオプティマイザのステップは囲みません
  • AMPはTensor Core搭載GPUで特に効果を発揮します。古いハードウェアでは効果が小さくなります

確認テスト

AMPの理解度を確認しましょう。

まとめ

AMPを使った混合精度学習について学びました。

  • autocast()はフォワードパスで、演算ごとにFP16またはFP32を選択します
  • GradScalerは損失をスケーリングして、勾配のアンダーフローを防ぎます
  • 一連の処理はscaler.scale(loss).backward()、scaler.step(optimizer)、scaler.update()です
  • 結果として、メモリを約2倍節約でき、学習も高速になります

よくある質問

「AMPによる混合精度学習」レッスンは無料ですか?

はい。「AMPによる混合精度学習」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。

「AMPによる混合精度学習」で何を学びますか?

torch.cuda.amp.autocast()、GradScaler、FP16とBF16の違い、メモリ削減、速度向上について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn AI with Pythonを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「AMPによる混合精度学習」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn AI with Pythonレッスンでコードを書いて実行できますか?

はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. DataParallelによるマルチGPU学習
  2. DistributedDataParallel(DDP)
  3. AMPによる混合精度学習
  4. Hugging Face Accelerateによる効率的な学習
← Learn AI with Pythonに戻る