音声認識の雰囲気を掴もう

こんにちは。リサーチャーの古谷です。

私は普段、音声認識の研究開発をしています。

今回の記事では、音声認識がどのように実現されているのかを、非技術者の方にも伝わるように紹介してみたいと思います。

あまり込み入った話はできないので、スタンダードな教師あり学習に限定して、音声認識の概要を解説してみます。

非技術者の方に伝えることを目指す都合で、かなり説明を端折っている部分があります。この記事を読んだだけでは絶対に実装できるようにならないので、実装レベルの情報が欲しい方はごめんなさい。あくまで「なんとなく音声認識の雰囲気が分かる」というぐらいの読み物としてご覧ください。

また、音声認識の歴史の話はせずに、現在主流の深層学習に限ったお話をします。

続きを読む

深層学習の量子化に入門してみた 〜BERTをIntel Neural CompressorでStatic Quantization〜

こんにちは。 リサーチャーの勝又です。 私はレトリバで自然言語処理、とくに要約や文法誤り訂正に関する研究の最新動向の調査・キャッチアップなどを行っております。

前々回、Dynamic Quantizationを様々なライブラリで試した記事を公開しました。 前回はStatic QuantizationをONNX Runtimeで試した記事を公開しました。 今回はStatic QuantizationをIntel Neural Compressorで試してみようと思います。

続きを読む

深層学習の量子化に入門してみた 〜BERTをStatic Quantization〜

こんにちは。 リサーチャーの勝又です。 私はレトリバで自然言語処理、とくに要約や文法誤り訂正に関する研究の最新動向の調査・キャッチアップなどを行っております。

前々回、深層学習の量子化について簡単な解説記事を公開しました。 前回はDynamic Quantizationを試した記事を公開しました。 今回はStatic Quantizationを実際に試してみようと思います。

続きを読む

簡潔データ構造第3回: 順序木に対する簡潔データ構造 (導入編)

こんにちは。レトリバのリサーチャーの木村@big_wingです。 4月から静岡県浜松市に引っ越しをして、引き続きフルリモートで働いています。 ずいぶん久しぶりになってしまいましたが、今回は簡潔データ構造シリーズの続きで順序木に対する簡潔データ構造について、導入編ということで順序木に対する3つの簡潔表現を紹介したいと思います。

  • 1回目の記事はこちら (簡潔データ構造の概略)
  • 2回目の記事はこちら (ビットベクトルに対するrank演算)
  • 2.5回目の記事はこちら (ビットベクトルに対するselect演算)

簡潔データ構造の書籍としてはNavarro氏の本、日本語で書かれたものとしては定兼氏の本岡野原氏の本があります。また今回紹介する順序木に対する簡潔データ構造を日本語入力に応用したものとして徳永氏の本があります。

続きを読む

Transformerモデルの高速化

Cheif Research Officerの西鳥羽 (Jiro Nishitoba (@jnishi) | Twitter) です。

前回はONNX runtimeを利用した高速化を紹介いたしました。今回はさらなる高速化をしたいと思います。 NVIDIA社のTensorRTおよびIntel社のOpenVINOを利用します。

onnxruntimeのインストール

OpenVINOやTensorRTを用いる場合*1、onnxruntimeをソースからビルドしてインストールします。なお、OpenVINOやTensorRTは既にインストールされているものとします。これらのインストールはOpenVINOのinstallation instructionやTensorRTのInstallation Guideを参考にしてください。

以下のコマンドでonnxruntimeの取得とビルドを行います。詳しくはBuild ONNX Runtime for inferencing及びBuild ONNX Runtime with Execution Providersを参考にしてください。

git clone --recursive git@github.com:microsoft/onnxruntime.git
cd onnxruntime
source  /opt/intel/openvino_2021/bin/setupvars.sh # OpenVINOの有効化
./build.sh --use_cuda --cuda_home /usr/local/cuda --cudnn_home /usr/lib/x86_64-linux-gnu --use_tensorrt --tensorrt_home /usr --use_openvino CPU_FP32 --config RelWithDebInfo  --build_shared_lib --use_openmp --build_wheel --parallel

なお、--cuda_home --cudnn_home --tensorrt_home で指定しているディレクトリはUbuntu 20.04にてDebパッケージでインストールした際のデフォルトのパスになります。ご自身の環境に合わせて変更してください。

OpenVINOを用いたCPUでの推論の高速化

CPUのモデルの推論をOpenVINOを利用して高速化します。OpenVINOはIntel社がオープンソースで提供している推論用ライブラリです。IntelのCPU、GPUおよびFPGA上での計算に特化して高速な推論を行います。

OpenVINOを用いる場合には providers["OpenVINOExecutionProvider"] を指定します。 前回のブログでCUDAの指定を行っていた部分を以下のように変更します。

# ONNX形式のモデルから推論用モデルを作成
session = InferenceSession(args.onnx_path, providers=["OpenVINOExecutionProvider"])

以上でOpenVINOを用いた推論が行われます。

以下に速度比較を行っています。前回のブログと同じように事前学習済みモデルとして cl-tohoku/bert-large-japanese を利用し、livedoorニュースコーパスの記事を学習データ:評価データを4:1に分割し、カテゴリ推定でファインチューニングを行いました。Hugging Face Transformersのモデル、ONNXのCPU実行、ONNXのOpenVINO実行における推論時間を測定しています。評価データ全件に対して推論を行いその1件当たりの平均時間で比較しています。なおOpenVINOでの推論において、8秒近く時間のかかっている推論が4件あり、それらは異常値として平均からは取り除いています。

