Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Intel NNP-I の Glow 用コードを覗いてみた

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

vengineer.hatenablog.com

ということで、ソースコードをちょこっと解析してみました。

どうやら、つぎの2つのパターンがあるみたい。

  • OpenCLっぽい API で、nnpiInferCommandQueue にて処理を実行
  • nnpiNetworkInferOnHostにて、ホスト上で実行する場合

NNP-Iは、IceLake + アルファなので、IceLakeの部分で実行するのか?それとも、本当にホスト側のXeonで実行するのか?

全体的には、Arm NN SDKの中にある各種フレームワークのモデルを Import する感じでNNP-IのSDK内のAPIを使ってモデルを再構築をして、NNP-I内で実行するって感じです。

以下、NNP-IのSDK関連のキーワードです。

ヘッダファイル

  • nnpi_inference.h
  • nnpi_transformer.h
  • nnpi_network_builder.h
  • nnpi_network_builder_EXPERIMENTAL.h

ライブラリ

  • libnnpi_transformer.so
  • libnnpi_inference.so

  • NNPINetwork
  • NNPICompilationConfig
  • NNPIDeviceContext
  • NNPIInferCommand
  • NNPIObjectName
  • NNPIResourceDesc
  • NNPIHandle
  • NNPICopyCommand
  • NNPIHostNetwork
  • NNPIDeviceNetwork
  • NNPIAdapter

関数

  • nnpiNetworkOptimize
  • nnpiGetDefaultCompilationConfig
  • nnpiNetworkCompileToStream
  • nnpiNetworkCompileToFile
  • nnpiNetworkSetName
  • nnpiNetworkCreate
  • nnpiNetworkDestroy
  • nnpiDeviceContextCreate
  • nnpiDeviceContextDestroy
  • nnpiAdapterCreate
  • nnpiAdapterDestroy
  • nnpiNetworkGetInputNum
  • nnpiNetworkGetInputDesc
  • nnpiNetworkGetOutputDesc
  • nnpiHostNetworkCreateFromStream
  • nnpiHostNetworkDestroy
  • nnpiDeviceNetworkCreate
  • nnpiDeviceNetworkDestroy
  • nnpiInferCommandQueue
  • nnpiInferCommandDestroy
  • nnpiCopyCommandQueue
  • nnpiCopyCommandDestroy
  • nnpiCopyCommandCreateHostToDevice
  • nnpiCopyCommandCreateDeviceToHost
  • nnpiHostResourceCreate
  • nnpiHostResourceDestroy
  • nnpiHostResourceLock
  • nnpiHostResourceUnlock
  • nnpiDeviceResourceCreate
  • nnpiDeviceResourceDestroy
  • nnpiNetworkInferOnHost

バイスのバージョンは、3つ ( 1, 2, 3 )

if (!deviceVersion.empty()) {
    if (deviceVersion.compare("1") == 0) {
        config_.deviceType = NNPI_DEVICE_M2_A;
    } else if (deviceVersion.compare("2") == 0) {
        config_.deviceType = NNPI_DEVICE_M2_B;
    } else if (deviceVersion.compare("3") == 0) {
        config_.deviceType = NNPI_DEVICE_M2_C;
    } else {
        LOG_IF_NOT_RETURN_LLVMERROR(
        false, "INVALID NNPI_DEVICE_VERSION, valid values are 1,2,3");
    }
}

 環境変数

  • USE_ICE_T
  • USE_INF_API
  • ICE_T_FILE
  • SYMLOWP_WA

 もうちょっと詳しく見たら、他のBackendは、QueueBackedDeviceManager クラスを継承して DeviceManager クラスを定義しているが、NNP-IのBackendは、ただのDeviceManager クラスを継承しているんだね。対応が遅れているのかな?

1月には QueueBackendDeviceManager クラスあったんだけどね。

あー、Habanaも DeviceManager クラスを継承しているのね