８年前のオンボログラボでTensorflowとPytorchを走らせようとした話

# はじめに
データサイエンティストの皆さん、ディープラーニングしてますか？
ディープラーニングと言えばGPUでガリガリ高速計算ですが、今回はCUDAとcuDNNをインストールして、
tensorflowとpytorchで動かそうという趣旨の記事です。
それも８年前の骨董品級のオンボログラボで。

~~結論から言うと**失敗しました**。~~
いえ、**とうとう成功しました**。詳細は最後のセクションにて。

動機としては、ローカルでゴリゴリ高速に処理を動かしたかったからです。
最新のCUDAに対応しているグラボは高いですし（３万円～）、
クラウドもGoogle Colaboratoryは時間が経つといちいち接続が切れますし、
Google Driveとの連携も認証し直さなければならないので手間がかかります。
ブラウザのタブとして開いておいて、好きなときにコーディングを始めるという
スタイルでやりたかったのです。

# グラボのスペック
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89145/ea112c4b-9f4a-e7d4-d957-84a5a00a0dac.jpeg)

| 項目名 | 値 |
|:-:|:-:|
| 型番  | ‎GF-GT730-LE1GHD/D5  |
|  搭載チップ | NVIDIA GeForce GT 730 (64-bit GDDR5)  |
|VRAM容量|‎1 GB|
|発売日 | 2014年 6月19日|

現在においては見る影もないスペックですが・・・

# そもそもこのグラボCUDAが使えるのか？
これについては比較的簡単に調べられるそうです。

> デスクトップで右クリックしたとき、「NVIDIA コントロール パネル」があれば、それをクリックして実行。 その後、上のメニューの「ヘルプ」の「システム情報」をクリック。「ディスプレイ」タブの、「グラフィックス カード情報」の 「詳細」のところに「CUDA コア」という項目があり、それがゼロでない場合は、そのグラフィックスカードはCUDAが使用可能です。

http://www.gfd-dennou.org/member/murashin/memo/cuda-programming.html

私のグラボでは、きちんとゼロ以上の値が出ました。なのでCUDAは使用可能と言えそうです。

![cuda version.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89145/8d1595e8-9f50-8057-9b69-a75bab8ab403.jpeg)



# CUDAのインストール
まずどのバージョンのCUDAを入れるかなのですが、全く同じグラボを使っていてCUDAをインストールしようとしている方のページを見つけました。

http://www.mwsoft.jp/programming/tensor/gpu_install.html

> cudaのバージョンが変わった場合などは、release.mdのところに書かれるはず。リンク先でpipでページ検索すると、下記のような記述が見られる。
> 
> GPU Pip wheels are built with cuda 7.5 and cudnn-v4, making them required for the binary releases. Lower versions of cuda/cudnn can be supported by installing from sources and setting the options during ./configure
> 上記に従い、Cuda Toolkit7.5とcudnn-v4をインストールする。

ちょっと腹落ちしないところがありますが、取り敢えずCUDA 7.5, cuDNN v4で進めてみます。

CUDA toolkit 7.5は以下からダウンロードできますので、ここから取ってインストールしました。
https://developer.nvidia.com/cuda-75-downloads-archive

インストール中に、Visual Studioがインストールされていることを求められる場面がありますので、
ちゃんと入れておきましょう（後述）。

また、ちょっと脇道に逸れますが、グラボにはcompute capabilityというものがあり、これにより使えるCUDAのバージョンやcuDNNの使用可否が変わります。GF-GT730-LE1GHD/D5の場合は以下のようでした。

| compute capability | CUDA | cuDNN |
|:-:|:-:|:-:|
| 2.1  |  8 or prior | no cuDNN |
| 3.5  |  8, 9, 9.1 | cuDNN |

https://forums.developer.nvidia.com/t/install-cuda-nvidia-driver-and-cudnn-for-geforce-gt-730/59770

また、compute capability=2.1, 3.5とどちらにGF-GT730-LE1GHD/D5は相当するのか？結論から言うと3.5でした。

