이 기사는 Ingonyama 팀 과 공동으로 작성되었습니다. 이를 가능하게 해준 @jeremyfelder 에게 특별히 감사드립니다.
하드웨어 가속 ZKML
우리는 최근 Ingonyama 팀 이 구축한 오픈 소스 Icicle GPU 가속 라이브러리를 통합했습니다. 이를 통해 개발자는 간단한 환경 구성을 통해 하드웨어 가속을 활용할 수 있습니다.
이러한 통합은 EZKL 엔진의 전략적 향상이며 현재 ZK 증명 시스템에 내재된 계산 병목 현상을 해결합니다. 이는 기계 학습 모델용으로 생성된 회로와 같은 대규모 회로에 특히 유용합니다.
우리는 집계된 회로의 MSM 시간이 기준 CPU 실행에 비해 98% 감소하고, 총 집계된 증명 시간이 기준 CPU 증명 시간에 비해 35% 감소한다는 것을 관찰했습니다.
이는 완전한 하드웨어 통합을 향한 첫 번째 단계입니다. Ingonyama 팀과 함께 우리는 GPU 작업에 대한 전폭적인 지원을 위해 지속적으로 노력하고 있습니다. 또한 우리는 다른 하드웨어 공급업체와의 통합을 위해 노력하고 있습니다. 이상적으로는 더 넓은 분야에 대한 실질적인 벤치마크를 보여줍니다.
아래에 상황과 기술 사양이 나와 있습니다. 아니면 언제든지 여기 도서관 으로 직접 갈 수도 있습니다.
제로 지식 병목 현상
하드웨어 검토: GPU, FPGA 및 영지식 증명을 인용하면 영지식 애플리케이션에는 두 가지 구성 요소가 있습니다.
1. DSL 및 하위 수준 라이브러리: ZK 친화적인 방식으로 계산을 표현하는 데 필수적입니다. 예로는 Circom, Halo2, Noir 및 Arkworks와 같은 하위 수준 라이브러리가 있습니다. 이러한 도구는 프로그램을 제약 조건 시스템으로 변환합니다(또는 여기에서 자세한 내용을 읽어보세요). 여기서 더하기 및 곱셈과 같은 연산은 개별 제약 조건으로 표시됩니다. 비트 작업은 더 까다롭고 더 많은 제약 조건이 필요합니다.
2. 증명 시스템: 증명을 생성하고 검증하는 데 중요한 역할을 합니다. 검증 시스템은 회로, 증인, 매개변수 등의 입력을 처리합니다. 범용 시스템에는 Groth16 및 PLONK가 포함되며, EZKL과 같은 특수 시스템은 기계 학습 모델과 같은 특정 입력을 처리합니다.
가장 널리 배포된 ZK 시스템에서 주요 병목 현상은 다음과 같습니다.
• 다중 스칼라 곱셈(MSM): 벡터의 대규모 곱셈으로, 병렬화하더라도 많은 시간과 메모리를 소모합니다.
• FFT(고속 푸리에 변환): 데이터를 자주 변환해야 하는 알고리즘으로, 특히 분산 인프라에서 속도를 높이기가 어렵습니다.
하드웨어의 역할
GPU 및 FPGA와 같은 하드웨어 가속은 병렬성을 향상하고 메모리 액세스를 최적화하여 소프트웨어 최적화에 비해 상당한 이점을 제공합니다.
• GPU: 빠른 개발과 대규모 병렬성을 제공하지만 많은 전력을 소비합니다.
• FPGA: 특히 대규모 데이터 스트림의 경우 대기 시간이 짧고 에너지 효율적이지만 개발 주기가 복잡합니다.
최적의 하드웨어 설계 및 성능에 대한 보다 광범위한 논의를 보려면 여기를 참조하십시오. 이 분야는 빠르게 발전하고 있으며 많은 방법이 여전히 경쟁력을 갖고 있습니다.
Halo2용 GPU 가속
Halo2 검증 시스템 에서 병목 현상은 검증되는 특정 회로에 따라 달라질 수 있습니다. 이러한 병목 현상은 주로 두 가지 범주로 분류됩니다.
1. MSM(Commitment 병목 현상): 이는 주로 계산 병목 현상이며 일반적으로 병렬화 가능합니다. MSM이 병목 현상을 일으키는 회로에서는 어느 정도의 일반성이 관찰됩니다. 즉, GPU 가속 솔루션을 적용하면 기존 코드 베이스를 최소한으로 수정하면서 이러한 병목 현상을 효과적으로 해결할 수 있습니다.
2. 제약 조건 평가 병목 현상(특히 h-poly에서): 이러한 병목 현상은 계산이나 메모리 집약적일 수 있기 때문에 더 복잡합니다. 이는 회로의 세부 사항에 크게 의존합니다. 이러한 문제를 해결하려면 평가 알고리즘을 맞춤형으로 재설계해야 합니다. 여기서 초점은 메모리 사용량과 계산 간의 균형을 최적화하고 중간 결과를 저장할지 아니면 다시 계산할지 결정하는 것입니다.

