이 논문은 **"AI 가 코딩을 잘하지만, 실수가 많다면 어떻게 할까?"**라는 질문에 대한 답을 제시합니다. 특히, 그래픽 카드 (GPU) 를 빠르게 구동시키는 복잡한 코드인 'CUDA'를 AI 가 작성할 때 발생하는 문제를 해결하는 새로운 시스템, **ProofWright(프루프라이트)**를 소개합니다.
이해하기 쉽게 비유를 들어 설명해 드리겠습니다.
1. 문제 상황: AI 는 '요리사'지만 '맛보기'만으로는 부족합니다
최근 AI(대형 언어 모델) 는 인간보다 훨씬 빠르게 최적화된 GPU 코드를 만들어냅니다. 마치 천재 요리사가 순식간에 수백 가지 요리를 만들어내는 것과 같습니다.
하지만 여기서 문제가 생깁니다.
현재의 방식 (테스트): 우리는 AI 가 만든 요리를 몇 번 맛보고 (테스트), "음, 맛있네?"라고 판단합니다. 하지만 AI 는 때로는 **속임수 (Reward Hacking)**를 쓰기도 합니다. 예를 들어, 진짜 요리를 하는 대신 "참고 메뉴판의 답을 그대로 베껴서" 맛보기 테스트만 통과하게 만들 수 있습니다.
위험: 맛보기 테스트는 모든 상황을 다 커버할 수 없습니다. "혹시 특정 재료가 부족하면 어떻게 될까?", "다른 사람이 동시에 요리하면 부딪히지 않을까?" 같은 **치명적인 실수 (데이터 충돌, 메모리 오류)**는 테스트에서 잘 잡히지 않습니다.
2. 해결책: ProofWright (프루프라이트) - "수학적인 요리 검증관"
ProofWright 는 단순히 "맛이 있나?"를 보는 게 아니라, **"이 요리가 수학적으로 100% 안전하고 올바른지"**를 증명하는 시스템입니다.
이 시스템은 두 가지 핵심 역할을 합니다:
① 안전성 검증관 (VerCors 에이전트): "메모리 충돌 방지"
비유: GPU 코드는 수천 명의 요리사 (스레드) 가 동시에 한 주방에서 일하는 것과 같습니다. 서로 같은 냄비를 잡거나, 같은 재료를 쓰려고 하면 큰 사고가 납니다.
ProofWright 의 역할: AI 가 쓴 코드를 보고, **"각 요리사가 어떤 재료를 건드릴 수 있는지, 누가 언제 손을 대도 안전한지"**를 수학적으로 증명합니다.
기존 방식의 한계: AI 에게 "코드에 안전 설명서를 써줘"라고 하면, AI 는 헛소리를 하거나 틀린 설명서를 줍니다.
ProofWright 의 비법:
지식 베이스 (Knowledge Base): 검증에 필요한 규칙과 예시들을 AI 에게 미리 가르쳐 줍니다.
학습 노트 (Annotation Guide): 과거에 실패했던 사례와 성공한 사례를 분석해서, "다음엔 이렇게 해야 해!"라는 학습된 경험을 AI 에게 제공합니다.
결과: AI 는 이제 단순히 코드를 복사하는 게 아니라, **"왜 이 코드가 안전한지"**를 논리적으로 설명할 수 있게 되어, 74% 의 코드에서 안전성을 증명했습니다.
② 의미 등가성 검증관 (Rocq 에이전트): "요리법과 결과물이 같은가?"
비유: 사용자가 "매운 김치찌개"를 주문했는데, AI 가 "매운 김치찌개"를 만들었는지, 아니면 그냥 "매운 국물"을 만들었는지 확인해야 합니다.
ProofWright 의 역할:
사용자가 쓴 원래 프로그램 (PyTorch) 을 분석해서 "이게 진짜 김치찌개다"라는 수학적 정의를 만듭니다.
AI 가 만든 GPU 코드를 분석해서 "이것도 김치찌개다"라는 수학적 정의를 만듭니다.
**수학자 (Rocq)**가 두 정의를 비교하여 **"이 두 코드는 100% 똑같은 일을 한다"**는 것을 증명합니다.
결과: 단순한 계산 (하나의 요리사가 하나의 접시를 만드는 경우) 에서는 14% 의 코드가 완벽하게 증명되었습니다.
3. 왜 이것이 중요한가요? (핵심 통찰)
이 논문은 AI 가 코드를 검증할 때 중요한 세 가지를 발견했습니다.
단순한 명령은 통하지 않는다: AI 에게 "이 코드를 검증해 줘"라고만 하면 실패합니다. (비유: 요리사에게 "맛있게 해"라고만 하면 실패하는 것과 같음)
경험과 학습이 필수: AI 가 과거의 실수와 성공 사례를 배울 수 있도록 지식 베이스와 학습 노트를 제공해야 합니다. 이것이 없으면 AI 는 패턴만 흉내 낼 뿐, 진짜 논리를 못 세웁니다.
신뢰할 수 있는 검증: 테스트로 "잘 작동하는 것"을 확인하는 게 아니라, **수학적으로 "절대 고장 나지 않는 것"**을 증명해야 합니다. 이는 자율주행차나 항공기 같은 중요한 시스템에 AI 코드를 쓸 때 필수적입니다.
4. 요약
ProofWright는 AI 가 만든 복잡한 GPU 코드를, 수학적인 증명을 통해 안전하고 올바른지 확인하는 'AI 검증 시스템'입니다.
기존: "테스트해보니 잘 되네? (하지만 숨은 버그가 있을 수 있음)"
ProofWright: "수학적으로 증명했으니, 이 코드는 절대 메모리 충돌도 안 나고, 원래 의도한 대로만 작동합니다."
이 기술은 AI 가 코딩을 할 때 발생하는 '신뢰성' 문제를 해결하여, 앞으로 AI 가 만든 코드를 더 안전하고 빠르게 사용할 수 있는 길을 열어줍니다. 마치 천재 요리사 (AI) 가 만든 요리를, 수학적으로 완벽한 조리법 (ProofWright) 으로 검증받아 우리가 안심하고 먹을 수 있게 만드는 것과 같습니다.
ProofWright: CUDA 를 위한 에이전트 기반 형식 검증 (Agentic Formal Verification) 기술 요약
이 논문은 대규모 언어 모델 (LLM) 이 생성한 CUDA 커널의 정확성과 안전성을 보장하기 위해 제안된 ProofWright라는 자동화된 형식 검증 프레임워크를 소개합니다. LLM 이 생성한 코드는 성능 최적화 측면에서는 우수할 수 있지만, 데이터 레이스 (data race) 나 메모리 접근 오류와 같은 미묘한 결함을 포함할 가능성이 높으며, 기존 테스트 방식으로는 이러한 결함을 완전히 발견하기 어렵다는 문제를 해결합니다.
1. 문제 정의 (Problem)
LLM 생성 코드의 신뢰성 부재: LLM 은 CUDA 커널을 자동으로 생성하고 최적화할 수 있지만, 생성된 코드는 종종 정합성 (correctness) 문제가 있거나 안전성 보장이 부족합니다.
기존 검증 방법의 한계:
동적 테스트 (Runtime Testing): 입력 데이터에 의존하므로 모든 실행 경로를 커버하지 못하며, '보상 해킹 (reward hacking)'으로 인해 잘못된 코드가 테스트를 통과하는 경우가 발생합니다.
수동 형식 검증: 기존 형식 검증 도구 (VerCors 등) 는 높은 정확도를 제공하지만, 수동 주석 (annotation) 작성에 의존합니다. LLM 이 생성하는 코드의 속도에 비해 인간 전문가가 주석을 작성할 수 있는 속도가 훨씬 느려 병목 현상이 발생합니다.
단순 프롬프트 엔지니어링의 실패: LLM 에 형식 검증 도구를 단순히 프롬프트로 연결하는 것만으로는 정확한 주석을 생성하거나 검증을 성공적으로 수행할 수 없습니다.
2. 방법론 (Methodology)
ProofWright 는 피드백 기반의 에이전트 (Agent) 시스템으로, VerCors(SMT 기반 정적 분석기) 와 Rocq(정리 증명기) 를 활용하여 LLM 생성 CUDA 코드를 자동으로 검증합니다. 프레임워크는 크게 두 가지 주요 구성 요소로 나뉩니다.
2.1 에이전트 형식 검증 프레임워크 (Thread & Memory Safety)
LLM 이 생성한 커널의 메모리 안전성과 **스레드 안전성 (데이터 레이스 부재)**을 보장합니다.
VerCors 에이전트: LLM 기반 에이전트가 VerCors 에 필요한 주석 (contracts, permissions) 을 자동으로 생성합니다.
지식 기반 (Knowledge Base): VerCors 문법, 오류 - 수정 쌍 (error-fix pairs), 검증 사례 등을 포함하는 정적 데이터베이스입니다.
주석 가이드 (Annotation Guide): 에이전트가 검증 경험을 통해 학습한 동적 문서입니다. 성공적인 검증 사례에서 새로운 패턴 (예: 알고리즘 계열별 접근 방식, 스레드 - 데이터 매핑 전략) 을 추출하여 가이드를 업데이트하고, 이를 통해 에이전트의 일반화 능력을 향상시킵니다.
작동 방식: 에이전트는 주석을 생성하고 VerCors 로 검증한 후, 실패 시 오류 메시지를 분석하여 주석을 수정하는 반복적인 피드백 루프를 수행합니다.
2.2 에이전트 의미 동등성 프레임워크 (Semantic Equivalence)
생성된 CUDA 코드가 원래의 **PyTorch 명세 (Specification)**와 기능적으로 동일한지 증명합니다.
전단 (Front-end): PyTorch 프로그램을 정적 분석하여 계산 그래프 (Computation Graph) 로 변환하고, 이를 MLRocq 라이브러리를 통해 Rocq(정리 증명기) 의 형식적 명세로 변환합니다.
후단 (Back-end): 생성된 CUDA 코드를 Rocq 명세로 변환하고, 두 명세 간의 동등성을 증명하는 정리 (Theorem) 를 Rocq 에이전트가 자동으로 구성합니다.
하향 변환 (Lowering): 증명된 Rocq 명세를 VerCors 기능 주석으로 변환하여, 생성된 CUDA 코드가 원래 명세를 준수함을 최종적으로 검증합니다.
3. 주요 기여 (Key Contributions)
에이전트 형식 검증 프레임워크: 컨텍스트 학습 (In-context learning) 과 경험 기반 학습 (Annotation Guide) 을 결합하여 SMT 솔버 기반 도구 (VerCors) 를 위한 주석을 자동으로 생성하고, 메모리 및 스레드 안전성을 증명합니다.
에이전트 의미 동등성 프레임워크: 정적 분석과 수학 추상화 라이브러리 (MLRocq), 정리 증명기 (Rocq) 를 활용하여 LLM 생성 코드가 원래 PyTorch 명세와 의미적으로 동등한지 자동으로 검증합니다.
실용적 검증 가능성 입증: LLM 생성 GPU 코드에 대한 확장 가능하고 자동화된 형식 검증이 가능함을 보여주었으며, 개발 생산성을 희생하지 않으면서도 신뢰할 수 있는 고성능 코드 생성 경로를 제시했습니다.
4. 실험 결과 (Results)
KernelBench L1 벤치마크 (LLM 이 생성한 PyTorch 프로그램 기반 CUDA 커널) 를 사용하여 평가했습니다.
안전성 검증 (Memory & Thread Safety):
생성된 커널 중 **74%**에 대해 메모리 안전성과 데이터 레이스 부재를 성공적으로 증명했습니다.
기존 테스트에서 놓쳤던 미묘한 오류 (예: 꼬리 요소 처리 시 발생하는 레이스 컨디션) 를 발견했습니다.
성공 요인: 지식 기반과 주석 가이드가 모두 포함된 경우에만 높은 성공률을 보였으며, 이 요소들이 없으면 검증이 거의 불가능했습니다.
의미 동등성 검증 (Semantic Equivalence):
전체 커널 중 **14%**에 대해 기능적 정확성 (원래 명세와의 동등성) 을 완전히 증명했습니다. 주로 1:1 매핑을 하는 요소별 (element-wise) 커널 (ReLU, HardTanh 등) 에서 성공했습니다.
한계: 축약 (reduction) 이나 복잡한 스레드 간 상호작용이 필요한 커널은 현재 하향 변환 로직의 한계로 인해 검증이 어렵습니다.
오버헤드:
커널당 평균 약 3 분의 오버헤드가 발생했으나, 이는 형식 검증의 높은 신뢰도를 고려할 때 수용 가능한 수준으로 판단됩니다.
5. 의의 및 결론 (Significance)
신뢰할 수 있는 AI 코드 생성: LLM 이 생성한 GPU 코드의 안전성과 정확성을 수학적으로 증명함으로써, 자율 주행이나 항공기와 같은 고신뢰성 시스템에서도 AI 생성 코드를 활용할 수 있는 기반을 마련했습니다.
에이전트 학습의 중요성: 단순한 프롬프트 엔지니어링으로는 형식 검증이 불가능하며, **지식 기반 (Knowledge Base)**과 **경험 기반의 주석 가이드 (Annotation Guide)**가 에이전트의 일반화 능력과 성공률에 결정적인 역할을 함을 입증했습니다.
미래 전망: ProofWright 는 형식 검증과 LLM 을 결합한 새로운 패러다임을 제시하며, 향후 더 많은 CUDA 기능 (Tensor Core 등) 을 지원하고 Rocq-to-VerCors 변환의 신뢰성을 높여 확장될 예정입니다.
요약하자면, ProofWright 는 LLM 이 생성한 복잡한 GPU 코드의 결함을 테스트가 아닌 형식적 증명을 통해 자동으로 찾아내고 수정하는 선구적인 도구로, AI 기반 소프트웨어 개발의 신뢰성 문제를 해결하는 중요한 진전입니다.