https://developer.nvidia.com/cuda-gpus

DDR3, 128bitが2.1とありますが、該当グラボはメモリGDDR5、バス幅64bitなので違います。

https://kakaku.com/item/K0000668745/spec/#tab

なので、該当のグラボはcompute capability 3.5できちんとCUDAもcuDNNも使えそうです。

# Visual Studioのインストール
ここでも、あるブログで貴重な情報があり、VS 2013 Communityをインストールすればいいことが分かりました。

https://hirotaka-hachiya.hatenablog.com/entry/2016/06/18/121143

> 調べてみたところ、CUDA7.5は、VS2010、2012、2013および2013 communityに対応しているようだ。つまり、express版と2015には対応していないとのこと。

該当バージョンのVisual Studioについては、https://my.visualstudio.com/Downloads から"Visual Studio Community 2013 with Update 5"を検索して落としてください。マイクロソフトのアカウントが必要です。

# cuDNNのインストール
インストール用ファイルを手に入れる前に手順があるのですが、まず、https://developer.nvidia.com/ に登録して下さい。この登録がかなり長ったらしく途中で嫌になります。ちなみに私はテキトーに入力してやり過ごしました。真似しないでね。

登録が終わったら、https://developer.nvidia.com/rdp/cudnn-archive から、[cuDNN v4 Library for Windows (updated October 18th,2016)](https://developer.nvidia.com/rdp/assets/cudnn-70-win-x64-v40)をダウンロードして下さい。

そして、中身をCUDAのフォルダにコピー＆ペーストします。

> そしてタスクバーのWindowsマークの隣にある検索ボックスに
> 『C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vXX.X』と打ち込み、コピーしたデータをそのフォルダ内に貼り付けます。

https://okkamotto.blog.jp/archives/21386908.html

この場合CUDA7.5なので、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5 ですね

これでcuDNNのインストールは完了です。

# tensorflowのインストール
ここがかなり難関でした。CUDAのバージョンが古すぎるので、tensorflowのサイトで対応バージョンを探したのですが、CUDA 7.5が載っていない・・・

https://www.tensorflow.org/install/source_windows


ですが、このページの記述でtensorflow 0.8.0をダウンロードすればいいのではないかということが分かりました。

> これで準備は整ったので、TensorFlowのGPU版をインストールする。
> $ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0-cp34-cp34m-linux_x86_64.whl

http://www.mwsoft.jp/programming/tensor/gpu_install.html

ただ、上のwhlファイルはlinux用なのでインストールできません(platformが違うとエラーが出る)。では、version 0.8.0のダウンロードですが、ぐぐっても0.8.0が見つかりませんでした。では、https://storage.googleapis.com/tensorflow/ で該当バージョンのwhlファイルのURLを調べようとして"0.8.0 site:https://storage.googleapis.com/tensorflow/ "をChromeで検索したのですが、何も出てきませんでした。今度は当て推量でURLを定めてやってみましたが、不成功でした。

```
pip3 install --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow-0.8.0-cp36-cp36m-win_amd64.whl

  ERROR: HTTP error 404 while getting https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow-0.8.0-cp36-cp36m-win_amd64.whl
ERROR: Could not install requirement tensorflow==0.8.0 from https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow-0.8.0-cp36-cp36m-win_amd64.whl because of HTTP error 404 Client Error: Not Found for url: https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow-0.8.0-cp36-cp36m-win_amd64.whl for URL https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow-0.8.0-cp36-cp36m-win_amd64.whl
```

whlファイルのURLを直接ブラウザに打ち込んでみましたが、NoSuchKeyと表示されるのでおそらくファイル自体が存在しません。whlファイルを使わずレポジトリからパッケージを取得する方法も功を奏しませんでした。

