DirectML の概要Introduction to DirectML

まとめSummary

Direct Machine Learning (DirectML) は、機械学習 (ML) 向けの低水準 API です。Direct Machine Learning (DirectML) is a low-level API for machine learning (ML). ハードウェア高速化される機械学習プリミティブ (演算子と呼ばれます) が、DirectML の構成要素です。Hardware-accelerated machine learning primitives (called operators) are the building blocks of DirectML. これらの構成要素から、アップスケーリング、アンチエイリアシング、スタイル トランスファーなどの機械学習手法を開発することができます。From those building blocks, you can develop such machine learning techniques as upscaling, anti-aliasing, and style transfer, to name but a few. たとえば、ノイズ除去と超解像技術を使用すると、印象的なレイトレーシング効果を、1 ピクセルあたりの光線数を減らして実現できます。Denoising and super-resolution, for example, allow you to achieve impressive raytraced effects with fewer rays per pixel.

機械学習による推論ワークロードを、開発するゲーム、エンジン、ミドルウェア、バックエンドやその他のアプリケーションに統合できます。You can integrate machine learning inferencing workloads into your game, engine, middleware, backend, or other application. DirectML には、親しみやすい (ネイティブ C++、nano-COM) DirectX 12 スタイルのプログラミング インターフェイスとワークフローがあり、DirectX 12 対応のハードウェアすべてでサポートされています。DirectML has a familiar (native C++, nano-COM) DirectX 12-style programming interface and workflow, and it's supported by all DirectX 12-compatible hardware. DirectML のサンプル アプリケーション (最小限の DirectML アプリケーションのサンプルも含まれます) については、DirectML のサンプル アプリケーションのページを参照してください。For DirectML sample applications, including a sample of a minimal DirectML application, see DirectML sample applications.

DirectML は Windows 10 バージョン 1903 で導入された機能であり、対応するバージョンの Windows SDK でもサポートされています。DirectML is introduced in Windows 10, version 1903, and in the corresponding version of the Windows SDK.

DirectML が適しているプロジェクトIs DirectML appropriate for my project?

DirectML は Windows Machine Learning の傘下にあるコンポーネントです。DirectML is a component under the Windows Machine Learning umbrella. 高水準の WinML API は主にモデルを扱うものであり、"読み込み、バインド、評価" のワークフローが特徴です。The higher-level WinML API is primarily model-focused, with its load-bind-evaluate workflow. ただし、ゲームやエンジンなどを開発するときは、一般的に、より低水準の抽象化とより高度な開発者コントロールが必要になります。これは、ハードウェアの利点をフルに活用するためです。But domains such as games and engines typically need a lower level of abstraction, and a higher degree of developer control, in order to take full advantage of the silicon. 開発するアプリケーションでミリ秒単位が重要であり、フレーム時間を短縮しているような場合は、DirectML がその機械学習のニーズを満たします。If you're counting milliseconds, and squeezing frame times, then DirectML will meet your machine learning needs.

信頼性の高いリアルタイム、高パフォーマンス、低待機時間が求められている、あるいはリソースの制約がある場合は、DirectML を使用します (WinML ではなく)。For reliable real-time, high-performance, low-latency, and/or resource-constrained scenarios, use DirectML (rather than WinML). DirectML を、既存のエンジンやレンダリング パイプラインに直接統合できます。You can integrate DirectML directly into your existing engine or rendering pipeline. これよりも上のレベルで、独自の機械学習フレームワークやミドルウェアを開発する場合は、DirectML を利用すると高パフォーマンスのバックエンドを Windows 上で実現できます。Or, at a higher level for custom machine learning frameworks and middleware, DirectML can provide a high-performance backend on Windows.

WinML 自体の実装にも、DirectML がそのバックエンドの 1 つとして使用されています。WinML is itself implemented using DirectML as one of its backends.

DirectML がどの作業を行い、開発者がどの作業を行う必要があるかWhat work does DirectML do; and what work must I do as the developer?

DirectML は、開発者が作成した推論モデルの個々のレイヤーを GPU 上で (AI アクセラレーション コアが存在する場合はその上で) 効率的に実行します。DirectML efficiently executes the individual layers of your inference model on the GPU (or on AI-acceleration cores, if present). 各レイヤーは 1 つの演算子であり、DirectML には低水準の、ハードウェア高速化される機械学習プリミティブ演算子のライブラリがあります。Each layer is an operator, and DirectML provides you with a library of low-level, hardware-accelerated machine learning primitive operators. これらの演算子には、ハードウェア固有とアーキテクチャ固有の最適化設計が組み込まれています (詳細については、「DirectML の優れたパフォーマンスの理由」を参照してください)。These operators have hardware-specific and architecture-specific optimizations designed in to them (more on that in the section Why does DirectML perform so well?). 開発者は、単一の、ベンダーにとらわれないインターフェイスでこれらの演算子を実行できます。At the same time, you as the developer see a single, vendor-agnostic interface for executing those operators.

