次の方法で共有


DirectML の概要

概要

Direct Machine Learning (DirectML) は、機械学習 (ML) 用の低レベルの API です。 この API には、おなじみの (ネイティブ C++、nano-COM) プログラミング インターフェイスと、DirectX 12 スタイルのワークフローがあります。 機械学習推論ワークロードをゲーム、エンジン、ミドルウェア、バックエンド、またはその他のアプリケーションに統合できます。 DirectML は、すべての DirectX 12 互換ハードウェアでサポートされています。

ハードウェア アクセラレータによる機械学習プリミティブ (演算子と呼ばれます) は、DirectML の構成要素です。 これらのビルディングブロックから、アップスケーリング、アンチエイリアシング、スタイル転送などの機械学習手法を開発できます。 たとえば、ノイズ除去と超解像を使用すると、ピクセルあたりの光線数を減らして印象的なレイトレーシング効果を実現できます。

機械学習推論ワークロードをゲーム、エンジン、ミドルウェア、バックエンド、またはその他のアプリケーションに統合できます。 DirectML には、使い慣れた (ネイティブ C++、nano-COM) DirectX 12 スタイルのプログラミング インターフェイスとワークフローがあり、すべての DirectX 12 互換ハードウェアでサポートされています。 DirectML サンプル アプリケーション (最小限の DirectML アプリケーションのサンプルを含む) については、「 DirectML サンプル アプリケーション」を参照してください。

DirectML は、Windows 10 バージョン 1903 と、対応するバージョンの Windows SDK で導入されました。

DirectML は私のプロジェクトに適していますか?

DirectML は、DirectX 12 互換の任意の GPU で機械学習ワークロードを実行できる低レベルのハードウェア抽象化レイヤーです。

リアルタイム、高パフォーマンス、低遅延、またはリソースに制約のあるシナリオで機械学習のパフォーマンスを最適化する必要がある場合、DirectML は最大限の制御と柔軟性を提供します。 DirectML を使用すると、機械学習を既存のエンジンやレンダリング パイプラインに直接統合したり、Windows 上で独自のカスタム機械学習フレームワークやミドルウェアを構築したりできます。

また、機械学習モデルのオープン標準 ONNX 形式をサポートするクロスプラットフォーム ライブラリである ONNX ランタイムを通じて、DirectML を間接的に使用することもできます。 ONNX ランタイムは、実行プロバイダーの 1 つとして DirectML を、CPU、CUDA、TensorRT などの他のバックエンドと共に使用できます。 これにより、DirectML コードを自分で記述しなくても、DirectML のパフォーマンスと互換性を活用できます。

または、WinML API は、モデルに重点を置いた高レベルの API であり、load-bind-evaluate パターンを使用して機械学習ワークフローを簡略化します。 WinML では、モデルにも ONNX 形式が使用され、バックエンドとして DirectML を使用できます。 WinML は、基になるハードウェアやフレームワークの詳細を気にすることなく、機械学習を Windows アプリケーションに迅速かつ簡単に統合する必要があるシナリオ向けに設計されています。

DirectML はどのような作業を行いますか。また、開発者としてどのような 仕事をしなければならないのか ?

DirectML は、推論モデルの個々のレイヤーを GPU (または、存在する場合は AI アクセラレーション コア) で効率的に実行します。 各レイヤーは演算子であり、DirectML は、ハードウェアで高速化される低レベルの機械学習プリミティブ演算子のライブラリを提供します。 DirectML 操作は、単独で実行することも、グラフとして実行することもできます ( 「DirectML のレイヤー単位とグラフベースのワークフロー」のセクションを参照)。

演算子とグラフは、ハードウェア固有およびアーキテクチャ固有の最適化を適用します。 同時に、開発者は、これらの演算子を実行するためのベンダーに依存しない単一のインターフェイスを見ることができます。

DirectML の演算子のライブラリには、機械学習ワークロードで使用できると予想される通常の操作がすべて用意されています。

  • 線形ReLU、シグモイドtanhなどの活性化演算子。
  • 要素ごとの演算子 ( addexplogmaxminsub など)。
  • 2D や 3D の畳み込みなどの畳み込み演算子。
  • argminaveragel2sum などのリダクション演算子。
  • プール演算子 ( averagelpmax など)。
  • ニューラル ネットワーク (NN) 演算子 ( gemmgrulstmrnn など)。
  • その他多数。

パフォーマンスを最大限に高めるために、また使用しないものにお金を払わないように、DirectML では、ハードウェア上での機械学習ワークロードの実行方法に対する制御を開発者に委ねます。 どの演算子をいつ実行するかを把握することは、開発者の責任です。 あなたの裁量に任されているタスクには、モデルを書き写すことが含まれます。レイヤーの簡素化と最適化。ウェイトの積載;リソースの割り当て、バインディング、メモリ管理 (Direct3D 12 と同様)。グラフの実行。

グラフに関する高度な知識を保持しています (モデルを直接ハードコーディングすることも、独自のモデルローダーを作成することもできます)。 たとえば、 アップサンプリング畳み込み正規化および活性化 演算子のそれぞれを複数のレイヤーを使用して、アップスケーリング モデルを設計できます。 その親しみやすさ、慎重なスケジューリング、バリア管理により、ハードウェアから最大限の並列処理とパフォーマンスを引き出すことができます。 ゲームを開発している場合は、慎重なリソース管理とスケジューリングの制御により、機械学習ワークロードと従来のレンダリング作業をインターリーブして GPU を飽和させることができます。

