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

Ubuntu 18.04ベースのDockerイメージ自動ビルドを追加 #98

Merged

Conversation

aoirint
Copy link
Member

@aoirint aoirint commented Sep 15, 2021

内容

公式Dockerイメージに、Ubuntu 18.04(ubuntu:bionic)をベースイメージとするイメージを追加します。

#114 のコミットを含んでいるため、先に #114 のレビューをお願いします。

Linux用実行バイナリのビルド環境をUbuntu 18.04にしたいためのPRです。

メリット

ビルド環境をUbuntu 18.04にするだけでなく、Ubuntu 18.04の実行環境をDocker Hubに用意するメリット。

  • Linux用実行バイナリのビルド環境 と このPRによる追加イメージ がキャッシュを共有できる
  • 動作の安定性を合わせて管理できる(将来的なテストの追加など)

デメリット

  • Docker Hubに上げる/管理するイメージ数が増える
  • GitHub Workflowの同時実行数が増える

背景

https://github.com/Hiroshiba/voicevox_engine/issues/95#issuecomment-920446490

@aoirint aoirint changed the title Dockerfile (Linux): Ubuntu 18.04での自動ビルドを追加する Ubuntu 18.04ベースのDockerイメージの自動ビルドを追加 Sep 16, 2021
@aoirint aoirint changed the title Ubuntu 18.04ベースのDockerイメージの自動ビルドを追加 Ubuntu 18.04ベースのDockerイメージ自動ビルドを追加 Sep 16, 2021
@aoirint aoirint marked this pull request as ready for review September 16, 2021 00:03
@aoirint aoirint marked this pull request as draft September 16, 2021 00:30
@aoirint
Copy link
Member Author

aoirint commented Sep 16, 2021

Dockerイメージのビルドには成功したけれども、run.pyの実行時にエラーが発生する。

# docker run --rm -it --gpus all aoirint/voicevox_engine:nvidia-ubuntu18.04-0.5.2-aoirint-3
/sbin/ldconfig.real: Can't link /opt/libtorch/lib/terLayoutE0ELin1ELm1EE12block_traitsILm128ELm128ELm32ELm1EE11warp_traitsILm2ELm2ELm1EE21filter_per_cta_traitsILm1ELm3ELm3ELb0EELb0ELNS9_9AlgorithmE1ELNS9_7OpTypesE1ELNS9_6LayoutE4ELNS9_12FeatureNamesE1ELm1ELm8ELm8ELm8ELm16ELm16ELm16ELb1ELb0ELb0EEE13cuDnnIndexingEv to libtorch_cuda_cpp.so
...
Notice: --voicevox_dir is /opt/voicevox_core
Traceback (most recent call last):
  File "./run.py", line 56, in make_synthesis_engine
    import core
ImportError: libtorch_cuda_cpp.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir
# docker run --rm -it aoirint/voicevox_engine:cpu-ubuntu18.04-0.5.2-aoirint-3
/sbin/ldconfig.real: file /opt/libtorch/lib/libnvrtc-builtins-07fb3db5.so.11.1 is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libtorch_global_deps.so is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libcaffe2_nvrtc.so is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libc10_cuda.so is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libcudart-6d56b25a.so.11.0 is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libgomp-75eea7e8.so.1 is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libnvToolsExt-24de1d56.so.1 is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libc10.so is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libc10d_cuda_test.so is truncated

/sbin/ldconfig.real: file /opt/libtorch/lib/libnvrtc-3a20f2b6.so.11.1 is truncated

