导读
从现在开始,我们所有的基准(Benchmark)数据都将公开。在这篇博文中,我们使用了一个新的开源FPGA加速器-针对Grøstl哈希来演示如何使用我们的数据库。这是我们ZK-Score[1]提案的后续工作。
基准测试
对任何ZK从业者来说,基准测试都是一个关键的信息。透明和广泛的基准测试使开发人员和研究人员能够为他们的用例选择和使用最有效的硬件实现,并验证和比较实现结果。为了继续ZK-Score的相关工作,并利用我们在该领域的独特地位,我们专注于重要ZK原语的硬件基准测试:NTT,MSM和Hash函数。
资料来源:zk-benchpaper
基准测试工具包
基准测试工具包的核心是一个SQL数据库,它存储了不同ZK原语的基准测试数据。SQL表记录了关于硬件平台的数据、有限域信息以及与特定原语相关的基准数据。 硬件平台会记录运行基准测试的设备类型、驱动程序和机器规格。有限域信息存储了关于用于基准测试的曲线的细节。基准数据必须包括与运行时性能相关的所有信息,如设备温度、每秒模数乘法次数、输入大小等。下表展示了收集的不同数据结构。
可视化ZK基准测试数据
以MSM为例,下面的数据透视表比较了不同输入数据大小和硬件的性能(例如运行时间,功率)
MSM的例子
创建一个真正全面的基准数据库需要整个社区的努力。因此,该数据库是公开可供阅读的,也可以提交您在本地进行并希望共享的基准测试的条目。文章后面将提供相关说明。
查询数据库
该数据库托管在benchmarks.ingonyama.com,用户guest_user可以使用只读权限查询数据库。
arduino
psql -h benchmarks.ingonyama.com -U guest_user -d ingo_benchmarks -c
"SELECT * FROM poseidon_benchmark;"
使用命令行工具psql或任何Postgres用户界面,您可以简单地连接到数据库并提交查询。有关详细信息,请按照连接到基准数据库的指南[2]进行操作。
Grøstl的基准测试
Grøstl[3]是作为NIST密码哈希算法竞赛[4]的一部分开发的哈希函数。这种哈希函数最近被强调为基于towers of binary fields[5]的新多项式承诺方案中的主要计算瓶颈。因此,它是FPGA加速的首选候选。我们的新实现是开源[6]的:
Grøstl系统概述
我们将演示如何使用基准测试工具包上传基准测试数据,然后处理一些有趣的结果。
安装Grøstl基准
为了将基准测试数据加载到基准测试工具包中,我们首先需要为Grøstl哈希算法创建一个表。
sql
\connect ingo_benchmarks
CREATE TABLE grostl_benchmark (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
project VARCHAR(1024),
test_timestamp TIMESTAMP,
git_id VARCHAR(100),
frequency_MHz INT,
tree_height BIGINT,
batch_size BIGINT,
runtime_sec REAL,
power_Watt REAL,
chip_temp_C REAL,
throughput_GiB_sec REAL,
msg_size BIGINT,
comment VARCHAR(1024),
-- relationships
runs_on INT,
FOREIGN KEY (runs_on) REFERENCES hw_platform (id),
uses INT,
FOREIGN KEY (uses) REFERENCES finite_field (id)
);
GRANT SELECT ON ALL TABLES IN SCHEMA public TO guest_user;
现在已经创建了表,我们可以用一个简单的脚本[7]将数据加载到数据库中。
处理Grøstl基准
查询数据库很简单。
bash
#!/bin/bash
set -e # Exit immediately if a command exits with a non-zero status
QUERY="SELECT id, project, batch_size, msg_size, runtime_sec, throughput_gib_sec, test_timestamp, git_id, frequency_mhz, power_watt, chip_temp_c, comment FROM grostl_benchmark;"
# Set database connection parameters
if [ -z "${INGO_BENCHMARKS_DB_HOST}" ] || \
[ -z "${INGO_BENCHMARKS_DB_PORT}" ] || \
[ -z "${INGO_BENCHMARKS_DB_NAME}" ]; then
echo "Define INGO_BENCHMARKS environment variables"
exit 1
fi
DB_HOST="${INGO_BENCHMARKS_DB_HOST}"
DB_PORT="${INGO_BENCHMARKS_DB_PORT}"
DB_NAME="${INGO_BENCHMARKS_DB_NAME}"
DB_USER="guest_user"
psql -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "$QUERY"
上面的shell脚本将根据查询输出基准数据。您可以尝试自己从Ingonyama基准测试数据库中获取这些数据。
基准数据自动收集
关注ICICLE(Ingo的开源GPU加速库)[8]时,一个希望加速其Prover的开发者可能不仅想要与其他库比较性能,还想针对特定用例的输入对其ICICLE Prover进行基准测试。目前,这将需要从头开始编写大量代码。 目前基准测试工具的另一个问题是缺乏与CI/CD系统的集成。ZK的性能对代码更改很敏感,工程师必须了解修改对系统的影响。
Github Actions集成
Github Actions结合基准测试工具包,允许您运行基准测试并为每次git提交持续记录性能数据。
bash
name: Run Icicle Benchmarks
on: [push]
jobs:
my_job:
runs-on: self-hosted
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Run a command
run: echo "Running on self-hosted runner"
- name: Print Current Working Directory
run: pwd
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: ./benchmarks/Poseidon
file: ./benchmarks/Poseidon/.devcontainer/Dockerfile
load: true
tags: zk-image:latest
- name: Run Docker container
run: |
docker run --rm --gpus all zk-image:latest build/benchmark
# You can add additional commands here to interact with your container
上面的例子正在运行一个ZK容器,以及来自ICICLE Poseidon哈希实现的Poseidon哈希基准测试。基准测试工具将记录Poseidon哈希的性能;如果基准测试低于某个最低性能预期,甚至可以通知CI(持续集成)过程。
ZKBench
ZKBench 是一个rust库,可以用作criterion benchmarks(流行的Rust基准库)的插件。 使用 ZKBench ,你可以将基准测试工具包集成到你现有的标准基准测试中。 ZKBench 能够自动收集基准测试所需的许多数据点。
ini
use zkbench::{MsmBenchmark};
criterion_group!(
name = benchs;
config = Criterion::default().with_measurement(zkbench::new(zkbench::from_benchmark_template(MsmBenchmark::default())));
targets = bench
);
托管基准数据库
基准测试工具包是完全开源的,可以自托管。 如果您有兴趣托管自己的数据库,我们可以让这个过程变得简单。目前,我们支持在EC2实例(或任何服务器)上运行基准测试工具包;但是,如果需要的话,我们会为RDS添加自动化支持。我们建议使用EC2或类似的服务,因为它更便宜。
部署基准测试数据库非常容易,并且在我们的指南中有详细的说明。
我们提供CloudFormation模板,可以轻松部署免费层EC2实例,甚至可以为您配置网络和安全规则。为了部署基准测试工具,我们使用Docker Compose。在配置环境变量并安装依赖项之后,您只需运行:
docker-compose up -d
现在您的数据库现在应该已经配置完毕,可以集成到项目中了。我们提供了一些基本的脚本[9]来运行基准测试和测试您的设置。
免责声明和后续步骤
如果您有兴趣添加您的基准测试结果,您可以发送电子邮件到benchmarks@ingonyama.com或提交问题:github.com/ingonyama-z...
结果必须由第三方重现 (最好是开源),基准测试应该根据这些准则存储在json或xls文件中。 虽然DB中的所有结果都是由Ingonyama团队测量和记录的,但我们并不声称 这些结果是我们的最佳结果。
在我们这边,我们计划维护公共基准数据库,以及自动化工具,如 ZKBench 。随着更多的基准测试的执行,我们还将改进我们的数据库表,以包含更详细的运行时数据。最重要的是,我们希望尽快规范数据库,以反映不同形式的ZK-Score。
社区反馈,非常感谢🙏🏻
联系我们
Discord: discord.com/invite/qkBV...
Twitter:twitter.com/Ingo_zk
Github:github.com/ingonyama-z...
YouTube:www.youtube.com/@ingo_zk
参考资料
[1]
ZK-Score: zkproof.org/2023/10/23/...
[2]
Benchmark数据库指南: github.com/ingonyama-z...
[3]
Grostl: www.groestl.info/
[4]
NISTs哈希算法竞赛: csrc.nist.gov/projects/ha...
[5]
towers of binary fields: gitlab.com/UlvetannaOS...
[6]
Grostl开源实现: github.com/ingonyama-z...
[7]
grostl加载脚本: github.com/ingonyama-z...
[8]
ICICLE: github.com/ingonyama-z...
[9]
基准测试脚本: github.com/ingonyama-z...
本文使用 markdown.com.cn 排版