質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

4650閲覧

Docker+GPU+TensorFlow環境構築において、GPUを認識しない(なぜかNvidiaドライバが2つ出現?)

MagMag

総合スコア80

CUDA

CUDAは並列計算プラットフォームであり、Nvidia GPU(Graphics Processing Units)向けのプログラミングモデルです。CUDAは様々なプログラミング言語、ライブラリ、APIを通してNvidiaにインターフェイスを提供します。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/08/04 06:40

編集2021/08/05 05:22

やろうとしていること

Docker+GPU+TensorFlowの実行環境を作ろうと思っています。

対応

GPUを積んだ機体はproxy環境下にあり、ネットワーク設定が困難であったため、GPU非搭載で別ネットワーク下のMacBookでコンテナのイメージを作成し、このイメージをGPU搭載機体(Ubuntu16.04)にコピーしてdocker load→docker runしました。この方法が悪いのか不明ですか、Docker上でGPUを認識しません。そこで、問題の切り分け方法をアドバイスいただけないでしょうか?

問題の想定原因

TensorFlowからGPU認識を確認するコマンドを行ったところ(TensorFlowからGPUが認識できているかを2行コードで確認する)、kernel version 430.64.0 does not match DSO version 410.129.0 -- cannot find working devices in this configurationというErrorがでました。

確認事項等

  • ホストOS(GPU搭載機体)には、Nvidiaのドライバの430.64をインストールしました(古いバージョンからアップデートしたので、そこが原因かもしれません)。その後本体再起動しています。
  • ホストコンピュータ上でもコンテナ上でもnvidia-smiコマンドは通り、共にドライバは430.64で認識されます。
  • nvidiaドライバ、cuda、tensorflow、pythonのバージョンを合わせて導入したつもりです。
  • GPU利用可能なTensoflowのイメージを利用しても問題が再現しました。
  • GPUはGeFroce GTX 1080Ti(4枚)となります。

実行ファイル等

DockerFile

1FROM nvidia/cuda:10.0-cudnn7-runtime-ubuntu16.04 2 3RUN apt-get update && apt-get install -y wget curl sudo vim unzip git sudo 4RUN apt update && apt install -y software-properties-common 5 6# PPAからpython3.7インストール 7RUN add-apt-repository ppa:deadsnakes/ppa 8RUN apt update && apt install -y python3.7 9 10# pipのインストール 11RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 12RUN python3.7 get-pip.py 13RUN pip3 install -U pip 14 15# tensorflow-gpuのインストール 16RUN pip3 install tensorflow-gpu==2.0.0

bash

1$ docker run -it --gpus all tensor_image /bin/bash

python

1from tensorflow.python.client import device_lib 2device_lib.list_local_devices() 3 4# 2021-08-04 06:13:56.206162: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA 5# 2021-08-04 06:13:56.228115: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2993095000 Hz 6# 2021-08-04 06:13:56.239632: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x44c86a0 executing computations on platform Host. Devices: 7# 2021-08-04 06:13:56.239687: I tensorflow/compiler/xla/service/service.cc:175] StreamExecutor device (0): Host, Default Version 8# 2021-08-04 06:13:56.245282: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1 9# 2021-08-04 06:13:56.246894: E tensorflow/stream_executor/cuda/cuda_driver.cc:318] failed call to cuInit: CUDA_ERROR_SYSTEM_DRIVER_MISMATCH: system has unsupported display driver / cuda driver combination 10# 2021-08-04 06:13:56.246948: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: 89c089af9927 11# 2021-08-04 06:13:56.246968: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: 89c089af9927 12# 2021-08-04 06:13:56.247069: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:200] libcuda reported version is: 410.129.0 13# 2021-08-04 06:13:56.247121: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 430.64.0 14# 2021-08-04 06:13:56.247139: E tensorflow/stream_executor/cuda/cuda_diagnostics.cc:313] kernel version 430.64.0 does not match DSO version 410.129.0 -- cannot find working devices in this configuration 15# [name: "/device:CPU:0" 16# device_type: "CPU" 17# memory_limit: 268435456 18# locality { 19# } 20# incarnation: 7504376849925051239 21# , name: "/device:XLA_CPU:0" 22# device_type: "XLA_CPU" 23# memory_limit: 17179869184 24# locality { 25# } 26# incarnation: 11837196615187333375 27# physical_device_desc: "device: XLA_CPU device" 28# ]

コンテナ内でのライブラリパス確認

bash

1$ echo $LD_LIBRARY_PATH 2# /usr/local/nvidia/lib:/usr/local/nvidia/lib64 3 4ldconfig -p | grep libcuda 5# libcudart.so.10.0 (libc6,x86-64) => /usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudart.so.10.0 6# libcuda.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcuda.so.1

バージョン等確認

bash

1# ホスト 2$ docker —version 3Docker version 20.10.7, build f0df350 4 5# ホスト 6$ nvidia-container-cli info 7NVRM version: 430.64 8CUDA version: 10.1 9GPU認識されているが省略 10 11# ホスト 12$ ls -lh /usr/lib/x86_64-linux-gnu/libcuda.so* 13ls: '/usr/lib/x86_64-linux-gnu/libcuda.so*' にアクセスできません: そのようなファイルやディレクトリはありません 14 15# コンテナ 16$ ls -lh /usr/lib/x86_64-linux-gnu/libcuda.so* 17lrwxrwxrwx 1 root root 18 Aug 5 05:21 /usr/lib/x86_64-linux-gnu/libcuda.so.1 -> libcuda.so.410.129 18-rw-r--r-- 1 root root 15M Aug 14 2019 /usr/lib/x86_64-linux-gnu/libcuda.so.410.129

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lazykyama

