Files
concrete/docs/compilation/statistics.md
2024-08-28 12:15:00 +02:00

128 lines
4.3 KiB
Markdown

# Statistics
This document provides an overview of how to analyze compiled circuits and extract statistical data for performance evaluation in **Concrete**. These statistics help identify bottlenecks and compare circuits.
## Basic operations
Concrete calculates statistics based on the following six basic operations:
* **Clear addition:** `x + y` where `x` is encrypted and `y` is clear
* **Encrypted addition:** `x + y` where both `x` and `y` are encrypted
* **Clear multiplication:** `x * y` where `x` is encrypted and `y` is clear
* **Encrypted negation:** `-x` where `x` is encrypted
* **Key switch:** A building block for table lookups
* **Packing key switch:** A building block for table lookups
* **Programmable bootstrapping:** A building block for table lookups
## Displaying statistics
You can print all statistics using the `show_statistics` configuration option:
```python
from concrete import fhe
@fhe.compiler({"x": "encrypted"})
def f(x):
return (x**2) + (2*x) + 4
inputset = range(2**2)
circuit = f.compile(inputset, show_statistics=True)
```
This code will print:
```
Statistics
--------------------------------------------------------------------------------
size_of_secret_keys: 22648
size_of_bootstrap_keys: 51274176
size_of_keyswitch_keys: 64092720
size_of_inputs: 16392
size_of_outputs: 16392
p_error: 9.627450598589458e-06
global_p_error: 9.627450598589458e-06
complexity: 99198195.0
programmable_bootstrap_count: 1
programmable_bootstrap_count_per_parameter: {
BootstrapKeyParam(polynomial_size=2048, glwe_dimension=1, input_lwe_dimension=781, level=1, base_log=23, variance=9.940977002694397e-32): 1
}
key_switch_count: 1
key_switch_count_per_parameter: {
KeyswitchKeyParam(level=5, base_log=3, variance=1.939836732335308e-11): 1
}
packing_key_switch_count: 0
clear_addition_count: 1
clear_addition_count_per_parameter: {
LweSecretKeyParam(dimension=2048): 1
}
encrypted_addition_count: 1
encrypted_addition_count_per_parameter: {
LweSecretKeyParam(dimension=2048): 1
}
clear_multiplication_count: 1
clear_multiplication_count_per_parameter: {
LweSecretKeyParam(dimension=2048): 1
}
encrypted_negation_count: 0
--------------------------------------------------------------------------------
```
{% hint style="info" %}
Each of these properties can be directly accessed on the circuit (e.g., `circuit.programmable_bootstrap_count`).
{% endhint %}
## Tags
You can also use tags to analyze specific sections of your circuit. See more detailed explanation in [tags documentation](../core-features/tagging.md).
Imagine you have a neural network with 10 layers, each of them tagged, you can easily see the number of additions and multiplications required for matrix multiplications per layer:
```
Statistics
--------------------------------------------------------------------------------
clear_multiplication_count_per_tag: {
/model/model: 53342
/model/model.0/Gemm: 14720
/model/model.0/Gemm.matmul: 14720
/model/model.2/Gemm: 11730
/model/model.2/Gemm.matmul: 11730
/model/model.4/Gemm: 9078
/model/model.4/Gemm.matmul: 9078
/model/model.6/Gemm: 6764
/model/model.6/Gemm.matmul: 6764
/model/model.8/Gemm: 4788
/model/model.8/Gemm.matmul: 4788
/model/model.10/Gemm: 3150
/model/model.10/Gemm.matmul: 3150
/model/model.12/Gemm: 1850
/model/model.12/Gemm.matmul: 1850
/model/model.14/Gemm: 888
/model/model.14/Gemm.matmul: 888
/model/model.16/Gemm: 264
/model/model.16/Gemm.matmul: 264
/model/model.18/Gemm: 110
/model/model.18/Gemm.matmul: 110
}
encrypted_addition_count_per_tag: {
/model/model: 53342
/model/model.0/Gemm: 14720
/model/model.0/Gemm.matmul: 14720
/model/model.2/Gemm: 11730
/model/model.2/Gemm.matmul: 11730
/model/model.4/Gemm: 9078
/model/model.4/Gemm.matmul: 9078
/model/model.6/Gemm: 6764
/model/model.6/Gemm.matmul: 6764
/model/model.8/Gemm: 4788
/model/model.8/Gemm.matmul: 4788
/model/model.10/Gemm: 3150
/model/model.10/Gemm.matmul: 3150
/model/model.12/Gemm: 1850
/model/model.12/Gemm.matmul: 1850
/model/model.14/Gemm: 888
/model/model.14/Gemm.matmul: 888
/model/model.16/Gemm: 264
/model/model.16/Gemm.matmul: 264
/model/model.18/Gemm: 110
/model/model.18/Gemm.matmul: 110
}
--------------------------------------------------------------------------------
```