ONNX RuntimeとCUDAのバージョンが合わない時
目次
はじめに
すでに学習済みのONNXモデルを使用する時、CUDAライブラリのバージョンが合わないときがあります。
具体的には「libcudart.so.11.0などが見つからないエラーが出力される」などです。ONNXモデルが作成されたときのCUDAバージョンと、現在のシステム上のCUDAバージョンが異なる場合にこのようなエラーが発生します。
例えば日本人用顔学習モデルJAPANESE FACE V1をCUDA 12.x環境で使用した時、このようなエラーが出力されることがあります。
https://github.com/yKesamaru/FACE01_trained_models
通常、ある程度CUDAバージョンが異なっていてもONNX RuntimeとCUDAの互換性が保証されています。ONNX RuntimeとCUDAのバージョンの互換性は以下のサイトから確認できます。
CUDA Execution Provider: Requirements

ところが先のようなエラーが発生してコードが動作しない場合は、依存ライブラリを特定してシンボリックリンクを作成する方法でこの問題を回避できます。
ここではシステムのCUDAバージョンとONNX Runtimeが求めるCUDAバージョンが異なっている場合の対処法を解説します。
注意
公式ドキュメントでは以下の記述があります。
Install ONNX Runtime GPU (CUDA 12.x)
For Cuda 12.x, please use the following instructions to install from ORT Azure Devops Feed
pip install onnxruntime-gpu --extra-index-url https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-12/pypi/simple/
この操作は未検証です。この記事ではシンボリックリンクをはる方法を解説します。

環境
$ inxi -SG --filter
System:
Kernel: 6.8.0-40-generic x86_64 bits: 64 Desktop: Unity
Distro: Ubuntu 22.04.4 LTS (Jammy Jellyfish)
Graphics:
Device-1: NVIDIA TU116 [GeForce GTX 1660 Ti] driver: nvidia v: 555.42.06
Display: x11 server: X.Org v: 1.21.1.4 driver: X:
loaded: modesetting,nouveau,nvidia unloaded: fbdev,vesa gpu: nvidia
resolution: 2560x1440~60Hz
OpenGL: renderer: NVIDIA GeForce GTX 1660 Ti/PCIe/SSE2
v: 4.6.0 NVIDIA 555.42.06
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Thu_Nov_18_09:45:30_PST_2021
Cuda compilation tools, release 11.5, V11.5.119
Build cuda_11.5.r11.5/compiler.30672275_0
$ nvidia-smi
Tue Aug 20 18:06:06 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 555.42.06 Driver Version: 555.42.06 CUDA Version: 12.5 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce GTX 1660 Ti Off | 00000000:09:00.0 On | N/A |
| 41% 38C P8 16W / 120W | 1727MiB / 6144MiB | 21% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
(FACE01_DEV) user@user:~/bin/FACE01_DEV$ pip list | grep -i "onnx"
onnx 1.16.1
onnxruntime-gpu 1.18.1
nvidia-cuda-toolkitがインストールされているか確認
libcudart.so.11.0はCUDAランタイムライブラリです。まずCUDAがシステムに正しくインストールされているか確認してください。
sudo apt update
sudo apt install -y nvidia-cuda-toolkit
シンボリックリンクの作成
libonnxruntime_providers_cuda.soなどが必要とする(依存する)ライブラリがすべて正しい場所に存在することを確認します。
ldd /home/user/bin/FACE01/lib/python3.10/site-packages/onnxruntime/capi/libonnxruntime_providers_cuda.so
上記の出力結果から、たとえば以下のようにシンボリックリンクを作成します。
# libcufft.so.10 のシンボリックリンク作成
sudo ln -s /usr/lib/x86_64-linux-gnu/libcufft.so.10 /usr/local/cuda-11.8/lib64/libcufft.so.10
# libcublas.so.11 のシンボリックリンク作成
sudo ln -s /usr/lib/x86_64-linux-gnu/libcublas.so.11 /usr/local/cuda-11.8/lib64/libcublas.so.11
# libcublasLt.so.11 のシンボリックリンク作成
sudo ln -s /usr/lib/x86_64-linux-gnu/libcublasLt.so.11 /usr/local/cuda-11.8/lib64/libcublasLt.so.11
環境変数に正しいパスを記述して永続化させる
CUDAライブラリが正しいパスに設定されているか確認します。~/.bashrcに以下の記述を行います。
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda-11.8
.bashrcを再読込してください。
source ~/.bashrc
ONNX Runtimeを再インストール
pip uninstall onnxruntime-gpu
pip install onnxruntime-gpu==1.18.1
以上で必要なCUDAライブラリが正しくロードされるはずです。
おわりに
今回はシステムのCUDAバージョンとONNX Runtimeが要求するCUDAバージョンが異なった場合の対処法を解説しました。
どなたかの助けになれば幸いです。
参考文献
- CUDA Execution Provider
- Install ONNX Runtime GPU (CUDA 12.x)
- FACE01_trained_models
- 日本人専用の顔認証モデル
- FACE01
JAPANESE FACE V1を使うためのPythonで書かれたオープンソースのリファレンス実装


