富岳上にTensorFlow2.2.0/PyTorch1.7.0共存環境を構築する

富岳運営側では、本記事執筆段階(2022/3/15)において、計算ノード上で TensorFlow2.2.0が使用可能なPython3.8環境、PyTorch1.7.0が使用可能なPython3.8環境を個別に提供している。
提供方法としてはそれぞれのバイナリが配置されている共有参照可能なパスをPATH/LD_LIBRARY_PATHに通すことで使用可能となる。
また、運営提供の「富岳AIフレームワーク利用ガイド」(ガイド自体は富岳ポータル内のみで一般非公開)に、これらの環境を各自で構築できるようにソースコードから構築する手順を公開している。

- [GitHub wiki fujitsu/tensorflow](https://github.com/fujitsu/tensorflow/wiki/)
- [GitHub wiki fujitsu/pytorch](https://github.com/fujitsu/pytorch/wiki/)

しかし、Tensorflow2.2.0とPyTorch1.7.0 の両方の環境が共存するPython3.8環境は提供されていない。

このため、両方のモジュールを同時に使用するプログラムはすぐに実行することができない。

一般的な富岳利用者は、利用期間が半年や１年という制限のもと、その大半を実装とデバッグに時間を費やすことになる。このため、実装以前の実行環境整備に時間を取られるのはできるだけ避けたい。研究者の方々はTensorFlow/PyTorchを使わずOpenMP/MPIを使ったC/C++/Fortranプログラムで記述するのかもしれないが、既存研究をベースラインとして使用する場合の確認実行などでは、PyTorchやTensorFlowベースのものが少なくないはずである。

そのような富岳利用者のために、本記事では 上記のGitHub wiki の情報をもとに両方のモジュールを同時に使用するPython3.8 venv環境構築手順を紹介する。

なお、記述者の富岳へアクセスする権限が2022年3月末までのため、本手順はそのままでは使用できない可能性があるのだけど、情報を更新することができません。ご了承ください。

> ちなみに、2022年4月の保守で計算ノードのOSのマイナーバージョンアップが予定されている。


## 構築後の環境について

以下の場所へインストールする。

- `${HOME}/.local` へ計算ノード用バイナリをインストールする想定
  - `${HOME}/.local/bin` に Python3.8計算ノード用バイナリなど
  - `${HOME}/.local/lib` に計算ノード用ライブラリなど
  - `${HOME}/.local/venv/tf220pt170` にPython3.8 venv環境パス

このため使用するには、計算ノードへ会話ジョブでログイン or バッチジョブにて、以下のコマンドを実行する。

```bash
export PATH=${HOME}/.local/bin:.:${PATH}
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
source ${HOME}/.local/venv/tf220pt170/bin/activate
```

なおソースコードは `${HOME}/projects` 以下に展開するもととする。

## 準備

- `mkdir -p ${HOME}/.tmp`
- `.bashrc`最後に`export TMPDIR=${HOME}/.tmp`追加
- `mkdir -p ${HOME}/.local && mkdir -p ${HOME}/.local/bin && mkdir -p ${HOME}/.local/lib && mkdir -p ${HOME}/.local/venv`
- `mkdir -p ${HOME}/projects`

## Tcl/Tkのインストール

- ログインノードへログインし、`cd ~/projects`
- `vi tcltk.sh` を実行し、編集（`rscunit`と`--mail-list`は各自環境に合わせること、以降略）。

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S

cd ${HOME}/projects
wget https://prdownloads.sourceforge.net/tcl/tcl8.6.12-src.tar.gz
tar xvfz tcl8.6.12-src.tar.gz
mkdir -p tcl8.6.12/unix/aarch64
cd tcl8.6.12/unix/aarch64
${HOME}/projects/tcl8.6.12/unix/configure --prefix=${HOME}/.local
make
make install
cd ${HOME}/projects
wget https://prdownloads.sourceforge.net/tcl/tk8.6.12-src.tar.gz
mkdir -p tk8.6.12/unix/aarch64
cd tk8.6.12/unix/aarch64
${HOME}/projects/tk8.6.12/unix/configure --prefix=${HOME}/.local --with-tcl=/home/user/src/tcl8.6.12/unix/aarch64
make
make install
cd ${HOME}/.local/lib
ls -la
```

> elapse timeは、2022/3/29よりチェックが厳しくなった

- `chmod +x tcltk.sh`
- `pjsub tcltk.sh`
- 完了メールが到着したら `${HOME}/projects/tcltk.sh.9999999999.out`を参照して正常にインストールされていることを確認

## TensorFlow 2.2.0 のインストール

- ログインノードへログインし、`cd ~/projects`

```bash
cd ${HOME}/projects
git clone https://github.com/fujitsu/tensorflow.git
cd tensorflow
git checkout -b fujitsu_v2.2.0_for_a64fx origin/fujitsu_v2.2.0_for_a64fx
cd fcc_build_script
```

- `vi env.src` を実行し、以下の行を編集

```bash
TCSDS_PATH=/opt/FJSVxtclanga/tcsds-1.2.34 # Mandatory when use_fcc is true
VENV_PATH=${HOME}/.local/venv/tf220pt170 # Mandatory when use_venv is true
PREFIX=${HOME}/.local # Mandatory
```

- 以下のコマンドを実行して TensorFlowソースコードなどをダウンロード

```
cd ${HOME}/projects/tensorflow/fcc_build_script
bash 01_python_build.sh download
bash 02_bazel_build.sh download
bash 03_oneDNN_build.sh download
bash 04_make_venv.sh download
bash 05-0_set_tf_src.sh download
bash 05-1_build_batchedblas.sh download
bash 05_tf_build.sh download
bash 06_tf_install.sh download
bash 07_horovod_install.sh download
```

- `vi 01_python_build.sh` を実行し、以下のように変更
  - 先頭に挿入

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}
```

  - `configure_args` を編集

```bash
:
if [ ! -f Makefile -o "${fjenv_rebuild-}" ]; then
    configure_args="--enable-shared --disable-ipv6 --target=aarch64 --build=aarch64 --with-tcltk-includes=-I${HOME}/.local/include --with-tcltk-libs=-L${HOME}/.local/lib"
    if [ ! -z "${PREFIX}" ]; then
        configure_args="$configure_args --prefix=${PREFIX}"
    fi
    ./configure $configure_args
    make clean
fi
:
```

- `02_bazel_build.sh download` 、`03_oneDNN_build.sh` 、 `04_make_venv.sh` 、 `05-0_set_tf_src.sh` 、 `05-1_build_batchedblas.sh` 、 `05_tf_build.sh` 、 `06_tf_install.sh` の先頭行に以下のコードを挿入

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}
```

> `07_horovod_install.sh` は、ここでは実行しません。

- 以下のコマンドを連続実行し、ステップジョブを実行（XXXXX部分は最初にpjsubしたときに表示されるジョブID）。

```bash
pjsub --step 01_python_build.sh
pjsub --step --sparam "jid=XXXXX" 02_bazel_build.sh
pjsub --step --sparam "jid=XXXXX" 03_oneDNN_build.sh
pjsub --step --sparam "jid=XXXXX" 04_make_venv.sh
pjsub --step --sparam "jid=XXXXX" 05-0_set_tf_src.sh
pjsub --step --sparam "jid=XXXXX" 05-1_build_batchedblas.sh
pjsub --step --sparam "jid=XXXXX" 05_tf_build.sh
pjsub --step --sparam "jid=XXXXX" 06_tf_install.sh
```

- 完了メールを受領したら、Jから始まる拡張子`out`のファイルを確認してエラーがないことを確認
- TensorFlowの正常動作確認は、ログインノードから以下の方法でも確認可能

```bash
pjsub --interact -L "node=1" -L "rscgrp=int" -L "elapse=6:00:00" --sparam "wait-time=600"
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}
cd ${HOME}/.local/venv/tf220pt170
source bin/activate
which python3
which pip3
pip3 list
python3 --version
python3 -c 'print("tkinter: "); import tkinter'
python3 -c 'import tensorflow as tf; print("TensorFlow: ", tf.__version__)'

