Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ONNX版Raspberry Pi向け自動ビルド(armhf)の追加 #41

Merged
merged 83 commits into from
Nov 17, 2021

Conversation

aoirint
Copy link
Member

@aoirint aoirint commented Nov 14, 2021

内容

ONNX版コアのRaspberry Pi向け自動ビルド(Linux CPU armhf)を追加します。

  • ONNX Runtimeのarmhf自動ビルドの作成
  • libcoreのarmhf自動ビルドの作成
  • リリース用Artifactにlibcoreのarmhfビルドを追加
  • リリース用ArtifactにONNX Runtimeのarmhfビルドを追加
  • 上までの自動ビルド成果物のRaspberry Pi実機動作確認
  • ONNX Runtime v1.9.1を使用
  • 上までの自動ビルド成果物のRaspberry Pi実機動作確認
  • Configure build environmentのコメント追加
  • ドキュメント: libgompのインストール

ONNX Runtimeのarmhfビルド(Raspberry Pi向けビルド)

このPRでは、ONNX Runtimeのarmhf自動ビルドを合わせて追加します。GCCのarmhfクロスコンパイラを使って、x86_64環境でビルドします。

ONNX Runtime armhfビルドは、公式配布物に含まれていないため、VOICEVOX側でビルドする必要があります。

  • ONNX Runtimeの公式ダウンロードページ: https://onnxruntime.ai/
    • armhfの選択肢はない
    • arm32を選んでも自前ビルドを促される

将来的には、 https://github.com/Hiroshiba/voicevox_core/issues/40#issuecomment-968677300 のように、ONNX Runtimeビルド用の別リポジトリを作るのがいいと思いますが、現時点ではvoicevox_coreリポジトリに組み込んでいます。

OpenMP

音声合成の高速化のため、ONNX RuntimeのOpenMPビルドオプションを有効化しています。このため、ONNX Runtime armhfビルドは、libgomp(GCC/GNUのOpenMP実装)に動的リンクします。

libgompはGPLv3ですが、libstdc++(GCC/GNUのC++標準ライブラリ実装)などと同様にGNUランタイム・ライブラリ例外により、動的リンクできます。

ビルド時間

以前は全体で2-3分でしたが、ONNX Runtimeのビルドのため、全体で40-50分程度かかるようになります。

デフォルトブランチまたは同名のブランチにキャッシュがあると、ONNX Runtimeのビルドを省略できるため、1-2分程度の追加(全体で4-5分)で済みます(GitHub Actionsの状態によって多少遅延することはあります)。

The cache is scoped to the key and branch. The default branch cache is available to other branches.

ONNX RuntimeのArtifact・キャッシュ

Artifactには、公式バイナリ配布物(Releaseにアップロードされているもの)の仕様に合わせて、ONNX Runtimeのビルド成果物にライセンス情報やヘッダファイルなどを追加したものを保存しています。

キャッシュには、ONNX Runtimeのビルド成果物のみ(ライセンス情報やヘッダファイルなどが含まれない)を保存しています(キャッシュは基本的にGitHub Actions内部からしか見えない)。

ONNX Runtimeの再ビルドなしでArtifactの中身を変えやすくするため、毎回キャッシュ(ビルド成果物)からArtifactを構成するようにしています。

${{ matrix.artifact_name }}-${{ env.ONNXRUNTIME_VERSION }}-cache-v1-${{ hashFiles('matrix.json') }}

キャッシュキーとして、Artifact名、ONNX Runtimeのバージョン、matrixに設定した値(JSONとしてダンプ)、強制的にキャッシュを捨てさせるためのキャッシュバージョンv1を使っています。

ONNX Runtimeのキャッシュがある場合、ONNX Runtimeのビルドジョブ build-onnxruntime でキャッシュを取り出し、
Artifactを構成して、Artifactとしてアップロードします。

ONNX Runtimeのキャッシュがない場合、 build-onnxruntime でONNX Runtimeをビルドし、同様にArtifactとしてアップロードします。

ONNX Runtime armhfビルドの同梱

通常、ユーザがONNX Runtime armhfビルド(Raspberry Pi向けビルド)を入手するには、自分でビルドする必要があります。
この手間を省き、またバージョン互換性の問題を避けるため、自動ビルドしたものおよびライセンス情報をcore.zipに同梱して配布するようにしています。

armhf以外のVOICEVOX COREが要求するONNX Runtimeバイナリについては、ユーザが入手可能なため同梱していません。

ONNX Runtimeのビルドのメンテナンス

ONNX Runtime v1.8.2とv1.9.0では、依存ライブラリの変更(pytorch_cpuinfo)により、ビルドオプションを変更する必要がありました。

今後のバージョンアップで、ONNX Runtimeのビルドについて、同様にメンテナンスが必要になる可能性があります。

メンテナンスが難しいようであれば、 https://github.com/Hiroshiba/voicevox_core/issues/40#issuecomment-968677300 の方針でいいと思います。

関連 Issue

close #40

@aoirint aoirint marked this pull request as ready for review November 16, 2021 10:52
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

良いですね!!!
いくつか気になったのでコメントしてみました。

ところもしご存知だったら知りたいのですが、公式ビルドはOpenMPをONにしてビルドしているのでしょうか👀
というのもそういえば以前onnxruntimeを使ったときにCPUが100%にならなかったので、もしかしたら使ってないのかなと思った次第です。

.github/workflows/build.yml Outdated Show resolved Hide resolved
.github/workflows/build.yml Show resolved Hide resolved
.github/workflows/build.yml Outdated Show resolved Hide resolved
@aoirint
Copy link
Member Author

aoirint commented Nov 16, 2021

公式ビルドはOpenMPをONにしてビルドしているのでしょうか

公式ビルドのOpenMPはv1.7.0から無効化されています(現在はv1.9.1)。
理由はよくわからないのですが、外部依存を減らしたい意図があるのかなと思いました( https://github.com/Hiroshiba/voicevox_core/issues/40#issuecomment-968368166 )。
公式ビルドで使わなくなったことで、今後OpenMPのビルドオプションが削除される可能性もあるかもしれませんが、高速化の効果があったので、このPRでは有効化しています。

@aoirint aoirint requested a review from Hiroshiba November 16, 2021 16:20
@Hiroshiba
Copy link
Member

なるほどです!
PCでの利用だったらCPU使用率が100%になるのは逆に不便なのでOpenMPは無いほうが良さそうだなと感じました。
IoT用途のarmhfは逆に待機する意味がないのでONのほうが良さそうだと思います!

Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!
お試して一回releases作ってみようと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ONNX版Raspberry Pi向けビルド(armhf)の追加
2 participants