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)
説明
上記の例では、以下の操作を実行しています。
torch.randn
関数を使用して、ランダムな浮動小数点数のテンソルを作成します。torch.quantize_per_tensor
、torch.quantize_per_channel
、またはtorch.quantize_dynamic
関数を使用して、テンソルを量子化します。- 量子化テンソルの
qscheme
属性を確認します。 torch.dequantize
関数を使用して、量子化テンソルを元の浮動小数点数形式に戻します。
- 量子化には、さまざまなオプションと設定があります。詳細については、PyTorchのドキュメントを参照してください。
- 上記の例は、PyTorchにおける量子化の基本的な使用方法を示しています。
代替方法
- torch.quantize関数
この関数は、qscheme
属性を明示的に指定せずにテンソルを量子化することができます。引数として、テンソル、量子化タイプ、およびオプションのパラメータを渡します。
import torch
x = torch.randn(10, 20)
xq = torch.quantize(x, dtype=torch.qint8)
- 動的量子化
動的量子化では、量子化スキームは事前に定義されません。代わりに、オブザーバーを使用して、モデルの実行中に統計情報を収集し、量子化パラメータを計算します。
import torch
import torch.quantization
observer = torch.quantization.MinMaxObserver()
xq = torch.quantize_dynamic(x, observer, dtype=torch.qint8)
- ONNX変換
PyTorchモデルをONNX形式に変換し、その後、別の量子化ツールを使用して量子化することもできます。
「qscheme」属性を使用しない場合の利点
- 最新の量子化手法を利用しやすくなる
- モデルの柔軟性が向上する
- コードが簡潔になる
- 一部の量子化ツールで使用できない場合がある
- 量子化スキームの制御が制限される