Ubuntu20.04にCUDA11.4とtensorflow-gpu2.6をインストールしたログ@2021.12

# 概要

Ubuntu20.04にOSをフルインストールし、その状態から、CUDA11.4 と tensorflow-gpu 2.6.0 を install する方法を、2021年12月の時点で試した方法について記載しておきます。背景としては、現状@2021.12では、conda で linux に tensorflow-gpu 2.6.0 が入らないため、pip を使うことになるが、その時のkerasとの整合性の確認が必要です。Ubuntu20.04が初期状態に近いところからセットアップすることを想定しています。

## 大まかな流れ

1. CUDAをインストール
2. 基本的なライブラリをインストール
3. conda の仮想環境で tensorflow, keras, cudnn を入れる
4. 動作確認

になります。


# 具体的なステップ

## 1. CUDAをインストール

(https://developer.nvidia.com/cuda-downloads)[https://developer.nvidia.com/cuda-downloads] から、該当するOSやArchitectureを入れると、インストールのためのコマンドが出力されるのでそれに従う。

うまくいったとして、

``` bash:
%ls -l /usr/local/cuda
cuda -> /usr/local/cuda-11.4/
cuda-11.4
```

のように、cuda が、cuda-11.4 にシンボリックリンクが貼られてる状況を想定します。

もし、全ユーザーが同じcudaを使うのであれば、

``` bash:/etc/profile.d/cuda.sh
if ! echo ${PATH} | /bin/grep -q /usr/local/cuda/bin ; then
        PATH=/usr/local/cuda/bin:${PATH}
fi
```

などと、/etc/profile.d/cuda.sh を作成しておくと、全ユーザーがログイン時に、$PATHに /usr/local/cuda/bin が追加される。

## 2. 基本的なライブラリのインストール

``` bash:
sudo apt install screen
sudo apt install emacs
sudo apt install graphviz
sudo apt-get install texlive-xetex texlive-fonts-recommended texlive-plain-generic
```

はミニマムいれておけばOKです。

宇宙関係者でHEASOFTを使う人は、

``` bash:
sudo apt-get install libncurses5-dev # heasoft ユーザー向け
```

が必要になります。

## 3. conda の仮想環境で tensorflow, keras, cudnn を入れる

condaの仮想環境を作成し、tensorflow, keras, cudnn を入れます。
現状だと、conda で tensorflow の 2.6 がインストールされないので、tensorflow と keras は pip で入れます。cudnn は conda で大丈夫です。

``` bash:
# conda で仮想環境 cuda114tf2p6 を作成する 
conda create -n cuda114tf2p6
conda activate cuda114tf2p6

# pip で tensorflow-gpu==2.6.0, keras==2.6.0 を入れる。
conda install -c anaconda pip
pip install tensorflow-gpu==2.6.0
pip install keras==2.6.0

# cudnn を conda で入れる。
conda search cudnn  # 必要なversionがあることを確認
conda install -c conda-forge cudnn # 指定しないと、最適なものを自動で選んでくれる(はず)
```

一応、keras と tensorflow のバージョンが一致していることを確認しましょう。それぞれの side-packages にある、__init__.py の versionを比較すればOKです。

``` bash: 
grep version /home/ユーザー名/anaconda3/envs/cuda114tf2p6/lib/python3.8/site-packages/keras/__init__.py  # 
grep version /home/ユーザー名/anaconda3/envs/cuda114tf2p6/lib/python3.8/site-packages/tensorflow/python/keras/__init__.py 
```

そのほか、必要なライブラリを入れておきましょう。

``` bash:
conda install matplotlib
conda install seaborn
conda install ipython
conda install -c conda-forge jupyterlab
conda install -c anaconda scikit-learn
conda install astropy  # 宇宙の人向け
```

## 4. 動作確認

``` python:
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
``` 

でGPUが表示されればOKです。

環境を保存するために、

``` bash:
conda env export > env_cuda114tf2p6.yml
```

として、YAMLファイルに環境を保存しておきましょう。

``` env_cuda114tf2p6.yml:
name: cuda114tf2p6
channels:
  - anaconda
  - conda-forge
  - defaults
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=4.5=1_gnu
  - anyio=3.4.0=py38h578d9bd_0
  - argon2-cffi=20.1.0=py38h27cfd23_1
  - astropy=5.0=py38h09021b7_0
  - async_generator=1.10=py_0
  - attrs=21.2.0=pyhd8ed1ab_0
  - babel=2.9.1=pyh44b312d_0
  - backcall=0.2.0=pyhd3eb1b0_0
  - blas=1.0=mkl
  - bleach=4.1.0=pyhd8ed1ab_0
  - bottleneck=1.3.2=py38heb32a55_1
  - brotli=1.0.9=he6710b0_2
  - brotlipy=0.7.0=py38h497a2fe_1001
  - ca-certificates=2020.10.14=0
  - certifi=2020.6.20=py38_0
  - cffi=1.14.6=py38h400218f_0
  - charset-normalizer=2.0.9=pyhd8ed1ab_0
  - cryptography=35.0.0=py38ha5dfef3_0
  - cudatoolkit=10.2.89=hfd86e86_1
  - cudnn=8.2.1.32=h2c0ae14_0
  - cycler=0.11.0=pyhd3eb1b0_0
  - dbus=1.13.18=hb2f20db_0
  - decorator=5.1.0=pyhd3eb1b0_0
  - defusedxml=0.7.1=pyhd8ed1ab_0
  - entrypoints=0.3=pyhd8ed1ab_1003
  - expat=2.4.1=h2531618_2
  - fontconfig=2.13.1=h6c09931_0
  - fonttools=4.25.0=pyhd3eb1b0_0
  - freetype=2.11.0=h70c0345_0
  - giflib=5.2.1=h7b6447c_0
  - glib=2.69.1=h5202010_0
  - gst-plugins-base=1.14.0=h8213a91_2
  - gstreamer=1.14.0=h28cd5cc_2
  - icu=58.2=he6710b0_3
  - importlib_resources=5.4.0=pyhd8ed1ab_0
  - intel-openmp=2021.4.0=h06a4308_3561
  - ipykernel=5.5.5=py38hd0cf306_0
  - ipython=7.29.0=py38hb070fc8_0
  - ipython_genutils=0.2.0=py_1
  - jedi=0.18.0=py38h06a4308_1
  - jinja2=3.0.3=pyhd8ed1ab_0
  - joblib=0.17.0=py_0
  - jpeg=9d=h7f8727e_0
  - json5=0.9.5=pyh9f0ad1d_0
  - jsonschema=4.3.2=pyhd8ed1ab_0
  - jupyter_client=7.1.0=pyhd8ed1ab_0
  - jupyter_core=4.9.1=py38h578d9bd_1
  - jupyter_server=1.13.1=pyhd8ed1ab_0
  - jupyterlab=3.2.5=pyhd8ed1ab_0
  - jupyterlab_pygments=0.1.2=pyh9f0ad1d_0
  - jupyterlab_server=2.10.1=pyhd8ed1ab_0
  - kiwisolver=1.3.1=py38h2531618_0
  - lcms2=2.12=h3be6417_0
  - ld_impl_linux-64=2.33.1=h53a641e_7
  - libedit=3.1.20191231=h14c3975_1
  - libffi=3.3=he6710b0_2
  - libgcc-ng=9.3.0=h5101ec6_17
  - libgfortran-ng=7.5.0=ha8ba4b0_17
  - libgfortran4=7.5.0=ha8ba4b0_17
  - libgomp=9.3.0=h5101ec6_17
  - libpng=1.6.37=hbc83047_0
  - libsodium=1.0.18=h36c2ea0_1
  - libstdcxx-ng=9.1.0=hdf63c60_0
  - libtiff=4.2.0=h85742a9_0
  - libuuid=1.0.3=h7f8727e_2
  - libwebp=1.2.0=h89dd481_0
  - libwebp-base=1.2.0=h27cfd23_0
  - libxcb=1.14=h7b6447c_0
  - libxml2=2.9.12=h03d6c58_0
  - lz4-c=1.9.3=h295c915_1
  - markupsafe=2.0.1=py38h497a2fe_0
  - matplotlib=3.5.0=py38h06a4308_0
  - matplotlib-base=3.5.0=py38h3ed280b_0
  - matplotlib-inline=0.1.2=pyhd3eb1b0_2
  - mistune=0.8.4=py38h497a2fe_1004
  - mkl=2021.4.0=h06a4308_640
  - mkl-service=2.4.0=py38h7f8727e_0
  - mkl_fft=1.3.1=py38hd3c417c_0
  - mkl_random=1.2.2=py38h51133e4_0
  - munkres=1.1.4=py_0
  - nbclassic=0.3.4=pyhd8ed1ab_0
  - nbclient=0.5.9=pyhd8ed1ab_0
  - nbconvert=6.3.0=py38h578d9bd_1
  - nbformat=5.1.3=pyhd8ed1ab_0
  - ncurses=6.2=he6710b0_1
  - nest-asyncio=1.5.4=pyhd8ed1ab_0
  - notebook=6.4.6=pyha770c72_0
  - numexpr=2.7.3=py38h22e1b3c_1
  - numpy-base=1.21.2=py38h79a1101_0
  - olefile=0.46=pyhd3eb1b0_0
  - openssl=1.1.1l=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pandas=1.3.4=py38h8c16a72_0
  - pandoc=2.16.2=h7f98852_0
  - pandocfilters=1.5.0=pyhd8ed1ab_0
  - parso=0.8.2=pyhd3eb1b0_0
  - pcre=8.45=h295c915_0
  - pexpect=4.8.0=pyhd3eb1b0_3
  - pickleshare=0.7.5=pyhd3eb1b0_1003
  - pillow=8.4.0=py38h5aabda8_0
  - pip=20.2.4=py38_0
  - prometheus_client=0.12.0=pyhd8ed1ab_0
  - prompt-toolkit=3.0.20=pyhd3eb1b0_0
  - ptyprocess=0.7.0=pyhd3eb1b0_2
  - pycparser=2.21=pyhd8ed1ab_0
  - pyerfa=2.0.0=py38h27cfd23_0
  - pygments=2.10.0=pyhd3eb1b0_0
  - pyopenssl=21.0.0=pyhd8ed1ab_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pyqt=5.9.2=py38h05f1152_4
  - pyrsistent=0.18.0=py38heee7806_0
  - pysocks=1.7.1=py38h578d9bd_4
  - python=3.8.5=h7579374_1
  - python-dateutil=2.8.2=pyhd3eb1b0_0
  - python_abi=3.8=2_cp38
  - pytz=2021.3=pyhd3eb1b0_0
  - pyyaml=6.0=py38h7f8727e_1
  - pyzmq=19.0.2=py38ha71036d_2
  - qt=5.9.7=h5867ecd_1
  - readline=8.0=h7b6447c_0
  - requests=2.26.0=pyhd8ed1ab_1
  - scikit-learn=0.23.2=py38h0573a6f_0
  - scipy=1.7.1=py38h292c36d_2
  - seaborn=0.11.2=pyhd3eb1b0_0
  - send2trash=1.8.0=pyhd8ed1ab_0
  - setuptools=50.3.0=py38hb0f4dca_1
  - sip=4.19.13=py38he6710b0_0
  - sniffio=1.2.0=py38h578d9bd_2
  - sqlite=3.33.0=h62c20be_0
  - terminado=0.12.1=py38h578d9bd_1
  - testpath=0.5.0=pyhd8ed1ab_0
  - threadpoolctl=2.1.0=pyh5ca1d4c_0
  - tk=8.6.10=hbc83047_0
  - tornado=6.1=py38h27cfd23_0
  - traitlets=5.1.1=pyhd3eb1b0_0
  - urllib3=1.26.7=pyhd8ed1ab_0
  - wcwidth=0.2.5=pyhd3eb1b0_0
  - webencodings=0.5.1=py_1
  - websocket-client=1.2.3=pyhd8ed1ab_0
  - wheel=0.35.1=py_0
  - xz=5.2.5=h7b6447c_0
  - yaml=0.2.5=h7b6447c_0
  - zeromq=4.3.4=h2531618_0
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.11=h7b6447c_3
  - zstd=1.4.9=haebb681_0
  - pip:
    - absl-py==0.15.0
    - astunparse==1.6.3
    - cachetools==4.2.4
    - clang==5.0
    - flatbuffers==1.12
    - gast==0.4.0
    - google-auth==2.3.3
    - google-auth-oauthlib==0.4.6
    - google-pasta==0.2.0
    - grpcio==1.43.0
    - h5py==3.1.0
    - idna==3.3
    - importlib-metadata==4.10.0
    - keras==2.6.0
    - keras-preprocessing==1.1.2
    - markdown==3.3.6
    - numpy==1.19.5
    - oauthlib==3.1.1
    - opt-einsum==3.3.0
    - protobuf==3.19.1
    - pyasn1==0.4.8
    - pyasn1-modules==0.2.8
    - pydot==1.4.2
    - requests-oauthlib==1.3.0
    - rsa==4.8
    - six==1.15.0
    - tensorboard==2.7.0
    - tensorboard-data-server==0.6.1
    - tensorboard-plugin-wit==1.8.0
    - tensorflow-estimator==2.7.0
    - tensorflow-gpu==2.6.0
    - termcolor==1.1.0
    - typing-extensions==3.7.4.3
    - werkzeug==2.0.2
    - wrapt==1.12.1
prefix: /home/yamada3/anaconda3/envs/cuda114tf2p6
```