대표적인 예가 KZG 집합 회로입니다. 이러한 회로에서 주요 과제는 타원 곡선 그룹의 요소를 축적하는 것입니다. 이러한 경우 제약 조건은 상대적으로 균일하고 낮은 수준입니다(예: Halo2 문서 에 따르면 레벨 4 제약 조건이 있는 불완전한 추가 공식).
따라서 대부분의 복잡성은 GPU 가속을 통해 효율적으로 해결할 수 있는 계산 문제인 커밋(MSM)에서 비롯됩니다.
이 통합 범위에서 우리는 약정 병목 현상에 초점을 맞추기로 결정했습니다. 이는 쉬운 결과이며 엔진의 핵심 구성 요소(KZG 집계)의 최적화입니다. 이것은 단지 첫 번째 단계일 뿐이며, 아직 해야 할 일이 많이 남아 있습니다.
고드름: CUDA 지원 GPU
Ingonyama 팀은 CUDA 지원 GPU를 사용하여 ZK 설계를 가속화하기 위한 오픈 소스 라이브러리로 Icicle을 개발했습니다. CUDA(Computing Unified Device Architecture)는 NVIDIA가 만든 병렬 컴퓨팅 플랫폼이자 API 모델입니다. 이를 통해 소프트웨어는 범용 처리를 위해 NVIDIA GPU를 활용할 수 있습니다. Icicle의 주요 목표는 증명 프로그램 코드의 상당 부분을 GPU로 오프로드하고 병렬 처리 기능을 활용하는 것입니다.
Icicle은 Rust 및 Golang의 API를 호스팅하여 통합을 단순화합니다. 디자인은 다음과 같은 세부 사항으로 사용자 정의할 수도 있습니다.
• 고급 API: 다항식 제출, 평가 및 보간과 같은 일반적인 작업용입니다.
• 하위 수준 API: MSM(다중 스칼라 곱셈), NTT(수론적 변환) 및 INTT(역수론적 변환)와 같은 특정 연산용.
• GPU 커널: GPU에서 특정 작업의 최적화된 실행을 위한 것입니다.
Icicle은 다음과 같은 기본 기능을 지원한다는 점은 주목할 가치가 있습니다.
• 벡터화된 필드/그룹 산술: 필드 및 그룹에 대한 수학 연산을 효율적으로 처리합니다.
• 다항식 산술: 많은 ZK 알고리즘의 핵심입니다.
• 해시 기능: 암호화 애플리케이션에 중요합니다.
• 복잡한 구조: 역타원곡선 수론 변환(I/ECNTT), 배치 MSM 및 Merkle 트리 등.
EZKL과 통합
Icicle 라이브러리는 EZKL 엔진과 원활하게 통합되어 NVIDIA GPU에 직접 액세스하거나 Colab에 간단히 액세스하는 사용자에게 GPU 가속을 제공합니다. 이러한 통합은 GPU의 병렬 처리 기능을 활용하여 EZKL 엔진의 성능을 향상시킵니다. 이 기능을 활성화하고 관리하는 방법은 다음과 같습니다.
• GPU 가속 활성화: GPU 가속을 활성화하려면 Icicle 기능을 사용하여 시스템을 구축하고 환경 변수를 다음과 같이 설정합니다.
ENABLE_ICICLE_GPU=true 내보내기
• CPU로 되돌리기: CPU 처리로 다시 전환하려면 ENABLE_ICICLE_GPU 환경 변수를 false로 설정하는 대신 설정을 해제하면 됩니다.
ENABLE_ICICLE_GPU 설정 해제
• 소형 회로에 대한 임계값 사용자 정의: 소형 회로를 구성하는 임계값을 수정하려는 경우 ICICLE_SMALL_K 환경 변수를 원하는 값으로 설정할 수 있습니다. 이를 통해 GPU 가속이 사용될 때 더 효과적으로 제어할 수 있습니다.

