BLAZE: Xilinx FPGA용 ZK 가속 Rust 라이브러리
요약
BLAZE는 Xilinx FPGA에서 ZK(Zero-Knowledge) 가속을 구현하기 위한 Rust 라이브러리입니다. 이 라이브러리는 AXI 인프라와 커스텀 모듈 기능을 제공하여 사용자 로직을 FPGA에 로드할 수 있게 합니다. 특히, DriverClient 및 DriverPrimitiveClient 같은 모듈은 복잡한 하드웨어 연결 관리 및 기본 요소 사용 과정을 단순화합니다.
핵심 포인트
- Xilinx FPGA용 ZK 가속 Rust 라이브러리입니다.
- AXI 인프라와 커스텀 모듈을 통해 사용자 로직 구현이 가능합니다.
- DriverClient는 FPGA/AWS와의 연결 설정 및 정보를 제공합니다.
- DriverPrimitiveClient는 기본 요소 사용 과정을 단순화하는 래퍼 역할을 합니다.
blaze는 Xilinx FPGA에서 ZK 가속을 위한 Rust 라이브러리입니다.
면책 조항: 이 릴리스는 HW의 설계 및 처리를 확장하는 것을 목표로 합니다. 따라서 이전 버전과의 하위 호환성이 없으며, F1 지원은 현재 작동하지 않습니다. 곧 수정될 예정입니다.
:fire: Ingonyama AWS F1 AFI가 곧 공개될 예정이니 기대해 주세요!
Rust에서 장치 읽기/쓰기
이 Rust 패키지는 기본적인 AXI 인프라와 커스텀 모듈을 통해 사용자 로직을 처리할 수 있는 기능을 제공합니다. 제공되는 커스텀 모듈은 MSM과 Poseidon hash를 위해 설계되었으며, FPGA에 사용자 로직을 로드할 수 있게 합니다.
또한, 이 라이브러리는 우리의 바이너리 외에도 warpshell https://github.com/Quarky93/warpshell을 사용하여 커스텀 빌드를 작업할 수 있도록 지원합니다.
새로운 설계
새로운 설계는 데이터베이스에서 풀 연결(pool connection)이 작동하는 방식의 아이디어를 기반으로 합니다. 따라서 이 레벨은 특정 연결과의 상호 작용을 포함하며, 연결 선택, 다중 연결, 상태 머신과 관련된 모든 것은 관리 계층(management layer)에 의해 수행되어야 합니다.
연결 측면에서는 관리를 위해 필요한 모든 데이터(방화벽 상태, 현재 작업 번호 등 포함)를 검색할 수 있는 API를 제공할 수 있습니다. 주요 설계 구성 요소는 아래에 설명합니다.
DriverClient
DriverClient 모듈은 FPGA/AWS와 C1100 카드와 같은 알려진 유형의 카드 간에 연결을 설정하도록 설계되었습니다. 이 모듈은 기본 원시 요소(primitives)에 대한 지식을 가지고 있지 않습니다.
DriverClient는 기본적인 IO 메서드를 제공하며 바이너리를 로드할 수 있을 뿐만 아니라 현재 HW에 대한 특정 및 디버그 정보를 제공합니다. 특정 카드 유형의 경우, DriverConfig는 동일하게 유지되며 driver_client_cfg 함수를 사용하여 접근할 수 있습니다.
높은 수준의 관리 계층(high-level management layer)이 어떤 클라이언트와 기본 요소(primitive)를 사용해야 하는지를 결정한다는 점에 유의하는 것이 중요합니다. DriverClient는 이 과정에서 과도하게 사용될 수 있습니다.
새 연결을 생성하는 방법:
let dclient = DriverClient::new(&id,
DriverConfig::driver_client_cfg(CardType::C1100));
DriverPrimitive
다양한 기본 요소를 사용하는 과정을 단순화하기 위해 DriverPrimitiveClient가 생성되었습니다. 이는 DriverClient 연결을 감싸는 래퍼(wrapper)이며, 해당 기본 요소에 필요한 설정 데이터, DriverPrimitiveClient라는 공통 트레이트(trait) 구현체, 그리고 그 기본 요소에만 유효한 공개 및 비공개 메서드를 포함합니다.
각 기본 요소의 설정(예: msm의 경우 주소 공간과 곡선 설명)은 기본 요소 유형을 기반으로 제공되므로, 높은 수준 관리 계층에서 이를 수동으로 구성할 필요가 없습니다.
예를 들어 MSM에 대한 새로운 기본 요소 인스턴스를 생성하려면 다음과 같은 코드를 사용합니다:
let dclient = DriverClient::new(&id, DriverConfig::driver_client_cfg(CardType::C1100));
let driver = MSMClient::new(
MSMInit {
...
DriverPrimitiveClient는 특정 기본 요소에 대한 하드웨어(HW) 계산 상호작용의 기본적인 기능을 포함하는 트레이트입니다. 이는 기본 타입이든 튜플이든 모든 유형의 데이터와 작동할 수 있습니다. 이 트레이트는 초기화, 입력 데이터 설정, 결과 대기, 결과 가져오기 등의 함수를 포함합니다.
데이터 캡슐화를 위해, 각 기본 요소에 특정한 메서드는 공개(주로 특정 오프셋에서 데이터를 검색하는 메서드) 및 비공개(데이터 기록 또는 내부 계산을 위한 특정 데이터 검색 메서드)로 나눌 수 있습니다.
사용의 일반적인 예시
일반성을 보여주기 위해 모든 유형의 기본 요소를 DriverPrimitiveClient라고 지칭하겠습니다.
MSM (Multi Scalar Multiplication) 모듈
이 모듈은 세 가지 곡선(BLS12_377, BLS12_381, BN254)과 두 가지 유형의 하드웨어(HW) 포인트 저장소(DMA 및 HBM)를 지원합니다.
이 함수는 compute MSM에 필요한 데이터를 설정하며, 입력 매개변수에 따라 세 가지 다른 경우를 가집니다.
- DMA 전용 모드: [
MSMConfig]의 포인트 주소를 사용합니다.
MSMInput = {
points: Some(points),
scalars,
...
- HBM 모드 (포인트는 HBM에, 스칼라는 DMA로 설정): 포인트는
offset을 가진hbm_addr주소에서 hbm에 로드됩니다.
MSMInput = {
points: Some(points),
scalars,
...
- HBM 모드 (스칼라만 설정): 포인트는 이전 반복(iteration)에서 HBM에 로드되었습니다.
MSMInput = {
points: None,
scalars,
...
NTT (Number Theoretic Transform) 모듈
이 모듈은 크기 2^27의 NTT 계산을 구현합니다. 사용하려면 요소들의 입력 바이트 벡터를 지정해야 합니다. 각 요소는 리틀 엔디안(little-endian)으로 표현되어야 합니다. 결과 역시 유사한 바이트 벡터가 됩니다.
데이터 전송 과정이 다른 모듈과 약간 다르다는 점에 유의할 필요가 있습니다. 다음은 NTT 사용 예시입니다. 더 자세한 내용은 [LINK TO BLOG]에서 확인할 수 있습니다.
let dclient = DriverClient::new(&id, DriverConfig::driver_client_cfg(CardType::C1100));
let driver = NTTClient::new(NTT::Ntt, dclient);
let buf_host = 0;
...
Poseidon 모듈
테스트 및 벤치마크 실행
MSM (Multi Scalar Multiplication) 테스트
MSM 원시 요소(primitive)에 대한 테스트를 실행하려면 다음 명령을 사용하십시오:
RUST_LOG=<LEVEL_LOG> cargo test -- <TEST_FILE> -- <TEST_NAME>
또한, 다른 테스트는 추가 매개변수(ID, FILENAME, 및 MSM_SIZE)를 필요로 할 수 있습니다.
<LEVEL_LOG>를 원하는 로그 레벨(예: info, debug)로 대체하세요. FILENAME은 바이너리 파일의 경로로, ID는 FPGA 슬롯 번호로 설정합니다.
또한, MSM_SIZE 변수에서 MSM에 여러 개의 포인트를 설정하는 것도 가능합니다.
만약 ID와 MSM_SIZE 값이 제공되지 않으면 각각 ID=0, MSM_SIZE=8192로 기본 설정됩니다.
NTT 테스트
NTT 프리미티브에 대한 테스트를 실행하려면 다음 명령어를 사용하세요:
INFNAME=<INPUT_VEC_FILE> OUTFNAME=<REFERENCE_OUT_VEC> RUST_LOG=<LEVEL_LOG> cargo test -- integration_ntt
또한, 다른 테스트는 추가 매개변수: ID, INFNAME, 그리고 OUTFNAME을 필요로 할 수 있습니다.
<LEVEL_LOG>를 원하는 로그 레벨(예: info, debug)로 대체하세요. INFNAME은 리틀 엔디안 바이트 형식의 입력 벡터 경로로 설정합니다. 정확성을 테스트하는 것이므로, OUTFNAME 변수에 대한 결과를 비교하려는 파일의 경로를 지정해야 합니다. 이 역시 리틀 엔디안 바이트 벡터 파일이어야 하며, ID는 FPGA 슬롯 번호입니다.
만약 ID 값이 제공되지 않으면 각각 ID=0으로 기본 설정됩니다.
NTT 벤치마크
NTT에 대한 벤치마크는 benches 디렉토리에 위치하며, 벤치마크 내부에는 정확성 검사가 없다는 점을 명확히 할 필요가 있습니다. 정확성 검사는 테스트를 사용하세요.
NTT 프리미티브의 벤치를 실행하려면 다음 명령어를 사용하세요:
INFNAME=<INPUT_VEC_FILE> RUST_LOG=<LEVEL_LOG> cargo bench
또한, 벤치마크는 추가 매개변수: ID와 INFNAME을 필요로 할 수 있습니다. INFNAME은 리틀 엔디안 바이트 형식의 입력 벡터 경로로 설정합니다.
만약 ID 값이 제공되지 않으면 각각 ID=0으로 기본 설정됩니다.
Poseidon 테스트
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub ML Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기