Dockerの大きな魅力の一つは、別のPCでも同じ環境を簡単に再現できることだと思います。しかし、Deep LearningでGPUを動かすDocker(nvidia-docker)では環境依存でハマることが何回かあったのでまとめようと思います。

ハマった例

  • Pascal世代(1080Ti)が載ってるマシンで動いていたDockerをTuring世代(2080)が載っているマシンでbuildしてプログラムを動かしたらエラーになった
  • Pascal世代(1080Ti)が載ってるマシンで動いていたDockerをAmpere世代(3090)が載っているマシンでbuildしてプログラムを動かしたらエラーになった

以下,詳しく紹介です(/・ω・)/

Turing世代(2080)で動かなかった話

問題点

  • tensorflow1.13.0, cuDNN 7.4.1, CUDA10をDockerで入れていた
  • tensorflow/stream_executor/cuda/cuda_dnn.cc:334] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR]
    というエラーで動かない
  • ここで同じようなエラーが議論されている
    • 20系で動かない報告が多いので,多分20系を使っていることが原因と推測される

解決方法

  • tensorflow1.14で問題なかったので、NGCのコンテナ(ngc tensorflow:19.09-py3)をベースに用いた
    • NGCはnvidiaがいろいろなバージョンでtensorflowやpytorchのコンテナを作ってるやつ
    • tensorflow:19.09-py3は,Turing をサポートしているので使えるはず!
  • ベースを変えてみたがまだエラーをはいていたので,ここに従って脳死で
    ENV TF_FORCE_GPU_ALLOW_GROWTH=true
    を付け加えたら動いた
  • NGCのコンテナにしたことも必要なのか,環境変数を付け加えただけで良かったのか検証忘れた(´・ω・`)

自分のケースまとめ

  • NGCベースにしてENV TF_FORCE_GPU_ALLOW_GROWTH=trueを付けたら解決

Ampere世代(3090)で動かなかった話

  • 先に言うと解決していない.以下はnvidiaのフォーラムとかでやり取りしてたどり着いた結論(放置中)
    • 昔のことなので細かいことは忘れた(´・ω・`)

問題点

  • Tensordlow1.14とROS melodicを使っていた.
  • 1080Ti搭載のマシン上で動いていたDockerが,3090搭載のマシンではTensorflow関係やCUDA関係のエラーで動かなかったり,プログラムの起動に20分くらいかかったり

nvidiaフォーラムでのやり取り

  • 30シリーズが出始めで,ネット上にも情報が少なかったのでnvidiaフォーラムを頼った(ここ
  • 原因はpipで入れるtensorflow1.14がAmpere世代に対応していないこと
    • これのせいで,プログラム実行のたびにtensorflowのコンパイルが走っていて動かなかったり,軌道が遅かったりしていた.
  • NGCのコンテナを使うと良いかもしれないと助言をいただいたが,Python2はサポートされてないから自分でコンパイルしてみる必要があるとのこと
    • ROS melodicなのでPython2を使っている(´・ω・`)
  • tensorflowのコンパイルしてみたけど上手くいかなくて面倒で放置中←イマココ
    • 結局,古いマシンでプログラムを動かしている

まとめ

Python2は使うな。ROS…

tensorflowを自力でコンパイルできれば解決できるかもしれない

Categories:

Tags:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA