Gentoo LinuxでTensorFlowを使いたい


一般論ですが、ローカルにTensorFlowをinstallするのはオススメできません。poetryでもanacondaでもいいので、仮想環境にinstallするようにしてください。

#  必要なもの

もし、ただnvidia driverを入れただけの環境(`nvidia-smi`だけは使える)だと、TFでGPUを使うことができません。

GPUが使えるかは、以下のコードを実行し、GPUのデバイス情報が出てくるかで確認することができます。

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

ピチピチの環境だと、cudnnだったり、xxxdatrだったり諸々がないと言われてしまいます。

- nvidia driver
- CUDA toolkit(いわゆるCUDA)
- cuDNN

TFを使うにはこちらの3点セットが必要となります！

## nvidia driversを入れる

この`x11-drivers/nvidia-drivers`というパッケージをinstallすることで、`nvidia-smi`が使えるようになります。

https://packages.gentoo.org/packages/x11-drivers/nvidia-drivers

gentooのパッケージはArch系統と比べると慎重なので、stableが470.94になっています（2022/01/21時点）。自分は気分的に495を入れたかったので、`emerge -a =nvidia-drivers-491.44-r2`と打って、推奨はされていない新しいversionを入れました。
使えるバージョンは先程のリンクから確認できるので、使えるバージョンを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269030/9dedb644-363b-313e-9ebe-3db7cd38bba7.png)


自分がUbuntu使ってた頃は、driverをHPから落としてローカルで実行してinstallしていました。ただ、こうしてしまうとversionのup / downgradeが難しくなってしまうという問題があります。Gentooに限らないとは思いますが、package managerで管理することは将来の自分のためにもなります。

ちなみに、自分は最初stable(470.94)を入れて後から495.44-r2を入れました。問題ないです。

### やること

`emerge -a x11-drivers/nvidia-drivers`
必要に応じてversionを指定。
`emerge -a =x11-drivers/nvidia-drivers-495.x.x`

## CUDAを入れる
driverを入れた時点で、`nvidia-smi`をし、CUDAのversionが出て安堵していたら大目玉を食らいます。自分は11.4と出ていました。nvidia-driverを入れた時点でCUDA 11.4も依存関係に入ってくるかはわからないのですが、後にinstallする`cuDNN`というpackageは**CUDA 11.5**しか対応していないので、おとなしく**CUDA11.5**をinstallしましょう。

じゃあ、またversionを確認しましょう。

https://packages.gentoo.org/packages/dev-util/nvidia-cuda-toolkit

10.2, 11.5, 11.6しか使えないようですね。今回は11.5以外は入れます。（それ以外はだめ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269030/34998fcf-db6e-a385-ecd9-b7310f5a3e65.png)

### やること

`emerge -a =nvidia-cuda-toolkit-11.5.1-r1`

versionはその時その時で変わっていくので、Gentoo Packageのwebサイトからversionを確認してから入れましょう。


## cuDNNを入れる

**一番の鬼門**です。正攻法で戦ってもinstallできません。

https://packages.gentoo.org/packages/dev-libs/cudnn

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269030/bdd3f8d1-1614-9095-7b2c-d27b240c10a6.png)

なんかFとかついていますよね。

https://dev.gentoo.org/~zmedico/portage/doc/man/emerge.1.html

emergeのdocsから``--pretend``の部分を一部抜粋してきました。

>
F	fetch restricted (must be manually downloaded)
B	blocked by another package (unresolved conflict)

手動でdownloadしなきゃいけないらしいですね。
これを知らずに普通にemergeしようとすると、``cannot be fetched for cudnn``みたいなエラーが出て終わってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269030/5aeb0e66-16b8-703e-b9ce-82469298370c.png)



https://forums.gentoo.org/viewtopic-p-8295822.html

`cuDNN`はnvidiaのdeveloperなんちゃらにloginしないとdownloadできないパッケージなので、emergeコマンドで全部やってもらうのは無理なようです。

この公式forumの質問が無かったら死んでいました。fetch(downloadしてくること)されたfile群は`/usr/portage/distfiles/`下に保管されているので、手動でここに`cuDNN`のfileを置きなさいとのこと。


### やること

1. https://developer.nvidia.com/cuDNN のダウンロードページに飛ぶ
2. `Download cuDNN v8.3.1 (November 22nd, 2021), for CUDA 11.5`からfileをdownload
3. downloadしたfileを/usr/portage/distfilesにmv
4. `emerge -a cudnn`を実行

HPに飛ぶと8.3.2もあったのですが、Gentooのほうだと8.3.1までしか無かったので一応8.3.1にしておきました。

## ここまでやれば

おそらくTensorFlowが入ってる環境で以下のコードを実行すればエラーなしでGPU情報が得られるのではないでしょうか。もしエラーになったら、コメント等で教えてください。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269030/3f20b263-3cd3-f64b-5c6d-49825d2a65b8.png)

MNISTも動きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269030/313cfc0e-bbf3-195e-a1ac-f3fd6cb12b0b.png)


長々となってしまいましたが、これはGentooの仕様をよくわかっていなかったことに起因するものなので、慣れたら手間取らずにかんたんにできると思います。

## 躓いたとき用のメモ

公式wikiが便利です。全部日本語です。

https://wiki.gentoo.org/wiki/Handbook:AMD64/Full/Portage/ja

### あんまエラー出てないけど`emerge`してもinstallできなかった

`dispatch-conf` commandを実行し、`u`を入力して再度`emerge`を実行しましょう。

### maskがどうたらこうたら

危険性があるpackageに対する警告なのですが、今回は変なことはしないので`unmask`しちゃいましょう。

`emerge -a --autounmask=y --autounmask-write ***packagename***`　でmaskを解除できます。


# 参考文献

https://sciencompass.com/machine-learning/tensorflow-gpu-check

https://qiita.com/ringo-apo/items/138fbc2fa4d101e407b2

https://wiki.gentoo.org/wiki/Handbook:AMD64/Full/Portage/ja

https://ozy.be/wp/linux20191103/