次の方法で共有


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

一部の DirectML 演算子では、 Fusion と呼ばれる概念がサポートされています。 演算子の融合は、メモリへのラウンドトリップを必要とせずに一緒に実行されるように、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されます。

アクティブ化関数の演算子の説明を作成するときは、アクティブ化関数の 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_バッチ正規化
  • バッチ正規化トレーニング演算子 (DML_OPERATOR_BATCH_NORMALIZATION_TRAINING)
  • DML_OPERATOR_CONVOLUTION
  • DML_OPERATOR_ELEMENT_WISE_ADD1
  • DML_OPERATOR_GEMM
  • 平均分散正規化
  • DML_OPERATOR_MEAN_VARIANCE_NORMALIZATION1

Fusion がサポートするアクティベーション

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

  • DML 演算子 活性化 線形 (DML_OPERATOR_ACTIVATION_LINEAR)
  • DML_オペレーター_活性化_シグモイド
  • ハードシグモイド活性化関数のDMLオペレーター
  • 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演算子の活性化ソフトプラス)
  • DML_OPERATOR_ACTIVATION_PARAMETRIC_SOFTPLUS
  • DML_OPERATOR_ACTIVATION_SOFTSIGN
  • DML_OPERATOR_ACTIVATION_IDENTITY(DMLオペレーター_アクティベーション_アイデンティティ)
  • DML_OPERATOR_ACTIVATION_SHRINK
  • DML_OPERATOR_ACTIVATION_GELU
  • DML_OPERATOR_ELEMENT_WISE_CLIP (畳み込みと GEMM のみ)

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

こちらも参照ください