Chutes-Audit 新版本发布通知

📢 Chutes-Audit 新版本发布通知

一个包含重要性能优化与修复的新版本已发布:
🔗 PR 链接:https://github.com/rayonlabs/chutes-audit/pull/8
🔗 推荐机器规格:README - Recommended Machine Specs


🚀 主要更新内容

  1. 数据库优化

    • invocations 表改为 分区表
      每小时的审计数据独立存储为一个分表 → 新数据写入和查询性能稳定,不会因历史数据增长而下降。
    • 旧数据清理更高效:直接删除过期分表,避免昂贵的 DELETE + VACUUM ANALYZE 操作。
  2. 查询优化

    • 重写查询逻辑,支持分区表的 并行顺序扫描
    • 大部分场景下无需索引 → 写入性能显著提升
  3. 计算修复

    • 修复了之前计算中的错误:私有调用 / 计算单元错误地被计入分数,现在已排除。
  4. 多进程并行处理

    • 数据转换任务支持 多核并行,充分利用 CPU 资源。
  5. Postgres 参数优化

    • 调整 Postgres 启动参数,允许更多 worker 并更好利用内存,进一步提升性能。

⚠️ 注意事项

  • 需要完全重置审计系统

  • 两种升级策略:

    1. 直接升级 → 等待系统追上数据再重新设置权重;
    2. 新机器并行跑 → 在新机器上跑新版,config/config.yml 中设置 set_weights: false,待数据追上后关闭旧版,更新新机器配置 set_weights: true 并重启。

🛠️ 升级步骤

1
2
3
4
docker compose down
docker compose build auditor
docker volume rm chutes-audit_postgres_data
docker compose up -d

⏱️ 性能实测

  • 两台不同的节点测试:

    • 节点一:7小时32分钟 完成初始数据加载
    • 节点二:6小时46分钟 完成初始数据加载

这是一个关于 Chutes 审计系统的详细文档,我已经为你翻译好了。


Chutes Audit 审计系统

该系统旨在通过多种机制帮助验证者向矿工分发请求的公平性。尽管未来还会增加更多功能,但目前的实现已在很大程度上达到了这一目标,并且可以由任何感兴趣的人运行,而不仅仅是拥有大量权益的验证者。

为了完整验证7天审计窗口内的所有区块,你必须使用归档(archive)子张量节点,或使用带有 --state-pruning 60000 参数的本地子张量节点,以确保你保留了足够的区块来验证 set_commitment 调用。

推荐机器配置

  • 16个或更多 CPU 核心
    • 请注意,单核性能也至关重要,请选择一个快速的 CPU(例如 3+ GHz)。
    • 如果你必须在更多核心和更少但更快的核心之间做出权衡,选择更快的核心可能会更有益(但相应地调整 docker-compose.yaml 中的 worker 数量等,以匹配你的配置)。
  • 理想情况下 64GB+ 内存,但也可以在更少的内存下运行。
    • 相应地调整 docker-compose.yaml 文件,例如共享内存大小(shm size)、Postgres 缓存大小等。
  • 1TB+(快速)硬盘
    • 这应该是一个本地连接的 NVMe/SSD,最好是 RAID 1 或 RAID 10,以提供一定的冗余和弹性。
    • 尽量避免网络附加存储或共享驱动器,这些可能会遇到高延迟、低 IOPS 等问题。
    • 磁盘性能在这里非常重要,因为大部分计算都在 Postgres 中进行。

你可以使用配置较低的机器,但性能当然会是次优的,并且可能需要根据下面的说明调整设置。

Postgres 配置

根据核心数量、内存等,你可能希望更改 docker-compose.yml 文件中的 Postgres 命令,相应地增加或减少各项值。

首次同步

第一次运行该系统时,同步会花费非常长的时间,可能超过8个小时。使用更快的磁盘/CPU 和更多的内存会有帮助。在首次同步完成之前,你将无法设置权重。

合成数据(Synthetics)以确保审计导出/权重的完整性

如果配置了 synthetics.enabled 和一个有效的 API 密钥,审计系统将持续为所有标准模板生成合成数据。对于每个请求,它将使用 chutes 调用跟踪系统来准确获取请求被路由到哪个矿工、任何触发重试到另一个矿工的错误等,并验证每个合成数据是否都出现在验证者的审计导出文件中。调用数据应该总是出现在审计系统提取的调用导出文件中。

跟踪示例:

1
2
3
4
Attempting to perform synthetic task: task_type='image'
Invoking chute.name='AnimePastelDream' at https://chutes-animepasteldream.chutes.ai/generate
2025-02-10T15:51:19.216856 [invocation_id=f225adc1-da28-4de9-8640-a2993cc8c1f7 child_id=3e1d4eec-0ac7-4ae5-a5a0-04e54108cfe1 chute_id=791ea6b9-04b6-5f75-9f42-b30259553277 function=generate]: attempting to query target=d669c3e4-1e1f-41b5-b2ab-0f5dc330ca58 uid=49 hotkey=5EHhZEcksG5mds1j5HvKLhk4DZSe5AUkqFeeiDD23VYS8WG1 coldkey=5FhEkzwyGXdoktoE2i3VJWH12mW29YsQ2hBWC5gJMCWCxVyk
[image]

所有输出默认都会被渲染(包括播放音频和渲染图像!),但你可以为每种合成类型关闭渲染。
有关额外的合成配置选项,请参阅 config/config.yml

比较验证者指标与矿工自报指标