```
pip install tensorflow-gpu==0.8.0
ERROR: Could not find a version that satisfies the requirement tensorflow-gpu==0.8.0 (from versions: 1.2.0, 1.2.1, 1.3.0, 1.4.0, 1.5.0, 1.5.1, 1.6.0, 1.7.0, 1.7.1, 1.8.0, 1.9.0, 1.10.0, 1.11.0, 1.12.0, 1.12.2, 1.12.3, 1.13.1, 1.13.2, 1.14.0, 1.15.0, 1.15.2, 1.15.3, 1.15.4, 1.15.5, 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.1.0, 2.1.1, 2.1.2, 2.1.3, 2.1.4, 2.2.0, 2.2.1, 2.2.2, 2.2.3, 2.3.0, 2.3.1, 2.3.2, 2.3.3, 2.3.4, 2.4.0, 2.4.1, 2.4.2, 2.4.3, 2.4.4, 2.5.0, 2.5.1, 2.5.2, 2.6.0, 2.6.1, 2.6.2)
ERROR: No matching distribution found for tensorflow-gpu==0.8.0
```

```
pip install tensorflow==0.8.0

ERROR: Could not find a version that satisfies the requirement tensorflow==0.8.0 (from versions: 1.2.0, 1.2.1, 1.3.0, 1.4.0, 1.5.0, 1.5.1, 1.6.0, 1.7.0, 1.7.1, 1.8.0, 1.9.0, 1.10.0, 1.11.0, 1.12.0, 1.12.2, 1.12.3, 1.13.1, 1.13.2, 1.14.0, 1.15.0, 1.15.2, 1.15.3, 1.15.4, 1.15.5, 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.1.0, 2.1.1, 2.1.2, 2.1.3, 2.1.4, 2.2.0rc0, 2.2.0rc1, 2.2.0rc2, 2.2.0rc3, 2.2.0rc4, 2.2.0, 2.2.1, 2.2.2, 2.2.3, 2.3.0rc0, 2.3.0rc1, 2.3.0rc2, 2.3.0, 2.3.1, 2.3.2, 2.3.3, 2.3.4, 2.4.0rc0, 2.4.0rc1, 2.4.0rc2, 2.4.0rc3, 2.4.0rc4, 2.4.0, 2.4.1, 2.4.2, 2.4.3, 2.4.4, 2.5.0rc0, 2.5.0rc1, 2.5.0rc2, 2.5.0rc3, 2.5.0, 2.5.1, 2.5.2, 2.6.0rc0, 2.6.0rc1, 2.6.0rc2, 2.6.0, 2.6.1, 2.6.2)
ERROR: No matching distribution found for tensorflow==0.8.
```

仕方ないので取り敢えず最も若いバージョンをインストールしてやってみました。

```
pip install tensorflow-gpu==1.2.0
```

次に、以下のコードを走らせて反応を見ようとしてましたが、

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

ImportErrorが出て失敗してしまいました。やはり別バージョンだとダメみたいですね。