f:id:Christopher-727:20220329115244p:plain
CPUにおける推論時間の比較

Hugging Face Transformersでの実行よりもOpenVINOによる実行の方が高速ですが、ONNXのCPU実行よりも速度が低下しています。8秒以上かかる例も含めてOpenVINOをうまく扱えてないような感じがします。

TensorRTを用いたGPUでの推論の高速化

GPUモデルの推論をTensorRTを利用して高速化します。TensorRTはNVIDIA社がオープンソースで提供しているGPU上での推論ライブラリです。INT8やFP16への量子化やNeural Networkの最適化などを行い、GPU上での推論を高速化します。

TensorRTを用いる場合には providers["TensorRTExecutionProvider"] を指定します。 前回のブログでCUDAの指定を行っていた部分を以下のように変更します。

# ONNX形式のモデルから推論用モデルを作成
session = InferenceSession(args.onnx_path, providers=["TensorRTExecutionProvider"])

以上でTensorRTでの推論が行われます。注意点としては sessionを用いた推論の初回実行時にはTensorRT向けのモデルのビルドが行われるため、実行に数十秒くらいの時間がかかります。2回目以降の推論は高速に行われます*2

以下に速度比較を行っています。こちらも同じように事前学習済みモデルとして cl-tohoku/bert-large-japanese を利用し、livedoorニュースコーパスの記事を学習データ:評価データを4:1に分割し、カテゴリ推定でファインチューニングを行いました。Hugging Face Transformersのモデル、ONNXのCUDA実行、ONNXのTensorRT実行における推論時間を測定しています。評価データ全件に対して推論を行いその1件当たりの平均時間で比較しています。なおTensorRTでの推論において、1秒以上時間のかかっている推論は推論だけでなくモデルのビルドが行われていると思われるので平均からは取り除いています。

f:id:Christopher-727:20220329115311p:plain
GPUにおける推論時間の比較

Hugging Face TransformersのモデルとONNX CUDAでの実行を比較すると、前回のブログでもふれたとおり約2.4倍の高速化となっています。TensorRTを用いるとCUDAでの実行から更に1.35倍の高速化となっています。Neural Networkの最適化が行われるタイミングを管理しないといけない課題はありますが、効果は出ているようです。

まとめ

CPUのメーカーおよびGPUのメーカーが公開している高速化ライブラリを通じて推論がどれだけ早くなるかを試してみました。NVIDIA社のTensorRTを利用したところ初回や、何度も実行していると偶にビルドで時間がかかる時があるものの、CUDA実行と比較して1.35倍の高速化となりました。Intel社のOpenVINOの方は処理が速くはなりませんでしたが、こちらはうまく扱えていない様子なので今後何かわかりましたら続報を上げたいと思います。

*1:TensorRTだけを用いる場合はpypyにて公開されているパッケージでも利用可能です。onnxruntime-gpuパッケージで利用できます。

*2:ただ、推論を何度も実行しているとまたモデルのビルドが行われるようです。後述の実験の際に初回推論以外にも1回数秒かかる実行が存在しました。

社Dへの道 ~折り返し地点~

こんにちは。レトリバの飯田(@meshidenn)です。TSUNADE事業部 研究チームのリーダーをしており、マネジメントや論文調査、受託のPOCを行なっています。

2020年4月から、東京工業大学(東工大)の岡崎研究室に社会人博士課程で所属しており、論文が一本出せた段階です。折り返し地点でちょうど良いタイミングと思いますので、社会人博士で何を学べているのか、仕事との兼ね合いはどうなのかなど書いていきたいと思います。

続きを読む

音響学会2022年春季研究発表会に参加しました

こんにちは。リサーチャーの古谷(@kk_fry_)です。

レトリバでは、研究動向・業界動向の把握のため、積極的に学会参加をしています。3/9~11にオンラインで開催された日本音響学会2022年春季研究発表会にも参加しました。

今回の記事では、気になった発表をいくつかピックアップして紹介します。

各項目に講演番号を記載しているので、しばらくの間、研究発表会のページで公開されている講演要旨を確認することができます。

続きを読む

深層学習の量子化に入門してみた 〜BERTをDynamic Quantization〜

こんにちは。 リサーチャーの勝又です。 私はレトリバで自然言語処理、とくに要約や文法誤り訂正に関する研究の最新動向の調査・キャッチアップなどを行っております。

前回、深層学習の量子化について簡単な解説記事を公開しました。 今回は、深層学習の量子化、とくにDynamic Quantizationを実際に試してみようと思います。

続きを読む

Huggingface transformersモデルのONNX runtimeによる推論の高速化

Chief Research Officerの西鳥羽 (Jiro Nishitoba (@jnishi) | Twitter) です。 今回はHugging Face TransformersのモデルのONNX runtimeで実行を試してみました。それにより特にCUDAでの実行では2.4倍近い高速化が行えました。 Hugging Face TransformersのモデルのONNX形式への変換方法から、ONNX runtimeでの実行も含めて紹介したいと思います。

続きを読む

深層学習の量子化に入門してみた 〜理論編〜

こんにちは。 リサーチャーの勝又です。 私はレトリバで自然言語処理、とくに要約や文法誤り訂正に関する研究の最新動向の調査・キャッチアップなどを行っております。

最近、深層学習の量子化について勉強する機会があったので、この記事では量子化の理論的な話をまとめてみようと思います。

続きを読む