Ubuntu 2204 Livebook with EXLA GPU環境セットアップ

# はじめに
本記事は [Qiita AdventCalendar2022 Elixir](https://qiita.com/advent-calendar/2022/elixir) vol2 16日目の記事です

EXLAをGPUモードで動かすためのセットアップに苦労したので手順をメモしておきます
Nvidiaのドライバインストールまではこれに沿っていきます

https://take6shin-tech-diary.com/ubuntu2204_ml/#toc5

# デフォルトドライバのdisable
ubuntuではGPUのドライバがデフォルトでnouveauというのが動いているので、無効化します
```
sudo vi /etc/modprobe.d/blacklist-nouveau.conf
```

以下の内容を書き込んで
```
blacklist nouveau
options nouveau modeset=0
```

以下のコマンドで反映させます

```
sudo update-initramfs -u
```

ドライバはapt installするとうまく動かなかったので本家からもらってきます
ここから該当するドライバをダウンロードして実行権限を付与して管理者権限で実行してください
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

```
chmod +x NVIDIA-Linux-x86_64-525.60.11.run
sudo ./NVIDIA-Linux-x86_64-525.60.11.run
```
終わったら再起動してください

# cudaのインストール
以下をポチポチするとコマンドが出てくるので随時実行していく

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local


```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.0.0/local_installers/cuda-repo-ubuntu2204-12-0-local_12.0.0-525.60.13-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2204-12-0-local_12.0.0-525.60.13-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2204-12-0-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
```

インストールが完了したらパスを通します

```
export PATH=/usr/local/cuda-12.0/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-12.0/lib64:${LD_LIBRARY_PATH}
```
通したら再ログインか再起動してください

# cudnn 
直リンク集があるのでwgetする
https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/
```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/libcudnn8-dev_8.7.0.84-1+cuda11.8_amd64.deb
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/libcudnn8_8.7.0.84-1+cuda11.8_amd64.deb
sudo dpkg -i libcudnn8_8.7.0.84-1+cuda11.8_amd64.deb 
sudo dpkg -i libcudnn8-dev_8.7.0.84-1+cuda11.8_amd64.deb 
```

# Elixirのインストール
こちらを参考にしてください

https://qiita.com/t-yamanashi/items/9cb46beed0506edf26c6#elixir%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

Elixirが最新版が必要なのでlatestを指定してください
```
asdf install elixir latest
asdf global elixir latest
```

# Livebookの準備

```
git clone https://github.com/livebook-dev/livebook.git
cd livebook
mix deps.get
mix local.hex
mix local.rebar
MIX_ENV=prod mix phx.server
```

# Livebookで動作確認
何度か再起動したりするので新しいノートブックを作成し保存してください
setupに以下を追加します

```elixir
Mix.install(
  [
    {:kino_bumblebee, "~> 0.1.0"},
    {:exla, "~> 0.4.1"}
  ],
  config: [nx: [default_backend: EXLA.Backend]],
  system_env: [
    XLA_TARGET: "cuda111"
  ]
)
```

smart cellで Neural Network taskを追加します
![スクリーンショット 2022-12-17 23.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/5da54119-a7be-6f5f-b358-99d143b6c7b3.png)
top-k に適当に５を入力してなんか画像を入れてrunしてください

![スクリーンショット 2022-12-17 23.48.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/2c342749-8fff-ba75-9ff2-b0d73290375e.png)

そのあとエラーでこれが足りない、あれが足りないといってくるのでそのファイルを

`sudo find / -name xx` で検索して
`sudo cp xx /usr/local/cuda-12.0/lib64/` にコピーしてください

これをエラーが出なくなるまで続けます

![スクリーンショット 2022-12-17 23.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/f8ba8185-4646-cff0-f944-daed0abecd62.png)

無事動くようになったらこんな感じで動きます

# 最後に
anacondaとか入れて色々やってみましたが、
ドライバはインストーラー
cudaは本家
cudnnはリンク集から取ってきて展開
あとは実行しながら足りないファイルをひたすら`cuda-12.0/lib64/`にコピー
が楽そうな気がしました

本記事は以上になりますありがとうございました

# おまけ
ubuntuのサーバーでlivebookを動かしながら別PCのブラウザで見たい時は以下の ipを 0.0.0.0 にすれば同一ネットワーク内では見れるようになります

```diff_elixir:config/prod.exs
import Config

# Default bind and port for production
config :livebook, LivebookWeb.Endpoint,
+  http: [ip: {0, 0, 0, 0}, port: 8080],
-  http: [ip: {127, 0, 0, 1}, port: 8080],
  server: true

```

https://qiita.com/1ain2/items/194a9372798eaef6c5ab

# 参考サイト
https://qiita.com/cinchan/items/9718e1f26146dc5e3eaa
https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/
https://atsuyakoike.hatenablog.com/entry/2019/08/08/214530
https://take6shin-tech-diary.com/ubuntu2204_ml/#toc5
https://qiita.com/ktokey/items/7ee9c112198a6b0b5709
https://qiita.com/1ain2/items/194a9372798eaef6c5ab
https://touch-sp.hatenablog.com/entry/2022/05/05/114358