exit
```

- 現時点の状態をアーカイブファイル化してWinSCPなどでローカルPCへコピー

```bash
cd ${HOME}
tar cvfz dotlocal_tf220.tar.gz ./.local
```

## PyTorch2.2.0 のインストール

### ソースコードのダウンロード

- 以下のコマンドを実行して、PyTorch1.7.0ソースコードなどをダウンロード

- ログインノードへログインし、`cd ${HOME}/projects`

```bash
cd ${HOME}/projects
git clone https://github.com/fujitsu/pytorch.git
cd pytorch
git checkout -b fujitsu_v1.7.0_for_a64fx origin/fujitsu_v1.7.0_for_a64fx
cd scripts/fujitsu
ln -s ${HOME}/.local .
```

> fujitsu/pytorch ソースコードをそのまま実行すると、`${HOME}/projects/pytorch/scripts/fujitsu/.local へインストールされる。このため先に `ln` コマンドで `${HOME}/.local` へリンクさせておく。

- `vi env.src` を実行し、以下の行を編集

```bash
:
export PREFIX=${HOME}/projects/pytorch/scripts/fujitsu
export TCSDS_PATH=/opt/FJSVxtclanga/tcsds-1.2.34
:
export VENV_NAME="tf220pt170"
export LD_LIBRARY_PATH=${TCSDS_PATH}/lib64:${PREFIX}/.local/lib:${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${TCSDS_PATH}/bin:${PREFIX}/.local/bin:${HOME}/.local/bin:.:${PATH}
:
```

