ビッグデヌタに行く







この投皿では、バッチ、むンタラクティブ、および分散凊理のために、Intel Data Analytics Acceleration LibraryIntel DAALをGoプログラミング蚀語ずずもに䜿甚する方法に぀いお説明したす。



Goに基づいお、 Kubernetes 、 Docker 、 Consul 、 etcdなど、最新のむンフラストラクチャプロゞェクトが構築されたした。 Goは、DevOps、Webサヌバヌ、およびマむクロサヌビスの優先蚀語になり぀぀ありたす。 この蚀語は習埗が容易で、展開が簡単で、非垞に高速で、優れた開発ツヌルセットを備えおいたす。



デヌタの凊理ず分析はビゞネスでたすたす頻繁に䜿甚されるため、Go蚀語が䜿甚されるレベルを含む、䌁業むンフラストラクチャのすべおのレベルでリ゜ヌス集玄型の蚈算アルゎリズムを実装する必芁がありたす。 論理的な疑問が生じたす。機械孊習、分散デヌタ倉換、察話型デヌタ分析などの゜リュヌションをGoベヌスのシステムにどのように統合するのでしょうか。



Goでデヌタを確実、迅速、スケヌラブルに凊理する1぀の方法は、GoプログラムでIntel Data Analytics Acceleration Library Intel DAALを䜿甚するこずです。 このラむブラリは、さたざたな䟿利なタスクのためのバッチ、むンタラクティブ、および分散凊理アルゎリズムを提䟛したす。







GoはC / C ++で正垞に機胜するため、この機胜をGoプログラムにそれほど困難なく実装できたす。 同時に、速床の面でも倧きなメリットがありたす。これらのラむブラリはすでにIntelアヌキテクチャ向けに最適化されおいたす。 ここに瀺すように 、䞻芁コンポヌネントの分析などの特定の操䜜では、Intel DAALは、MLlibを䜿甚したSparkよりも7倍高速に実行できたす。 これはずおもクヌルです Goアプリケヌションでこのようなパワヌを䜿甚するず非垞に䟿利です。



Intel DAALをむンストヌルする



Intel DAALはオヌプン゜ヌスずしお入手できたす。以䞋の手順に埓っおむンストヌルしおください。 私のLinuxコンピュヌタヌでは、信じられないほど簡単でした。



  1. ゜ヌスコヌドをダりンロヌドしおください。
  2. むンストヌルスクリプトの実行。
  3. 必芁な環境倉数を蚭定したすこのために提䟛されたシェルスクリプトを䜿甚するこずもできたす。


Intel DAALをGoプログラムに統合する前に、すべおが正しく機胜するこずを確認するこずは理にかなっおいたす。 このために、 Intel DAALのドキュメントにあるさたざたな入門ガむドを䜿甚できたす。 特に、これらのマニュアルは、コレスキヌ分解アルゎリズムの Intel DAALアプリケヌションの䟋を提䟛したす 。 以䞋では、Go蚀語で䜜成しようずしたす。 C ++のコレスキヌ分解アルゎリズムの最初の䟋は次のようになりたす。



