本文介绍了TFHE-hpu-mockup,一个HPU硬件的仿真替代实现,它可以与没有硬件支持的tfhe-hpu-backend
无缝配对。该mockup旨在透明地集成到用户应用程序中,生成与真实硬件匹配的跟踪,并为RTL仿真生成精确的golden stimuli。它还支持固件开发,提供准确的性能估算和跟踪功能。
HPU硬件的模拟 直接替换 实现。
这个模拟实现可以与在没有任何硬件支持的情况下编译的 tfhe-hpu-backend
无缝配对(即 hpu-v80
或 hpu-xrt
)。
实际上,在没有硬件支持的情况下,tfhe-hpu-backend
对底层FFI的调用会被IPC调用替换,并且可以被这个模拟实现拦截。
这个模拟的目的是:
与用户应用程序的透明集成:
用户无需更改他的应用程序代码。 生成的跟踪必须与在真实硬件上获得的跟踪匹配(除了时间戳)
激励生成
获得的结果必须是位精确的,以便为RTL模拟生成黄金激励 RTL参数必须在运行时完全可配置,以便轻松地为任何配置生成激励
固件开发
生成准确的性能评估和跟踪能力,以帮助HPU固件的开发/优化
在没有硬件支持的情况下,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启动后,它在一个文件中注册一个IPC配置通道,ffi-sim
可以读取该文件以建立连接。
完成后,会发生以下步骤:
注意:使用的文件名在FFI部分的TOML配置文件中设置。环境变量可以在文件名中使用。
[fpga.ffi.Sim] ipc_name="/tmp/${USER}/hpu_mockup_ipc"
tfhe-hpu-backend
通过关联的IPC通道读取寄存器,并检索关联的mockup参数。tfhe-hpu-backend
分配所需的板载内存。然后,它上传固件翻译表(用于将IOp扩展为DOp流)和TFHE服务器密钥集。然后,它上传输入密文。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格式。
AckQ
通知 tfhe-hpu-backend
。tfhe-hpu-backend
在IPC通道的帮助下从HBM检索结果。mockup应用程序由两个文件配置:
配置(即 --config
CLI knob)
它与 tfhe-hpu-backend
使用的相同。它被mockup应用程序用来检索 ffi-sim
配置、寄存器映射以及板载内存的预期内存布局。
参数(即 --params
CLI knob)
此文件用于检索内部RTL参数,例如:
还有其他可选的配置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-v80
或hpu-xrt
等功能)。
为了方便起见,在 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
为了方便起见,提供了两种参数:
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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!