diffusion-point-cloudのインストール

ubuntu 22.04で[diffusion-point-cloud](https://https://github.com/luost26/diffusion-point-cloud)を動かしたかった。
インストールにおいては、いくつかのパッケージを同時に使いたいしconda,dockerなどは避けたい。

---
環境:
Ryzen7950X　or 9950x,
GEFORCE3090　or 4090

ubuntu22.04.04 LTS
Python 3.10.12 (main, Mar 22 2024, 16:50:05)

1. nvidia-driver-535(たぶん555に自動的に変更されてる？)　
2. pytorch for cu118　
3. 以後、アプリのインストール


---

* インストール手順
１．　nvidia driver
２．　cuda
３．　pytorch
４．　diffusion-point-cloudやlietorchなどの使いたいパッケージ
の順でインストール。

* 最初に全部パージする. ubuntuのデフォルトインストールでは動かない。あてにならない。
(機械学習関係でapt installを使うのはあまり良くないようだ。pipでローカル(.local)にインストールするのを基本にするのが良い)
```
sudo apt -y update
sudo apt -y upgrade
sudo apt remove --purge -y nvidia-*
sudo apt remove --purge -y cuda-*
sudo apt autoremove -y
```

* まずnvidia リポジトリを加える。
```
sudo wget -O /etc/apt/preferences.d/cuda-repository-pin-600 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /"
```
* nvidia driverのインストール:  
(nvidia-driver-535をインストールすると自動で555になった?)
```
sudo apt install nvidia-driver-535
sudo update-initramfs
sudo /sbin/shutdown -r now
nvidia-smi でGPUがみえるかどうかチェック。リブートしたら見えた。
```
（このページを参照：https://note.com/teruaki_ishizaki/n/n3fa5589d0915）

* cudaのインストール:  cuda-11-8がうごいた。たとえば11-5だと、lietorchのコンパイルに失敗する。
```
sudo apt -y update
sudo apt -y install cuda-11-8
sudo update-initramfs
```

* bashrcにパスを書き加える。11−8用。
```
echo 'export CUDA_PATH=/usr/local/cuda-11.8' >> ${HOME}/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:${LD_LIBRARY_PATH}' >> ${HOME}/.bashrc
echo 'export PATH=/usr/local/cuda-11.8/bin:${PATH}' >> ${HOME}/.bashrc
```

リブートするか、以下のようにbashrcを読み込むかする
```
source .bashrc
```

* pytorch for cu118をインストールする。torchをcu118と整合性をとってインストールする必要がある。これ以下はsudoでなく、pipでのローカルインストールとする。思うに、nvidia-driverだけをsudoインストールするのでも良いのかもしれない.よくわからない.(かち合うと困るようなシステム系のソフト以外は個々人がローカルにインストールするので良いように思う）。

https://pytorch.org/
```
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
```

import torchでフェイルするときはcudaとpytorchの整合性がないというメッセージがでた。
> nvcc --version
 nvcc: NVIDIA (R) Cuda compiler driver
 Cuda compilation tools, release 11.8, V11.8.89
 Build cuda_11.8.r11.8/compiler.31833905_0

* エラーメッセージ、よくわからないときはbingかgithub copilot chatにぶち込んでください。

いろんなパッケージが不足するときがあるーそのときはメッセージを読んで、pipでインストールする(aptは良くない）。いまや個人環境重視のGPU時代なので、suに言うんじゃなくて.localで行くしかない。

*（いまは使ってないが）lietorchは
pip install git+https://github.com/princeton-vl/lietorch.git
でインストールできた。作り直すので時間かかる。lietorchはGPUでうごかないバグがある?
（マイナーバグはあったが回避できた：githubページはサポートする気はないようだ）。
結局の所、最低限の部分しか使えてない。自動微分はテストしただけ.



```
pip scikit-learn tqdm tensorboard 
```
* nvtopをインストールしてGPUの動きをモニタしてみること。pidも確認できるから、キルするときは、kill -9 pidで(pstree -p |grep ptでも親pidは取得できる）。

* python3はpythonとソフトリンクしておくのが便利かと思う.
```
sudo ln -s /usr/bin/python3.10 /usr/bin/python
```
* pip listで何がpipでインストールされているかを確認。
 

* diffusion-point-cloud
https://github.com/luost26/diffusion-point-cloud
も動きました。きちんと動くのは確認した（メトリックとかは飛ばしている）。
plotlyを用いてout.npyをプロットすればよい。こういうのはvscodeでcopilotと相談しながら書くと良い。
train_gen.py実行後(nohupで実行）、
test_gen.pyでpoint cloudを描画

```python
import numpy as np
#data = np.load('results/GEN_Ours_airplane_1716864944/out.npy') #GEN_Ours_airplane_1716881180
data = np.load('out.npy') 
# !ckpt_0.000000_100000.pt 3hour of trainig by gefeorce 3090
num,nsize,xdeg=data.shape
print(data.shape)

#import time
#import matplotlib.pyplot as plt
#from mpl_toolkits.mplot3d import proj3d

#for i in range(1):
#    x = data[i,:,0]
#    y = data[i,:,1]
#    z = data[i,:,2]
#    fig = plt.figure(figsize=(8, 8))
#    ax = fig.add_subplot(111, projection='3d', proj_type='ortho')
#    #Plot with very small marker
#    ax.scatter(x, y, z, s=0.5)
#    #plt.show()

#print(data.shape)
#print(datax.shape)
import plotly.express as px
import pandas as pd

for id in range(0,15):
    print('id=',id )
    datax=data[id,:,:]
    # データフレームのデータを描画する
    df  = pd.DataFrame(datax,columns=['xx','yy','zz'])
    fig = px.scatter_3d(df, x='xx', y='yy', z='zz')
    # Set aspect ratio to be equal
    fig.update_layout(
    scene=dict(
        xaxis=dict(range=[-1, 1]),
        yaxis=dict(range=[-1, 1]),
        zaxis=dict(range=[-1, 1]),
        aspectmode='cube')
    )
    fig.update_layout(scene_aspectmode='cube')
    fig.update_traces(marker=dict(size=.5))
    fig.show()# pointsのサイズを変更する
```

* 使い方
GPUはnvtopでモニタする。GPU温度を気にする。
job投入にはnohup コマンド、とする。
killするときはnvtop（もしくはpstree -p|grep pt)で親pidを得て、kill -9 親pid.
必要なパッケージはpip インストールする。
dockerやcondaは使わないに越したことはない（もし使ってしまうと環境が変わるのでいままでつかっていたものは使えなくなる可能性がある）。
コンソール、vscodeを併用するのが良い。jupyter noteブックでの描画をするにはvscodeが必須。
描画コードなどを書くにはcopilotを活用する。nvtopでメモリ利用率、GPU利用率を確認する。