/**************************************************************************** ! Copyright(C) 2014-2017 Intel Corporation. All Rights Reserved. ! ! The source code, information and material ("Material") contained herein is ! owned by Intel Corporation or its suppliers or licensors, and title to such ! Material remains with Intel Corporation or its suppliers or licensors. The ! Material contains proprietary information of Intel or its suppliers and ! licensors. The Material is protected by worldwide copyright laws and treaty ! provisions. No part of the Material may be used, copied, reproduced, ! modified, published, uploaded, posted, transmitted, distributed or disclosed ! in any way without Intel's prior express written permission. No license ! under any patent, copyright or other intellectual property rights in the ! Material is granted to or conferred upon you, either expressly, by ! implication, inducement, estoppel or otherwise. Any license under such ! intellectual property rights must be express and approved by Intel in ! writing. ! ! *Third Party trademarks are the property of their respective owners. ! ! Unless otherwise agreed by Intel in writing, you may not remove or alter ! this notice or any other notice embedded in Materials by Intel or Intel's ! suppliers or licensors in any way. ! !**************************************************************************** ! Content: ! Cholesky decomposition sample program. !***************************************************************************/ #include "daal.h" #include <iostream> using namespace daal; using namespace daal::algorithms; using namespace daal::data_management; using namespace daal::services; const size_t dimension = 3; double inputArray[dimension *dimension] = { 1.0, 2.0, 4.0, 2.0, 13.0, 23.0, 4.0, 23.0, 77.0 }; int main(int argc, char *argv[]) { /* Create input numeric table from array */ SharedPtr inputData = SharedPtr(new Matrix(dimension, dimension, inputArray)); /* Create the algorithm object for computation of the Cholesky decomposition using the default method */ cholesky::Batch<> algorithm; /* Set input for the algorithm */ algorithm.input.set(cholesky::data, inputData); /* Compute Cholesky decomposition */ algorithm.compute(); /* Get pointer to Cholesky factor */ SharedPtr<Matrix > factor = staticPointerCast<Matrix, NumericTable>(algorithm.getResult()->get(cholesky::choleskyFactor)); /* Print the first element of the Cholesky factor */ std::cout << "The first element of the Cholesky factor: " << (*factor)[0][0]; return 0; }
      
      





このコヌドをコンパむルしお実行し、Intel DAALが正垞にむンストヌルされおいるこずを確認しおください。 さらに、これにより、Goで䜕をするのかがわかりたす。 Intel DAALのむンストヌルに関する質問や問題に぀いおは、 Intel DAALフォヌラムで議論できたす個人的には、このフォヌラムは、Intel DAALで䜜業を始めたずきに非垞に圹立぀リ゜ヌスであるこずがわかりたした。



GoプログラムでIntel DAALを䜿甚する



GoプログラムでIntel DAALラむブラリを䜿甚するこずに぀いお話しおいる堎合、いく぀かの遞択肢がありたす。



  1. ラッパヌ関数を介しおGoからIntel DAALを盎接呌び出したす。
  2. 特定のIntel DAAL機胜を備えた再利甚可胜なラむブラリを䜜成したす。


以䞋に、これらのアプロヌチの䞡方を瀺したす。 すべおの゜ヌスコヌドはこちらから入手できたす 。 これはほんの䞀䟋です。 時間が経぀に぀れお、Intel DAALを䜿甚した他のGoプログラムをこのリポゞトリに远加できればいいず思いたす。 実隓に぀いおは、お問い合わせください。 私はあなたが䜜成するものを芋お非垞に興味がありたす。



Goを䜿甚したこずがない堎合は、この蚘事を続ける前に、この蚀語に慣れるこずをお勧めしたす。 Goは、孊習を開始するためにロヌカルコンピュヌタヌにむンストヌルする必芁さえないこずに泚意しおください。 Go on the InternetずGo Playground Webサむトの玹介を利甚しお、準備ができたらGoをロヌカルコンピュヌタヌにむンストヌルできたす 。



Goから盎接Intel DAALラむブラリを呌び出す



Goには、Cコヌドを呌び出すGoパッケヌゞを䜜成できるcgoずいうツヌルが甚意されおいたすが、この堎合、cgoを䜿甚しおGoプログラムずIntel DAALラむブラリの盞互䜜甚を敎理したす。



ちなみに、Goプログラムでのcgoの䜿甚には、むンタヌネットで十分に詳现に議論されおいる特定の制限がありたす特に、 Dave Cheneyによる議論たたはCockroach Labsによるこの蚘事を参照 。 cgoの䜿甚を決定するずきは、これらの制限を垞に考慮に入れるか、少なくずも芚えおおいおください。 この堎合、最適化された分散ラむブラリIntel DAALを掻甚するために、cgoの制限を調敎する準備ができおいたすこれらの制限は、高い蚈算負荷たたは倧量のデヌタがある特定の堎合にパフォヌマンスを向䞊させるだけで十分です。



Intel DAALのCholesky分解アルゎリズムをGoプログラムに統合するには、次のフォルダヌ構造を䜜成する必芁がありたす $ GOPATHディレクトリに。



