密码学 - TFHE-hpu-mockup - Zama-Ai

  • zama-ai
  • 发布于 2025-05-20 19:48
  • 阅读 13

本文介绍了TFHE-hpu-mockup,一个HPU硬件的仿真替代实现,它可以与没有硬件支持的tfhe-hpu-backend无缝配对。该mockup旨在透明地集成到用户应用程序中,生成与真实硬件匹配的跟踪,并为RTL仿真生成精确的golden stimuli。它还支持固件开发,提供准确的性能估算和跟踪功能。

TFHE-hpu-mockup

简介

HPU硬件的模拟 直接替换 实现。 这个模拟实现可以与在没有任何硬件支持的情况下编译的 tfhe-hpu-backend 无缝配对(即 hpu-v80hpu-xrt)。 实际上,在没有硬件支持的情况下,tfhe-hpu-backend 对底层FFI的调用会被IPC调用替换,并且可以被这个模拟实现拦截。

这个模拟的目的是:

  • 与用户应用程序的透明集成:

    用户无需更改他的应用程序代码。 生成的跟踪必须与在真实硬件上获得的跟踪匹配(除了时间戳)

  • 激励生成

    获得的结果必须是位精确的,以便为RTL模拟生成黄金激励 RTL参数必须在运行时完全可配置,以便轻松地为任何配置生成激励

  • 固件开发

    生成准确的性能评估和跟踪能力,以帮助HPU固件的开发/优化

Mockup结构

在没有硬件支持的情况下,tfhe-hpu-backend 回退到模拟FFI接口(即 ffi-sim)。这个接口绑定到一个IPC通道,并通过IPC以一个简单的Cmd/Payload消息和Request/Ack协议转发FFI调用。该Mockup绑定到那些IPC并响应请求,就像真实的硬件一样。

在它这一侧,mockup响应backend的IPC请求并模拟硬件行为。 mockup的内部结构围绕着模拟硬件行为的模块组织。它包含以下模块:

  • memory: 模拟内存,例如Ddr和Hbm(仅从行为角度来看)。它支持分配/释放内存块。这些块可以通过IPC进行读/写,其同步机制与真实硬件相同。
  • regmap: 模拟RTL寄存器映射。它将具体的TFHE/RTL参数转换为寄存器值。
  • ucore: 模拟ucore行为。它负责从HBM读取DOp流,并以与真实硬件中相同的方式修补模板操作,以获得相同的已修补DOp ucode。

注意:对instruction_scheduler的建模是高效固件生成所必需的,因此直接在tfhe-hpu-backend crate的isc_sim模块中完成。mockup直接重用这个实现。

Mockup是一个独立的二进制文件,必须在用户应用程序代码之抢跑。 使用两个二进制文件可以:

  • 在不影响用户应用程序的情况下,公开广泛的mockup配置
  • 拥有不同的日志流:一个用于mockup,一个用于用户应用程序。因此,与真实硬件相比,用户应用程序的跟踪日志保持不变。

下面是Mockup内部结构的概述。 HPU Mockup

Mockup启动后,它在一个文件中注册一个IPC配置通道,ffi-sim 可以读取该文件以建立连接。 完成后,会发生以下步骤:

注意:使用的文件名在FFI部分的TOML配置文件中设置。环境变量可以在文件名中使用。

[fpga.ffi.Sim]
ipc_name="/tmp/${USER}/hpu_mockup_ipc"
  1. 使用配置通道交换一组IPC端点:一个用于寄存器访问,一个用于内存管理。这些通道实现了一个简单的Cmd/Payload消息和Request/Ack协议。
  2. tfhe-hpu-backend 通过关联的IPC通道读取寄存器,并检索关联的mockup参数。
  3. tfhe-hpu-backend 分配所需的板载内存。然后,它上传固件翻译表(用于将IOp扩展为DOp流)和TFHE服务器密钥集。然后,它上传输入密文。
  4. 一旦所有输入数据在mockup上同步,tfhe-hpu-backend 通过将操作推送到 WorkQ 中来触发IOp执行。 4.1 HPU行为模型从HBM内存中检索关联的DOps流。为此,它使用 ucore 模块。这个模块读取内存并修补获得的流,以获得要执行的具体DOp(固件翻译表有一些模板化的DOp,必须在执行前将其翻译成具体的DOp) 4.2 然后,DOp流被注入到 instruction scheduler 中,以获得真实的执行顺序和性能评估。 4.3 HPU行为模型从内存中检索密钥材料(即HPU格式),并将其转换回Cpu格式。 4.4 HPU行为模型借助 tfhe-rs 操作执行DOp。 4.5 在需要时,执行模型从 regfile 读取密文。

    注意:密文以HPU格式存储在 regfile 中,并在执行前转换回CPU格式。

  5. 当IOp执行完成时,Mockup通过 AckQ 通知 tfhe-hpu-backend
  6. tfhe-hpu-backend 在IPC通道的帮助下从HBM检索结果。

Mockup CLI和配置