2021/08/04 12:52

エラー中に410.129.0という番号が出ているのは、おそらく以下のissueにもある通り、`/usr/local/cuda/compat/` にあるライブラリが参照されているためではないかと思われます。 https://github.com/NVIDIA/nvidia-docker/issues/1256#issuecomment-620088349 ただなぜこれが見えてしまっているかが不明なので、お手数ですが以下の情報を追記頂けますか? * GPUの種類 (例: GeForce RTX 30xx, V100, など) * コンテナ内での `echo $LD_LIBRARY_PATH` の出力 * 同じくコンテナ内での `ldconfig -p | grep libcuda` の出力 また `docker pull tensorflow/tensorflow:2.0.0-gpu-py3` や `docker pull nvcr.io/nvidia/tensorflow:20.01-tf2-py3` などで取得できるTensorFlowのイメージでも同じエラーが出るか、というのは切り分けに役立つかもしれません。
MagMag

2021/08/05 01:24 編集

ありがとうございます。LinuxやDocker自体触り始めレベルでチンプンカンプンなので、大変助かります。コマンドの実施結果は質問文に追記しました。ただ、compatがでてこないということは、今回の件では共通ライブラリ参照の問題ではないということでしょうか? また、GPUはGeForce GTX 1080Ti(4枚搭載)となります。また、Tensorflowのイメージを使っても問題が再現したので、イメージ側の原因ではないようでした。
lazykyama

2021/08/05 03:15

追記ありがとうございます。GPUとドライバの整合性はとれていて、かつTensorFlowのビルド済みイメージでも発生しているとのことなので、おそらく認識されている通りイメージ側の問題というより、インストールされているdockerか、ホスト側の問題と思われます。 Step-by-stepでお願いして申し訳ないですが、念のため以下も確認いただけますか? * docker自体のバージョンと、nvidia-docker (ないしNVIDIA Container Toolkit) のバージョン * コンテナ内外両方の `ls -lh /usr/lib/x86_64-linux-gnu/libcuda.so*` > 古いバージョンからアップデートした とのことなので、ホスト側に余計なものが残っているのか、dockerがうまくGPU周りの処理をできていないか、という可能性を疑っています。 (調べる手間が……という場合は、ホスト側のドライバをキレイに入れ直すのがベストかもしれません)
MagMag

2021/08/05 05:26

ありがとうございます。大変助かります。情報追記いたしました。 コンテナ内でのls -lhコマンドで、410の数字が出てきたのですが、ここが主原因でしょうか? なお、GPUやドライバは違いますが、同じDockerのバージョン、同じDockerFileを別の機体で実行したら、GPUを認識しました。
guest

回答1

0

ベストアンサー

いろいろと追加情報ありがとうございます。結論としては、ドライバをキレイに入れ直していただく必要がありそうです。(後半で言及します)

コンテナ内でのls -lhコマンドで、410の数字が出てきたのですが、ここが主原因でしょうか?

今回のエラーの直接的な原因は、そうだと思われます。
エラーメッセージのとおりコンテナ内で、カーネルモジュールは新しい430が参照されているものの、libcuda.soは410を参照してミスマッチが起きている状況のようです。
コンテナとlibcuda.so、カーネルモジュールについては https://docs.nvidia.com/deploy/cuda-compatibility/NVIDIA Container Toolkit (NVIDIA Docker) は何をしてくれるか などが詳しいです。

前述の通り、古いバージョンからアップデートされる際に意図せず古いlibcuda.soが残った状態かつ、新しいものがうまくインストールできなかったのではないかと思われます。
その影響で、コンテナを起動する際、ホスト側のライブラリ等が適切にコンテナ内へマウントされず、コンテナ内の互換性パッケージが優先されたのではないかと。
(この点で、ホスト側のlibcuda.soがどこにあるのかが謎ではありますが……)

肝心の再インストールについては、現環境が複雑になっているようなので断定できない部分もありますが、基本的には以下の流れで進めていただくイメージです。

  • 現状のドライバをアンインストール
  • 新しいドライバをインストール
  • (それでもダメなら) 残っている不要なライブラリを探して削除

ドライバのアンインストール手順は、インストールした方法にも依存しますが、例えば以下があります。

  • apt-get purge *nvidia*apt-get purge *cuda* (ドライバを apt-get でインストールしていた場合)
  • nvidia-uninstall コマンドを実行 (手動でインストールした場合)
  • ./NVIDIA-Linux-x86_64-xxx.xxx.run --uninstall を実行 (.run ファイルが残っている場合)

余計なものが残っているかどうかは、ホスト側で ldconfig -p | grep libcudanvidia-container-cli list を実行して、意図しないバージョンのlibcuda.soなどが出てくるかどうかで判断できるかもしれません。

ドライバのインストール手順自体は、NVIDIA Docker って今どうなってるの? (20.09 版) を参考にしていただくのが確実かなと思います。

投稿2021/08/05 14:38

lazykyama

総合スコア58

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MagMag

2021/08/06 08:01

ありがとうございます。apt-get purge等で削除してみたのですが、やはり問題が再現したので、今の環境での構築を諦めて、Ubuntuを再インストールしようと思います。Dockerって環境に依存しないのがメリットと思いますが、GPUを使う場合ハードとの紐付けが必要なため、一筋縄ではないということなのでしょうか。 いずれにしろ、色々と教えていただきありがとうございました。Ubuntuの再インストールが必要という結果にはなりましたが、問題の切り分けができ、大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問