- `bash checkout.sh` を実行し、PyTorchソースコード関連をダウンロード

### 計算ノード用gccベースのcmakeインストール

- `vi 1_cmake.sh` を実行し、次のように編集

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
. env.src
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}

# Build cmake
cd ${DOWNLOAD_PATH}/cmake-3.11.4
./configure --prefix=${HOME}/.local
make clean
make -j32
make install

cd ${HOME}/.local/bin
ls -la
which make
make --version
```

- `pjsub 1_cmake.sh` を実行
- 完了メールが来たら `1_cmake.sh.XXXXXX.out` を参照し、gcc版 `make` が`${HOME}/.local/bin`にインストールされていることを確認

> `2_python.sh` は実行しない。

### Python関連パッケージのインストール

- `vi 3_venv.sh` を実行し、以下のように編集

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
. env.src
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}

# Create venv
cd ${HOME}/.local/venv
source tf220pt170/bin/activate

# Install requires
pip3 install ${UPLOAD_PATH}/PyYAML-5.3.1-cp38-cp38-linux_aarch64.whl
#pip3 install ${UPLOAD_PATH}/numpy-1.19.0-cp38-cp38-linux_aarch64.whl
pip3 install ${UPLOAD_PATH}/cloudpickle-1.3.0-py2.py3-none-any.whl ${UPLOAD_PATH}/psutil-5.7.0-cp38-cp38-linux_aarch64.whl ${UPLOAD_PATH}/tqdm-4.46.0-py2.py3-none-any.whl ${UPLOAD_PATH}/cffi-1.14.0-cp38-cp38-linux_aarch64.whl ${UPLOAD_PATH}/pycparser-2.20-py2.py3-none-any.whl
#pip3 install ${UPLOAD_PATH}/six-1.14.0-py2.py3-none-any.whl
pip3 install ${UPLOAD_PATH}/attrs-20.3.0-py2.py3-none-any.whl ${UPLOAD_PATH}/dataclasses-0.6-py3-none-any.whl ${UPLOAD_PATH}/hypothesis-6.0.2-py3-none-any.whl ${UPLOAD_PATH}/sortedcontainers-2.3.0-py2.py3-none-any.whl ${UPLOAD_PATH}/typing_extensions-3.7.4.3-py3-none-any.whl
#pip3 install ${UPLOAD_PATH}/Cython-0.29.21-py2.py3-none-any.whl ${UPLOAD_PATH}/attrs-20.3.0-py2.py3-none-any.whl ${UPLOAD_PATH}/dataclasses-0.6-py3-none-any.whl ${UPLOAD_PATH}/hypothesis-6.0.2-py3-none-any.whl ${UPLOAD_PATH}/sortedcontainers-2.3.0-py2.py3-none-any.whl ${UPLOAD_PATH}/typing_extensions-3.7.4.3-py3-none-any.whl
```

- `pjsub 3_venv.sh` を実行
- 完了メールが来たら `3_venv.sh.XXXXXX.out` を参照し、正常に完了したことを確認する
- 以下のコマンドを実行し、必要なPythonパッケージが導入済みであることを確認する

```bash
pjsub --interact -L "node=1" -L "rscgrp=int" -L "elapse=6:00:00" --sparam "wait-time=600"

export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}
cd ${HOME}/.local/venv/tf220pt170
source bin/activate
pip3 list

exit
```

