PINN 실험 환경 구축 (Windows/myenv 기준)
1. Python 설치
- 다운로드: Python 공식 홈페이지에서 3.10.x 또는 3.11.x 버전을 다운로드한다.
- 주의사항: 설치 초기 화면 하단의
Add Python to PATH옵션을 반드시 체크하고 설치한다. - 확인:
cmd(명령 프롬프트)에서python --version을 입력해 버전이 나오면 성공이다.
2. 가상환경(myenv) 구성
- 생성: 프로젝트 폴더로 이동한 뒤 아래 명령어로 가상환경을 만든다.
python -m venv myenv - 활성화: 아래 명령어로 가상환경을 켠다. (프롬프트 앞에
(myenv)가 떠야 한다.)myenv\Scripts\activate - 업그레이드:
pip를 최신화한다.python -m pip install --upgrade pip
3. CUDA 및 cuDNN 설정 (버전 매칭 필수)
- 버전 확인: PyTorch 홈페이지에서 지원하는 CUDA 버전(예: 11.8)을 먼저 확인한다.
- CUDA 설치: NVIDIA 아카이브에서 위에서 확인한 버전(11.8)을 다운로드하여 설치한다.
- cuDNN 설정: cuDNN 아카이브에서 CUDA 버전과 맞는 파일을 받는다. 압축을 푼 뒤
bin,include,lib폴더 안의 파일들을 CUDA 설치 경로(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8)에 덮어씌운다.
물론, 최신 버전은 cuDNN도 exe 이기 때문에, 그냥 설치하면 끝이다.
4. PyTorch 및 라이브러리 설치
- PyTorch 설치: 가상환경이 켜진 상태에서 CUDA 버전에 맞는 명령어를 입력한다.
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 - 필수 패키지: 수치 계산과 시각화를 위한 라이브러리를 설치한다.
pip install numpy matplotlib scipy - 검증: 파이썬 실행 후
import torch; print(torch.cuda.is_available())입력 시True가 나오면 GPU 연동 성공이다.
5. 라플라스(Laplace) 방정식 정의
- PINN의 핵심인 자동 미분을 이용해 $\nabla^2 u = u_{xx} + u_{yy}$를 정의하고 테스트한다.
test.py파일을 만들고 아래 코드를 실행해 본다.
import torch
# 라플라스 잔차 계산 함수 (f = u_xx + u_yy)
def laplace_residual(u_pred, x, y):
# 1차 미분 (create_graph=True 필수)
u_x = torch.autograd.grad(u_pred, x, grad_outputs=torch.ones_like(u_pred), create_graph=True)[0]
u_y = torch.autograd.grad(u_pred, y, grad_outputs=torch.ones_like(u_pred), create_graph=True)[0]
# 2차 미분
u_xx = torch.autograd.grad(u_x, x, grad_outputs=torch.ones_like(u_x), create_graph=True)[0]
u_yy = torch.autograd.grad(u_y, y, grad_outputs=torch.ones_like(u_y), create_graph=True)[0]
return u_xx + u_yy
# 테스트
if __name__ == "__main__":
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 임의의 입력값 (requires_grad=True 필수)
x = torch.rand((5, 1), device=device, requires_grad=True)
y = torch.rand((5, 1), device=device, requires_grad=True)
# 임의의 예측값 (가정)
u = torch.sin(x) * torch.cos(y)
# 잔차 계산
f = laplace_residual(u, x, y)
print("계산된 잔차 f:\n", f.detach().cpu().numpy())