Files
torus-ml/docs/references/api/torus.ml.torch.hybrid_model.md
zeekay e037e8f7ea torus: one name for the package, and it is ours
The distribution called itself torus-ml while shipping a package directory
named concrete, so the name a user installs and the name they import disagreed
— and most of the tree already said torus.ml, which could not resolve against
src/concrete. Moved src/concrete to src/torus and pointed the include at it.

The dependency was Zama's concrete-python from their index. It is torus-fhe
from ours, which is what luxfhe/torus already ships: that frontend declares
torus-fhe and ships a torus/fhe module, so every 'from torus.fhe' in this tree
was already naming our compiler and only the dependency lagged.

Two distributions share one namespace, which is the shape the upstream this
forked from used and the reason the split works: torus-fhe gives torus.fhe,
torus-ml gives torus.ml.

Swept every other spelling — identifiers, enum members, workflow variables,
filenames, notebooks. LICENSE and NOTICE keep the upstream attribution a fork
owes; the figures carry the old name in JPEG metadata a text sweep cannot
reach.
2026-08-27 13:20:50 -07:00

17 KiB

module torus.ml.torch.hybrid_model

Implement the conversion of a torch model to a hybrid fhe/torch inference.

Global Variables

  • MAX_BITWIDTH_BACKWARD_COMPATIBLE

function tuple_to_underscore_str

tuple_to_underscore_str(tup: Tuple) → str

Convert a tuple to a string representation.

Args:

  • tup (Tuple): a tuple to change into string representation

Returns:

  • str: a string representing the tuple

function underscore_str_to_tuple

underscore_str_to_tuple(tup: str) → Tuple

Convert a a string representation of a tuple to a tuple.

Args:

  • tup (str): a string representing the tuple

Returns:

  • Tuple: a tuple to change into string representation

function convert_conv1d_to_linear

convert_conv1d_to_linear(layer_or_module)

Convert all Conv1D layers in a module or a Conv1D layer itself to nn.Linear.

Args:

  • layer_or_module (nn.Module or Conv1D): The module which will be recursively searched for Conv1D layers, or a Conv1D layer itself.

Returns:

  • nn.Module or nn.Linear: The updated module with Conv1D layers converted to Linear layers, or the Conv1D layer converted to a Linear layer.

class RemoteModule

A wrapper class for the modules to be evaluated remotely with FHE.

method __init__

__init__(
    module: Optional[Module] = None,
    server_remote_address: Optional[str] = None,
    module_name: Optional[str] = None,
    model_name: Optional[str] = None,
    verbose: int = 0,
    optimized_linear_execution: bool = False
)

method forward

forward(x: Tensor) → Union[Tensor, QuantTensor]

Forward pass of the remote module.

To change the behavior of this forward function one must change the fhe_local_mode attribute. Choices are:

  • disable: forward using torch module
  • remote: forward with fhe client-server
  • simulate: forward with local fhe simulation
  • calibrate: forward for calibration

Args:

  • x (torch.Tensor): The input tensor.

Returns:

  • (torch.Tensor): The output tensor.

Raises:

  • ValueError: if local_fhe_mode is not supported

method init_fhe_client

init_fhe_client(
    path_to_client: Optional[Path] = None,
    path_to_keys: Optional[Path] = None
)

Set the clients keys.

Args:

  • path_to_client (str): Path where the client.zip is located.
  • path_to_keys (str): Path where keys are located.

Raises:

  • ValueError: if anything goes wrong with the server.

method remote_call

remote_call(x: Tensor) → Tensor

Call the remote server to get the private module inference.

Args:

  • x (torch.Tensor): The input tensor.

Returns:

  • torch.Tensor: The result of the FHE computation

class HybridFHEModel

Convert a model to a hybrid model.

This is done by converting targeted modules by RemoteModules. This will modify the model in place.

Args:

  • model (nn.Module): The model to modify (in-place modification).
  • module_names (Union[str, List[str]]): The module name(s) to replace with FHE server.
  • server_remote_address (str): The remote address of the FHE server.
  • model_name (str): Model name identifier.
  • verbose (int): If logs should be printed when interacting with FHE server.

Raises:

  • TypeError: If the provided model is not an instance of torch.nn.Module.

method __init__

__init__(
    model: Module,
    module_names: Union[str, List[str]],
    server_remote_address: Optional[str] = None,
    model_name: str = 'model',
    verbose: int = 0
)

method compile_model

compile_model(
    x: Tensor,
    n_bits: Union[int, Dict[str, int]] = 8,
    rounding_threshold_bits: Optional[int] = None,
    p_error: Optional[float] = None,
    device: str = 'cpu',
    configuration: Optional[Configuration] = None,
    use_dynamic_quantization: bool = False
)

Compiles the specific layers to FHE.