### PyTorch 本体のインストール

- `vi 4_pytorch_install.sh` を実行し、以下のように編集（新規作成）

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
. env.src
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}

export USE_LAPACK=1
export USE_NNPACK=0
export USE_XNNPACK=0
export USE_NATIVE_ARCH=1
export MAX_JOBS=48

# Create venv
cd ${HOME}/.local/venv/tf220pt170
source bin/activate

#export TCSDS_PATH=/opt/FJSVxtclanga/tcsds-1.2.34
export CC="${TCSDS_PATH}/bin/fcc -Nclang -Kfast -Knolargepage -lpthread"
export CXX="${TCSDS_PATH}/bin/FCC -Nclang -Kfast -Knolargepage -lpthread"


# Build PyTorch
#cd ${PYTORCH_INSTALL_PATH}
cd ${HOME}/projects/pytorch/scripts/fujitsu
cd ../../
pushd third_party/ideep/mkl-dnn/src/cpu/aarch64/xbyak_translator_aarch64/translator/third_party
mkdir -p build_xed_aarch64
cd build_xed_aarch64/
../xed/mfile.py --shared  --cc="${TCSDS_PATH}/bin/fcc -Nclang -Kfast -Knolargepage" --cxx="${TCSDS_PATH}/bin/FCC -Nclang -Kfast -Knolargepage" examples install
cd kits
ln -sf xed-install-base-* xed
cd ../../../../
make -j48

popd
pwd
#export XED_ROOT_DIR=/home/ra010001/data/.local/lib
export XED_ROOT_DIR=`pwd`/third_party/ideep/mkl-dnn/src/cpu/aarch64/xbyak_translator_aarch64/translator/third_party/build_xed_aarch64/kits/xed/lib
cp ${XED_ROOT_DIR}/libxed.so ${HOMe}/.local/lib/libxed.so

python3 setup.py clean
python3 setup.py install
```

- `chmod +x 4_pytorch_install.sh` を実行
- `pjsub 4_pytorch_install.sh` を実行
- 完了メールが来たら `4_pytorch_install.sh.XXXXXX.out` を参照し、正常に完了したことを確認
- 以下のコマンドを実行し、PyTorchパッケージが導入済みであることを確認する

```bash
pjsub --interact -L "node=1" -L "rscgrp=int" -L "elapse=6:00:00" --sparam "wait-time=600"

export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}
cd ${HOME}/.local/venv/tf220pt170
source bin/activate
pip3 list
python3 -c 'import torch; print("PyTorch: ", torch.__version__)'

exit
```

### Torchvision前提（JPEG）ライブラリのインストール

- `vi 5_jpeg.sh` を実行し、以下のように編集する

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
. env.src
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}

# Create venv
cd ${HOME}/.local/venv/tensorflow
source bin/activate

export CC="${TCSDS_PATH}/bin/fcc -Nclang -Kfast -Knolargepage -lpthread"
export CXX="${TCSDS_PATH}/bin/FCC -Nclang -Kfast -Knolargepage -lpthread"

# Build jpeg-9d
cd ${DOWNLOAD_PATH}
cd jpeg-9d/
./configure --prefix=${HOME}/.local --enable-shared
make clean
make -j32
make install

cd ${HOME}/.local/lib
ls -la
```

- `pjsub 5_jpeg.sh.sh` を実行
- 完了メールが来たら `5_jpeg.sh.XXXXXX.out` を参照し、正常に完了したことを確認する

### Torchvisionパッケージのインストール

- `vi 6_vision.sh` を実行し、以下のように編集する

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
. env.src
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}

# Create venv
cd ${HOME}/.local/venv/tensorflow
source bin/activate

export CC="${TCSDS_PATH}/bin/fcc -Nclang -Kfast -Knolargepage -lpthread"
export CXX="${TCSDS_PATH}/bin/FCC -Nclang -Kfast -Knolargepage -lpthread"

# Install Pillow
cd ${DOWNLOAD_PATH}
cd Pillow
MAX_CONCURRENCY=8 CFLAGS="-I${HOME}/.local/include" python3 setup.py install
cd ../

# Install torchvision
cd vision
python3 setup.py clean
python3 setup.py install

