CPU上での深層学習モデルのパフォーマンス向上:MKL-DNNとPyTorchのto_mkldnnメソッド


to_mkldnn メソッドを使用する利点

  • メモリ使用量の削減
    MKL-DNN は、テンソルをより効率的に格納することで、メモリ使用量を削減することができます。
  • パフォーマンスの向上
    MKL-DNN は、テンソルのメモリレイアウトを最適化し、ベクトル化およびマルチスレッド処理などの高度な技術を使用して、CPU 上の計算速度を向上させることができます。

to_mkldnn メソッドの使用例

import torch

# サンプルのテンソルを作成
x = torch.randn(100, 32, 56, 56)

# テンソルを MKL-DNN メモリレイアウトに変換
x_mkldnn = x.to_mkldnn()

# MKL-DNN を使用するモデルで x_mkldnn を使用
# ...

to_mkldnn メソッドを使用する際の注意点

  • to_mkldnn メソッドは、すべての種類のテンソルでサポートされているわけではありません。サポートされていないテンソルを MKL-DNN メモリレイアウトに変換しようとすると、エラーが発生する可能性があります。
  • to_mkldnn メソッドは、テンソルのメモリレイアウトを変更します。そのため、テンソルを元のレイアウトに戻す場合は、to('cpu') メソッドを使用する必要があります。
  • to_mkldnn メソッドは、CPU 上でのみ使用できます。GPU 上では使用できません。
  • MKL-DNN を使用するには、PyTorch を MKL-DNN でビルドする必要があります。
  • to_mkldnn メソッドは、PyTorch 1.2.0 以降で使用できます。


例 1: 単純な畳み込み層

この例では、to_mkldnn メソッドを使用して、入力テンソルとカーネルテンソルを MKL-DNN メモリレイアウトに変換し、MKL-DNN を使用する畳み込み層で使用する方法を示します。

import torch
import torch.nn as nn

# サンプルの入力とカーネルテンソルを作成
x = torch.randn(100, 3, 32, 56, 56)
w = torch.randn(5, 3, 3, 3, 3)

# テンソルを MKL-DNN メモリレイアウトに変換
x_mkldnn = x.to_mkldnn()
w_mkldnn = w.to_mkldnn()

# MKL-DNN を使用する畳み込み層を作成
conv = nn.Conv3d(5, 3, 3, padding=1, bias=False)
conv.to_mkldnn()

# 畳み込みを実行
y = conv(x_mkldnn, w_mkldnn)

例 2: 残差ネットワーク

この例では、to_mkldnn メソッドを使用して、残差ネットワーク内のすべての畳み込み層とバッチ正規化層を MKL-DNN メモリレイアウトに変換する方法を示します。

import torch
import torch.nn as nn
from torchvision import models

# ResNet18 モデルをロード
model = models.resnet18()

# モデルを MKL-DNN に変換
model.to_mkldnn()

# モデルに入力データを入力し、出力を取得
input = torch.randn(1, 3, 224, 224)
output = model(input)
  • MKL-DNN を使用するには、PyTorch を MKL-DNN でビルドする必要があります。
  • 上記のコード例は、PyTorch 1.2.0 以降で実行する必要があります。


しかし、to_mkldnn にはいくつかの制限があります。

  • テンソルのメモリレイアウトを変更する
    テンソルを元のレイアウトに戻すには、to('cpu') メソッドを使用する必要があります。
  • すべての種類のテンソルをサポートしていない
    一部の種類のテンソルは MKL-DNN メモリレイアウトに変換できません。
  • GPU 上で使用できない
    MKL-DNN は CPU 上でのみ使用できます。

これらの制限により、to_mkldnn が常に最適な選択とは限らない場合があります。

to_mkldnn の代替方法として検討できる方法はいくつかあります。

  1. テンソルを ONNX 形式に変換する
    ONNX は、深層学習モデルを異なるフレームワーク間で移植可能な形式で表現するためのオープンフォーマットです。ONNX モデルを MKL-DNN ランタイムを使用して実行することで、CPU 上のパフォーマンスを向上させることができます。

  2. 別の CPU 向け深層学習ライブラリを使用する
    Intel natively supports oneDNN which is an open-source deep learning library that is similar to MKL-DNN. OneDNN may offer better performance or support for a wider range of tensor types than MKL-DNN.

  3. モデルを GPU で実行する
    GPU は CPU よりも大幅に高速な場合が多いため、モデルを GPU で実行することでパフォーマンスを向上させることができます。

代替方法を選択する際には、以下の要素を考慮する必要があります。

  • パフォーマンス要件
    モデルのパフォーマンス要件。
  • ハードウェア
    使用している CPU と GPU の機能。
  • モデルのアーキテクチャ
    一部のモデルアーキテクチャは、他のアーキテクチャよりも MKL-DNN に適しています。

テンソルを ONNX 形式に変換する

  • ONNX ランタイムは、MKL-DNN など、さまざまなハードウェアアクセラレータをサポートしています。
  • ONNX モデルは、ONNX ランタイムを使用して実行できます。
  • PyTorch の torch.onnx.export 関数を使用して、テンソルを ONNX 形式に変換できます。


import torch
import torch.onnx

# サンプルのテンソルを作成
x = torch.randn(100, 32, 56, 56)

# テンソルを ONNX 形式に変換
torch.onnx.export(model, x, "model.onnx")

# ONNX モデルを MKL-DNN ランタイムを使用して実行
import onnxruntime

# ONNX モデルをロード
ort_session = onnxruntime.InferenceSession("model.onnx")

# 入力データを作成
input = np.random.randn(100, 32, 56, 56).astype(np.float32)

# ONNX モデルを実行
output = ort_session.run(None, {"input": input})

別の CPU 向け深層学習ライブラリを使用する

  • Other CPU-based deep learning libraries include TensorFlow and MXNet.
  • Intel natively supports oneDNN which is an open-source deep learning library that is similar to MKL-DNN. OneDNN may offer better performance or support for a wider range of tensor types than MKL-DNN.

モデルを GPU で実行する

  • PyTorch provides CUDA support for running models on GPUs.
  • If you have a GPU available, you can often achieve significant performance improvements by running your model on the GPU.

代替方法を選択する際には、特定の状況に最適な方法を判断するために、各方法をベンチマークすることをお勧めします。