スパコン ITO のフロントエンド（GPU有り）で Jupyter から TensorFlow 2.1 を実行する手順

[スパコンITO](https://www.cc.kyushu-u.ac.jp/scp/index.html) の [フロントエンド](https://www.cc.kyushu-u.ac.jp/scp/system/ITO/frontend/) の Jupyter で TensorFlow を使えるようにします．フロントエンド と Jupyter の設定手順は[こちらの記事](https://qiita.com/jsasaki/items/a3f390eac6c52fcf4abc)にまとめています．
[フロントエンド](https://www.cc.kyushu-u.ac.jp/scp/system/ITO/frontend/) で GPU が使えるのはベアメタルのみです．GPU を利用するためには，フロントエンドの資源を予約する際に，ベアメタルを選択する必要があります．GPU はフロントエンド仮想マシンでは利用できません．
NVIDIA の GPU を利用した，Linux 環境における TensorFlow のインストール方法は，スパコンITOに限らず，一般的な内容です．

# フロントエンドノードで GPU の設定
[こちらの記事](https://www.cc.kyushu-u.ac.jp/scp/system/ITO/frontend/)を参照して，予約したフロントエンドノードにログインします．スパコンITOでは module を load することで様々なソフトウエアを利用できます．`TensorFlow 2.1` で `GPU` を使用するために必要となる，`CUDA 10.1` をloadします.TensorFlow と GPU それぞれのバージョンの組み合わせは要注意です．TensorFlow 2.1 は CUDA 10.1 が必要です．
**CUDA の load は TensorFlow のインストール時だけでなく，TensorFlow 実行時に毎回必要です．**

```bash
# ログイン後に必要要件を実行します
$ ulimit -v 20140000
$ ulimit -u 512
# GPU利用のため適切なバージョンのcudaをloadします
$ module load cuda/10.1
# cudaがloadされたことを確認します．著者の環境ではIntelコンパイラもloadされています．
$ module list
Currently Loaded Modulefiles:
  1) intel/2019.4   2) cuda/10.1

# NVIDIA CUDA Toolkit のバージョンが確認できれば成功です
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243
```

# TensorFlow のインストールと確認
最初は Intel のディストリビューションで仮想環境を構築した上で，[Anaconda Cloud](https://anaconda.org/search?q=tensorflow) を参照し，intel channel を含む様々なchannelの TensorFlow 2.1 のインストールを試しました．しかし，GPU が認識されませんでした．結局，`anaconda channel` で仮想環境を構築し，`anaconda channel` で `tensorflow-gpu` パッケージをインストールすることで成功しました．
[こちらの記事](https://qiita.com/jsasaki/items/c807e155753468a0cfbc)で整備したMinicondaを用いました．新しい仮想環境 tf を用意して作業を進めます．

```bash
$ conda create -c anaconda -n tf
$ conda activate tf
$ conda install -c anaconda tensorflow-gpu
```

TensorFlow が GPU を認識するか，確認しましょう．Python環境で以下を実行します．

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

実際にやってみると以下のようになりました．Python環境では `Shift-Enter` で実行します．下の方に，`device_type: "GPU"` が現れ，GPU を認識していることが確認できます．Python環境から抜けるには `quit()` を実行します．

```bash
$ python
Python 3.7.7 (default, Mar 26 2020, 15:48:22)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow.python.client import device_lib
>>> device_lib.list_local_devices()
2020-04-12 10:07:00.887858: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 AVX512F FMA
2020-04-12 10:07:01.650004: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2300000000 Hz
2020-04-12 10:07:01.674747: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fd2f0c37f20 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-04-12 10:07:01.674811: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2020-04-12 10:07:01.862541: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
2020-04-12 10:07:02.015789: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1555] Found device 0 with properties:
pciBusID: 0000:37:00.0 name: Quadro P4000 computeCapability: 6.1
coreClock: 1.48GHz coreCount: 14 deviceMemorySize: 7.93GiB deviceMemoryBandwidth: 226.62GiB/s
2020-04-12 10:07:02.066758: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.1
2020-04-12 10:07:07.009068: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10
2020-04-12 10:07:10.726880: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10
2020-04-12 10:07:11.122902: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10
2020-04-12 10:07:16.866789: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10
2020-04-12 10:07:17.233256: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10
2020-04-12 10:07:21.609688: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2020-04-12 10:07:21.630634: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1697] Adding visible gpu devices: 0
2020-04-12 10:07:21.653310: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.1
2020-04-12 10:07:21.868090: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1096] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-04-12 10:07:21.868135: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102]      0
2020-04-12 10:07:21.881889: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] 0:   N
2020-04-12 10:07:21.953254: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1241] Created TensorFlow device (/device:GPU:0 with 7609 MB memory) -> physical GPU (device: 0, name: Quadro P4000, pci bus id: 0000:37:00.0, compute capability: 6.1)
2020-04-12 10:07:22.064372: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7fd2f185b0d0 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:
2020-04-12 10:07:22.064411: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Quadro P4000, Compute Capability 6.1
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 604661095847797083
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 8073603212876973691
physical_device_desc: "device: XLA_CPU device"
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 7979450368
locality {
  bus_id: 1
  links {
  }
}
incarnation: 4571149872542587611
physical_device_desc: "device: 0, name: Quadro P4000, pci bus id: 0000:37:00.0, compute capability: 6.1"
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 3629064078974056009
physical_device_desc: "device: XLA_GPU device"
]
>>>
```

# 必要なパッケージをインストールする
TensorFlow の他に必要なパッケージを tf仮想環境 にインストールしておきます．`channel` は `anaconda` を指定しました．必須の `jupyterlab` に加え，リモートセンシング解析のため，以下をインストールしました．

```bash
$ conda install -c anaconda jupyterlab matplotlib rasterio scikit-learn
```

# Jupyterを立ち上げる

Jupyter を起動し，TensorFlow を import して使えるようにします．方法の詳細は[こちらの記事](https://qiita.com/jsasaki/items/a3f390eac6c52fcf4abc)にまとめてあります．要約すると，以下の手順です．

```bash
# 1. ログインノードのターミナルにおいて以下を実行し，フロントエンドノードに入る

$ ssh -A -Y Floating_IP
# Floating_IP はメールで送られてくる，172.18.32.191 のようなIPアドレスです．

# 2. フロントエンドノードにおいて，Jupyterを起動

# Jupyter Notebook の場合
$ jupyter notebook --ip=127.0.0.1 --port=8888 --no-browser
# JupterLab の場合
$ jupyter lab --ip=127.0.0.1 --port=8888 --no-browser

# 3. 1.で現れる以下のようなurlをクライアントのブラウザurlに貼り付け実行
http://127.0.0.1:8888/?token=... 
```

**注意： JupyterLab で実行中にcellが `*` 状態で止まってしまうことがありました．その場合は `Kernel` の `Restart Kernel` で解決しました．**

# パッケージの確認
パッケージは日々更新されますので，インストールの日時によって挙動が異なります．2020年4月11日時点での上記の方法によるパッケージリストを示しておきます．ただし，上記インストールのうち，scikit-learn は含まれていません．

```bash
$ conda list
# packages in environment at /home/usr1/m00000a/local/miniconda3/envs/tf:
#
# Name                    Version                   Build  Channel
_tflow_select             2.1.0                       gpu    anaconda
absl-py                   0.9.0                    py37_0    anaconda
affine                    2.3.0                      py_0    anaconda
asn1crypto                1.3.0                    py37_0    anaconda
astor                     0.8.0                    py37_0    anaconda
attrs                     19.3.0                     py_0    anaconda
backcall                  0.1.0                    py37_0    anaconda
blas                      1.0                         mkl    anaconda
bleach                    3.1.0                    py37_0    anaconda
blinker                   1.4                      py37_0    anaconda
boost-cpp                 1.72.0               h8e57a91_0    conda-forge
bzip2                     1.0.8                h7b6447c_0    anaconda
c-ares                    1.15.0            h7b6447c_1001    anaconda
ca-certificates           2020.1.1                      0    anaconda
cachetools                3.1.1                      py_0    anaconda
cairo                     1.16.0            hcf35c78_1003    conda-forge
certifi                   2020.4.5.1               py37_0    anaconda
cffi                      1.14.0           py37h2e261b9_0    anaconda
cfitsio                   3.470                hb7c8383_2    anaconda
chardet                   3.0.4                 py37_1003    anaconda
click                     7.1.1                      py_0    anaconda
click-plugins             1.1.1                      py_0    anaconda
cligj                     0.5.0                    py37_0    anaconda
cryptography              2.8              py37h1ba5d50_0    anaconda
cudatoolkit               10.1.243             h6bb024c_0    anaconda
cudnn                     7.6.5                cuda10.1_0    anaconda
cupti                     10.1.168                      0    anaconda
curl                      7.69.1               hbc83047_0    anaconda
cycler                    0.10.0                   py37_0    anaconda
decorator                 4.4.2                      py_0    anaconda
defusedxml                0.6.0                      py_0    anaconda
entrypoints               0.3                      py37_0    anaconda
expat                     2.2.9                he1b5a44_2    conda-forge
fontconfig                2.13.1            h86ecdb6_1001    conda-forge
freetype                  2.10.1                        1    intel
freexl                    1.0.5                h14c3975_0    anaconda
gast                      0.2.2                    py37_0    anaconda
geos                      3.8.0                he6710b0_0    anaconda
geotiff                   1.5.1                h38872f0_8    conda-forge
giflib                    5.2.1                h516909a_2    conda-forge
glib                      2.63.1               h5a9c865_0    anaconda
gmp                       6.1.2                hb3b607b_0    anaconda
google-auth               1.13.1                     py_0    anaconda
google-auth-oauthlib      0.4.1                      py_2    anaconda
google-pasta              0.2.0                      py_0    anaconda
grpcio                    1.27.2           py37hf8bcb03_0    anaconda
h5py                      2.10.0          nompi_py37h513d04c_102    conda-forge
hdf4                      4.2.13               h3ca952b_2
hdf5                      1.10.5          nompi_h3c11f04_1104    conda-forge
icu                       64.2                 he1b5a44_1    conda-forge
idna                      2.9                        py_1    anaconda
importlib_metadata        1.5.0                    py37_0    anaconda
intel-openmp              2020.0                      166    anaconda
intelpython               2020.1                        0    intel
ipykernel                 5.1.4            py37h39e3cac_0    anaconda
ipython                   7.13.0           py37h5ca1d4c_0    anaconda
ipython_genutils          0.2.0                    py37_0    anaconda
jedi                      0.16.0                   py37_1    anaconda
jinja2                    2.11.1                     py_0    anaconda
jpeg                      9c                h14c3975_1001    conda-forge
json-c                    0.13.1               h1bed415_0    anaconda
json5                     0.9.4                      py_0    anaconda
jsonschema                3.2.0                    py37_0    anaconda
jupyter_client            6.1.2                      py_0    anaconda
jupyter_core              4.6.3                    py37_0    anaconda
jupyterlab                1.2.6              pyhf63ae98_0    anaconda
jupyterlab_server         1.1.0                      py_0    anaconda
kealib                    1.4.13               hec59c27_0    conda-forge
keras-applications        1.0.8                      py_0    anaconda
keras-preprocessing       1.1.0                      py_1    anaconda
kiwisolver                1.1.0            py37he6710b0_0    anaconda
krb5                      1.17.1               h173b8e3_0    anaconda
ld_impl_linux-64          2.33.1               h53a641e_7    anaconda
libblas                   3.8.0                    14_mkl    conda-forge
libcblas                  3.8.0                    14_mkl    conda-forge
libcurl                   7.69.1               h20c2e04_0    anaconda
libdap4                   3.20.4               hd3bb157_0    conda-forge
libedit                   3.1.20181209         hc058e9b_0    anaconda
libffi                    3.2.1                h4deb6c0_3    anaconda
libgcc-ng                 9.1.0                hdf63c60_0    anaconda
libgdal                   3.0.4                h20022a4_0    conda-forge
libgfortran-ng            7.3.0                hdf63c60_0    anaconda
libiconv                  1.15                 h63c8f33_5    anaconda
libkml                    1.3.0             hb574062_1011    conda-forge
liblapack                 3.8.0                    14_mkl    conda-forge
libnetcdf                 4.7.3           nompi_h9f9fd6a_101    conda-forge
libpng                    1.6.37               hbc83047_0    anaconda
libpq                     12.2                 h20c2e04_0    anaconda
libprotobuf               3.11.4               hd408876_0    anaconda
libsodium                 1.0.16               h1bed415_0    anaconda
libspatialite             4.3.0a            ha48a99a_1034    conda-forge
libssh2                   1.9.0                h1ba5d50_1    anaconda
libstdcxx-ng              9.1.0                hdf63c60_0    anaconda
libtiff                   4.1.0                hc3755c2_3    conda-forge
libuuid                   2.32.1            h14c3975_1000    conda-forge
libwebp                   1.0.2                h56121f0_5    conda-forge
libxcb                    1.13                 h1bed415_1    anaconda
libxml2                   2.9.10               hee79883_0    conda-forge
lz4-c                     1.8.3             he1b5a44_1001    conda-forge
markdown                  3.1.1                    py37_0    anaconda
markupsafe                1.1.1            py37h7b6447c_0    anaconda
matplotlib                3.1.2                    py37_3    intel
mistune                   0.8.4            py37h7b6447c_0    anaconda
mkl                       2019.5                      281    anaconda
mkl-service               2.3.0            py37he904b0f_0    anaconda
mkl_fft                   1.0.15           py37ha843d7b_0    anaconda
mkl_random                1.1.0            py37hd6b4f25_0    anaconda
nbconvert                 5.6.1                    py37_0    anaconda
nbformat                  5.0.4                      py_0    anaconda
ncurses                   6.2                  he6710b0_0    anaconda
notebook                  6.0.3                    py37_0    anaconda
numpy                     1.17.5           py37h95a1406_0    conda-forge
numpy-base                1.18.1           py37hde5b4d6_1    anaconda
oauthlib                  3.1.0                      py_0    anaconda
openjpeg                  2.3.1                h981e76c_3    conda-forge
openssl                   1.1.1                h7b6447c_0    anaconda
opt_einsum                3.1.0                      py_0    anaconda
pandoc                    2.2.3.2                       0    anaconda
pandocfilters             1.4.2                    py37_1    anaconda
parso                     0.6.2                      py_0    anaconda
pcre                      8.43                 he6710b0_0    anaconda
pexpect                   4.8.0                    py37_0    anaconda
pickleshare               0.7.5                    py37_0    anaconda
pip                       20.0.2                   py37_1    anaconda
pixman                    0.38.0               h7b6447c_0    anaconda
poppler                   0.67.0               h14e79db_8    conda-forge
poppler-data              0.4.9                         0    anaconda
postgresql                12.2                 h20c2e04_0    anaconda
proj                      6.3.0                hc80f0dc_0    conda-forge
prometheus_client         0.7.1                      py_0    anaconda
prompt-toolkit            3.0.4                      py_0    anaconda
prompt_toolkit            3.0.4                         0    anaconda
protobuf                  3.11.4           py37he6710b0_0    anaconda
ptyprocess                0.6.0                    py37_0    anaconda
pyasn1                    0.4.8                      py_0    anaconda
pyasn1-modules            0.2.7                      py_0    anaconda
pycparser                 2.20                       py_0    anaconda
pygments                  2.6.1                      py_0    anaconda
pyjwt                     1.7.1                    py37_0    anaconda
pyopenssl                 19.1.0                   py37_0    anaconda
pyparsing                 2.4.6                      py_0    anaconda
pyrsistent                0.16.0           py37h7b6447c_0    anaconda
pysocks                   1.7.1                    py37_0    anaconda
python                    3.7.7           hcf32534_0_cpython    anaconda
python-dateutil           2.8.1                      py_0    anaconda
pytz                      2019.3                     py_0    anaconda
pyzmq                     18.1.1           py37he6710b0_0    anaconda
rasterio                  1.1.0            py37h41e4f33_0    anaconda
readline                  8.0                  h7b6447c_0    anaconda
requests                  2.23.0                   py37_0    anaconda
requests-oauthlib         1.3.0                      py_0    anaconda
rsa                       4.0                        py_0    anaconda
scipy                     1.4.1            py37h0b6359f_0    anaconda
send2trash                1.5.0                    py37_0    anaconda
setuptools                46.1.3                   py37_0    anaconda
six                       1.14.0                   py37_0    anaconda
snuggs                    1.4.7                      py_0    anaconda
sqlite                    3.31.1               h7b6447c_0    anaconda
tbb                       2018.0.5             h6bb024c_0    anaconda
tcl                       8.6.9                        24    intel
tensorboard               2.1.0                     py3_0    anaconda
tensorflow                2.1.0           gpu_py37h7a4bb67_0    anaconda
tensorflow-base           2.1.0           gpu_py37h6c5654b_0    anaconda
tensorflow-estimator      2.1.0              pyhd54b08b_0    anaconda
tensorflow-gpu            2.1.0                h0d30ee6_0    anaconda
termcolor                 1.1.0                    py37_1    anaconda
terminado                 0.8.3                    py37_0    anaconda
testpath                  0.4.4                      py_0    anaconda
tiledb                    1.7.0                hcde45ca_2    conda-forge
tk                        8.6.8                hbc83047_0    anaconda
tornado                   6.0.4            py37h7b6447c_1    anaconda
traitlets                 4.3.3                    py37_0    anaconda
urllib3                   1.25.8                   py37_0    anaconda
wcwidth                   0.1.9                      py_0    anaconda
webencodings              0.5.1                    py37_1    anaconda
werkzeug                  1.0.0                      py_0    anaconda
wheel                     0.34.2                   py37_0    anaconda
wrapt                     1.12.1           py37h7b6447c_1    anaconda
xerces-c                  3.2.2             h8412b87_1004    conda-forge
xorg-kbproto              1.0.7             h14c3975_1002    conda-forge
xorg-libice               1.0.10               h516909a_0    conda-forge
xorg-libsm                1.2.3             h84519dc_1000    conda-forge
xorg-libx11               1.6.9                h516909a_0    conda-forge
xorg-libxext              1.3.4                h516909a_0    conda-forge
xorg-libxrender           0.9.10            h516909a_1002    conda-forge
xorg-renderproto          0.11.1            h14c3975_1002    conda-forge
xorg-xextproto            7.3.0             h14c3975_1002    conda-forge
xorg-xproto               7.0.31            h14c3975_1007    conda-forge
xz                        5.2.4                h14c3975_4    anaconda
zeromq                    4.3.1                he6710b0_3    anaconda
zipp                      2.2.0                      py_0    anaconda
zlib                      1.2.11               h7b6447c_3    anaconda
zstd                      1.4.4                h3b9ef0a_2    conda-forge

```