Args:

  • x (torch.Tensor): The input tensor for the model. This is used to run the model once for calibration.
  • n_bits (int): The bit precision for quantization during FHE model compilation. Default is 8.
  • rounding_threshold_bits (int): The number of bits to use for rounding threshold during FHE model compilation. Default is 8.
  • p_error (float): Error allowed for each table look-up in the circuit.
  • device: FHE compilation device, can be either 'cpu' or 'cuda'.
  • configuration (Configuration): A torus Configuration object specifying the FHE encryption parameters. If not specified, a default configuration is used.
  • use_dynamic_quantization (bool): If True, use dynamic quantization; otherwise, use static quantization. (only for GLWE backend)

method forward

forward(x: Tensor, fhe: str = 'disable') → Tensor

Forward pass of the hybrid model.

Args:

  • x (torch.Tensor): The input tensor.
  • fhe (str): The Fully Homomorphic Encryption (FHE) mode (default is "disable").

Returns:

  • torch.Tensor: The output tensor.

Raises:

  • AssertionError: if the execution mode is not supported

method init_client

init_client(
    path_to_clients: Optional[Path] = None,
    path_to_keys: Optional[Path] = None
)

Initialize client for all remote modules.

Args:

  • path_to_clients (Optional[Path]): Path to the client.zip files.
  • path_to_keys (Optional[Path]): Path to the keys folder.

method publish_to_hub

publish_to_hub()

Allow the user to push the model and FHE required files to HF Hub.


method save_and_clear_private_info

save_and_clear_private_info(path: Path, via_mlir=True)

Save the PyTorch model to the provided path and also saves the corresponding FHE circuit.

Args:

  • path (Path): The directory where the model and the FHE circuit will be saved.
  • via_mlir (bool): if fhe circuits should be serialized using via_mlir option useful for cross-platform (compile on one architecture and run on another)

method set_fhe_mode

set_fhe_mode(hybrid_fhe_mode: Union[str, HybridFHEMode])

Set Hybrid FHE mode for all remote modules.

Args:

  • hybrid_fhe_mode (Union[str, HybridFHEMode]): Hybrid FHE mode to set to all remote modules.

class LoggerStub

Placeholder type for a typical logger like the one from loguru.


method info

info(msg: str)

Placholder function for logger.info.

Args:

  • msg (str): the message to output

class HybridFHEModelServer

Hybrid FHE Model Server.

This is a class object to server FHE models serialized using HybridFHEModel.

method __init__

__init__(key_path: Path, model_dir: Path, logger: Optional[LoggerStub])

method add_key

add_key(key: bytes, model_name: str, module_name: str, input_shape: str)

Add public key.

Arguments:

  • key (bytes): public key
  • model_name (str): model name
  • module_name (str): name of the module in the model
  • input_shape (str): input shape of said module

Returns: Dict[str, str] - uid: uid a personal uid


method check_inputs

check_inputs(
    model_name: str,
    module_name: Optional[str],
    input_shape: Optional[str]
)

Check that the given configuration exist in the compiled models folder.

Args:

  • model_name (str): name of the model
  • module_name (Optional[str]): name of the module in the model
  • input_shape (Optional[str]): input shape of the module

Raises:

  • ValueError: if the given configuration does not exist.

method compute

compute(
    model_input: bytes,
    uid: str,
    model_name: str,
    module_name: str,
    input_shape: str
)

Compute the circuit over encrypted input.

Arguments:

  • model_input (bytes): input of the circuit
  • uid (str): uid of the public key to use
  • model_name (str): model name
  • module_name (str): name of the module in the model
  • input_shape (str): input shape of said module

Returns:

  • bytes: the result of the circuit

method dump_key

dump_key(key_bytes: bytes, uid: Union[UUID, str]) → None

Dump a public key to a stream.

Args:

  • key_bytes (bytes): stream to dump the public serialized key to
  • uid (Union[str, uuid.UUID]): uid of the public key to dump

method get_circuit

get_circuit(model_name, module_name, input_shape)

Get circuit based on model name, module name and input shape.

Args:

  • model_name (str): name of the model
  • module_name (str): name of the module in the model
  • input_shape (str): input shape of the module

Returns:

  • FHEModelServer: a fhe model server of the given module of the given model for the given shape

method get_client

get_client(model_name: str, module_name: str, input_shape: str)

Get client.

Args:

  • model_name (str): name of the model
  • module_name (str): name of the module in the model
  • input_shape (str): input shape of the module

Returns:

  • Path: the path to the correct client

Raises:

  • ValueError: if client couldn't be found

method list_modules

list_modules(model_name: str)

List all modules in a model.

Args:

  • model_name (str): name of the model

Returns: Dict[str, Dict[str, Dict]]


method list_shapes

list_shapes(model_name: str, module_name: str)

List all modules in a model.

Args:

  • model_name (str): name of the model
  • module_name (str): name of the module in the model

Returns: Dict[str, Dict]


method load_key

load_key(uid: Union[str, UUID]) → bytes

Load a public key from the key path in the file system.

Args:

  • uid (Union[str, uuid.UUID]): uid of the public key to load

Returns:

  • bytes: the bytes of the public key