[TensorFlow] Could not load dynamic library ‘libnvinfer.so.7’;

概要

  • TensorFlowを使用していて以下のようなWARNINGが出る
  • TensorFlowの使用に支障はないがWARNINGが出ないように対応したい

先に一番大事なことを書いておくと、これはWARNINGであってエラーではありません。TensorRTによる推論の最適化を使っていないのであれば、放置してもGPUでの学習や推論は普通に動きます。実際、私もしばらく放置していました。

動作環境

  • TensorFlow 2.x(TensorRT 7に対してビルドされたもの)
  • TensorRT 8がインストールされている環境

ログのパスに tensorflow/compiler/xla/stream_executor が含まれるバージョンでの記録です。TensorFlow 2.18以降ではそもそもこのWARNINGが出なくなっているので、後述の「新しいTensorFlowでは事情が違う」も合わせて確認してください。

原因

ログを見ると、探しているのは libnvinfer.so.7libnvinfer_plugin.so.7 です。末尾の 7 はTensorRTのメジャーバージョンを指します。

2024-03-25 10:12:43.717400: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/nvidia/lib:/usr/local/nvidia/lib64
2024-03-25 10:12:43.717453: W tensorflow/compiler/xla/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/nvidia/lib:/usr/local/nvidia/lib64
2024-03-25 10:12:43.717457: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.

つまり、TensorFlowのバイナリがTensorRT 7を前提にビルドされているのに、環境にはTensorRT 8が入っている(あるいは何も入っていない)という状態です。TensorFlowは起動時にTF-TRT(TensorFlow内蔵のTensorRT連携機能)用のライブラリを読もうとして、見つからないので警告を出して、そのまま進みます。

TF-TRTを使っていなければ実害はありません。TensorRTで推論を高速化したい場合にだけ、実際に困ることになります。

解決方法

方法1. WARNINGを非表示にする(TF-TRTを使わない場合)

TensorRTを使う予定がないなら、これが一番簡単で安全です。環境変数でTensorFlowのログレベルを上げれば、WARNING以下が表示されなくなります。

export TF_CPP_MIN_LOG_LEVEL=2

値の意味は次の通りです。

| 値 | 表示されるもの | | — | — | | 0 | すべて(デフォルト) | | 1 | INFOを抑制 | | 2 | INFOとWARNINGを抑制 | | 3 | INFO、WARNING、ERRORを抑制 |

3 にすると本当のエラーまで見えなくなるので、2 にとどめておくのが無難です。

Pythonコード内で設定する場合は、TensorFlowをimportする前に書く必要があります。importの後では効きません。

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

import tensorflow as tf  # この順番でないと効かない

方法2. TensorRTをインストールしてシンボリックリンクを作成する

WARNING自体を消したい場合は、探されているファイル名でリンクを作る方法があります。

pip install tensorrt --extra-index-url https://pypi.nvidia.com
ln -s /usr/lib/x86_64-linux-gnu/libnvinfer.so.8 /usr/lib/x86_64-linux-gnu/libnvinfer.so.7
ln -s /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.8 /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7

*.so.* ファイルまでのパスは環境に合わせて変更してください。インストール先が分からない場合は次のように探せます。

find / -name "libnvinfer.so*" 2>/dev/null

ただし、この方法には注意点があります。 バージョン8のライブラリを7という名前で見せているだけなので、ABIが一致している保証はありません。WARNINGは消えますが、TF-TRTで実際に推論を最適化しようとすると、動かなかったり不可解な挙動をしたりする可能性があります。

私の用途では「ログが煩いのを消したい」だけだったのでこれで済ませましたが、TF-TRTを本当に使いたい場合は、この回避策ではなくバージョンの揃った組み合わせを用意すべきです。NVIDIAが提供しているNGCのTensorFlowコンテナを使うのが、依存関係を自分で合わせるより確実だと思います。

新しいTensorFlowでは事情が違う

この記事の内容は、TensorRT連携を含むバージョンのTensorFlowを前提にしています。その後、状況が変わりました。

TensorFlowのリリースノートによれば、TensorRTのサポートはTensorFlow 2.17が最後で、2.18以降のCUDAビルドでは無効化されています。TF-TRTのリポジトリ自体も2025年2月にアーカイブされました(tensorflow/tensorflow Issue #87911)。

つまり、

  • TensorFlow 2.18以降を使っている場合:このWARNINGはそもそも出ません。似たメッセージが出ているなら別の原因を疑ってください。
  • TensorRTで推論を高速化したい場合:TensorFlow経由ではなく、TensorRTを直接使う形に移行する必要があります。

古い環境をそのまま使い続ける事情がある場合は上記の方法で対処できますが、新規に環境を作るのであれば、TF-TRT前提の構成は避けた方がいいと思います。

関連記事

TensorFlowを使う側の話として、物体検出の手法については物体検出の基礎:アルゴリズムと応用事例に、3次元姿勢推定については深層学習を用いた3次元姿勢推定モデルとその応用事例にまとめています。

GPUを使う検証環境の費用が想定より膨らみやすい話は機械学習プロジェクトにおける予算管理の成功要因に書きました。

「バイナリが期待しているバージョンと、環境に入っているバージョンが違う」という同じ形の問題は、他の環境でも起きます。FlutterのAndroidビルドでKotlinのバージョン不整合に苦しんだ記録はFlutterでkotlin_moduleのバージョン不整合エラーが出たときの対処にあります。