DirectML の演算子のライブラリには、機械学習のワークロードでの使用が想定される通常の操作がすべて含まれています。The library of operators in DirectML supplies all of the usual operations that you'd expect to be able to use in a machine learning workload.

  • アクティブ化演算子: linearReLUsigmoidtanh など。Activation operators, such as linear, ReLU, sigmoid, tanh, and more.
  • 要素ごとの演算子: addexplogmaxminsub など。Element-wise operators, such as add, exp, log, max, min, sub, and more.
  • 畳み込み演算子: 2D と 3D の convolution など。Convolution operators, such as 2D and 3D convolution, and more.
  • 簡約演算子: argminaveragel2sum など。Reduction operators, such as argmin, average, l2, sum, and more.
  • プール演算子: averagelpmax など。Pooling operators, such as average, lp, and max.
  • ニューラル ネットワーク (NN) 演算子: gemmgrulstmrnn など。Neural network (NN) operators, such as gemm, gru, lstm, and rnn.
  • 他にも多数あります。And many more.

パフォーマンスを最大化するために、および使用しないものへの支出を防ぐために、DirectML では、機械学習ワークロードをハードウェア上でどのように実行するかを開発者が制御できるようになっています。For maximal performance, and so that you don't pay for what you don't use, DirectML puts the control into your hands as a developer over how your machine learning workload is executed on the hardware. どの演算子をいつ実行するかを判断するのは、開発者の責任です。Figuring out which operators to execute, and when, is your responsibility as the developer. 開発者に判断が任されているタスクの例としては、モデルの転写、レイヤーの単純化と最適化、重みの読み込み、リソースの割り当て、バインド、メモリ管理 (Direct3D 12 と同様)、グラフの実行などがあります。Tasks that are left to your discretion include: transcribing the model; simplifying and optimizing your layers; loading weights; resource allocation, binding, memory management (just as with Direct3D 12); and execution of the graph.

開発者は、自分のグラフについての高度な知識を保持しています (モデルを直接ハードコーディングすることや、独自のモデル ローダーをプログラミングすることができます)。You retain high-level knowledge of your graphs (you can hard-code your model directly, or you can write your own model loader). たとえば、アップスケーリング モデルを設計するとします。これには多数のレイヤーがあり、それぞれ upsampleconvolutionnormalizationactivation の演算子に対応しています。You might design an upscaling model, for example, using several layers each of upsample, convolution, normalization, and activation operators. このような熟知、慎重なスケジューリング、そしてバリア管理によって、開発者はハードウェアが持つ最大限の並列処理能力とパフォーマンスを引き出すことができます。With that familiarity, careful scheduling, and barrier management, you can extract the most parallelism and performance from the hardware. ゲームを開発する場合は、慎重なリソース管理とスケジューリング制御によって、機械学習のワークロードと従来のレンダリング作業を交互に実行させ、GPU を飽和状態にすることができます。If you're developing a game, then your careful resource management and control over scheduling enables you to interleave machine learning workloads and traditional rendering work in order to saturate the GPU.

概要レベルの DirectML ワークフローWhat's the high-level DirectML workflow?

ここでは、DirectML の使い方を概要レベルで説明します。Here's the high-level recipe for how we expect DirectML to be used. 大きく分けて初期化と実行の 2 つのフェーズがあり、その中で作業をコマンド リストとして記録してから、このコマンド リストをキューに対して実行します。Within the two main phases of initialization and execution, you record work into command lists and then you execute them on a queue.

初期化Initialization

  1. Direct3D 12 のリソースを作成します。つまり、Direct3D 12 デバイス、コマンド キュー、コマンド リスト、その他のリソース (記述子ヒープなど) です。Create your Direct3D 12 resources—the Direct3D 12 device, command queue, command list, and resources such as descriptor heaps.
  2. レンダリングのワークロードに加えて機械学習の推論を行うので、DirectML のリソース (DirectML デバイスと演算子インスタンス) を作成します。Since you're doing machine learning inferencing as well as your rendering workload, create DirectML resources—the DirectML device, and operator instances. 作成する機械学習モデルで特定の種類の畳み込みを、特定のサイズのフィルター テンソルと特定のデータ型で実行する必要がある場合は、これらのすべてがパラメーターとして DirectML の convolution 演算子に渡されます。If you have a machine learning model where you need to perform a particular type of convolution with a particular size of filter tensor with a particular data type, then those are all parameters into DirectML's convolution operator.
  3. DirectML によって作業が Direct3D 12 のコマンド リストとして記録されます。DirectML records work into Direct3D 12 command lists. したがって、初期化が完了したら、たとえば convolution 演算子のバインドと初期化をコマンド リストとして記録します。So, once initialization is done, you record the binding and initialization of (for example) your convolution operator into your command list. その後で、通常どおり、コマンド リストを閉じてキューに対して実行します。Then, close and execute your command list on your queue as usual.