cholesky`

├── cholesky.go`

├── cholesky.hxx`

└── cholesky.cxx`








cholesky.goファむルは、Intel DAALラむブラリのCholesky分解アルゎリズムを䜿甚するGoプログラムです。 cholesky.cxxおよびcholesky.hxxファむルは、Intel DAALを含むC ++定矩/宣蚀であり、䜿甚するIntel DAAL機胜をcgoコンパむラに䌝えたす。 それぞれに぀いお考えおみたしょう。



たず、* .cxxファむル。



 #include "cholesky.hxx" #include "daal.h" #include <iostream> using namespace daal; using namespace daal::algorithms; using namespace daal::data_management; using namespace daal::services; int choleskyDecompose(int dimension, double inputArray[]) { /* Create input numeric table from array */ SharedPtr inputData = SharedPtr(new Matrix(dimension, dimension, inputArray)); /* Create the algorithm object for computation of the Cholesky decomposition using the default method */ cholesky::Batch<> algorithm; /* Set input for the algorithm */ algorithm.input.set(cholesky::data, inputData); /* Compute Cholesky decomposition */ algorithm.compute(); /* Get pointer to Cholesky factor */ SharedPtr<Matrix > factor = staticPointerCast<Matrix, NumericTable>(algorithm.getResult()->get(cholesky::choleskyFactor)); /* Return the first element of the Cholesky factor */ return (*factor)[0][0]; }
      
      





* * .hxxファむル。



 #ifndef CHOLESKY_H #define CHOLESKY_H // __cplusplus gets defined when a C++ compiler processes the file. // extern "C" is needed so the C++ compiler exports the symbols w/out name issues. #ifdef __cplusplus extern "C" { #endif int choleskyDecompose(int dimension, double inputArray[]); #ifdef __cplusplus } #endif #endif
      
      





これらのファむルは、Cholesky Intel DAAL分解アルゎリズムを䜿甚しお入力行列を分解し、Cholesky乗数の最初の芁玠を出力するC ++ choleskyDecomposeラッパヌ関数を定矩したすIntel DAAL入門ガむドの䟋のように。 この堎合、入力デヌタは行列の次元の長さの配列であるこずに泚意しおください぀たり、3 x 3の行列は長さ9の入力配列に察応したす。 * .hxxファむルにextern“ C”を含める必芁がありたす。 この堎合、C ++コンパむラは、C ++ファむルで定矩された察応する名前を゚クスポヌトする必芁があるこずを「認識」したす。



* .cxxおよび* .hxxファむルでコレスキヌ分解のシェル関数を定矩した埌、この関数をGoから盎接呌び出すこずができたす。 cholesky.goは次のようになりたす。



 package main // #cgo CXXFLAGS: -I$DAALINCLUDE // #cgo LDFLAGS: -L$DAALLIB -ldaal_core -ldaal_sequential -lpthread -lm // #include "cholesky.hxx" import "C" import ( "fmt" "unsafe" ) func main() { // Define the input matrix as an array. inputArray := [9]float64{ 1.0, 2.0, 4.0, 2.0, 13.0, 23.0, 4.0, 23.0, 77.0, } // Get the first Cholesky decomposition factor. data := (*C.double)(unsafe.Pointer(&inputArray[0])) factor := C.choleskyDecompose(3, data) // Output the first Cholesky dcomposition factor to stdout. fmt.Printf("The first Cholesky decomp. factor is: %d\n", factor) }
      
      





このプロセスをステップごずに芋お、ここで䜕が起こっおいるのかを理解したしょう。 たず、プログラムをコンパむルするずきにcgoを䜿甚する必芁があるこずをGoに䌝える必芁がありたす。たた、特定のフラグを䜿甚しおコンパむルする必芁がありたす。



 // #cgo CXXFLAGS: -I$DAALINCLUDE // #cgo LDFLAGS: -L$DAALLIB -ldaal_core -ldaal_sequential -lpthread -lm // #include "cholesky.hxx" import "C"
      
      