DirectML のワークフローの概要を教えてください。

ここでは、DirectML の使用方法の概要を示します。 初期化と実行の 2 つの主要なフェーズでは、作業をコマンド リストに記録し、キューで実行します。

初期化

  1. Direct3D 12 リソース (Direct3D 12 デバイス、コマンド キュー、コマンド リスト、記述子ヒープなどのリソース) を作成します。
  2. 機械学習の推論とレンダリング ワークロードを行っているため、DirectML リソース (DirectML デバイスとオペレーター インスタンス) を作成します。 機械学習モデルがあり、特定のデータ型で特定のサイズのフィルター テンソルを使用して特定の種類の畳み込みを実行する必要がある場合、それらはすべて DirectML の 畳み込み 演算子のパラメーターです。
  3. DirectML レコードは、Direct3D 12 コマンド リストに機能します。 したがって、初期化が完了したら、(たとえば) 畳み込み演算子のバインドと初期化をコマンド リストに記録します。 次に、通常どおりキューのコマンドリストを閉じて実行します。

実行

  1. 重みテンソルをリソースにアップロードします。 DirectML のテンソルは、通常の Direct3D 12 リソースを使用して表されます。 たとえば、重みデータを GPU にアップロードする場合は、他の Direct3D 12 リソースの場合と同じ方法で行います (アップロード ヒープまたはコピー キューを使用します)。
  2. 次に、これらの Direct3D 12 リソースを入力テンソルと出力テンソルとしてバインドする必要があります。 オペレーターのバインディングと実行をコマンドリストに記録します。
  3. コマンドリストを閉じて実行します。

Direct3D 12 と同様に、リソースの有効期間と同期はユーザーの責任です。 たとえば、少なくとも GPU での実行が完了するまで、DirectML オブジェクトを解放しないでください。

DirectML のレイヤー単位およびグラフベースのワークフロー

DirectML では、モデルの実行に対してレイヤーごとのアプローチとグラフベースのアプローチの両方がサポートされています。 レイヤーごとに実行する場合は、各 DirectML 演算子を作成して初期化し、コマンド リストに実行するために個別に記録する必要があります。 これに対し、グラフを実行する場合は、代わりにノードとエッジのセットを作成します (各ノードは DirectML 演算子を表し、エッジはノード間を流れるテンソル データを表します)。 その後、グラフ全体が初期化または実行のために一度に送信され、DirectML がユーザーに代わって個々のオペレーターのスケジューリングと記録を処理します。

どちらのパターンも、さまざまな状況で役立ちます。 レイヤーごとのアプローチにより、コンピューティング作業の順序とスケジューリングを最大限に制御できます。 たとえば、このレベルの制御により、Direct3D 12 レンダリング ワークロードと DirectML コンピューティング ディスパッチをインターリーブできます。 これは、非同期コンピューティングまたはシェーダーユニットを GPU で利用する場合に役立ちます。これは、他の方法ではアイドル状態になります。 レイヤーごとに手動で実行することで、開発者はテンソルレイアウトとメモリ使用量を明示的に制御できます。

ただし、機械学習モデルは、多くの場合、レイヤーの グラフ で表されます。 レイヤーごとのアプローチの代わりに、DirectML では、ノード (DirectML 演算子) とノード間のエッジ (テンソル記述) の有向非巡回グラフとしてモデルを表現できます。 グラフの説明を作成したら、初期化と実行のために、すべてをコンパイルして DirectML に一度に送信できます。 このアプローチでは、DirectML が走査順序を決定し、個々の演算子とそれらの間のデータ フローをユーザーに代わって処理します。 これは、多くの場合、機械学習モデルを表現するためのよりシンプルで自然な方法であり、アーキテクチャ固有の最適化を自動的に適用できます。 さらに、 DirectMLX ヘルパー ライブラリは、DirectML 演算子の複雑なグラフを構築するためのクリーンで便利な構文を提供します。

どちらの方法を選択しても、同じ広範な DirectML 演算子スイートに常にアクセスできます。 つまり、レイヤーごとのきめ細かな制御を好む場合でも、グラフアプローチの利便性を好む場合でも、機能を犠牲にする必要はありません。

このセクションでは...

トピック 説明
クイックスタートガイド DirectML の使用を開始します。
開発者ツール DirectML のプロファイリング、最適化、デバッグを行うツール。
プログラミング ガイド データ バインディング、バリア、スライド、フュージョン、エラー処理、デバイスの削除、およびヘルパー関数に関するトピック。
トラブルシューティング エラー条件の処理とデバッグレイヤーの使用。
DirectML のバージョン履歴 DirectML は Windows 10 のシステム コンポーネントであり、スタンドアロンの再頒布可能パッケージとしても利用できます。
DirectML 機能レベルの履歴 各機能レベルで導入された型のマニフェスト。
DirectML サンプル アプリケーション 最小限の DirectML アプリケーションのサンプルを含む DirectML サンプル アプリケーションへのリンク。
GPU アクセラレーテッド ML トレーニング Windows Subsystem for Linux (WSL) とネイティブ Windows の GPU 高速機械学習 (ML) トレーニングで現在サポートされている内容について説明します。
DirectML API リファレンス このセクションでは、 DirectML.hで宣言されている Direct Machine Learning (DirectML) API について説明します。

こちらも参照ください