본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 25. 03:35

AI 추론의 영지식 증명 입문 ④ EZKL의 Proof Splitting을 사용하여 모델을 분할하고 ZKP화하기

요약

EZKL의 Proof Splitting 기술을 사용하여 대규모 뉴럴 네트워크를 작은 회로로 분할하고 영지식 증명(ZKP)을 생성하는 방법을 설명합니다. 메모리 부족 문제를 해결하고 분산 처리를 가능하게 하는 메커니즘과 구현 과정을 다룹니다.

핵심 포인트

  • Proof Splitting을 통해 피크 메모리를 억제하고 분산 처리가 가능함
  • Public Instances와 KZG Commitments를 이용한 두 가지 회로 연결 방식 제공
  • ONNX 모델 분할 및 각 서브 모델의 독립적인 셋업 과정 설명
  • swap_proof_commitments를 통해 분할된 증명 간 데이터 일치성 및 보안 보장

서론

EZKL로 뉴럴 네트워크 (Neural Network)를 영지식 증명 (ZKP)화하려고 하면, 모델이 조금만 커져도 메모리가 부족해집니다.

그래서 사용하는 것이 Proof Splitting입니다. 큰 모델을 여러 개의 작은 회로 (Circuit)로 분할하여 증명을 생성하고, 마지막에 하나로 연결하는 메커니즘입니다.

Proof Splitting이란

거대한 뉴럴 네트워크를 하나의 회로로 다루는 것이 아니라, 여러 개의 작은 회로로 분할하여 증명을 생성하는 기능입니다.

장점은 두 가지입니다.

메모리 절감: 분할하여 피크 메모리 (Peak Memory)를 억제할 수 있으므로 한 대의 머신에서 처리 가능 -
분산 처리: 여러 머신에 부하를 분산하여 파이프라인 (Pipeline) 처리 가능

리포지토리

2가지 결합 방법

분할된 회로끼리 연결하는 (Stitch) 방법이 2가지 있습니다.

방법중간 출력의 처리유스케이스
Public Instances공개함 (다음 회로의 입력으로 전달)중간 데이터에 기밀 정보가 없는 경우
KZG Commitments숨긴 채로 다항식 커밋먼트 (Polynomial Commitment)를 생성중간 데이터를 비밀로 유지하고 싶은 경우

전체 파이프라인

PyTorch 모델
→ ONNX 내보내기 (network.onnx)
→ 모델 분할 (network_split_0.onnx / network_split_1.onnx)
...

구현

1. 모델 정의 및 ONNX 내보내기

class MyModel(nn.Module):
def __init__(self):
super().__init__()
...

2. ONNX를 2개로 분할

onnx.utils.extract_model을 사용하여 분할 위치를 지정합니다. Netron (https://netron.app/)에서 ONNX의 중간 노드 이름을 확인한 후 자릅니다.

import onnx
# 서브 모델 0: 입력 → conv1 + relu 까지
onnx.utils.extract_model(
...

3. 각 서브 모델의 셋업 (Setup)

async def setup(i):
model_path = f'network_split_{i}.onnx'
settings_path = f'settings_split_{i}.json'
...

매번 파일로 쓰는 이유는 두 가지입니다.

메모리 관리: 모든 서브 모델의 데이터를 변수로 유지하면 OOM (Out of Memory)이 발생함. 불필요한 데이터는 디스크로 보냄 -
분산 처리 상정: 머신 A가 서브 모델 0을 처리하여 파일을 저장하고, 머신 B가 그것을 받아 서브 모델 1을 처리하는 구성에 대응 가능

4. 증명 생성 및 연결

이 부분이 Proof Splitting의 핵심입니다.

def prove_model(i):
proof_path = f'proof_split_{i}.json'
witness_path = f'witness_split_{i}.json'
...

swap_proof_commitments가 필요한 이유

분할 증명의 가장 큰 함정은 부정 (Cheat)의 리스크입니다.

서브 모델 0: 올바른 입력으로 출력 A를 계산했다고 증명
서브 모델 1: 임의로 유리한 다른 입력 B를 사용하여 최종 출력을 계산

이렇게 되면 모델 전체로서 올바른 계산이 수행된 것이 아니게 됩니다.

swap_proof_commitments는 "전 단계의 출력과 다음 단계의 입력이 완전히 일치함"을 증명에 포함시키는 처리입니다. 이를 통해 분할된 증명이 변조 없이 바통 터치되었음을 검증자가 확인할 수 있습니다.

요약

단계포인트
ONNX 분할Netron에서 중간 노드 이름을 확인한 후 extract_model 수행
setup이전 서브 모델의 outputs를 다음 서브 모델의 input_data로 전달
파일 쓰기메모리 절약 + 분산 처리를 위해 매번 디스크에 저장
swap_proof_commitments전후 연결을 증명에 포함. 이것이 없으면 부정을 탐지할 수 없음

큰 모델을 EZKL에 올릴 때는 Proof Splitting이 현실적인 선택지가 됩니다. 메모리가 부족해진다면, 우선 Netron을 사용하여 모델을 어디에서 분할할 수 있는지 확인하는 것부터 시작해 보는 것도 좋습니다.

저자의 다른 실험

LiDAR 점군 (Point Cloud) 분석, 블록체인 × AI 등 다른 프로젝트들도 정리해 두었습니다.

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0