Vengineerの妄想(準備期間)

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

Xilinx ML Suite


Xilinx も攻めてきましたね。


PCIe ボード上に搭載した Xilinx FPGA を利用した Machine Learning のソリューション。

エッジでは、Zynq UltraScale+ MPSoC用のソリューションとして、CHaiDNNとはちょっと違う。

下記の図は、引用です。

https://github.com/Xilinx/ml-suite/raw/master/docs/tutorials/img/stack.png

RESTfulなAPIを用意しているので、Webサービスでも利用が楽ちんなのかな。。。

言語は、C++Scala、R、JavaScriptPython、Julia、Spark、Go
フレームワークは、Caffe、TensorFlow、MXNet に対応。。。

Xilinxからは ミドルウェア、ツール、ランタイムが提供されていると。

githubの中身を眺めてみたら、これらはソースコードによる提供ではなく、すべてオブジェクトの模様。

例えば、コンパイラは、Pythonのバイナリスクリプト量子化ツールも同じ感じ。

ランタイムも勿論、バイナリ

C++のサンプルコードを見てみると。
引用します。
int main()
{
  //string xclbin = "kernel.xclbin";
  string xclbin = "xdnn_v1_ku115_8b.xclbin";
  string kernelName = "kernelSxdnn_0";
  string netCfgFile = "/proj/xsjhdstaff1/aaronn/HEAD_work/OPENCL_APPS_DEV/src/ristretto_fpga/pyxdnn_test/googlenet_v1_16b_115/googlenet.fpgaaddr.64.txt";
  string quantCfgFile = "googlenet_v1.json";
  string dataDir = "/proj/xsjhdstaff1/aaronn/HEAD_work/OPENCL_APPS_DEV/src/ristretto_fpga/pyxdnn_test/googlenet_v1_16b_115/data";
  string labelFile = "synset_words.txt";
  const int fpgaOutputSize = 1024 * EXECUTOR_MAX_BATCH_SZ;
  const int netOutputSize = 1000; // imagenet

  XBLASHandle *handle = NULL;
  int ret = xblasCreate(handle, xclbin.c_str(), kernelName.c_str());
  assert(ret == 0);

  vector<float> input = loadInput(dataDir);
  vector<float> output(fpgaOutputSize);
  float *inputPtr = &(input[0]);
  float *outputPtr = &(output[0]);

  // make FPGA pointer for output (inputs are auto-created)
  XMemPtr *cFpgaPtr = xMalloc(*handle, output.size()*sizeof(float), true);
  xMemcpy(*handle, outputPtr, cFpgaPtr, output.size()*sizeof(float));// load XDNN weights & create Executor
  XDNNScriptExecutor<float> *executor = loadExecutor(
    handle, dataDir, netCfgFile, quantCfgFile);

  // load FC weights
  int unused;
  std::string unusedStr;
  std::vector<float> fcWeight, fcBias;
  ret = readFromFile(dataDir+"/fc", unusedStr, 
    unused, unused, unused, unused, fcWeight, false);
  assert(ret == 0);
  ret = readFromFile(dataDir+"/fc_bias", unusedStr, 
    unused, unused, unused, unused, fcBias, false);
  assert(ret == 0);

  // run on FPGA
  executor->execute(inputPtr, outputPtr, /*batch_size*/1);

  // run FC
  std::vector<float> netOutput(netOutputSize);
  computeFC(&(fcWeight[0]), &(fcBias[0]), outputPtr, 
    1, netOutputSize, fpgaOutputSize, &(netOutput[0]));

  // run softmax
  softmax(netOutput);

  // get labels
  std::vector<std::string> labels = getLabels(labelFile);

の感じで、loadExecutorでウェイトをロードし、Executorを生成、その後、executeメソッドで実行。
FCとsoftmaxは、CPUで実行しているようですね。 => computeFC(これは、xdnnのライブラリ) & softmax

全部をFPGAでやるのではなく、FPGAの方が得意なものだけをやっているようですね。

FPGA側のデータは、各クライド(AWS、NIMBOX)に対応したものがあります。
Xilinxの開発ボード、VCU1525にも対応しているようです。

AWS F1で利用できるのは、いいかもしれません。
ML Suiteは、あくまでも推論側のソリューションであって、FPGAを利用するだけなので、Vivadoとかも使わないので
とりあえず、FPGAを使ってやってみたい人にとってはいいかもしれませんね。