実行Execution

  1. 重みテンソルをリソースにアップロードします。Upload your weight tensors into resources. DirectML のテンソルは、通常の Direct3D 12 リソースを使用して表現します。A tensor in DirectML is represented using a regular Direct3D 12 resource. たとえば、重みデータを GPU にアップロードする方法は、他の Direct3D 12 リソースをアップロードするときと同じです (アップロード ヒープ、またはコピー キューを使用します)。For example, if you want to upload your weight data to the GPU, then you do that the same way you would with any other Direct3D 12 resource (use an upload heap, or the copy queue).
  2. 次に、これらの Direct3D 12 リソースを入力と出力のテンソルとしてバインドする必要があります。Next, you need to bind those Direct3D 12 resources as your input and output tensors. 演算子のバインドと実行をコマンド リストに記録します。Record into your command list the binding and the execution of your operators.
  3. コマンド リストを閉じて実行します。Close and execute your command list.

Direct3D 12 と同様に、リソースの有効期間と同期の責任は開発者にあります。Just as with Direct3D 12, resource lifetime and synchronization are your responsibility. たとえば、DirectML オブジェクトを解放するのは、少なくともそのオブジェクトの実行が GPU 上で完了するまで待つ必要があります。For example, don't release your DirectML objects at least until they've completed execution on the GPU.

DirectML の優れたパフォーマンスの理由Why does DirectML perform so well?

独自の convolution 演算子 (たとえば) を計算シェーダー内で HLSL として作成しないほうがよいのには理由があります。There's a good reason why you shouldn't just write your own convolution operator (for example) as HLSL in a compute shader. DirectML を使用する利点は、独自のソリューションを自作する手間を省けることに加えて、パフォーマンスの向上があります。それは、convolutionlstm などのための汎用計算シェーダーを自分でプログラミングした場合に達成できるパフォーマンスを、はるかに上回っています。The advantage of using DirectML is that—apart from saving you the effort of homebrewing your own solution—it has the capability of giving you much better performance than you could achieve with a hand-written, general-purpose compute shader for something like convolution, or lstm.

DirectML がこのことを達成できる要因の一つとして Direct3D 12 のメタコマンド機能があります。DirectML achieves this in part due to the Direct3D 12 metacommands feature. メタコマンドによって機能のブラック ボックスが DirectML にまで公開されるので、ハードウェア ベンダーが、自社のハードウェア固有およびアーキテクチャ固有の最適化に DirectML からアクセスできるしくみを用意することができます。Metacommands expose a black box of functionality up to DirectML, which allows hardware vendors to provide DirectML access to vendor hardware-specific and architecture-specific optimizations. 複数の演算子 (たとえば、convolution と activation) を融合して 1 つのメタコマンドを作成することができます。Multiple operators—for example, convolution followed by activation—can be fused together into a single metacommand. このような要因があるため、DirectML のパフォーマンスは、幅広いハードウェア上で動作するように非常にうまくプログラミングされた、手作業によるチューニング済みのシェーダーさえも上回ることができます。Because of these factors, DirectML has the capability to exceed the performance of even a very well-written hand-tuned compute shader written to run on a breadth of hardware.

メタコマンドは Direct3D 12 API の一部ですが、疎結合されています。Metacommands are part of the Direct3D 12 API, although they're loosely coupled to it. 1 つのメタコマンドは 1 つの固定 GUID で識別されますが、メタコマンドに関するそれ以外のほとんどすべて (動作とセマンティクスからシグネチャと名前に至るまで) は、厳密には Direct3D 12 API の一部ではありません。A metacommand is identified by a fixed GUID, while almost everything else about it (from its behavior and semantics to its signature and name) are not strictly part of the Direct3D 12 API. メタコマンドとは、その作成者とそれを実装するドライバーの間で指定されるものです。Rather, a metacommand is specified between its author and the driver that implements it. この場合の作成者は DirectML です。In this case, the author is DirectML. メタコマンドは Direct3D 12 のプリミティブであるため (Draw や Dispatch と同様)、コマンド リストとして記録してまとめて実行されるようにスケジュールすることができます。Metacommands are Direct3D 12 primitives (just like Draws and Dispatches), so they can be recorded into a command list and scheduled for execution together.

DirectML は、一連の機械学習メタコマンドをすべて使用して機械学習のワークロードを高速化します。DirectML accelerates your machine learning workloads using an entire suite of machine learning metacommands. したがって、開発者はベンダー固有のコード パスを書かなくても推論のハードウェア高速化を実現できます。Consequently, you don't need to write vendor-specific code paths to achieve hardware acceleration for your inferencing. 実行するチップに AI アクセラレータが搭載されている場合は、DirectML はそのハードウェアを使用して畳み込みなどの操作を大幅に高速化します。If you happen to run on an AI-accelerated chip, then DirectML uses that hardware to greatly accelerate operations such as convolution. それと同じコードを、修正せずに AI アクセラレータ非搭載のチップ (たとえばノート PC の一体型 GPU) で実行するときでも、かなりの GPU ハードウェア高速化が実現できます。You can take the same code that you wrote, without modifying it, run it on a chip that's not AI-accelerated (perhaps the integrated GPU in your laptop), and still get great GPU hardware acceleration. さらに、使用できる GPU がない場合は、DirectML が CPU にフォールバックします。And if no GPU is available, then DirectML falls back to the CPU.