ローカルGPU(Nvidia GeForce RTX3000シリーズ)環境でディープラーニングを実装している方の中には、TensorFlow1.xのコードを実行できなくて困っている人がいると思います。と言うのもRTX3000シリーズはCUDA10.0に対応しておらず、TensorFlow1.x系のライブラリが使えない状況になっているためです。
CUDA | 使用可能TensorFlow | |
RTX3000シリーズ | 11.0~ | 2.x |
RTX2000以下 | ~10.0 | 1.x |
私の環境はRTX3070を使用しているためCUDA11系以降しか対応しておらず、TensorFlow1.xコードを実行することはできませんでした😿正確には実行できるのですが物凄く遅いです。
会社のPC環境でも同様なことが生じたため解決策を調べた結果、以下の方法がありました。
- Dockerをつかう
- tensorflow.compat.v1をつかいTensorFlow 2の挙動を無効化する
- TensorFlow1.xコードをTensorFlow2へアップグレードする
今回は2、3を説明していきます。1のDockerをつかうのが一般的だと思いますが、会社がインターネットにつなげない制約のある環境でしたので。。。OSはWindows10です。
↓の公式サイトの情報を参考にしています。
tensorflow.compat.v1 をつかう
tensorflow.compat.v1 のつかい方は簡単です。tensorflowをインポートする際に↓の様に書き換えればOKです。
import tensorflow as tf
↓
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
これだけでOKです。
簡単ですが公式ドキュメントによると、tensorflow.compat.v1をつかうと”TensorFlow 2.0 で追加された改善の多くを活用できない”ようです。TensorFlow2.xを無効化しているので当然ですが。
とにかく動かしたい方はこのままでOKと思いますが、しっかり実装したい方は↓のアップグレードや、コードの書換えをおすすめします。
TensorFlow1.xコードをTensorFlow2へアップグレードする
作業ディレクトリのスクリプトをTensorFlow1.x→TensorFlow2.xへアップグレードするコードです。
手順としては
- TensorFlow2.xがインストールされている必要があります。AnacondaPrompt等でインストールされている環境をアクティベートしてください。インストールされていない方はpip install tensorflowを実行してください。
- 書き換えたい.pyファイルを作業ディレクトリへ格納します。GithubでダウンロードしたモノでもOKです。
- ↓のコードをAnacondaPromtなどで実行してください。保存するディレクトリをあらかじつくらないように注意してください。
tf_upgrade_v2 --intree my_project/ --outtree my_project_v2/ --reportfile report.txt
#my_projectを変換したい作業ディレクトリ、my_project_v2/を保存するディレクトリ名へ変更してください。
以上の手順でTensorFlow2.xで動作するコードへ自動変換されたと思います。
ただし、うまくいかないケースもあるようなので、その場合は手動でコード書き換えを検討してみてください。
試してみる
上記の2つの手法を試してみました。試したコードはSegmentation modelsを用いたセマンティックセグメンテーションです。Githubは↓
Segmentation modelsは簡単にセマンティックセグメンテーションすることができる素晴らしいライブラリなのですが、TensorFlow1.xでの動作を想定しているモデルです。
トマトのオリジナル画像でセマンティックセグメンテーションを実装した結果を下に示します。このモデルの詳細はまた別のブログで書きます。
U-Netによる4クラス分類をBACKBORN = ‘efficientnetb4’, Batch_size=1, Epochs=100で学習させた結果は↓です。
学習時間 | evaluate loss | evaluate IoU score | |
tensorflow.compat.v1 | 467 sec. | 0.13 | 0.81 |
アップグレード | 300 sec. | 0.06 | 0.89 |
データ数が少ないのでスコアとLossのバラつきはあると思います。注目は学習時間で1.5倍もの差があります。これは tensorflow.compat.v1 でTensorFlow2.xの動きを無効化しているため、TensorFlow1.xで動いたためと考えられます。TensorFlow2.xにすることでかなり高速化していたんですね!
まずは
- TensorFlow1.xコードをTensorFlow2へアップグレードする
を実施してみて、うまくいかなかったら
- tensorflow.compat.v1 をつかう
みたいなつかい方がいいのかなと思いました。
いずれにしても、簡単なコードの追加や、自動アップグレードでTensorFlow2.xが動くので、↑の手法はおすすめです。ただし、対応していないコードもあるようなので注意が必要のようです。この辺りは公式ドキュメントをご参照お願いします。
参考図書
最近はPyTorchで実装するコードが多いですが、私の場合コード書くときはTensorFlowの方が書きやすいです。以下の書籍はおすすめです。ご参考に👍
コメント