审计脚本的一个功能是比较矿工从其 Prometheus 报告的指标与验证者的调用计数。Prometheus 指标与验证者的 Postgres 数据库相比总会有些不准确,原因很简单,因为在 extras 剧本中配置的 Prometheus 服务器只是一个无状态的 Pod,没有状态存储(所以如果它重启,数据就会重新开始)。此外,可能还存在由 wireguard / calico 等引起的抓取指标时的潜在问题。尽管有这些问题,你仍然可以看到审计系统显示,矿工报告的摘要指标与调用导出文件中的数据有大约 90% 的一致性(且差异通常是 Prometheus 统计数据的报告不足,这在某种程度上是预期中的)。

1
2
3
4
5
6
7
Miner 5FhMaRd59y5nyDEtCz1JMMEMZzAGimtmC8m5AfCeXVE3vzCx has full audit report coverage [601200 seconds]
Miner 5Fpw5S6drw26vujZVoCwjQWfmgv6Vp82Jqj2Fxw3dGaZsrGt has full audit report coverage [601200 seconds]
Miner 5FvLzisiVtovB8zAuX3Jqne9T3gqiEyCbRx4Z4Ly6ETc3WXg has full audit report coverage [601200 seconds]
...
Miner 5FhMaRd59y5nyDEtCz1JMMEMZzAGimtmC8m5AfCeXVE3vzCx reported 103655 vs audit 108817: agreement ratio 0.9526
Miner 5Fpw5S6drw26vujZVoCwjQWfmgv6Vp82Jqj2Fxw3dGaZsrGt reported 63950 vs audit 65077: agreement ratio 0.9827
Miner 5FvLzisiVtovB8zAuX3Jqne9T3gqiEyCbRx4Z4Ly6ETc3WXg reported 100763 vs audit 108142: agreement ratio 0.9318

重现激励计算

每当有新的审计数据可用时,系统将下载包含每个调用(以及计算乘数、赏金、错误消息等)的 CSV 导出文件,这些文件对应于该审计条目所代表的那一小时。一旦加载了整个7天历史的审计导出文件,审计系统就可以在本地计算和重现权重,并将其与当前的元图(metagraph)权重进行比较。由于权重复制器以及 Chutes 验证器和审计导出文件之间可能存在的几秒到几分钟的潜在差距,总会有一些微小的差异,但结果应该非常接近。

输出示例:

1
2
3
4
Calculated incentive locally for 5F22KgAv4kvJEMcmPoWLLMkAysFUALH9JLJh9exg7QFv6s5H [  2]: 0.08938 vs actual 0.08960, delta 0.00021
Calculated incentive locally for 5EemLYa94DLwmY35g6EfLTuahnf5iHvQULjhQp3UUPyb3Tok [ 3]: 0.11454 vs actual 0.11307, delta 0.00147
Calculated incentive locally for 5CaqyHE9eBPyN469MNKor8R3zoyNsQwCzMZjd51xAR66S8tF [ 5]: 0.18241 vs actual 0.18234, delta 0.00007
Calculated incentive locally for 5DFurcu7b4XbArin6Rjw2Yev4AE3ScxyByGXxpatJs956eth [ 6]: 0.07283 vs actual 0.07300, delta 0.00016

如你所见,这里的差异非常小,小于 0.2%

作为验证者独立设置权重

如果你愿意,除了使用子热键(child hotkey)或运行一个包含所有昂贵功能的完整验证者之外,你还可以使用该系统根据审计导出数据独立设置权重。要做到这一点,请更新 config/config.yml 文件,例如:

1
2
3
4
set_weights:
enabled: true
ss58_address: 5GerCEPSx22bmr5Wnm2wj87SSpZiVvhVqFUrGG5795XkUbjr
secret_seed: '0x971c2a6674d0861ade72297d11110ce21c93734210527c8f4c9190c00139ce20'

运行审计器

在尝试运行审计器之前,请务必仔细检查 config/config.yml 文件并进行任何你希望的更改。最重要的更改包括:

  1. 用一个有效的 Chutes API 密钥配置 api_key。你可以通过 CLI 或 chutes.ai 网站注册,然后获取一个 API 密钥(同样,可以使用 chutes keys create --name foo ... 命令或从网站获取)。
  2. 如果你是验证者,已在 64 子网上注册,并且希望设置权重,请确保配置 set_weights 部分,填入你的 SS58 地址和热键种子。

注意:你需要给账户充值,或者通知 Chutes 团队你的用户名以启用免费访问,或者如果你是验证者/子网所有者,使用 chutes link ... 命令来启用免费访问:https://github.com/rayonlabs/chutes?tab=readme-ov-file#-validators-and-subnet-owners

更新配置后,有两种运行方式:

选项 1:运行自动更新器(确保你已安装 Python)

如果需要,安装 pm2

1
2
3
apt-get install -y -qq nodejs npm
npm i -g -q pm2
apt-get install -y -qq jq

运行自动更新器

1
pm2 delete autoupdates || true && pm2 start --name "autoupdates" "python utils/autoupdater.py"

选项 2:只使用 docker-compose

1
docker compose up --build auditor

选项 3:安装 Python、Poetry 等,并在不使用 Docker 的情况下运行
你需要安装 portaudio2 或禁用音频渲染,例如 sudo apt-get -y install libportaudio2
你还需要 Poetry 来管理依赖项(或者你可以从 pyproject.toml 中解析出依赖要求),例如 curl -sSL https://install.python-poetry.org | python3 -
确保你本地运行了 Postgres(如果愿意,可以使用提供的 docker-compose 文件来运行),并设置 POSTGRESQL 环境变量,例如:export POSTGRESQL='postgresql+asyncpg://user:[email protected]:5432/chutes_audit'