이 글은 DeepXDE 기반 공학적 물리AI 모델 학습 기술 개발 방법을 나눔한다. 특히, 대형 언어 모델(LLM) 기반의 다중 에이전트(Multi-Agent)가 전통적인 유한요소해석(FEM) 도구인 Ansys나 OpenSees 등을 조작하여 구조물의 안전성을 자동 평가하는 기술을 알아본다.
혼동되는 용어인 물리AI와 피지컬AI에 관련된 깊은 내용은 다음 링크를 참고한다.
'Engineer Team'이 수행하는 응답(Pf) 및 내력(Pr) 계산을 기존 FEM 소프트웨어 대신 AI로 처리하여 연산 속도를 기하급수적으로 높일 수 있는 기술이 바로 PINN(Physics-Informed Neural Networks)이다.
PINN의 핵심 개발자 및 창시자
- 조지 카니아다키스 (George Karniadakis): 브라운 대학교(Brown University) 응용수학과 교수로, PINN이라는 용어와 개념을 학계에 주도적으로 정립한 'PINN의 아버지'로 불린다.
- 마지아르 라이시(Maziar Raissi) & 파리스 페르디카리스(Paris Perdikaris): 카니아다키스 교수와 함께 2017~2019년에 걸쳐 PINN의 근간이 되는 기념비적인 논문을 공동 저술한 핵심 연구자들이다.
- 루루: 브라운 대학교 출신으로 현재 펜실베이니아 대학교(UPenn)에 재직 중이며, 가장 유명한 PINN 오픈소스 라이브러리인 'DeepXDE'를 개발하여 기술 대중화에 기여한 인물이다.
유명 오픈소스 및 기술 스택
- DeepXDE: 루 루 박사가 개발한 가장 대중적인 오픈소스 라이브러리이다. TensorFlow, PyTorch, JAX 등 다양한 딥러닝 백엔드를 모두 지원하며, 직관적인 API를 제공하여 연구자들 사이에서 1순위로 채택된다.
- NVIDIA Modulus: 엔비디아가 개발한 산업용 물리 기반 머신러닝 프레임워크이다. 복잡한 3D 형상과 다중 물리(Multiphysics) 현상을 대규모 GPU 클러스터에서 병렬 처리하는 데 특화되어 있어, 이미지 속 상용 툴(Ansys)의 역할을 직접적으로 대체하는 데 자주 쓰인다.
- SciML (NeuralPDE.jl): MIT의 크리스 라카우카스(Chris Rackauckas) 주도 하에 개발된 Julia 언어 기반 생태계이다. 미분 방정식 풀이에 특화된 연산 속도와 효율성을 자랑한다.
- PySINDy: 엄밀히 말해 PINN은 아니지만, 측정된 데이터로부터 물리 지배 방정식을 역으로 찾아내는 데이터 기반 물리 모델링 기술 스택으로 함께 자주 활용된다.
프레임워크 사용 예시
- 대체 모델(Surrogate Model) 연동: 'Analyst Team'의 AutoGen 에이전트가 복잡한 메쉬(Mesh)를 짜고 OpenSees를 돌리는 대신, 사전에 구조 역학(Navier-Cauchy 방정식 등)을 학습한 PINN 모델을 API로 호출한다.
- 실시간 한계 상태 검토(Limit State Check): 기존 FEM은 구조물 처짐이나 응력 계산에 몇 시간씩 걸릴 수 있지만, PINN은 밀리초(ms) 단위로 Pr과 Pf 값을 도출하여 'Management Team'의 Project Manager 에이전트에게 전달한다.
- 역해석 및 안전 진단: 센서 데이터(Document/Log)가 주어지면, PINN을 통해 눈에 보이지 않는 구조물 내부의 균열이나 하중 분포를 역으로 추적하여 Safety Manager가 즉각적인 의사결정을 내리도록 돕는다.
DeepXDE 기반 PINN 코딩 예시
다음 패키지를 설치한다.
pip install pyautogen deepxde torch numpy
구조 역학의 가장 기본이 되는 1차원 푸아송 문제(Poisson's equation)를 DeepXDE를 사용하여 푸는 파이썬 코드 예시이다.
import os
os.environ["DDE_BACKEND"] = "pytorch"
import deepxde as dde
import matplotlib.pyplot as plt
import numpy as np
def run_pinn():
# 1. 해석할 공간 정의 (0부터 1까지의 1D 도메인)
geom = dde.geometry.Interval(0, 1)
# 2. 물리 지배 방정식 정의 (d^2y/dx^2 = -2)
# x: 위치 텐서, y: 신경망이 예측한 변위 텐서
def pde(x, y):
dy_xx = dde.grad.hessian(y, x) # y를 x에 대해 2번 미분
return dy_xx + 2.0
# 3. 경계 조건 정의 (양 끝단에서 처짐이 0)
def boundary(x, on_boundary):
return on_boundary
bc = dde.icbc.DirichletBC(geom, lambda x: 0, boundary)
# 4. 학습 데이터셋 구성 (데이터 없이 물리 공식만으로 학습)
# 도메인 내부에 50개의 점, 경계에 2개의 점을 샘플링하여 물리 법칙 검증
data = dde.data.PDE(
geom, pde, bc, num_domain=50, num_boundary=2
)
# 5. 인공신경망 아키텍처 설계 (입력 1개, 50개 노드를 가진 은닉층 3개, 출력 1개)
# 매끄러운 물리 곡선을 표현하기 위해 활성화 함수로 'tanh' 사용
net = dde.nn.FNN([1] + [50] * 3 + [1], "tanh", "Glorot uniform")
# 6. 모델 통합 및 컴파일 (Adam 옵티마이저 적용)
model = dde.Model(data, net)
model.compile("adam", lr=0.001)
print("PINN 학습을 시작함")
# 7. 5000번의 에폭(Epoch) 동안 물리 손실 함수(Loss) 최소화
losshistory, train_state = model.train(iterations=5000)
# 8. 검증 및 결과 시각화
# 0부터 1까지 100개의 테스트 지점 생성
x_test = np.linspace(0, 1, 100).reshape(-1, 1)
# 해석해(진짜 정답) 계산
y_true = x_test * (1 - x_test)
# 학습된 PINN 모델의 예측값 계산
y_pred = model.predict(x_test)
# 중앙 지점(x=0.5) 결과 출력
print("\n=== 학습 결과 ===")
print(f"중앙(x=0.5) 물리 공식 정답: 0.25")
print(f"중앙(x=0.5) PINN 예측 결과: {y_pred[50][0]:.5f}")
# 시각화 차트 생성
plt.figure(figsize=(8, 5))
plt.plot(x_test, y_true, 'r-', linewidth=2, label="Exact Physics Solution")
plt.plot(x_test, y_pred, 'b--', linewidth=2, label="PINN Prediction")
plt.xlabel("Position (x)")
plt.ylabel("Deflection (y)")
plt.title("DeepXDE PINN Result: 1D Equation")
plt.legend()
plt.grid(True)
plt.show()
if __name__ == "__main__":
run_pinn()
실행결과는 다음과 같다.
=== 학습 결과 ===
중앙(x=0.5) 물리 공식 정답: 0.25
중앙(x=0.5) PINN 예측 결과: 0.25030
참고로, 1D Poisson (1차원 푸아송 방정식)은 공학과 물리학에서 가장 뼈대가 되는 아주 유명한 지배 방정식(Governing Equation)이다. 이 푸아송 방정식도 "외부에서 힘(하중, 열, 전기 등)이 가해졌을 때 물체가 어떻게 반응하는가?"를 나타내는 수학적 규칙이다.
1. 수학적 의미: "얼마나 휘어지는가?"
수식으로는 아주 간단하게 다음과 같이 생겼음.
d^2y / dx^2 = f(x)
- y: 우리가 알고 싶은 결과값 (예: 기둥이 아래로 처진 깊이)
- d^2y / dx^2: y를 위치 x에 대해 두 번 미분한 값. 즉, '곡선이 휘어진 정도(곡률)'를 뜻함.
- f(x): 외부에서 가해지는 힘이나 하중임.
"물체가 휘어진 정도는 가해진 하중에 비례한다"는 아주 직관적인 물리 법칙을 수학으로 쓴 것임.
2. 팽팽한 빨랫줄
놀이터에 묶어둔 팽팽한 고무줄이나 빨랫줄을 상상해 본다.
- 거기에 젖은 수건들을 일정한 간격으로 쭉 널어둠 (이게 바로 균일 하중 f(x) = -2 상황임).
- 그러면 빨랫줄이 무게 때문에 가운데가 축 처지면서 아름다운 포물선 모양을 그리게 됨.
- 이때 빨랫줄의 각 지점(x)이 바닥으로 얼마나 처졌는지(y)를 정확히 계산해 내는 것이 바로 1D Poisson 방정식을 푸는 것임.
균일 하중을 받는 1차원 푸아송 방정식의 정답은 완벽한 2차 함수 포물선 형태라는 것을 수학자는 이미 알고 있다. AI에게 데이터(정답지)를 하나도 주지 않고, 오직 "두 번 미분한 값이 -2가 되어야 해"라는 물리 법칙(규칙) 하나만 던져준다.
만약 AI가 이 규칙만 가지고 스스로 학습해서 포물선 모양의 처짐값을 정확히 예측해 낸다면, "이 인공지능이 데이터를 외운 게 아니라 진짜 물리(미분)를 깨우쳤구나!"라고 증명할 수 있기 때문에 푸아송 문제를 PINN에서 많이 활용한다. 그래서, 물리 인공지능(PINN)을 처음 개발할 때 무조건 1순위로 통과해야 하는 기본 관문이 바로 이 1D Poisson 방정식이다. 참고로, 19세기 프랑스의 전설적인 수학자이자 물리학자인 시메옹 드니 포아송(Siméon Denis Poisson, 1781)의 이름을 따서 이 방정식 이름이 붙여졌다.
물리AI 기반 에이전트 개발 방법
이 코드를 AutoGen 기반의 AI 에이전트가 직접 작성하고 실행하도록 만들면, 유한요소분석 소프트웨어의 라이선스나 무거운 연산 과정 없이도 완벽한 자율 구조 검토 인공지능 모델이 가능하다. 'Agent to Agent Communication'을 파이썬의 AutoGen 프레임워크를 이용해 구현하고, 앞서 다룬 PINN(Physics-Informed Neural Networks) 코드를 결합하는 방법을 설명한다.
1. AutoGen 기반 다중 에이전트 시스템 설계
이미지의 워크플로우를 파이썬 코드로 매핑하기 위해 다음과 같이 세 명의 AI 에이전트를 정의한다.
- User Proxy (Safety Manager): 목표를 하달하고 코드 실행 권한을 가진 관리자이다.
- Engineer Agent (Analyst Team): 구조 해석을 위해 DeepXDE 기반의 PINN 코드를 작성하고 실행 결과를 반환하는 실무자이다.
- Project Manager (Reviewer): PINN 해석 결과(최대 처짐량 등)를 건축 구조 기준(Limit State)과 비교하여 최종 안전 여부를 판정한다.
2. AutoGen 및 PINN 결합 파이썬 코드
아래 코드는 에이전트들이 대화를 나누며 스스로 PINN 코드를 작성, 실행, 평가하는 전체 통신 로직이다.
import os
import autogen
from autogen.coding import LocalCommandLineCodeExecutor
def start_interactive_session():
# 1. LLM 환경 설정
# (주의: 실제 구동 시 api_key에 본인의 OpenAI API Key를 문자열로 입력하세요)
llm_config = {
"config_list": [{"model": "gpt-4-turbo", "api_key": ""}],
"temperature": 0.1 # 일관된 논리와 코드 생성을 위해 낮게 설정
}
# 2. 코드가 저장되고 실행될 안전한 작업 폴더 생성
work_dir = "agent_workspace"
os.makedirs(work_dir, exist_ok=True)
# 3. AI 엔지니어 에이전트 생성 (두뇌 역할)
engineer = autogen.AssistantAgent(
name="Engineer",
llm_config=llm_config,
system_message="""당신은 파이썬 기반의 구조 해석 및 PINN(Physics-Informed Neural Network) 최고 전문가이다.
1. 사용자의 질문에 친절하고 명확하게 답하라.
2. 계산이나 모델링이 필요하면 실행 가능한 파이썬 코드를 마크다운 블록(```python ... ```) 안에 작성하라.
3. 코드는 반드시 print() 함수를 통해 결괏값을 터미널에 출력하도록 작성해야 한다.
4. 사용자가 코드 실행 결과를 터미널을 통해 복사해서 넘겨주면, 그 수치가 물리적으로 어떤 의미인지(안전한지, 위험한지 등) 해석해 주어라."""
)
# 4. 사용자 프록시 에이전트 생성 (나 자신 & 코드 실행기 역할)
user_proxy = autogen.UserProxyAgent(
name="User",
human_input_mode="ALWAYS", # ★ 핵심: 매 턴마다 사용자의 입력을 대기하는 채팅 모드
max_consecutive_auto_reply=10,
code_execution_config={
"work_dir": work_dir,
"use_docker": False # 로컬 파이썬 환경에서 직접 코드를 실행하도록 강제
}
)
# 5. CLI 채팅 인터페이스 안내문 출력
print(" AI 구조 엔지니어(Engineer)와 대화하는 인터랙티브 세션입니다.")
print(" - 코드를 실행하려면 아무것도 입력하지 않고 'Enter'만 누르세요.")
print(" - 대화를 완전히 종료하려면 'exit'를 입력하세요.")
# 6. 채팅 워크플로우 시작
# 최초 발화를 빈 메시지로 처리하여, 프로그램이 켜지자마자 사용자의 첫 명령을 기다리게 만듦
user_proxy.initiate_chat(
engineer,
message="안녕하세요. 구조 해석 지원 시스템입니다. 어떤 해석을 도와드릴까요?"
)
if __name__ == "__main__":
start_interactive_session()
3. 에이전트 간 통신(Communication) 실행 흐름
코드를 실행하면 내부적으로 다음과 같은 협업 파이프라인이 작동한다.
1) 작업 지시: Safety Manager가 채팅방에 목표(Task)를 투척한다.
2) 코드 생성: Engineer 에이전트가 앞서 배운 DeepXDE 파이썬 코드를 스스로 작성하여 채팅방에 올린다.
3) 코드 실행: Safety Manager(User Proxy)가 해당 코드를 로컬 환경(pinn_workspace 폴더)에서 실제 실행하고, 처짐량 계산 결과(예: 0.024m)를 채팅방에 다시 반환한다.
4) 결과 검증: Project Manager가 계산된 응답값(P_f)과 허용치(P_r)를 비교한다. "0.024m는 허용 기준 0.05m 이내이므로 안전하다"고 판단한 뒤 `Structurally Adequate` 텍스트를 출력한다.
5) 자동 종료: 종료 조건(Termination Message)이 발동되어 워크플로우가 마무리된다.
실행 결과는 다음과 같다.
User (to Engineer): 길이가 10m, 영률(E)이 200GPa, 단면이차모멘트(I)가 0.0005m^4인 단순 지지보의 중앙에 50kN 하중이 가해질 때의 최대 처짐량을 구하는 파이썬 코드를 작성해 줘. 결과는 반드시 print()로 출력해 줘.
--------------------------------------------------------------------------------
Engineer (to User):
해당 문제는 고전적인 구조역학 문제로, 단순 지지보의 중앙에 집중하중이 작용할 때의 최대 처짐을 계산할 수 있습니다. 이 문제에서는 다음 공식을 사용할 수 있습니다:
\[ \delta_{\text{max}} = \frac{F \cdot L^3}{48 \cdot E \cdot I} \]
여기서:
- \( F \)는 중앙에 작용하는 하중 (50 kN)
- \( L \)은 보의 길이 (10 m)
- \( E \)는 영률 (200 GPa)
- \( I \)는 단면이차모멘트 (0.0005 m^4)
이제 이 값을 계산하는 파이썬 코드를 작성하겠습니다.
```python
# 주어진 값
F = 50000 # 하중 (N)
L = 10 # 길이 (m)
E = 200e9 # 영률 (Pa)
이제 이 값을 계산하는 파이썬 코드를 작성하겠습니다.
```python
# 주어진 값
F = 50000 # 하중 (N)
L = 10 # 길이 (m)
E = 200e9 # 영률 (Pa)
```python
# 주어진 값
F = 50000 # 하중 (N)
L = 10 # 길이 (m)
E = 200e9 # 영률 (Pa)
# 주어진 값
F = 50000 # 하중 (N)
L = 10 # 길이 (m)
E = 200e9 # 영률 (Pa)
F = 50000 # 하중 (N)
L = 10 # 길이 (m)
E = 200e9 # 영률 (Pa)
I = 0.0005 # 단면이차모멘트 (m^4)
# 최대 처짐 계산
L = 10 # 길이 (m)
E = 200e9 # 영률 (Pa)
I = 0.0005 # 단면이차모멘트 (m^4)
# 최대 처짐 계산
I = 0.0005 # 단면이차모멘트 (m^4)
# 최대 처짐 계산
delta_max = (F * L**3) / (48 * E * I)
delta_max = (F * L**3) / (48 * E * I)
# 결과 출력
print(f"최대 처짐량은 {delta_max:.5f} m 입니다.")
```
4. 구조적 장점
- 자동화된 Limit State Check: 복잡한 역학 방정식을 사람이 풀거나 상용 툴(Ansys)을 켤 필요 없이, 프롬프트 지시만으로 AI가 해석부터 판정까지 처리한다.
- 유연한 대처: 만약 PINN 해석 결과가 불안정하게 나오거나 오차가 크면, Project Manager 에이전트가 "학습 에폭(Epoch)을 20000으로 늘려서 다시 계산하라"고 Engineer에게 스스로 피드백을 주며 모델을 튜닝하는 것이 가능하다.
PINN 라이브러리
DeepXDE를 포함해 다른 좋은 SOTA 라이브러리들도 다음과 같이 있다.
DeepXDE (표준 및 교육용 프레임워크)
- 개발자: 루 루(Lu Lu) 박사와 조지 카니아다키스(George Karniadakis) 교수팀(브라운 대학교, Brown University)이 주도하여 개발하였다.
- 개발 시기 및 목적: 2019년에 최초 공개되었으며, 복잡한 물리 방정식을 딥러닝으로 풀기 위한 범용적인 라이브러리를 구축하는 것이 목적이다. 입문자들이 수치 해석적 지식 없이도 PINN 모델을 쉽게 구현할 수 있도록 다중 백엔드(TensorFlow, PyTorch, JAX, PaddlePaddle)를 지원하는 추상화된 API를 제공한다.
- 주요 특징: 연구용으로 가장 널리 쓰이며, 1D/2D/3D의 복잡한 기하학적 영역 정의와 다양한 경계 조건(Dirichlet, Neumann, Robin) 설정을 지원한다.
- 전체 링크: https://github.com/lululxvi/deepxde
NVIDIA Modulus
- 개발자: 엔비디아(NVIDIA)의 가속 컴퓨팅 및 AI 연구 팀이 개발하였다. (과거 'SimNet'이라는 이름으로 시작되었다.)
- 개발 시기 및 목적: 2021년에 정식 출시되었으며, 산업 현장의 대규모 엔지니어링 문제(유체 역학, 열전달, 구조 해석 등)를 해결하기 위해 설계되었다. 전통적인 CAE(Computer-Aided Engineering) 툴을 대체하거나 보완하여 디지털 트윈(Digital Twin)을 실시간으로 구현하는 것이 주된 목적이다.
- 주요 특징: 엔비디아 GPU 하드웨어에 최적화되어 연산 속도가 압도적이며, 실제 산업용 CAD 데이터(STL 파일 등)를 모델에 직접 입력할 수 있는 기능을 갖추고 있다.
- 전체 링크: https://github.com/NVIDIA/modulus
NeuralPDE.jl
- 개발자: 크리스 라카우카스(Chris Rackauckas) 교수와 MIT의 SciML(Scientific Machine Learning) 오픈소스 커뮤니티가 주도하여 개발하였다.
- 개발 시기 및 목적: 2020년경부터 활발히 개발되었으며, Julia(줄리아) 언어의 고성능 연산 능력을 머신러닝과 결합하는 것이 목적이다. 파이썬의 속도 한계를 극복하고 자동 미분(Automatic Differentiation)의 효율성을 극대화하여 가장 정밀한 물리 해를 구하는 데 집중한다.
- 주요 특징: 미분 방정식 시스템 전체를 신경망으로 변환하여 풀이하며, 물리 기반 제어(Control) 및 최적화 문제에서 세계 최고 수준의 성능을 보여준다.
- 전체 링크: https://github.com/SciML/NeuralPDE.jl
FNO (Fourier Neural Operator)
- 개발자: 리종이(Zongyi Li)와 애니마 아난드쿠마르(Anima Anandkumar) 교수팀(칼텍, Caltech) 및 엔비디아 연구진이 공동 개발하였다.
- 개발 시기 및 목적: 2020년 말에 발표되었으며, 특정 지점의 해를 구하는 것을 넘어 '입력 함수와 출력 함수 사이의 맵핑(연산자)' 자체를 학습하는 것이 목적이다. 기상 예측이나 나비에-스토크스(Navier-Stokes) 유체 방정식처럼 복잡한 현상을 순식간에 추론하기 위해 개발되었다.
- 주요 특징: 한 번 학습하면 서로 다른 해상도나 경계 조건에서도 재학습 없이 즉각적으로 결과를 뱉어내며, 기존 수치 해석 대비 최대 1,000배 이상 빠르다.
- 전체 링크: https://github.com/neuraloperator/fourier_neural_operator
레퍼런스
- Large language model-empowered next-generation computer-aided engineering - ScienceDirect
- Automating Structural Engineering Workflows with Large Language Model Agents
- DL-VLM: A Dynamic Lightweight Vision-Language Model for Bridge Health Diagnosis
- dataset-ninja/codebrim: CODEBRIM: COncrete DEfect BRidge IMage Dataset
- "SDNET2018: A concrete crack image dataset for machine learning applica" by Marc Maguire, Sattar Dorafshan et al.
- PrismaX/PhysUniBench · Datasets at Hugging Face
- DelosLiang/masse: Automating Structural Engineering Workflows with Large Language Model Agents
- CODEBRIM: COncrete DEfect BRidge IMage Dataset
- zhuminjie/OpenSeesPy: OpenSeesPy versions, doc, and pip
댓글 없음:
댓글 쓰기