```python
>>> from tensorflow.python.client import device_lib
Traceback (most recent call last):
  File "E:\usr\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 18, in swig_import_helper
    return importlib.import_module(mname)
  File "E:\usr\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 658, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 571, in module_from_spec
  File "<frozen importlib._bootstrap_external>", line 922, in create_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

ということでtensorflowのインストールは万策尽きて終了です。

# Pytorchのインストール
以下に詳しいやり方が書いてあります。
https://chowdera.com/2022/01/202201080436140979.html#5_Pytorch_041_26

```powershell
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ 
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
```

をやった後にcondaとpip両方の手法を試しましたが、両方ダメでした。

```powershell
> conda install pytorch==0.4.1 torchvision==0.2.1 cuda75
Collecting package metadata (repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.

PackagesNotFoundError: The following packages are not available from current channels:

  - cuda75
```

```powershell
> pip install https://download.pytorch.org/whl/cu75/torch-0.4.1-cp36-cp36m-win_amd64.whl torchvision==0.2.1
Collecting torch==0.4.1
  ERROR: HTTP error 403 while getting https://download.pytorch.org/whl/cu75/torch-0.4.1-cp36-cp36m-win_amd64.whl
ERROR: Could not install requirement torch==0.4.1 from https://download.pytorch.org/whl/cu75/torch-0.4.1-cp36-cp36m-win_amd64.whl because of HTTP error 403 Client Error: Forbidden for url: https://download.pytorch.org/whl/cu75/torch-0.4.1-cp36-cp36m-win_amd64.whl for URL https://download.pytorch.org/whl/cu75/torch-0.4.1-cp36-cp36m-win_amd64.whl
```

```powershell
pip install https://download.pytorch.org/whl/cu75/torch-0.4.1-cp36-cp36m-win_amd64.whl torchvision==0.2.1 
```
というのも試しましたが、403エラーが返ってきてダメでした。外部からのアクセスを遮断しているみたいです。

# 最後に
古いグラボ挿している人は、素直にクラウド使うか、最新のCUDA対応のグラボを買った方がいいと思います。一連の試行錯誤で１．５日潰れました！

# 追記：やっと成功したぞ！
成功の条件が分かりました。

| 項目名 | 値 |
|:-:|:-:|
|　CUDA | 9.1  |
|  cuDNN | 7.1 |
|  Visual Studio | Visual Studio Community 2015 with Update 3 |
|  tensorflow | tensorflow-gpu==1.12.0 |
|  pytorch | torch==1.1.0 torchvision==0.3.0 |

若干の補足をします。

- この条件だと、VS2017ではビルドできないらしいです (https://taktak.jp/2018/05/13/3028/)
- VSは右からダウンロード https://my.visualstudio.com/Downloads?q=visual%20studio%202017
- cuDNNは中身をC:\ProgramData\NVIDIA GPU Computing Toolkit\CUDA\v9.1に貼り付けるだけですが、CUDA\v9.1が何故か無いので手動で作って私は入れました
- tensorflowはconda install tensorflow-gpu==1.12.0で行けました。pipでも行けるかも？
- pytorchはpip install torch==1.1.0 torchvision==0.3.0 -f https://download.pytorch.org/whl/cu90/torch_stable.html で成功しました。"You can also install PyTorch 1.0.1, 1.0.0, 0.4.1, 0.4.0., 0.3.1, 0.3.0, but not 1.2.0, 1.3.0, 1.3.1, 1.4.0, 1.5.0, 1.5.1, 1.6.0 for CUDA 9.1."とあったので、他のバージョンのpytorchもできるかも？
- import torch; torch.cuda.is_available()はTrueを返しました。pytorchではGPUが使えそうです。
- from tensorflow.python.client import device_lib;device_lib.list_local_devices()は以下のようなアウトプットを返しました。

```
2022-02-14 20:24:03.938527: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
2022-02-14 20:24:04.129005: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 0 with properties:
name: GeForce GT 730 major: 3 minor: 5 memoryClockRate(GHz): 0.954
pciBusID: 0000:01:00.0
totalMemory: 1.00GiB freeMemory: 833.46MiB
2022-02-14 20:24:04.129241: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0
2022-02-14 20:24:04.561058: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2022-02-14 20:24:04.561220: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988]      0
2022-02-14 20:24:04.561670: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0:   N
2022-02-14 20:24:04.563117: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/device:GPU:0 with 561 MB memory) -> physical GPU (device: 0, name: GeForce GT 730, pci bus id: 0000:01:00.0, compute capability: 3.5)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 7942324163660345203
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 588732827
locality {
  bus_id: 1
  links {
  }
}
incarnation: 1622033143383668544
physical_device_desc: "device: 0, name: GeForce GT 730, pci bus id: 0000:01:00.0, compute capability: 3.5"
]
```

"GPU"の文言が現れているので、tensorflowでGPUが使えそうですね。
しかし、メモリが561MBしか使えないのは痛い・・・バッチの区切り方を工夫しないと苦戦しそうです。
なにはともあれ、骨董品のグラボでtensorflowとpytorchが動いたというお話でした！