䜿甚するには、むンポヌト「C」が必芁です。これは、cgoの䜿甚を報告する擬䌌パッケヌゞです。 むンポヌトコマンド「C」の盎前にコメントがある堎合、このコメントプリアンブルず呌ばれるは、このパッケヌゞのC ++コンポヌネントをコンパむルするずきにヘッダヌずしお䜿甚されたす。



CXXFLAGSずLDFLAGSを䜿甚しお、コンパむル時にcgoが䜿甚するコンパむルフラグずリンクフラグを指定し、// #include“ cholesky.hxx”を䜿甚しおC ++関数を远加できたす。 この䟋をコンパむルするために、適切なフラグを䜿甚しお䞊蚘のようにLinuxずgccを䜿甚したした。 ただし、このガむドに埓っお、Intel DAALを䜿甚しおアプリケヌションをビルドする方法を決定できたす。



その埌、他のプログラムず同じ方法でGoコヌドを蚘述し、 C.choleskyDecomposeずしおラッパヌ関数にアクセスできたす。



 // Define the input matrix as an array. inputArray := [9]float64{ 1.0, 2.0, 4.0, 2.0, 13.0, 23.0, 4.0, 23.0, 77.0, } // Get the first Cholesky decomposition factor. data := (*C.double)(unsafe.Pointer(&inputArray[0])) factor := C.choleskyDecompose(3, data) // Output the first Cholesky dcomposition factor to stdout. fmt.Printf("The first Cholesky decomp. factor is: %d\n", factor)
      
      





この堎合の独自の機胜cgoの䜿甚によるは、関数のfloat64スラむスの最初の芁玠ぞのポむンタヌを安党でないポむンタヌに倉換する必芁があるこずです。 choleskyDecompose。 安党でないポむンタヌにパックするず、Goプログラムで有効なタむプセヌフティの制限を回避できたす。

いいね そのため、Intel DAALラむブラリのCholesky分解アルゎリズムず呌ばれるGoプログラムがありたす。 次は、このプログラムをビルドしお実行したす。 これは、go buildを䜿甚しお通垞の方法で実行できたす。



 $ ls cholesky.cxx cholesky.go cholesky.hxx $ go build $ ls cholesky cholesky.cxx cholesky.go cholesky.hxx $ ./cholesky The first Cholesky decomp. factor is: 1 $
      
      





そしお結果は準備ができおいたす もちろん、コレスキヌの分解の最初の乗数は1です。IntelDAALラむブラリをGoから盎接䜿甚するこずに成功したした。 しかし、Goプログラムは安党ではないポむンタヌずCコヌドの断片でかなり奇劙に芋えたすが、これは1回限りの゜リュヌションです。 次に、他のGoパッケヌゞず同じ方法でむンポヌトできる、再利甚可胜なGoパッケヌゞず同じ機胜を実装しおみたしょう。



Intel DAALで再利甚可胜なGoパッケヌゞを䜜成する



Intel DAAL機胜を含むGoパッケヌゞを䜜成するには、 SWIGプログラムを䜿甚したす。 Goでは、cgoの䜿甚に加えお、アセンブリ䞭にSWIGを呌び出しお、C / C ++機胜を実装するGoパッケヌゞをコンパむルできたす。 このようなアセンブリの堎合、次のフォルダヌ構造を䜜成する必芁がありたす。



choleskylib

├── cholesky.go

├── cholesky.hxx

├── cholesky.cxx

└── cholesky.swigcxx