/sbin/ldconfig.real: Can't link /opt/libtorch/lib/terLayoutE0ELin1ELm1EE12block_traitsILm128ELm128ELm32ELm1EE11warp_traitsILm2ELm2ELm1EE21filter_per_cta_traitsILm1ELm3ELm3ELb0EELb0ELNS9_9AlgorithmE1ELNS9_7OpTypesE1ELNS9_6LayoutE4ELNS9_12FeatureNamesE1ELm1ELm8ELm8ELm8ELm16ELm16ELm16ELb1ELb0ELb0EEE13cuDnnIndexingEv to libtorch_cuda_cpp.so
/sbin/ldconfig.real: Can't link /opt/libtorch/lib/INS2_15AgentScanPolicyILi256ELi9EN3c104HalfELNS2_18BlockLoadAlgorithmE3ELNS2_17CacheLoadModifierE0ELNS2_19BlockStoreAlgorithmE3ELNS2_18BlockScanAlgorithmE2ENS2_15MemBoundScalingILi256ELi9ES6_EEEEPS6_SE_NS2_13ScanTileStateIS6_Lb0EEE18__nv_hdl_wrapper_tILb0ELb1E11__nv_dl_tagIPFRNS_6TensorERKSJ_lSK_EXadL_ZNS_6native22_logcumsumexp_out_cudaESM_lSK_EELj3EEFS6_S6_S6_EJEENS2_8NullTypeEiEEvT0_T1_T2_iT3_T4_T5_ to libtorch_cuda_cu.so
...
Notice: --voicevox_dir is /opt/voicevox_core
Traceback (most recent call last):
  File "./run.py", line 56, in make_synthesis_engine
    import core
ImportError: libc10.so: cannot open shared object file: No such file or directory
Notice: mock-library will be used. Try re-run with valid --voicevox_dir

LibTorch 1.5.0の時点で似た問題が報告されている?

https://discuss.pytorch.org/t/libtorch-c-so-files-truncated-error-when-ldconfig/46404/6

LibTorchは、glibc 2.31以降でないとldconfigが正しく動作しないかもしれない。

原因は、LibTorchの配布者がpatchelfを使って共有ライブラリのリンクを書き換えていて、patchelfがglibc 2.31より前のバージョンでは対応していない書き換え方法を使っていること?

The issue seems to be caused by patchelf, which alters the order of sections in a way that ldconfig and libc libraries for do not deal with prior to libc version 2.31.

https://sourceware.org/bugzilla/show_bug.cgi?id=25087

LD_LIBRARY_PATHを指定してみると、また別のエラーが起きる。

# docker run --rm -it --gpus all --entrypoint "" aoirint/voicevox_engine:nvidia-ubuntu18.04-0.5.2-aoirint-3 bash
# LD_LIBRARY_PATH="/opt/libtorch/lib:${LD_LIBRARY_PATH}" gosu user /opt/python/bin/python3 run.py
Traceback (most recent call last):
  File "run.py", line 56, in make_synthesis_engine
    import core
ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /opt/voicevox_core/libcore.so)
Notice: mock-library will be used. Try re-run with valid --voicevox_dir

libcore.soをビルドしている環境のlibstdc++バージョンが関係していそう。

# strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_DEBUG_MESSAGE_LENGTH

@Hiroshiba
Copy link
Member

ちょっと状況がわかっていないのですが、実行が難しそうであれば、一旦docker image作成を保留しても良いかもしれないなと思いました。
(coreがlibtorchから脱却できれば動くようになっているかもしれないので、コメントアウトして残しておくのは良いと思います)

@aoirint
Copy link
Member Author

aoirint commented Sep 16, 2021

一旦docker image作成を保留しても良いかもしれないなと思いました。

それもよいと思います。

または、サポート期限内ではありますが、Ubuntu 18.04やCentOS 8/CentOS Stream 8など、すこし古い共有ライブラリを使っているOSへの対応は一旦あきらめて、それらの環境では動作しないものとして #96 を進めるのも選択肢と思います。

