pytorch 예제 따라서 실행해보기
1. Anaconda 설치
> wget https://repo.anaconda.com/archive/Anaconda3-2020.11-Linux-x86_64.sh
(You can check new version in https://repo.anaconda.com/archive)
> bash Anaconda3-2020.11-Linux-x86_64.sh
> source ~/.bashrc
> (conda 명령어 인식이 안되는 경우) anaconda3/bin/conda init bash (anaconda 폴더를 변경한 경우에는 변경한 폴더를 path로)
> conda deactivate
2. python 3.9, pytorch 설치
> conda create -n tutorial python=3.9
> conda activate tutorial
> conda install pytorch torchvision torchaudio pytorch-cuda=11.6 -c pytorch -c nvidia
3. 파이썬 코드 작성
code.py 파일 만들기
- - torch.cuda.is_available() : GPU 사용가능 여부 확인
- - device = torch.device(cuda) and [something].to(device) : GPU에 Pytorch model 이 돌아가도록 하는 명령어
<code.py>
import argparse
import torch
import torch.nn as nn
import torch.optim as optim
parser = argparse.ArgumentParser("Continuous Normalizing Flow") parser.add_argument("--hidden_size", type=int, default=4) parser.add_argument("--hidden_layer", type=int, default=3) parser.add_argument("--batch_size", type=int, default=100) parser.add_argument("--lr", type=float, default=1e-3) parser.add_argument("--weight_decay", type=float, default=1e-5) args = parser.parse_args() print(f"cuda: {torch.cuda.is_available()}") device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
input_size = 10 output_size = 10 model_lst = [nn.Linear(input_size, args.hidden_size)] for i in range(args.hidden_layer): model_lst.append(nn.Linear(args.hidden_size,args.hidden_size)) model_lst.append(nn.Linear(args.hidden_size,output_size))
model = nn.Sequential(*model_lst).to(device) optimizer = optim.Adam(model.parameters(), lr=args.lr, weight_decay=args.weight_decay)
for itr in range(200): x = torch.randn(args.batch_size, input_size).to(device) y = torch.randn(args.batch_size, output_size).to(device) y_hat = model(x) loss = (y - y_hat).pow(2).mean() optimizer.zero_grad() loss.backward() optimizer.step() print(f"{itr}: {loss.item():.3f}")
parser = argparse.ArgumentParser("Continuous Normalizing Flow") parser.add_argument("--hidden_size", type=int, default=4) parser.add_argument("--hidden_layer", type=int, default=3) parser.add_argument("--batch_size", type=int, default=100) parser.add_argument("--lr", type=float, default=1e-3) parser.add_argument("--weight_decay", type=float, default=1e-5) args = parser.parse_args() print(f"cuda: {torch.cuda.is_available()}") device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
input_size = 10 output_size = 10 model_lst = [nn.Linear(input_size, args.hidden_size)] for i in range(args.hidden_layer): model_lst.append(nn.Linear(args.hidden_size,args.hidden_size)) model_lst.append(nn.Linear(args.hidden_size,output_size))
model = nn.Sequential(*model_lst).to(device) optimizer = optim.Adam(model.parameters(), lr=args.lr, weight_decay=args.weight_decay)
for itr in range(200): x = torch.randn(args.batch_size, input_size).to(device) y = torch.randn(args.batch_size, output_size).to(device) y_hat = model(x) loss = (y - y_hat).pow(2).mean() optimizer.zero_grad() loss.backward() optimizer.step() print(f"{itr}: {loss.item():.3f}")
4. 코드를 실행시킬 shell script 작성
code.sh 파일 만들기
- #SBATCH -J example <- [job 이름]
- #SBATCH --gres=gpu:N <- [사용할 GPU 개수]
- #SBATCH --output=example.out <- [Output 파일 이름. Stdout에 적히는 모든 것들이 이 파일에 작성됨]
- #SBATCH --time 0-23:00:00 <- [코드를 실행시킬 시간]
- conda activate toturial <- [Anaconda Environment]
<code.sh>
#!/bin/bash
#SBATCH -J example
#SBATCH --gres=gpu:1
#SBATCH --output=example.out
#SBATCH --time 0-23:00:00
eval "$(conda shell.bash hook)"
conda activate tutorial
python -u code.py --hidden_size 32 --hidden_layer 3 --batch_size 256 --lr 1e-3 --weight_decay 1e-6
5. Slurm 명령어로 job 제출
> sbatch code.sh
> squeuelong (job 제출 후 수행중인 job 확인)
> sinfo (서버 상태 확인)
> scancel jobID (job 취소)