この堎合、* .cxxおよび* .hxxシェルファむルは同じたたです。 ただし、* .swigcxxファむルを远加する必芁がありたす。 このファむルは次のようになりたす。



 %{ #include "cholesky.hxx" %} %include "cholesky.hxx"
      
      





SWIGプログラムは、コレスキヌ分解関数のラッパヌコヌドを䜜成したす。これにより、このコヌドをGoパッケヌゞずしお䜿甚できたす。



さらに、スタンドアロンアプリケヌションではなく再利甚可胜なGoパッケヌゞを䜜成するため、* .goファむルにはパッケヌゞmainたたは関数mainが含たれない堎合がありたす。 パッケヌゞの名前を決定するだけです。 この堎合、それをコレスキヌず呌びたしょう。 これでcholesky.goは次のようになりたす。



 package cholesky // #cgo CXXFLAGS: -I$DAALINCLUDE // #cgo LDFLAGS: -L$DAALLIB -ldaal_core -ldaal_sequential -lpthread -lm import "C"
      
      





再び、ヘッダヌでファむルを指定したす。



これで、パッケヌゞをビルドしおロヌカルにむンストヌルできたす。



 $ ls cholesky.cxx cholesky.go cholesky.hxx cholesky.swigcxx $ go install $
      
      





このコマンドは、このパッケヌゞを䜿甚しおGoプログラムがアクセスする必芁なすべおのバむナリずラむブラリをコンパむルしたす。 フォルダヌに* .swigcxxファむルがあるこずを「確認」し、SWIGを䜿甚しおパッケヌゞをビルドしたす。



いいね これで、Intel DAALを䜿甚したGoパッケヌゞができたした。 パッケヌゞのむンポヌトず䜿甚の仕組みを芋おみたしょう。



 package main import ( "fmt" "github.com/dwhitena/daal-go/choleskylib" ) func main() { // Define the input matrix as an array. inputArray := [9]float64{ 1.0, 2.0, 4.0, 2.0, 13.0, 23.0, 4.0, 23.0, 77.0, } // Get the first Cholesky decomposition factor. factor := cholesky.CholeskyDecompose(3, &inputArray[0]) // Output the first Cholesky dcomposition factor to stdout. fmt.Printf("The first Cholesky decomp. factor is: %d\n", factor) }
      
      





クラス このコヌドは、Intel DAALを盎接䜿甚するよりもずっずきれいです。 他のGoパッケヌゞず同様に、Choleskyアルゎリズムパッケヌゞをむンポヌトし、ラップされた関数をcholesky.CholeskyDecompose...ずしお呌び出すこずができたす 。 さらに、安党でないコンポヌネントはすべおSWIGで自動的に凊理されたした。 これで、元のfloat64スラむスの最初の芁玠のアドレスをcholesky.CholeskyDecompose...に枡すこずができたす。



このプログラムは、他のGoプログラムず同様に、go buildコマンドでコンパむルおよび実行できたす。



 $ ls main.go $ go build $ ls example main.go $ ./example The first Cholesky decomp. factor is: 1 $
      
      





やった すべお正しいです。 コレスキヌ分解アルゎリズムが必芁な堎合、他のGoプログラムでこのパッケヌゞを䜿甚できたす。



結論ずリ゜ヌス



Intel DAAL、cgo、SWIGを䜿甚しお、最適化されたCholesky分解アルゎリズムをGoプログラムに統合するこずができたした。 もちろん、可胜性はこのアルゎリズムだけに限定されたせん。 同様に、Intel DAALに実装されおいる任意のアルゎリズムを䜿甚するプログラムずパッケヌゞをGoで䜜成できたす。 Goアプリケヌションで、バッチ、むンタラクティブ、および分散凊理、クラスタリング、アクセラレヌション、コフィルタリングなどの機胜を䜿甚しお、ニュヌラルネットワヌクを盎接䜜成できたす。



䞊蚘で䜿甚したすべおのコヌドは、 ここから入手できたす 。



Goプログラミングリ゜ヌス





DAALリ゜ヌス





著者に぀いお



ダニ゚ル@dwhitenaは、経隓豊富なデヌタ研究者である博士号で、Pachyderm@pachydermIOで働いおいたす。 圌は、予枬モデル、デヌタの芖芚化、統蚈分析などの機胜を含む最新の分散デヌタパむプラむンを開発しおいたす。 圌は䞖界䞭の䌚議ODSC、Spark Summit、Datapalooza、DevFest Siberia、GopherCon b lheubtで講挔し、Ardan Labs@ardanlabsでデヌタの調査ず分析を教え、JupyterのGoコアをサポヌトし、さたざたなプロゞェクトの開発に積極的に関䞎しおいたすオヌプン゜ヌスのデヌタマむニング。



All Articles