pip3 list
```

- `pjsub 6_vision.sh` を実行
- 完了メールが来たら `6_vision.sh.XXXXXX.out` を参照し、正常に完了したことを確認する

### Horovodパッケージののインストール

- `vi 7_horovod.sh` を実行し、以下のように編集する

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
. env.src
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}

# Create venv
cd ${HOME}/.local/venv/tensorflow
source bin/activate

export MPI_HOME=${TCSDS_PATH}
export HOROVOD_MPICXX_SHOW="${MPI_HOME}/bin/mpiFCC -show"

export CC="${TCSDS_PATH}/bin/fcc -Nclang -Kfast -Knolargepage -lpthread"
export CXX="${TCSDS_PATH}/bin/FCC -Nclang -Kfast -Knolargepage -lpthread"

cd ${DOWNLOAD_PATH}/horovod
HOROVOD_WITHOUT_MXNET=1 HOROVOD_WITHOUT_GLOO=1 HOROVOD_WITH_MPI=1 HOROVOD_WITH_PYTORCH=1 HOROVOD_WITH_TENSORFLOW=1 python3 setup.py clean
HOROVOD_WITHOUT_MXNET=1 HOROVOD_WITHOUT_GLOO=1 HOROVOD_WITH_MPI=1 HOROVOD_WITH_PYTORCH=1 HOROVOD_WITH_TENSORFLOW=1 python3 setup.py install

pip3 list
```

- `pjsub 7_horovod.sh` を実行
- 完了メールが来たら `7_horovod.sh.XXXXXX.out` を参照し、正常に完了したことを確認する

### TensorFlow/PyTorch、horovod がインストールされていることを確認する

- `vi 8_check.sh` を実行し、以下のように編集する

```bash
#!/bin/bash
#PJM -L "rscunit=your_rscunit"
#PJM -L "rscgrp=small"
#PJM -L elapse=10:00:00
#PJM -L "node=1"
#PJM -j
#PJM -m b,e,s
#PJM --mail-list "yourmail@address"
#PJM -S
. env.src
export LD_LIBRARY_PATH=${HOME}/.local/lib:.:${LD_LIBRARY_PATH}
export PATH=${HOME}/.local/bin:.:${PATH}

# venv
cd ${HOME}/.local/venv/tf220_pt170
source bin/activate


# check
pip3 list
python3 -c 'import torch; print("PyTorch: ", torch.__version__)'
python3 -c 'import torchvision'
python3 -c 'import horovod.torch as hvd'
python3 -c 'import tensorflow as tf; print("TensorFlow: ", tf.__version__)'
python3 -c 'import horovod.tensorflow as hvd'
echo "check done!"
```

- `pjsub 8_check.sh` を実行
- 完了メールが来たら `8_check.sh.XXXXXX.out` を参照し、正常に完了したことを確認する

------

ちなみに、プリポストノードではGPU搭載ノードが8ノード存在する。
このGPUノードではPyPI管理のTensorFlowをpipインストールできる。

ログインノードにSSH接続して以下のコマンドを実行することで `${HOME}/.local/venv/gpu` にtensorflow-gpuをインストールしたvenv環境 `gpu` を作成できる。ご参考まで。

```bash
export ENV_NAME="gpu"
srun -p ppsq -N 1 --time=10:00:00 --pty bash -i
mkdir -p ${HOME}/.local/venv
cd ${HOME}/.local/venv
python3 -m venv ${ENV_NAME}
source ${ENV_NAME}/bin/activate
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-11.2/lib64
export PATH=${PATH}:/usr/local/cuda-11.2/bin:.
pip3 install tensorflow-gpu
exit
```

Slurmバッチでvenv環境を使いたい場合は、以下のように記述する。

```bash
#!/bin/bash
#SBATCH -p ppsq
#SBATCH --time=24:00:00
#SBATCH --gpus=1
#SBATCH --gpus-per-node=1
#SBATCH --gpus-per-task=1
#SBATCH --mail-type="ALL"
#SBATCH --mail-user="hogegoge@fugafuga.com"
#SBATCH -J "use_tfgpu"
#SBATCH --comment="use tensorflow on gpu node"

# use venv
export ENV_NAME="gpu"
mkdir -p ${HOME}/.local/venv/${ENV_NAME}
source bin/activate
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-11.2/lib64
export PATH=${PATH}:/usr/local/cuda-11.2/bin:.

#main
cd ${HOME}
:
```


ご参考まで。