【OpenVINO】GNA使用方法


# はじめに

GNA という音声関連の推論を行うためのプロセッサーを見つけたので、OpenVINOで使用するための方法の解説となります。
大した記事ではありませんが、細々と調べるのに時間がかかったので、こちらにまとめておこうと思います。


# GNA とは

> インテル® Gaussian & Neural Accelerator (インテル® GNA)
電力とパフォーマンスが重要である中、インテル® GNA は高い電力効率の常時サポートを提供します。インテル® GNA は、ニューラル・ネットワークによるノイズ除去など AI によるスピーチおよびオーディオ・アプリケーションを提供するとともに、CPU リソースを開放することでシステム全体のパフォーマンスと応答性を向上させます。[1]

完全にCPUから独立したものではないものの、主記憶空間の一部を共有して動いているそうです。
基本的にはCPUが常に動き続けるのを補助するためのもののようで、音声処理やノイズ抑制などに対する処理を想定しているようです。



# GNA 使い方

まずは、以下のコードでGNAがハードウェアにあることを確認します。

```python
from openvino.inference_engine import IECore

ie = IECore()
available_processor = ie.available_devices
print(available_processor)  # ['CPU', 'GNA']
```


次に、IECore インスタンスを作成して、そのインスタンスで ```add_extension ```で外部ライブラリを読み込むだけでした。[3]
外部ライブラリの場所はデフォルトでは以下の場所にあります。

```python
from openvino.inference_engine import IECore

iecore = IECore()
# パスについては自身の環境に合わせて変更してください
iecore.add_extension(extension_path="/opt/intel/openvino/deployment_tools/inference_engine/lib/intel64/libGNAPlugin.so", device_name="GNA")
```

あとは、```load_network```メソッドで```device_name```の引数に__GNA__を指定するだけとなります。


### 参考
 
iecore インスタンスのメソッド一覧を参考に載せます。

```
_class__ : <class 'type'>
__delattr__ : <class 'method-wrapper'>
__dir__ : <class 'builtin_function_or_method'>
__doc__ : <class 'NoneType'>
__eq__ : <class 'method-wrapper'>
__format__ : <class 'builtin_function_or_method'>
__ge__ : <class 'method-wrapper'>
__getattribute__ : <class 'method-wrapper'>
__gt__ : <class 'method-wrapper'>
__hash__ : <class 'method-wrapper'>
__init__ : <class 'method-wrapper'>
__init_subclass__ : <class 'builtin_function_or_method'>
__le__ : <class 'method-wrapper'>
__lt__ : <class 'method-wrapper'>
__ne__ : <class 'method-wrapper'>
__new__ : <class 'builtin_function_or_method'>
__pyx_vtable__ : <class 'PyCapsule'>
__reduce__ : <class 'builtin_function_or_method'>
__reduce_ex__ : <class 'builtin_function_or_method'>
__repr__ : <class 'method-wrapper'>
__setattr__ : <class 'method-wrapper'>
__setstate__ : <class 'builtin_function_or_method'>
__sizeof__ : <class 'builtin_function_or_method'>
__str__ : <class 'method-wrapper'>
__subclasshook__ : <class 'builtin_function_or_method'>
add_extension : <class 'builtin_function_or_method'>
available_devices : <class 'list'>
get_config : <class 'builtin_function_or_method'>
get_metric : <class 'builtin_function_or_method'>
get_versions : <class 'builtin_function_or_method'>
import_network : <class 'builtin_function_or_method'>
load_network : <class 'builtin_function_or_method'>
query_network : <class 'builtin_function_or_method'>
read_network : <class 'builtin_function_or_method'>
register_plugin : <class 'builtin_function_or_method'>
register_plugins : <class 'builtin_function_or_method'>
set_config : <class 'builtin_function_or_method'>
unregister_plugin : <class 'builtin_function_or_method'>
```


# まとめ

GNAの使用方法というより外部ライブラリを読み込ませる方法で、他のライブラリでも使える方法ですので参考にしてみてください。

筆者はスペックの低いラズパイのようなPCで開発をしているのですが、CPUの中にGNAというプロセッサを見つけて、しかも推論で使えると思って飛びついて調べました。

顔検出のために使用したかったのですが、上述した通りGNAは音声などで使用されるため顔検出としては使用することができませんでした。（ライブラリを読み込ませることには成功するのですが、エラーが出てしまいます。。）

自分では使うことができませんでしたが、どなたかのお役に立つことがあればと思って記事を書きました。
誤り等があれば、コメントなどでご連絡をお願いします。


# 参考

* インテリジェント PC 向けインテリジェント・プロセッサー [1]
    * https://www.intel.co.jp/content/www/jp/ja/products/docs/processors/core/intelligent-pc-overview.html
* 第231回 Intelの新プロセッサ「第10世代Coreプロセッサ」3つの特徴をざっくり検証 [2]
    * https://www.atmarkit.co.jp/ait/articles/1908/22/news023.html
* ie_api.IECore Class Reference [3]
    * https://docs.openvinotoolkit.org/latest/ie_python_api/classie__api_1_1IECore.html

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/