インテル® DAAL を使用したオンライン処理の概要

インテル® oneDALビッグデータ

この記事は、インテル® デベロッパー・ゾーンに公開されている「A Walk-Through of Online Processing Using Intel® DAAL」(https://software.intel.com/en-us/articles/a-walk-through-of-online-processing-using-intel-daal/) の日本語参考訳です。


インテル® Data Analytics Acceleration Library (インテル® DAAL) は、データマイニング、統計分析、およびマシン・ラーニング・アプリケーションを対象とした新たな高度に最適化されたライブラリーです。すべてのデータ分析ステージをサポートする高度なビルディング・ブロックが提供されます。インテル® DAAL は、バッチ処理、オンライン処理、そして分散処理の 3 つの処理モードをサポートします。

オンライン処理 (別名ストリーミング) は、データがブロックで処理されている場合に適用できます。これは、データセット全体が大きすぎて一度にメモリーに収まりきらない場合や、データが断片でのみ利用可能な場合に役立ちます。

概要

インテル® DAAL で提供されるアルゴリズムのいくつかはデータセットをブロックで処理できます。オンライン処理モードでは、特定のアルゴリズム・クラスの compute() と finalizeCompute() メソッドを使用します。この計算モードでは、データはブロック i = 1,2,3 … n で到達することを想定します。新たな入力が利用可能になるたびに compute() メソッドを呼び出します。最後のデータブロックが到達すると、最終結果を生成するため finalizeCompute() メソッドを呼び出します。非同期モードでデータを入力する場合、getStatus() メソッドを使用して新しいデータブロックが読み込み可能であるかデータソースをチェックすることができます。

以下にオンライン処理向けの計算スキームの図を示します。

注意
各データブロックはそれぞれ異なる列数 (ni) を持つことができますが、ベクトル (p) の数は同じでなければいけません。

一般的にオンライン処理は、ループに適用されます。ループの各反復で 1 つのデータブロックをフェッチし、そのブロックの部分的な結果を計算します。その後、外部ループで部分的な結果はブロック全体の結果を生成するため結合されます。以下にコード例を示します。

/* Create algorithm to compute SVD decomposition in online mode */
svd::Online<> algorithm;
Status loadStatus;
while((loadStatus = dataSource.loadDataBlock(nRowsInBlock)) == success)
{
    algorithm.input.set( svd::data, dataSource.getNumericTable() );
    /* Compute SVD algorithm */
    algorithm.compute();
}

/* Finalize the computations and retrieve SVD results */
algorithm.finalizeCompute();
SharedPtr<svd::Result> res = algorithm.getResult();

/* Access results */
printNumericTable(res->get(svd::singularValues), "Singular values:");
printNumericTable(res->get(svd::rightSingularMatrix), "Right orthogonal matrix V:");
printNumericTable(res->get(svd::leftSingularMatrix), "Left orthogonal matrix U:", 10);

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください

タイトルとURLをコピーしました