I really appreciate your work. I am trying to enter this field. There are several questions here to consult.
When I analyzed evaluate_one_example_fhe.py in Concrete ML, I found that the run method of ServerCircuit(WrapperCpp) took the most time, and I wanted to fine-grained the TFHE scheme itself, so I checked the concrete library and then TFHE-rs. I don’t understand how concrete calls TFHE-rs. I don’t understand how Concrete ML calls Concrete. I wish there was a diagram to explain this. Sorry I’m not familiar with rust.
2.What are the underlying operators of the TFHE algorithm? Just like the underlying operator of CKKS is NTT/INTT. In other words, what are the performance bottlenecks of TFHE-rs? I want to do some work on this and test it in ML inference.
3.If possible, help me point out which function takes the most time in the TFHE-rs library.
I browsed through all your website content and I thought it was really cool.
Yes, Concrete ML uses Concrete: Concrete ML prepares some python code, than Concrete will compile to FHE.
And yes, Concrete uses TFHE-rs: TFHE-rs is our library for cryptographic operations, and so Concrete makes calls to it to take care of FHE programs. It’s in Concrete-CPU backend (for what’s related to CPU)
In TFHE, you have mainly
linear operations: additions, subtractions, multiplications by integers: they are called leveled operations and are very fast
table-lookup based operations (TLU): basically, anything which is non linear will be replaced by a TLU. This stands for min / max, activations, etc. The corresponding operation in FHE is called “programmable bootstrapping” (PBS).
Under the hood, yes, as in CKKS, they are polynomial multiplications in TFHE as well, so NTT/FFT are used / critical for speed in both schemes.
PBS are
unique to TFHE: in CKKS, replacing non-linear function is done with approximations and polynomials
a way to reduce noise, which allows to go as deep as we want in TFHE, eg for deep learning