オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

Tensorflow v1とTensorflow v2を共存させる

 こんにちは.changです.

 Tensorflow ver. 1.14.0を長く使っていますが,Tensorflow 3D*1を試す為にv2を導入することにしました. 今までに書いたソースは同じ環境で使い続けたいので,v1とv2を共存させます.

 Pythonの開発環境を複数持つ方法はいくつか在ります.

(1) ハードディスクを分ける

 古臭いやり方ですが,ドライバレベルから環境を分ける一番確実な方法です. 僕の場合,システムファイル用とデータファイル用にHDDを分けているので,システムファイル側だけを変えればソースは共有できます. 500GBのSDDも5000円位で買える時代ですし,僕的にはプランAです.

 これをやるつもりでSDDも買ったのですが,「一度は今風の仮想環境を試そう」と思い立ったので見送りにします.

(2) Dockerを使う

 王道のやり方という事は知っているのですが,恥ずかしながらやったことがありません. これもどこかで試すつもりですが,今回はより簡単な(3)を採用します.

(3) vertualenvを使う

 Pythonを複数ver.持つための仮想環境です. 今回はこれを試します.

 Tensorflow ver.1.14.0の対応CUDAは ver. 10.0,今回導入するTensorflow ver. 2.3.0の対応CUDAはver. 10.1です*2. vertualenvの中にCUDAを入れることは出来ません. ですので,複数ver.のCUDAを同一PC内に入れ,かつ干渉させないことが,今回の一つのポイントになります.

(4) GCPを使う

 インスタンスを複数立てる事で,簡単に実現出来ます. これも流行りの方法ですが,一応,自作PCブログですので...

0. 今回やること

ベース環境

基本方針

  • vertualenvを使って,Tensorflow ver 1.14.0とTensorflow ver 2.3.0を同一PCで使用する
  • Tensorflow ver. 1.14.0ではCUDA 10.0を,Tensorflor ver. 2.3.0ではCUDA 10.1を使用する
  • NVidiaドライバはver. 450.102.04で統一とする(ドライバver.を分ける必要がある場合には,vertualenvでは出来ません)

1. CUDAのインストール

 既に10.0が入っている状態から初めます.

f:id:changlikesdesktop:20210622100323p:plain:w400
既存のCUDA 10.0

 ここ*3からCUDA10.1を,ここ*4からcuDNN 7.6.5をダウンロードします. この方*5によると,ver.違いのCUDAはそれぞれ別のディレクトリにインストールされて干渉しないそうです. 別々に入っていれば,Tensorflow側で適合ver.を勝手に選ぶとのこと. なので,このままインストールしていきます.

CUDA 10.0へのシンボリックリンクを消す

f:id:changlikesdesktop:20210622101639p:plain:w500
CUDA 10.0へのシンボリックリンクが在ったので,削除

$ sudo unlink /usr/local/cuda

CUDA10.1をインストールする

$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub  
$ sudo dpkg -i cuda-repo-ubuntu1804-10-1-local-10.1.105-418.39_1.0-1_amd64.deb  
$ sudo apt update  
$ sudo apt install cuda-toolkit-10-1
$ reboot

cuDNN 7.6.5をインストールする

$ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb

入ったか確認すると...何故かCUDA 10.2も入っとる???ここでまたシンボリックリンクを消しておく

$ ls /usr/local
$ sudo unlink /usr/local/cuda

f:id:changlikesdesktop:20210622113145p:plain:w500
/usr/localを確認

.bashrcを編集して環境変数を追加

export PATH="/usr/local/cuda-10.0/bin:$PATH"
export PATH="/usr/local/cuda-10.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH"

nvcc を打ってみると...10.1に変わっている

f:id:changlikesdesktop:20210622142625p:plain:w400
nvccの結果.CUDA 10.0が無くなっていないか不安になる

CUDA 10.0が無事か試す

$ python3  
>>> from tensorflow.python.client import device_lib  
>>> device_lib.list_local_devices()

f:id:changlikesdesktop:20210622114152p:plain:w500
libcudart.so.10.0が読み込まれているのでOK

2. Tensorflow v2のインストール

 /Python/tf2_env に環境を作ります

$ sudo apt update
$ sudo apt install virtualenv
$ cd ~/Python
$ mkdir tf2_env
$ virtualenv -p python3 tf2_env
$ source ./tf2_env/bin/activate

f:id:changlikesdesktop:20210622120253p:plain:w500
こんな感じでtf2_envに入る

pipでインストールする

$ pip3 install tensorflow==2.3.0

CUDA 10.1が呼び出されるか試すと,なんか失敗しているっぽい

$ python3  
>>> from tensorflow.python.client import device_lib  
>>> device_lib.list_local_devices()

f:id:changlikesdesktop:20210622133938p:plain:w500
libcublas.soが見つからないみたい

先刻何故か入っていると言ったCUDA 10.2の中に在るっぽいので,.bashrcにパスを追加する

export LD_LIBRARY_PATH="/usr/local/cuda-10.2/targets/x86_64-linux/lib:$LD_LIBRARY_PATH"

こんどは行けたっぽい

f:id:changlikesdesktop:20210622141359p:plain:w500
libcublas.soがロードされた

仮想環境から抜ける

$ deactivate

 取り敢えず,これで使ってみようと思います...(^^).