# Environment setting
## 1. Install Docker (Windows): https://docs.docker.com/desktop/

## 2. Install WSL2
* open cmd : `wsl --install`
* check version : `wsl --list --verbose`
> 這是對的 :+1:

> 這是錯的 :-1:

如果做錯可以用`wsl --set-version Ubuntu 2`轉換版本, 再檢查 version
* setting docker

* cmd : `wsl` 創建帳號
:::info
## Install Docker (Ubuntu): https://docs.docker.com/engine/install/ubuntu/
* Install WSL2, and then enter WSL
* Add Docker's official GPG key:
```
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
```
* Add the repository to Apt sources
```
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```
To install the latest version, run
```
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
:::
## 3. Install Container toolkit : https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
* Configure the production repository :
```
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
```
* Update the packages list from the repository :
```
sudo apt-get update
```
* Install the NVIDIA Container Toolkit packages :
```
sudo apt-get install -y nvidia-container-toolkit7
```
* Docker restart
```
sudo nvidia-ctk runtime configure --runtime=docker
sudo service restart docker
```
## 4. Install Modulus
* Install NVIDIA Container : https://catalog.ngc.nvidia.com/orgs/nvidia/teams/physicsnemo/containers/physicsnemo
* check available container version: https://catalog.ngc.nvidia.com/orgs/nvidia/teams/physicsnemo/containers/physicsnemo/tags
* Download physicsnemo docker image
```
docker pull nvcr.io/nvidia/physicsnemo/physicsnemo:xx.xx
```
> 第一次會下載很多東西(50GB), 會放入 docker image, 以後在 wsl 使用相同指令就能創建 container
* Launch physicsnemo container
```
docker run --gpus all --shm-size=8g --ulimit memlock=-1 --ulimit stack=67108864 --runtime nvidia --rm -it nvcr.io/nvidia/physicsnemo/physicsnemo:xx.xx bash
```
> Where xx.xx is the container version. For example, 25.03.
Command 中含有 `--rm`, container 只要關閉就會消失
* 可以幫 conainer 命名, 增加共享記憶體至4G, 並且關閉後 container 能夠儲存
```
docker run --gpus all --shm-size=8g --ulimit memlock=-1 --ulimit stack=67108864 --runtime nvidia -it --name my_nemo_container nvcr.io/nvidia/physicsnemo/physicsnemo:xx.xx bash
```
* 以後可以使用下面這個指令開啟
```
docker start my_nemo_container
docker exec -it my_nemo_container bash
```
> container 對應的 docker image 不能刪除, 執行 docker start 會參考原始 image 的內容
* 一些有用的 docker 指令, 要在 wsl 內使用
| Command | function |
| ------------ | ---------------------- |
| docker ps | 查看 Running container |
| docker ps -a | 查看 All container |
| docker image ls | 查看 docker image file |
## 6. Check CUDA version and Modulus needed : https://catalog.ngc.nvidia.com/orgs/nvidia/teams/physicsnemo/containers/physicsnemo/layers
* 在 wsl 輸入 `nvidia-smi`, 確認 CUDA version

* 進到官網 Ctrl + F 搜尋 "CUDA_VERSION" (可能需要一頁一頁找)

* 只要確認 CUDA version > Modulus needed 就行了
> 像我目前的 cuda 是 12.9, Modulus 需要的版本是 12.8
## 7. Container command
* 查看當前 folder 下的子項目
```
ls -l
```
* 查看 file 樹狀結構
> 先用 `apt install tree` 安裝套件
```
tree -L 2
```
* Edit file
```
nano [file name]
```
## 8. 學姐推薦的作法
* 把 github 資料夾下載到 wsl
```
git clone https://github.com/NVIDIA/physicsnemo-sym.git
```
* cd 到想要的目錄, 例如 :
```
cd physicsnemo-sym/examples/darcy/
```
* 在 wsl 打開 vscode, 方便更改 code
```
code .
```
* 創建 container, 並且將資料夾 mount 到 workspace/
```
docker run -p 7007:7007 -d --gpus all --shm-size=8g --ulimit memlock=-1 --ulimit stack=67108864 -v ${PWD}:/workspace -it nvcr.io/nvidia/physicsnemo/physicsnemo:25.03 bash
```
> 要注意 port 有沒有被其他程式占用
> 
>可以用 `docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" | grep 7007` 看是誰在搞鬼
* 進到 container
```
docker exec -it [container_name] bash
```
# Darcy Flow with Adaptive Fourier Neural Operator
## 1. example : train_fno_darcy.py
* Download physicsnemo package
```
git clone https://github.com/NVIDIA/physicsnemo-sym.git
```
* cd to ./modulus/examples/cfd/darcy_fno/
```
cd physicsnemo/examples/cfd/darcy_fno/
```
* Download required package
```
pip install warp-lang
pip install mlflow
```
* Running
```
python train_fno_darcy.py
```
> Max_step : 256 epochs
> Use 5070 Ti waste 7 hr 20 min
> shm-size = 1g
## 2. example : darcy_AFNO.py
* Download physicsnemo-sym package
```
https://github.com/NVIDIA/physicsnemo-sym.git
```
* cd to physicsnemo-sym/examples/darcy/
```
cd physicsnemo-sym/examples/darcy/
```
* Download required package
```
pip install gdown
```
* Running
```
python darcy_AFNO.py
```
* open tensorboard
```
tensorboard --logdir=./ --port=7007
```
> Max_step : 10000 steps
> Use 5070 Ti waste 7 min
> shm-size = 8g