一応、上のコメント( https://github.com/Hiroshiba/voicevox_engine/pull/98#issuecomment-920488596 )の要点は、以下の2点です。

  1. ldconfigがLibTorch読み込み時にエラーを出す件については回避できそう(代わりにLD_LIBRARY_PATHを設定する)
  2. libcoreのビルド環境のgccが新しすぎるかもしれない(ビルド環境のOSが新しすぎるかもしれない)

2について、いまのところ、gccが使用するlibstdc++という共有ライブラリのバージョンが問題になっています。
Ubuntu 18.04では、libstdc++の内部バージョンのGLIBCXX_3.4.25までしか動かない(aptでは新しいlibstdc++が入らない)ようなのですが、
libcoreの動作にはGLIBCXX_3.4.26が必要そうだということがわかりました(最後のエラーメッセージ)。

libcoreのビルドはどのような環境でしていますか?
Ubuntu 20.04など新しめのOSでビルドしているのであれば、次にlibcoreをビルドする機会に、Ubuntu 18.04など1つ前の世代でのビルドを試していただきたいかなと思っています。

以下を説明に追記しました。

Linux用実行バイナリのビルド環境をUbuntu 18.04にしたいためのPRです。

@Hiroshiba
Copy link
Member

なるほど、libcoceのビルドをやり直せばubuntu18環境でも動かせるということなんですね!
ビルド環境はnvidia/cuda:11.1.1-cudnn8-devel-ubuntu20.04でした。ubuntu18環境もすぐ作れると思うので、 https://github.com/Hiroshiba/voicevox/issues/229 のタイミングで変更してビルドし直してみたいと思います。
(来週くらいになるかもしれません・・・。)

@aoirint
Copy link
Member Author

aoirint commented Sep 16, 2021

一応、新しいバージョンのlibstdc++をサードパーティのパッケージリポジトリ(PPA)からインストールすることで、Ubuntu 18.04をベースイメージとするDockerコンテナ内で、VOICEVOX ENGINE(run.py/libcore)を正常起動することはできました。

パッチ例: aoirint/voicevox_engine@master...2fa03cb

docker pull aoirint/voicevox_engine:cpu-ubuntu18.04-0.5.2-aoirint-14
docker run --rm -it -p '127.0.0.1:50021:50021' aoirint/voicevox_engine:cpu-ubuntu18.04-0.5.2-aoirint-14

docker pull aoirint/voicevox_engine:nvidia-ubuntu18.04-0.5.2-aoirint-14
docker run --rm -it --gpus all -p '127.0.0.1:50021:50021' aoirint/voicevox_engine:nvidia-ubuntu18.04-0.5.2-aoirint-14

しかし、このイメージをLinux用実行バイナリのビルド環境として使ったとしても、Ubuntu 20.04上のビルドと同様の、通常のUbuntu 18.04環境では動かないバイナリが生成されそうです。

このPRでは、Ubuntu 18.04やCentOS 8で動作するバイナリのビルド環境の準備として、Ubuntu 18.04環境を追加したいため、
libstdc++を更新するアプローチでは目的を達成できなさそうということがわかりました。

Ubuntu 18.04上でビルドしたlibcoreができるまで、このPRは保留しようと思います。

@aoirint aoirint marked this pull request as ready for review September 21, 2021 18:44
@aoirint
Copy link
Member Author

aoirint commented Sep 21, 2021

glibc 2.31より古いバージョンを使ったシステム(Ubuntu 18.04はglibc 2.27)ではldconfigがLibTorchを正しく読み込めないため、
USE_GLIBC_231_WORKAROUND のbuild-argを追加して、
entrypointで LD_LIBRARY_PATH を設定するWorkaroundを実装しています( LD_LIBRARY_PATH を設定すると問題なく動作する)。

Ubuntu 18.04のコンテナ内で ldconfig -p を実行すると共有ライブラリリストの表示が壊れているのが心配な点ではあります。

# ldconfig -p | grep libtorch
	t� (libc6,x86-64) => /opt/libtorch/lib/t�
	libtorchbind_test.so (libc6,x86-64) => /opt/libtorch/lib/libtorchbind_test.so
	libtorch_python.so (libc6,x86-64) => /opt/libtorch/lib/libtorch_python.so
	libtorch.so (libc6,x86-64) => /opt/libtorch/lib/libtorch.so
	libtensorpipe_agent.so (libc6,x86-64) => /opt/libtorch/lib/libtensorpipe_agent.so
	libshm.so (libc6,x86-64) => /opt/libtorch/lib/libshm.so
	libprocess_group_agent.so (libc6,x86-64) => /opt/libtorch/lib/libprocess_group_agent.so
	libjitbackend_test.so (libc6,x86-64) => /opt/libtorch/lib/libjitbackend_test.so
	libcaffe2_observers.so (libc6,x86-64) => /opt/libtorch/lib/libcaffe2_observers.so
	libcaffe2_module_test_dynamic.so (libc6,x86-64) => /opt/libtorch/lib/libcaffe2_module_test_dynamic.so
	libbackend_with_compiler.so (libc6,x86-64) => /opt/libtorch/lib/libbackend_with_compiler.so
	 (libc6,x86-64) => /opt/libtorch/lib/
	��n (libc6,x86-64) => /opt/libtorch/lib/��n

正常な表示(Ubuntu 20.04)

# ldconfig -p | grep libtorch
	libtorchbind_test.so (libc6,x86-64) => /opt/libtorch/lib/libtorchbind_test.so
	libtorch_python.so (libc6,x86-64) => /opt/libtorch/lib/libtorch_python.so
	libtorch_global_deps.so (libc6,x86-64) => /opt/libtorch/lib/libtorch_global_deps.so
	libtorch_cpu.so (libc6,x86-64) => /opt/libtorch/lib/libtorch_cpu.so
	libtorch.so (libc6,x86-64) => /opt/libtorch/lib/libtorch.so
	libtensorpipe_agent.so (libc6,x86-64) => /opt/libtorch/lib/libtensorpipe_agent.so
	libshm.so (libc6,x86-64) => /opt/libtorch/lib/libshm.so
	libprocess_group_agent.so (libc6,x86-64) => /opt/libtorch/lib/libprocess_group_agent.so
	libjitbackend_test.so (libc6,x86-64) => /opt/libtorch/lib/libjitbackend_test.so
	libgomp.so.1 (libc6,x86-64) => /opt/libtorch/lib/libgomp.so.1
	libc10.so (libc6,x86-64) => /opt/libtorch/lib/libc10.so
	libcaffe2_observers.so (libc6,x86-64) => /opt/libtorch/lib/libcaffe2_observers.so
	libcaffe2_module_test_dynamic.so (libc6,x86-64) => /opt/libtorch/lib/libcaffe2_module_test_dynamic.so
	libcaffe2_detectron_ops.so (libc6,x86-64) => /opt/libtorch/lib/libcaffe2_detectron_ops.so
	libbackend_with_compiler.so (libc6,x86-64) => /opt/libtorch/lib/libbackend_with_compiler.so

Ubuntu 20.04の方も同じように LD_LIBRARY_PATH を設定する仕様にすることもできますが、
ldconfig で設定する方がシステム全体に設定でき、よい方法だと思っているため、例外的な処理にしています。

entrypointでなく、ENV 命令の方がいいかもしれません。

また、一度glibcのバージョンを読み取って判定するロジックを書きましたが、複雑になったので採用していません。

GLIBC_VERSION_LINE=($(/lib/x86_64-linux-gnu/libc.so.6 | head -n1 | sed 's/.$//'))
GLIBC_VERSION="\${GLIBC_VERSION_LINE[-1]}"
GLIBC_VERSION_THRESHOLD="2.31"

GLIBC_VERSION_OLDER=$(echo "\${GLIBC_VERSION} \${GLIBC_VERSION_THRESHOLD}" | xargs -n1 | sort --version-sort | head -n1)

# if GLIBC_VERSION < 2.31
if [ "\${GLIBC_VERSION_OLDER}" != "\${GLIBC_VERSION_THRESHOLD}" ]; then
    : # old version
fi

一度Ready for reviewにしましたが、GNU Parallelのバージョンが古く、pyopenjtalkの辞書ダウンロードがされていなかったため、Draftに戻します。
Windows版の自動ビルドと同じロジックにします。

@aoirint aoirint marked this pull request as draft September 21, 2021 19:29
@aoirint aoirint marked this pull request as ready for review September 21, 2021 20:12
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.

たぶん大丈夫そうなのですが、念の為 https://github.com/Hiroshiba/voicevox_engine/pull/114 がマージされた後にもう一度見させていただこうと思います!

Makefile Show resolved Hide resolved
@aoirint
Copy link
Member Author

aoirint commented Sep 23, 2021

コンフリクト起こしているようなので、masterブランチとのマージコミットをpushします

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! コマンド || return=$?の書き方がとても参考になりました。

@Hiroshiba Hiroshiba merged commit 45ac35f into VOICEVOX:master Sep 23, 2021
@aoirint aoirint deleted the patch-linux-docker-base-image-ubuntu18.04 branch October 9, 2023 03:00
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.

2 participants