PyTorchの`torch.get_float32_matmul_precision`関数:概要と使い方


  • "medium": 8 ビットの有効精度を持つ bfloat16 型を使用します。
  • "high": 10 ビットの有効精度を持つ テンソル浮動小数点 (TensorFloat32) 型または、各 float32 数値を 2 つの bfloat16 数値の合計として扱う方法のいずれかを使用します。 bfloat16 は 7 ビットの有効精度を持つデータ型です。
  • "highest": 32 ビット浮動小数点型 (float32) をそのまま使用します。 これがデフォルト設定です。

行列積の精度を下げることで、計算速度を大幅に向上させることができます。 しかし、精度が低下するため、モデルの精度にも影響を与える可能性があります。

torch.get_float32_matmul_precision 関数は、以下の例のように使用できます。

precision = torch.get_float32_matmul_precision()
print(f"Current float32 matmul precision: {precision}")

このコードは、現在の float32 行列積の精度を出力します。

torch.get_float32_matmul_precision 関数の使用例

  • ハードウェアの制約がある場合
  • 推論速度を向上させたい場合
  • モデルの速度と精度の間でトレードオフを行う必要がある場合
  • すべてのハードウェアで torch.get_float32_matmul_precision 関数がサポートされているわけではありません。
  • 行列積の精度を下げる前に、モデルの精度への影響を評価する必要があります。
  • torch.get_float32_matmul_precision 関数は、PyTorch バージョン 1.6 以降でのみ使用できます。

torch.get_float32_matmul_precision 関数は、PyTorch で実行される float32 型の行列積の内部精度を取得および設定するために使用されます。 この関数は、モデルの速度と精度の間でトレードオフを行う必要がある場合や、推論速度を向上させたい場合などに役立ちます。



import torch

# デフォルトの精度を取得する
precision = torch.get_float32_matmul_precision()
print(f"Current float32 matmul precision: {precision}")

# 行列積の精度を "high" に設定する
torch.set_float32_matmul_precision("high")

# 新しい精度を取得する
new_precision = torch.get_float32_matmul_precision()
print(f"New float32 matmul precision: {new_precision}")

# 行列積を実行する
matrix1 = torch.randn(100, 100)
matrix2 = torch.randn(100, 100)
result = torch.matmul(matrix1, matrix2)

# 結果を出力する
print(result)

このコードでは、まず torch.get_float32_matmul_precision 関数を使用して、デフォルトの行列積精度を取得します。 次に、torch.set_float32_matmul_precision 関数を使用して、行列積精度を "high" に設定します。 最後に、torch.get_float32_matmul_precision 関数を使用して、新しい精度を取得し、2 つのランダムな行列を掛け合わせます。

この例では、行列積の精度を下げることで、計算速度が向上する可能性があることを示しています。 しかし、精度が低下するため、モデルの精度にも影響を与える可能性があります。

以下のコードは、torch.get_float32_matmul_precision 関数を使用して、特定のハードウェアでサポートされている最高の精度を取得する方法を示しています。

import torch

if torch.cuda.is_available():
    device = torch.device("cuda")
    precision = torch.get_float32_matmul_precision(device=device)
    print(f"Current float32 matmul precision on CUDA: {precision}")
else:
    print("CUDA is not available")


環境変数を使用する

PyTorch では、TORCH_MMA_PRECISION という環境変数を設定することで、行列積の精度を制御できます。 この変数は、以下のいずれかの値に設定できます。

  • "bfloat16": 8 ビット浮動小数点 (bfloat16) 型を使用します。
  • "half": 16 ビット浮動小数点 (float16) 型を使用します。
  • "float": 32 ビット浮動小数点 (float32) 型を使用します。

以下の例は、TORCH_MMA_PRECISION 環境変数を "half" に設定する方法を示しています。

export TORCH_MMA_PRECISION="half"

このコマンドを実行すると、すべての行列積が float16 型を使用して実行されます。

torch.backends.cudnn.matmul 関数を使用する

PyTorch では、torch.backends.cudnn.matmul 関数を使用して、CuDNN ライブラリによって最適化された行列積を実行できます。 この関数は、以下の引数を受け取ります。

  • bias: バイアスベクトル (オプション)
  • tensor2: 2 番目のテンソル
  • tensor1: 最初のテンソル

以下の例は、torch.backends.cudnn.matmul 関数を使用して 2 つのランダムな行列を掛け合わせる方法を示しています。

import torch
import torch.backends.cudnn as cudnn

# CUDA デバイスを設定する
device = torch.device("cuda")

# ランダムな行列を作成する
matrix1 = torch.randn(100, 100, device=device)
matrix2 = torch.randn(100, 100, device=device)

# CuDNN を有効にする
cudnn.enabled = True

# 行列積を実行する
result = torch.backends.cudnn.matmul(matrix1, matrix2)

# 結果を出力する
print(result)

このコードでは、まず torch.device("cuda") を使用して CUDA デバイスを設定します。 次に、torch.randn 関数を使用して 2 つのランダムな行列を作成します。 次に、cudnn.enabled = True を設定して CuDNN を有効にします。 最後に、torch.backends.cudnn.matmul 関数を使用して行列積を実行します。

カスタム行列積関数を作成する

独自の行列積関数を作成することもできます。 この関数は、以下の引数を受け取る必要があります。

  • precision: 使用する精度
  • tensor2: 2 番目のテンソル
  • tensor1: 最初のテンソル

以下の例は、8 ビット浮動小数点 (bfloat16) 型を使用して行列積を実行するカスタム関数を作成する方法を示しています。

import torch

def matmul_bfloat16(tensor1, tensor2):
    # bfloat16 型に変換する
    tensor1_bfloat16 = tensor1.half()
    tensor2_bfloat16 = tensor2.half()

    # 行列積を実行する
    result_bfloat16 = torch.matmul(tensor1_bfloat16, tensor2_bfloat16)

    # float32 型に戻す
    result = result_bfloat16.float()

    return result

# ランダムな行列を作成する
matrix1 = torch.randn(100, 100)
matrix2 = torch.randn(100, 100)

# bfloat16 型を使用して行列積を実行する
result = matmul_bfloat16(matrix1, matrix2)

# 結果を出力する
print(result)

このコードでは、まず matmul_bfloat16 というカスタム関数を作成します。 この関数は、tensor1tensor2 を bfloat16 型に変換し、行列積を実行し、結果を float32 型に戻します。 次に、torch.randn 関数を使用して 2 つのランダムな行列を作成します。 最後に、matmul_bfloat16 関数を使用して bfloat16 型を使用して行列積を実行します。

  • 上記の代替方法は、Py