組み合わせ演算子を使用したパフォーマンスの向上

一部の DirectML 演算子では、フュージョン と呼ばれる概念がサポートされています。 演算子のフュージョンは、メモリへのラウンドトリップを必要とせずに一緒に実行されるように、1 つの演算子 (通常はアクティブ化関数) を別の演算子に統合することでパフォーマンスを向上させる方法です。

アクティベーションを融合するタイミング

融合されたアクティブ化はパフォーマンス最適化です。 多くの機械学習 (ML) モデルで非常に一般的なシナリオは、モデル内の各レイヤの出力に非線形性 (アクティブ化関数) を適用することです。

通常、これにはグラフィックス メモリへのラウンドトリップが必要です。 たとえば、畳み込みの後に非融合 Relu アクティブ化が続く場合、GPU は、Relu アクティブ化レイヤの計算を開始する前に、畳み込みの結果が GPU メモリに書き込まれるのを待つ必要があります。 ほとんどのアクティブ化関数のコンピューティング ワークロードは小さくなりがちなため、グラフィックス メモリへのラウンドトリップがパフォーマンスの主要なボトルネックになる可能性があります。

演算子のフュージョンにより、前の演算子 (畳み込みなど) の一部としてアクティブ化関数 (上記の例では Relu) を実行できます。 これにより、GPU は、前の演算子の結果がメモリに書き込まれるのを待たずにアクティブ化関数を計算でき、パフォーマンスが向上します。

融合されたアクティブ化では同じ結果が生成されますが、多くの場合は高速であるため、可能な限り前の演算子に結合してアクティブ化レイヤを排除することをお勧めします。

アクティブ化を融合する方法

融合されたアクティブ化をサポートする演算子には、演算子構造体 const DML_OPERATOR_DESC* FusedActivation に追加のオプション パラメーターがあります。 たとえば、畳み込みでは、融合されたアクティブ化がサポートされ、演算子の説明には対応する FusedActivation があります (「DML_CONVOLUTION_OPERATOR_DESC」を参照)。

struct DML_CONVOLUTION_OPERATOR_DESC
{
    const DML_TENSOR_DESC* InputTensor;
    const DML_TENSOR_DESC* FilterTensor;
    _Maybenull_ const DML_TENSOR_DESC* BiasTensor;
    const DML_TENSOR_DESC* OutputTensor;
    DML_CONVOLUTION_MODE Mode;
    DML_CONVOLUTION_DIRECTION Direction;
    UINT DimensionCount;
    _Field_size_(DimensionCount) const UINT* Strides;
    _Field_size_(DimensionCount) const UINT* Dilations;
    _Field_size_(DimensionCount) const UINT* StartPadding;
    _Field_size_(DimensionCount) const UINT* EndPadding;
    _Field_size_(DimensionCount) const UINT* OutputPadding;
    UINT GroupCount;
    _Maybenull_ const DML_OPERATOR_DESC* FusedActivation;
};

アクティブ化を融合するには、融合する アクティブ化の種類を記述する DML_OPERATOR_DESC を作成します。 たとえば、Relu 関数を融合するには、正しい演算子の種類は、DML_OPERATOR_ACTIVATION_RELU です。

Note

アクティブ化関数の演算子の説明を作成するときは、アクティブ化関数の InputTensor パラメーターと OutputTensor パラメーターを NULL に設定する必要があります。

DML_ACTIVATION_LEAKY_RELU_OPERATOR_DESC leakyReluDesc;
leakyReluDesc.InputTensor = nullptr;
leakyReluDesc.OutputTensor = nullptr;
leakyReluDesc.Alpha = 0.01f;

DML_OPERATOR_DESC activationDesc = { DML_OPERATOR_ACTIVATION_LEAKY_RELU, &leakyReluDesc };

DML_CONVOLUTION_OPERATOR_DESC convDesc;
// ...
convDesc.FusedActivation = &activationDesc;

完全な例として、DirectMLSuperResolution サンプル では、融合されたアクティブ化を利用してパフォーマンスを向上させます。

融合アクティブ化をサポートする演算子

次の一覧は、 DML_OPERATOR_TYPE 列挙体の定数に基づいています。 そのトピックの各定数は、使用する適切な説明構造にリンクします。

  • DML_OPERATOR_BATCH_NORMALIZATION
  • DML_OPERATOR_BATCH_NORMALIZATION_TRAINING
  • DML_OPERATOR_CONVOLUTION
  • DML_OPERATOR_ELEMENT_WISE_ADD1
  • DML_OPERATOR_GEMM
  • DML_OPERATOR_MEAN_VARIANCE_NORMALIZATION
  • DML_OPERATOR_MEAN_VARIANCE_NORMALIZATION1

フュージョンでサポートされているアクティブ化

次の一覧は、 DML_OPERATOR_TYPE 列挙体の定数に基づいています。 そのトピックの各定数は、使用する適切な説明構造にリンクします。

  • DML_OPERATOR_ELEMENT_WISE_CLIP
  • DML_OPERATOR_ACTIVATION_LINEAR
  • DML_OPERATOR_ACTIVATION_SIGMOID
  • DML_OPERATOR_ACTIVATION_HARD_SIGMOID
  • DML_OPERATOR_ACTIVATION_TANH
  • DML_OPERATOR_ACTIVATION_SCALED_TANH
  • DML_OPERATOR_ACTIVATION_RELU
  • DML_OPERATOR_ACTIVATION_LEAKY_RELU
  • DML_OPERATOR_ACTIVATION_THRESHOLDED_RELU
  • DML_OPERATOR_ACTIVATION_ELU
  • DML_OPERATOR_ACTIVATION_CELU
  • DML_OPERATOR_ACTIVATION_SCALED_ELU
  • DML_OPERATOR_ACTIVATION_SOFTPLUS
  • DML_OPERATOR_ACTIVATION_PARAMETRIC_SOFTPLUS
  • DML_OPERATOR_ACTIVATION_SOFTSIGN
  • DML_OPERATOR_ACTIVATION_IDENTITY
  • DML_OPERATOR_ACTIVATION_SHRINK
  • DML_OPERATOR_ACTIVATION_GELU

この一覧に含まれていない演算子は、融合されたアクティブ化ではサポートされていません。

関連項目