현재 ICICLE 통합 개요. 이 통합은 MSM으로 인한 계산 병목 현상을 목표로 하며 KZG 집계 회로에서 상당한 효과가 나타납니다.
주요 기능
이 통합은 여러 가지 기술 지원을 제공합니다.
가장 중요한 점은 통합이 Icicle 라이브러리를 사용하여 GPU에서 플러그 앤 플레이 MSM 작업을 지원한다는 것입니다. 대상 및 테스트 환경으로서 우리는 EZKL 집계 명령에서 CPU 기반 KZG 약속을 대체하는 데 중점을 둡니다. 여러 증명이 하나로 결합되는 경우입니다. 보다 구체적으로 KZG는 BN254 타원 곡선(GPU에서 수행)에 대한 MSM 작업과 비교하여 commit 및 commit_lagrange(CPU에서 수행)를 커밋합니다.
또한 개발자가 동일한 바이너리/빌드 EZKL의 서로 다른 회로 간에 CPU와 GPU를 전환할 수 있도록 환경 변수와 크레이트 기능을 활성화했습니다. GPU 전환을 최적화하기 위해 GPU 가속은 기본적으로 대형 k 회로(k > 8)에 대해서만 활성화됩니다.
벤치마크 결과
벤치마크 결과에 따르면 Icicle 라이브러리를 EZKL 엔진에 통합하면 성능이 크게 향상되는 것으로 나타났습니다.
• MSM 시간의 대폭 감소: 통합 회로의 기본 CPU 실행과 비교하여 MSM(다중 스칼라 곱셈) 시간이 약 98% 감소한 것을 관찰했습니다. 이는 컴퓨팅 작업을 GPU로 효율적으로 오프로드하는 것을 보여줍니다.
• 훨씬 더 빠른 MSM 작업: ICICLE은 기본 CPU 구성에 비해 평균적으로 50배 더 빠르게 MSM 작업을 수행합니다. 이 속도 향상은 집계 명령의 대부분의 MSM에서 일관됩니다.
• 전체적인 증명 시간 감소: 집계 증명을 생성하는 데 필요한 전체 시간은 기본 CPU 증명 시간에 비해 약 35% 감소합니다. 이는 증명 생성 중 전반적인 성능이 크게 향상되었음을 반영합니다.
이러한 결과는 특히 MSM 작업과 같은 계산 측면에서 ZK 증명 시스템을 최적화하는 데 있어 GPU 가속의 효율성을 강조합니다. 확인하려면 여기에서 지속적인 통합 테스트를 확인하세요.
앞으로의 발전방향
앞으로 우리는 Icicle과 통합하는 EZKL의 기능을 더욱 최적화하고 확장할 계획입니다.
• GPU 작업 확장: 초점 영역 중 하나는 더 많은 CPU 작업을 GPU로 대체하는 것입니다. 여기에는 현재 CPU 기반인 NTT(수론적 변환)와 관련된 작업이 포함됩니다. 이러한 작업을 GPU에 오프로드함으로써 효율성과 속도가 향상될 것으로 기대합니다.
• 일괄 작업 도입: 또 다른 중요한 발전은 일괄 작업의 추가입니다. 이 향상된 기능은 더 작고 더 넓은 회로에서도 GPU를 효율적으로 사용할 수 있도록 특별히 설계되었습니다. 이를 통해 우리는 GPU 가속의 이점을 더 넓은 범위의 회로 유형과 크기로 확장하여 모든 시나리오에서 최적의 성능을 보장하는 것을 목표로 합니다.
보다 광범위하게는 다른 하드웨어 시스템과의 통합을 추구합니다. 이는 더 넓은 범위의 도메인에 기능적 벤치마킹과 개발자 유연성을 제공할 것입니다.
이러한 향후 개발을 통해 우리는 ZK 증명 시스템의 성능 한계를 지속적으로 확장하여 더 효율적이고 다양한 응용 분야에 적합하게 만드는 것을 목표로 합니다.
부록
향후 통합 고려 사항
기여자와 개발자를 위해 우리는 4가지 증명이 있는 사용자 정의 인스턴스에서 집계 명령 튜토리얼을 사용하여 이 통합을 테스트했습니다. 향후 통합에 대한 몇 가지 참고 사항
• 벤치마크 환경: AMD Epyc 7R13의 벤치마크 CPU와 함께 AWS c6a.8xlarge 인스턴스를 사용하여 c 테스트를 실행합니다.
• 집계 명령 튜토리얼: 이를 입증하기 위한 4가지 기준 비교가 포함된 테스트 인스턴스를 포함하여 집계 명령 튜토리얼을 사용하여 통합 성능을 검증했습니다.
• 단일 MSM 인스턴스에 대한 초기 테스트: 처음에 테스트는 기능을 확인하기 위해 EZKL/halo2 상자에 있는 단일 MSM 인스턴스에 중점을 둡니다.
• 완전한 증명의 GPU 컨텍스트 문제: 완전한 증명으로 확장할 때 단일 작업 후에 GPU 컨텍스트가 손실되는 것으로 나타났습니다. Prove 명령 전체에서 GPU 컨텍스트를 유지하기 위해 정적 참조를 생성하여 솔루션을 얻을 수 있습니다.
• 집합 회로/명령에 초점: 이 통합은 주로 큰 K(제약 조건 수)와 적은 수의 조언 열이 특징인 집합 회로/명령에 중점을 둡니다.
• 증명 명령에 대한 영향: 코드 수정은 증명 명령에도 영향을 미칩니다. 이러한 변화에 따라 개별 증명의 성능이 유지되거나 향상되는지 확인하는 것이 필요합니다.
• 회로 크기 및 폭에 따른 성능 변화: 큰 회로와 좁은 회로 모두에서 GPU 향상으로 긍정적인 결과가 나왔습니다. 그러나 더 작고(K≤8) 더 넓은 회로의 경우 GPU 향상으로 인해 성능이 저하됩니다.
• 일반 최적화의 향후 개선 사항: 다양한 회로 크기에 걸쳐 최적의 성능을 달성하기 위한 배치 작업에 특히 중점을 두고 모든 회로 유형에 대한 GPU 통합을 강화할 계획입니다.




