PyTorchでTensorの量子化スキームを理解する:qscheme属性の役割と使い方


PyTorchの「Tensor」クラスには、qscheme属性と呼ばれる属性があります。これは、テンソルの量子化スキームを定義する列挙型です。量子化とは、浮動小数点数を整数値に変換することで、モデルのサイズと計算量を削減する手法です。

qscheme属性の値

qscheme属性には、以下の4つの値が設定できます。

  • torch.per_channel_symmetric
    対称な量子化を各チャンネルに対して行います。各チャンネルごとにゼロポイントを設定します。
  • torch.per_tensor_symmetric
    対称な量子化を各テンソルに対して行います。ゼロポイントのみを使用して、浮動小数点数を整数値に変換します。
  • torch.per_channel_affine
    非対称な量子化を各チャンネルに対して行います。各チャンネルごとにスケールとゼロポイントを設定します。
  • torch.per_tensor_affine
    非対称な量子化を各テンソルに対して行います。スケールとゼロポイントと呼ばれる2つのパラメータを使用して、浮動小数点数を整数値に変換します。

qscheme属性の使用方法

qscheme属性は、以下の方法で使用できます。

  • torch.dequantize関数
    量子化テンソルを元の浮動小数点数形式に戻します。
  • torch.quantize_per_channel関数
    テンソルを量子化します。
  • torch.quantize_per_tensor関数
    テンソルを量子化します。

以下の例では、torch.quantize_per_tensor関数を使用して、テンソルを量子化し、qscheme属性を確認します。

import torch

x = torch.randn(10, 20)
xq = torch.quantize_per_tensor(x, dtype=torch.qint8)
print(xq.qscheme())

このコードを実行すると、以下の出力が得られます。

torch.per_tensor_affine


import torch

x = torch.randn(10, 20)
xq = torch.quantize_per_tensor(x, dtype=torch.qint8)
print(xq.qscheme())  # torch.per_tensor_affine

# 量子化テンソルを元の浮動小数点数形式に戻す
x_dequantized = torch.dequantize(xq)

例2:torch.quantize_per_channel関数を使用した量子化

import torch

x = torch.randn(10, 20, 3)
xq = torch.quantize_per_channel(x, dtype=torch.qint8, axis=2)
print(xq.qscheme())  # torch.per_channel_affine

# 量子化テンソルを元の浮動小数点数形式に戻す
x_dequantized = torch.dequantize(xq)

例3:torch.quantize_dynamic関数を使用した動的量子化

import torch
import torch.quantization

observer = torch.quantization.MinMaxObserver()
xq = torch.quantize_dynamic(x, observer, dtype=torch.qint8)
print(xq.qscheme())  # torch.per_tensor_affine

# 量子化テンソルを元の浮動小数点数形式に戻す
x_dequantized = torch.dequantize(xq)

説明

上記の例では、以下の操作を実行しています。

  1. torch.randn関数を使用して、ランダムな浮動小数点数のテンソルを作成します。
  2. torch.quantize_per_tensortorch.quantize_per_channel、またはtorch.quantize_dynamic関数を使用して、テンソルを量子化します。
  3. 量子化テンソルのqscheme属性を確認します。
  4. torch.dequantize関数を使用して、量子化テンソルを元の浮動小数点数形式に戻します。
  • 量子化には、さまざまなオプションと設定があります。詳細については、PyTorchのドキュメントを参照してください。
  • 上記の例は、PyTorchにおける量子化の基本的な使用方法を示しています。


代替方法

  1. torch.quantize関数
    この関数は、qscheme属性を明示的に指定せずにテンソルを量子化することができます。引数として、テンソル、量子化タイプ、およびオプションのパラメータを渡します。
import torch

x = torch.randn(10, 20)
xq = torch.quantize(x, dtype=torch.qint8)
  1. 動的量子化
    動的量子化では、量子化スキームは事前に定義されません。代わりに、オブザーバーを使用して、モデルの実行中に統計情報を収集し、量子化パラメータを計算します。
import torch
import torch.quantization

observer = torch.quantization.MinMaxObserver()
xq = torch.quantize_dynamic(x, observer, dtype=torch.qint8)
  1. ONNX変換
    PyTorchモデルをONNX形式に変換し、その後、別の量子化ツールを使用して量子化することもできます。

「qscheme」属性を使用しない場合の利点

  • 最新の量子化手法を利用しやすくなる
  • モデルの柔軟性が向上する
  • コードが簡潔になる
  • 一部の量子化ツールで使用できない場合がある
  • 量子化スキームの制御が制限される