mockup应用程序由两个文件配置:

  1. 配置(即 --config CLI knob) 它与 tfhe-hpu-backend 使用的相同。它被mockup应用程序用来检索 ffi-sim 配置、寄存器映射以及板载内存的预期内存布局。

  2. 参数(即 --params CLI knob) 此文件用于检索内部RTL参数,例如:

    • TFHE参数集
    • NTT内部结构
    • 指令调度器属性
    • 每个HBM连接的PC配置

还有其他可选的配置knob可用:

  • --freq-hz, --register, isc-depth: 这些knob用于在飞行中覆盖某些参数。它们对于快速探索很有用。
  • --dump-out, --dump-reg: 用于RTL激励生成和调试
  • --report-out, report-trace: 用于详细分析性能报告
  • --nops: 禁用tfhe-rs计算。显然会导致不正确的行为,但可以进行准确的性能评估。
  • --log-out: 将跟踪消息写入给定的文件而不是stdio。

最重要的是,tfhe-hpu-mockup 可以在运行时生成一组详细的跟踪点,以帮助在调试/探索阶段(例如,在编写新的Hpu固件时)。 这些跟踪点依赖于 tokio-tracing,并且可以通过 RUST_LOG 环境变量在基于path::verbosity的基础上激活。 例如,以下值将为所有设计启用info跟踪,并为ucore子模块启用debug跟踪: RUST_LOG=info,tfhe_hpu_mockup::modules::ucore=debug

注意:使用mockup时,估计的IOp性能必须从mockup日志中读取,而不是从用户应用程序报告中读取。 实际上,用户应用程序报告的是mockup二进制文件的执行时间,而不是真实Hpu硬件上的预期性能。

示例

以下部分说明如何在mockup后端上运行用户应用程序示例。

注意:对于用户应用程序来说,使用mockup而不是真实硬件是透明的。 只需要更改配置文件,并且在编译期间不应激活任何硬件支持(即 hpu-v80hpu-xrt 等功能)。

HPU配置选择

为了方便起见,在 backends/tfhe-hpu-backend/config_store/sim 中提供了一个模拟配置。 借助 setup_hpu.sh 选择所需的配置:

source setup_hpu.sh --config sim

注意:为了方便起见,提供了一个带有不同目标的Justfile来构建和启动User/Mockup应用程序。 打开两个终端,例如 在第一个终端中启动 just mockup,在第二个终端中启动 just hpu_bench。 有关可用目标的列表,请使用 just

启动mockup应用程序

为了方便起见,提供了两种参数:

  • mockups/tfhe-hpu-mockup/params/tfhers_*_fast.ron:

    使用具有小lwe_n的伪参数集。模拟速度很快。对调试和测试有用

  • mockups/tfhe-hpu-mockup/params/tfhers_*.ron:

    使用真实的硬件参数集。模拟速度很慢,但它可以生成位精确的结果和准确的性能评估。对RTL激励生成和FW探索有用。

## 构建/运行模拟应用程序的CLI示例
## 为了方便起见,也可以使用 `just mockup`
cargo build --release --bin hpu_mockup
./target/release/hpu_mockup \
  --params mockups/tfhe-hpu-mockup/params/gaussian_64b_fast.ron \
  [--freq-hz --register --isc-depth]
  [--dump-out mockup_out/ --dump-reg]\
  [--report-out mockup_rpt/ --report-trace]

启动用户应用程序

在下面的代码段中,选择了 hpu_bench,但可以使用任何使用HPU硬件的应用程序。

## 构建/运行hpu_bench应用程序的CLI示例
## 为了方便起见,也可以使用 `just hpu_bench`
cargo build --release --features="hpu" --example hpu_bench
## 在64位整数上启动MUL和ADD IOp
./target/release/examples/hpu_bench --integer-w 64 --iop MUL --iop ADD

测试

Hpu测试框架也可以使用mockup启动。它依赖于相同的配置机制(参见 setup_hpu.sh)。

与示例类似,Justfile中提供了一个专用条目用于测试 打开两个终端并运行以下命令 在第一个终端中启动 just mockup,在第二个终端中启动 just hpu_test

启动模拟应用程序

mockup启动过程与示例相同(参见 启动Mockup)。

启动测试框架

在下面的代码段中,hpu测试框架在8b整数上启动。

## 运行hpu测试框架的CLI示例
## 为了方便起见,也可以使用 `just hpu_test`
## 测试是为8/16/32/64和128位整数定义的,如果没有指定,则启动所有整数宽度
cargo run --release --features="hpu" --test hpu -- u8

## 也可以使用过滤来对子类别进行分类
## 可用的子类别有:
## * alus:用于ct x 标量算术IOp
## * alu:用于ct x ct 算术IOp
## * bitwise:用于ct x ct 按位IOp
## * cmp:用于比较IOp
## * ternary:用于if-then-else之类的IOp
## * algo:用于专门用于卸载子算法的IOp,如ERC_20
## 下面的命令仅运行比较IOp,为了方便起见,也可以使用 `just hpu_test "cmp"`
cargo run --release --features="hpu" --test hpu -- cmp
  • 原文链接: github.com/zama-ai/tfhe-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
zama-ai
zama-ai
江湖只有他的大名,没有他的介绍。