mirror of
https://github.com/zama-ai/concrete.git
synced 2026-01-09 21:07:56 -05:00
230 lines
10 KiB
Markdown
230 lines
10 KiB
Markdown
# Configure
|
|
|
|
This document provides instructions on how to customize the compilation pipeline using `Configuration`s in Python and describes various configuration options available.
|
|
|
|
You can customize **Concrete** using the `fhe.Configuration` :
|
|
|
|
```python
|
|
from concrete import fhe
|
|
import numpy as np
|
|
|
|
configuration = fhe.Configuration(p_error=0.01, dataflow_parallelize=True)
|
|
|
|
@fhe.compiler({"x": "encrypted"})
|
|
def f(x):
|
|
return x + 42
|
|
|
|
inputset = range(10)
|
|
circuit = f.compile(inputset, configuration=configuration)
|
|
```
|
|
|
|
You can overwrite individual configuration options by specifying kwargs in the `compile` method:
|
|
|
|
```python
|
|
from concrete import fhe
|
|
import numpy as np
|
|
|
|
@fhe.compiler({"x": "encrypted"})
|
|
def f(x):
|
|
return x + 42
|
|
|
|
inputset = range(10)
|
|
circuit = f.compile(inputset, p_error=0.01, dataflow_parallelize=True)
|
|
```
|
|
|
|
You can also combine both ways:
|
|
|
|
```python
|
|
from concrete import fhe
|
|
import numpy as np
|
|
|
|
configuration = fhe.Configuration(p_error=0.01)
|
|
|
|
@fhe.compiler({"x": "encrypted"})
|
|
def f(x):
|
|
return x + 42
|
|
|
|
inputset = range(10)
|
|
circuit = f.compile(inputset, configuration=configuration, loop_parallelize=True)
|
|
```
|
|
|
|
{% hint style="info" %}
|
|
|
|
When options are specified both in the `configuration` and as kwargs in the `compile` method, the kwargs take precedence.
|
|
|
|
{% endhint %}
|
|
|
|
## Options
|
|
|
|
#### approximate_rounding_config: ApproximateRoundingConfig = fhe.ApproximateRoundingConfig()
|
|
- Provide fine control for [approximate rounding](../core-features/rounding.md#approximate-rounding-features):
|
|
- To enable exact clipping,
|
|
- Or/and approximate clipping, which makes overflow protection faster.
|
|
|
|
#### auto_adjust_rounders: bool = False
|
|
- Adjust rounders automatically.
|
|
|
|
#### auto_parallelize: bool = False
|
|
- Enable auto parallelization in the compiler.
|
|
|
|
#### bitwise_strategy_preference: Optional[Union[BitwiseStrategy, str, List[Union[BitwiseStrategy, str]]]] = None
|
|
- Specify preference for bitwise strategies, can be a single strategy or an ordered list of strategies. See [Bitwise](../core-features/bitwise.md) to learn more.
|
|
|
|
#### compiler_debug_mode: bool = False
|
|
- Enable or disable the debug mode of the compiler. This can show a lot of information, including passes and pattern rewrites.
|
|
|
|
#### compiler_verbose_mode: bool = False
|
|
- Enable or disable verbose mode of the compiler. This mainly shows logs from the compiler and is less verbose than the debug mode.
|
|
|
|
#### comparison_strategy_preference: Optional[Union[ComparisonStrategy, str, List[Union[ComparisonStrategy, str]]]] = None
|
|
- Specify preference for comparison strategies. Can be a single strategy or an ordered list of strategies. See [Comparisons](../core-features/comparisons.md) to learn more.
|
|
|
|
#### compress_evaluation_keys: bool = False
|
|
- Specify that serialization takes the compressed form of evaluation keys.
|
|
|
|
#### compress_input_ciphertexts: bool = False
|
|
- Specify that serialization takes the compressed form of input ciphertexts.
|
|
|
|
#### composable: bool = False
|
|
- Specify that the function must be composable with itself.
|
|
- Only used when compiling a single circuit; when compiling modules, use the [composition policy](../compilation/composing_functions_with_modules.md#optimizing_runtimes_with_composition_policies).
|
|
|
|
#### dataflow_parallelize: bool = False
|
|
- Enable dataflow parallelization in the compiler.
|
|
|
|
#### dump_artifacts_on_unexpected_failures: bool = True
|
|
- Export debugging artifacts automatically on compilation failures.
|
|
|
|
#### enable_tlu_fusing: bool = True
|
|
- Enables Table Lookups(TLU) fusing to reduce the number of TLUs.
|
|
|
|
#### enable_unsafe_features: bool = False
|
|
- Enable unsafe features.
|
|
|
|
#### fhe_execution: bool = True
|
|
- Enable FHE execution. Can be enabled later using `circuit.enable_fhe_execution()`.
|
|
|
|
#### fhe_simulation: bool = False
|
|
- Enable FHE simulation. Can be enabled later using `circuit.enable_fhe_simulation()`.
|
|
|
|
#### global_p_error: Optional[float] = None
|
|
- Global error probability for the whole circuit.
|
|
- If set, the whole circuit will have the probability of a non-exact result smaller than the set value. See [Exactness](../core-features/table_lookups_advanced.md#table-lookup-exactness) to learn more.
|
|
|
|
#### if_then_else_chunk_size: int = 3
|
|
- Chunk size to use when converting the `fhe.if_then_else extension`.
|
|
|
|
#### insecure_key_cache_location: Optional[Union[Path, str]] = None
|
|
- Location of insecure key cache.
|
|
|
|
#### loop_parallelize: bool = True
|
|
- Enable loop parallelization in the compiler.
|
|
|
|
#### multi_parameter_strategy: fhe.MultiParameterStrategy = fhe.MultiParameterStrategy.PRECISION
|
|
- Set the level of circuit partitioning when using `fhe.ParameterSelectionStrategy.MULTI`.
|
|
- `PRECISION`: all TLUs with the same input precision have their own parameters.
|
|
- `PRECISION_AND_NORM2`: all TLUs with the same input precision and output [norm2](../../compilers/concrete-optimizer/v0-parameters/) have their own parameters.
|
|
|
|
#### optimize_tlu_based_on_measured_bounds: bool = False
|
|
- Enables TLU optimizations based on measured bounds.
|
|
- Not enabled by default, as it could result in unexpected overflows during runtime.
|
|
|
|
#### optimize_tlu_based_on_original_bit_width: Union[bool, int] = 8
|
|
- Configures whether to convert values to their original precision before doing a table lookup on them.
|
|
- `True` enables it for all cases.
|
|
- `False` disables it for all cases.
|
|
- Integer value enables or disables it depending on the original bit width. With the default value of 8, only the values with original bit width ≤ 8 will be converted to their original precision.
|
|
|
|
#### p_error: Optional[float] = None
|
|
- Error probability for individual table lookups.
|
|
- If set, all table lookups will have the probability of a non-exact result smaller than the set value. See [Exactness](../core-features/table_lookups_advanced.md#table-lookup-exactness) to learn more.
|
|
|
|
#### parameter_selection_strategy: fhe.ParameterSelectionStrategy = fhe.ParameterSelectionStrategy.MULTI
|
|
- Set how cryptographic parameters are selected.
|
|
|
|
#### print_tlu_fusing: bool = False
|
|
- Enables printing of TLU fusing to see which table lookups are fused.
|
|
|
|
#### progress_tag: Union[bool, int] = False
|
|
- How many nested tag elements to display with the progress bar.
|
|
- `True` means all tag elements
|
|
- `False` disables the display.
|
|
- `2` will display `elmt1.elmt2`.
|
|
#### progress_title: str = ""
|
|
- Title of the progress bar.
|
|
|
|
#### rounding_exactness: Exactness = fhe.Exactness.EXACT
|
|
- Set default exactness mode for the rounding operation:
|
|
- `EXACT`: threshold for rounding up or down is exactly centered between the upper and lower value.
|
|
- `APPROXIMATE`: faster but threshold for rounding up or down is approximately centered with a pseudo-random shift. Precise behavior is described in [`fhe.rounding_bit_pattern`](../core-features/rounding.md).
|
|
|
|
#### relu_on_bits_chunk_size: int = 3
|
|
- Chunk size of the ReLU extension when [fhe.bits](../core-features/bit_extraction.md) implementation is used.
|
|
|
|
#### relu_on_bits_threshold: int = 7
|
|
- Bit-width to start implementing the ReLU extension with [fhe.bits](../core-features/bit_extraction.md).
|
|
|
|
#### shifts_with_promotion: bool = True
|
|
- Enable promotions in encrypted shifts instead of casting at runtime. See [Bitwise#Shifts](../core-features/bitwise.md#shifts) to learn more.
|
|
|
|
#### show_graph: Optional[bool] = None
|
|
- Print computation graph during compilation.
|
|
- `True` means always print
|
|
- `False` means never print
|
|
- `None` means print depending on verbose configuration.
|
|
|
|
#### show_mlir: Optional[bool] = None
|
|
- Print MLIR during compilation.
|
|
- `True` means always print
|
|
- `False` means never print
|
|
- `None` means print depending on verbose configuration.
|
|
#### show_optimizer: Optional[bool] = None
|
|
- Print optimizer output during compilation.
|
|
- `True` means always print
|
|
- `False` means never print
|
|
- `None` means print depending on verbose configuration.
|
|
#### show_progress: bool = False
|
|
- Display a progress bar during circuit execution.
|
|
|
|
#### show_statistics: Optional[bool] = None
|
|
- Print circuit statistics during compilation.
|
|
- `True` means always print
|
|
- `False` means never print
|
|
- `None` means print depending on verbose configuration.
|
|
|
|
#### simulate_encrypt_run_decrypt: bool = False
|
|
- Whether to use the simulate encrypt/run/decrypt methods of the circuit/module instead of actual encryption/evaluation/decryption.
|
|
- When this option is set to `True`, encrypt and decrypt are identity functions, and run is a wrapper around simulation. In other words, this option allows switching off encryption to quickly test if a function has the expected semantic (without paying the price of FHE execution).
|
|
- This is extremely unsafe and should only be used during development.
|
|
- For this reason, it requires `enable_unsafe_features` to be set to `True`.
|
|
|
|
#### single_precision: bool = False
|
|
- Use single precision for the whole circuit.
|
|
|
|
#### range_restriction: Optional[RangeRestriction] = None
|
|
- A range restriction to pass to the optimizer to restrict the available crypto-parameters.
|
|
|
|
#### keyset_restriction: Optional[KeysetRestriction] = None
|
|
- A keyset restriction to pass to the optimizer to restrict the available crypto-parameters.
|
|
|
|
#### use_gpu: bool = False
|
|
- Enable generating code for GPU in the compiler.
|
|
|
|
#### use_insecure_key_cache: bool = False (Unsafe)
|
|
- Use the insecure key cache.
|
|
|
|
#### verbose: bool = False
|
|
- Print details related to compilation.
|
|
|
|
#### auto_schedule_run: bool = False
|
|
- Enable automatic scheduling of `run` method calls. When enabled, fhe function are computated in parallel in a background threads pool. When several `run` are composed, they are automatically synchronized.
|
|
- For now, it only works for the `run` method of a `FheModule`, in that case you obtain a `Future[Value]` immediately instead of a `Value` when computation is finished.
|
|
- E.g. `my_module.f3.run( my_module.f1.run(a), my_module.f1.run(b) )` will runs `f1` and `f2` in parallel in the background and `f3` in background when both `f1` and `f2` intermediate results are available.
|
|
- If you want to manually synchronize on the termination of a full computation, e.g. you want to return the encrypted result, you can call explicitely `value.result()` to wait for the result. To simplify testing, decryption does it automatically.
|
|
- Automatic scheduling behavior can be override locally by calling directly a variant of `run`:
|
|
- `run_sync`: forces the fhe function to occur in the current thread, not in the background,
|
|
- `run_async`: forces the fhe function to occur in a background thread, returning immediately a `Future[Value]`
|
|
|
|
#### security_level: int = 128
|
|
- Set the level of security used to perform the optimization of crypto-parameters.
|