PyTorch Quantizationでモデルの潜在能力を引き出す:torch.ao.nn.quantized.QFunctional活用ガイド


QFunctional モジュールは、以下の機能を提供します。

  • 逐層クオンタイゼーション: モデルの各層を個別にクオンタイゼーションできます。
  • 動的クオンタイゼーション: モデル推論時にクオンタイゼーションパラメータを動的に更新できます。
  • 量子化された操作の実行: linear, conv2d, relu, max_pool2d などの量子化された操作を実行できます。

QFunctional モジュールを使用するには、まずモデルを quantized aware にする必要があります。これは、torch.quantization.quantize_dynamic などの関数を使用して行うことができます。モデルが quantized aware になったら、QFunctional モジュールの関数を使用して量子化された操作を実行できます。

以下の例は、QFunctional モジュールを使用して量子化された畳み込みを実行する方法を示します。

import torch
import torch.nn.functional as F
import torch.ao.nn.quantized as qnn

# モデルを quantized aware にする
model = torch.quantization.quantize_dynamic(model)

# 量子化された畳み込みを実行
q_input = qnn.quantize(input)
q_output = F.qconv2d(q_input, weight, bias)

torch.ao.nn.quantized.QFunctional モジュールは、PyTorch の Quantization をより簡単に、より柔軟に実行するために役立ちます。詳細については、PyTorch の Quantization ドキュメントを参照してください:

  • torch.ao.nn.quantized.QFunctional モジュールは、PyTorch 1.6 以降で使用できます。


import torch
import torch.nn.functional as F
import torch.ao.nn.quantized as qnn

# モデルを定義する
class MyModel(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv = qnn.Conv2d(1, 1, 3)
        self.relu = qnn.ReLU()

    def forward(self, x):
        x = self.conv(x)
        x = self.relu(x)
        return x

# モデルを quantized aware にする
model = MyModel()
model = torch.quantization.quantize_dynamic(model)

# 入力データを作成する
input = torch.randn(1, 1, 28, 28)

# 量子化された畳み込みとReLUを実行
q_input = qnn.quantize(input)
q_output = model(q_input)
print(q_output)

このコードは、以下の処理を実行します。

  1. MyModel という名前のモデルを定義します。このモデルは、量子化された畳み込み層とReLU層で構成されています。
  2. モデルを quantize_dynamic 関数を使用して quantized aware にします。
  3. ランダムな入力データを作成します。
  4. quantize 関数を使用して入力を量子化します。
  5. model 関数を使用して量子化された入力をモデルに入力します。
  6. モデルの出力を印刷します。


代替手段

  1. nn.Module を使用した静的クオンタイゼーション: この方法は、モデルをトレーニング前に量子化する方法です。モデルの各層を torch.nn.Module の派生クラスで置き換える必要があり、そのクラスは量子化ロジックを実装する必要があります。この方法は、柔軟性が高いですが、コード量が多くなる可能性があります。
  2. FX Graph Mode Quantization: この方法は、モデルの推論グラフを分析し、量子化可能な操作を自動的に検出して変換する方法です。この方法は、コード量が少ないですが、torch.ao.nn.quantized.QFunctional ほど柔軟ではありません。
  3. TFLite Converter: このツールを使用して、PyTorch モデルを TFLite 形式に変換できます。TFLite は、Android や iOS デバイスで広く使用されているモバイル向けの軽量なランタイムです。TFLite Converter は量子化を自動的に行うことができ、モデルを軽量化するために役立ちます。

各代替手段の長所と短所

代替手段長所短所
nn.Module を使用した静的クオンタイゼーション柔軟性が高いコード量が多い
FX Graph Mode Quantizationコード量が少ない柔軟性が低い
TFLite Converterコード量が少ない、モデルを軽量化できるTFLite にのみ対応
  • 展開先: モデルを Android や iOS デバイスで展開する場合は、TFLite Converter が良い選択となります。
  • 開発時間: コード量が少ない方が開発時間が短縮されるため、FX Graph Mode Quantization または TFLite Converter が良い選択となる場合があります。
  • モデルの複雑性: モデルが複雑な場合は、nn.Module を使用した静的クオンタイゼーションの方が柔軟性が高いかもしれません。