concrete.ml.quantization.quantized_ops
module concrete.ml.quantization.quantized_ops
concrete.ml.quantization.quantized_opsQuantized versions of the ONNX operators for post training quantization.
class QuantizedSigmoid
QuantizedSigmoidQuantized sigmoid op.
class QuantizedHardSigmoid
QuantizedHardSigmoidQuantized HardSigmoid op.
class QuantizedRelu
QuantizedReluQuantized Relu op.
class QuantizedPRelu
QuantizedPReluQuantized PRelu op.
class QuantizedLeakyRelu
QuantizedLeakyReluQuantized LeakyRelu op.
class QuantizedHardSwish
QuantizedHardSwishQuantized Hardswish op.
class QuantizedElu
QuantizedEluQuantized Elu op.
class QuantizedSelu
QuantizedSeluQuantized Selu op.
class QuantizedCelu
QuantizedCeluQuantized Celu op.
class QuantizedClip
QuantizedClipQuantized clip op.
class QuantizedRound
QuantizedRoundQuantized round op.
class QuantizedPow
QuantizedPowQuantized pow op.
Only works for a float constant power. This operation will be fused to a (potentially larger) TLU.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Nonemethod can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Power raising can be fused and computed in float when a single integer tensor generates both the operands. For example in the formula: f(x) = x ** (x + 1) where x is an integer tensor.
Returns:
bool: Can fuse
class QuantizedGemm
QuantizedGemmQuantized Gemm op.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Nonemethod can_fuse
can_fusecan_fuse()Determine if this op can be fused.
Gemm operation can not be fused since it must be performed over integer tensors and it combines different values of the input tensors.
Returns:
bool: False, this operation can not be fused as it adds different encrypted integers
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayclass QuantizedMatMul
QuantizedMatMulQuantized MatMul op.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Nonemethod can_fuse
can_fusecan_fuse()Determine if this op can be fused.
Gemm operation can not be fused since it must be performed over integer tensors and it combines different values of the input tensors.
Returns:
bool: False, this operation can not be fused as it adds different encrypted integers
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayclass QuantizedAdd
QuantizedAddQuantized Addition operator.
Can add either two variables (both encrypted) or a variable and a constant
method can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Add operation can be computed in float and fused if it operates over inputs produced by a single integer tensor. For example the expression x + x * 1.75, where x is an encrypted tensor, can be computed with a single TLU.
Returns:
bool: Whether the number of integer input tensors allows computing this op as a TLU
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayclass QuantizedTanh
QuantizedTanhQuantized Tanh op.
class QuantizedSoftplus
QuantizedSoftplusQuantized Softplus op.
class QuantizedExp
QuantizedExpQuantized Exp op.
class QuantizedLog
QuantizedLogQuantized Log op.
class QuantizedAbs
QuantizedAbsQuantized Abs op.
class QuantizedIdentity
QuantizedIdentityQuantized Identity op.
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayclass QuantizedReshape
QuantizedReshapeQuantized Reshape op.
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayReshape the input integer encrypted tensor.
Args:
q_inputs: an encrypted integer tensor at index 0 and one constant shape at index 1attrs: additional optional reshape options
Returns:
result(QuantizedArray): reshaped encrypted integer tensor
class QuantizedConv
QuantizedConvQuantized Conv op.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → NoneConstruct the quantized convolution operator and retrieve parameters.
Args:
n_bits_output: number of bits for the quantization of the outputs of this operatorint_input_names: names of integer tensors that are taken as input for this operationconstant_inputs: the weights and activationsinput_quant_opts: options for the input quantizerattrs: convolution optionsdilations(Tuple[int]): dilation of the kernel, default 1 on all dimensions.group(int): number of convolution groups, default 1kernel_shape(Tuple[int]): shape of the kernel. Should have 2 elements for 2d convpads(Tuple[int]): padding in ONNX format (begin, end) on each axisstrides(Tuple[int]): stride of the convolution on each axis
method can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Conv operation can not be fused since it must be performed over integer tensors and it combines different elements of the input tensors.
Returns:
bool: False, this operation can not be fused as it adds different encrypted integers
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayCompute the quantized convolution between two quantized tensors.
Allows an optional quantized bias.
Args:
q_inputs: input tuple, containsx(numpy.ndarray): input data. Shape is N x C x H x W for 2dw(numpy.ndarray): weights tensor. Shape is (O x I x Kh x Kw) for 2db(numpy.ndarray, Optional): bias tensor, Shape is (O,)attrs: convolution options handled in constructor
Returns:
res(QuantizedArray): result of the quantized integer convolution
class QuantizedAvgPool
QuantizedAvgPoolQuantized Average Pooling op.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Nonemethod can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Avg Pooling operation can not be fused since it must be performed over integer tensors and it combines different elements of the input tensors.
Returns:
bool: False, this operation can not be fused as it adds different encrypted integers
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayclass QuantizedPad
QuantizedPadQuantized Padding op.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Nonemethod can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Pad operation can not be fused since it must be performed over integer tensors.
Returns:
bool: False, this operation can not be fused as it is manipulates integer tensors
class QuantizedWhere
QuantizedWhereWhere operator on quantized arrays.
Supports only constants for the results produced on the True/False branches.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Noneclass QuantizedCast
QuantizedCastCast the input to the required data type.
In FHE we only support a limited number of output types. Booleans are cast to integers.
class QuantizedGreater
QuantizedGreaterComparison operator >.
Only supports comparison with a constant.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Noneclass QuantizedGreaterOrEqual
QuantizedGreaterOrEqualComparison operator >=.
Only supports comparison with a constant.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Noneclass QuantizedLess
QuantizedLessComparison operator <.
Only supports comparison with a constant.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Noneclass QuantizedLessOrEqual
QuantizedLessOrEqualComparison operator <=.
Only supports comparison with a constant.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Noneclass QuantizedOr
QuantizedOrOr operator ||.
This operation is not really working as a quantized operation. It just works when things got fused, as in e.g. Act(x) = x || (x + 42))
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Nonemethod can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Or can be fused and computed in float when a single integer tensor generates both the operands. For example in the formula: f(x) = x || (x + 1) where x is an integer tensor.
Returns:
bool: Can fuse
class QuantizedDiv
QuantizedDivDiv operator /.
This operation is not really working as a quantized operation. It just works when things got fused, as in e.g. Act(x) = 1000 / (x + 42))
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Nonemethod can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Div can be fused and computed in float when a single integer tensor generates both the operands. For example in the formula: f(x) = x / (x + 1) where x is an integer tensor.
Returns:
bool: Can fuse
class QuantizedMul
QuantizedMulMultiplication operator.
Only multiplies an encrypted tensor with a float constant for now. This operation will be fused to a (potentially larger) TLU.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: QuantizationOptions = None,
**attrs
) → Nonemethod can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Multiplication can be fused and computed in float when a single integer tensor generates both the operands. For example in the formula: f(x) = x * (x + 1) where x is an integer tensor.
Returns:
bool: Can fuse
class QuantizedSub
QuantizedSubSubtraction operator.
This works the same as addition on both encrypted - encrypted and on encrypted - constant.
method can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Add operation can be computed in float and fused if it operates over inputs produced by a single integer tensor. For example the expression x + x * 1.75, where x is an encrypted tensor, can be computed with a single TLU.
Returns:
bool: Whether the number of integer input tensors allows computing this op as a TLU
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayclass QuantizedBatchNormalization
QuantizedBatchNormalizationQuantized Batch normalization with encrypted input and in-the-clear normalization params.
class QuantizedFlatten
QuantizedFlattenQuantized flatten for encrypted inputs.
method can_fuse
can_fusecan_fuse() → boolDetermine if this op can be fused.
Flatten operation can not be fused since it must be performed over integer tensors.
Returns:
bool: False, this operation can not be fused as it is manipulates integer tensors.
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayFlatten the input integer encrypted tensor.
Args:
q_inputs: an encrypted integer tensor at index 0attrs: contains axis attribute
Returns:
result(QuantizedArray): reshaped encrypted integer tensor
class QuantizedReduceSum
QuantizedReduceSumReduceSum with encrypted input.
This operator is currently an experimental feature.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: Optional[QuantizationOptions] = None,
**attrs
) → NoneConstruct the quantized ReduceSum operator and retrieve parameters.
Args:
n_bits_output(int): Number of bits for the operator's quantization of outputs.int_input_names(Optional[Set[str]]): Names of input integer tensors. Default to None.constant_inputs(Optional[Dict]): Input constant tensor.axes(Optional[numpy.ndarray]): Array of integers along which to reduce. The default is to reduce over all the dimensions of the input tensor if 'noop_with_empty_axes' is false, else act as an Identity op when 'noop_with_empty_axes' is true. Accepted range is [-r, r-1] where r = rank(data). Default to None.input_quant_opts(Optional[QuantizationOptions]): Options for the input quantizer. Default to None.attrs(dict): RecuseSum options.keepdims(int): Keep the reduced dimension or not, 1 means keeping the input dimension, 0 will reduce it along the given axis. Default to 1.noop_with_empty_axes(int): Defines behavior if 'axes' is empty or set to None. Default behavior with 0 is to reduce all axes. When axes is empty and this attribute is set to true 1, input tensor will not be reduced, and the output tensor would be equivalent to input tensor. Default to 0.
method calibrate
calibratecalibrate(*inputs: ndarray) → ndarrayCreate corresponding QuantizedArray for the output of the activation function.
Args:
*inputs (numpy.ndarray): Calibration sample inputs.
Returns:
numpy.ndarray: the output values for the provided calibration samples.
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArraySum the encrypted tensor's values over axis 1.
Args:
q_inputs(QuantizedArray): An encrypted integer tensor at index 0.attrs(Dict): Contains axis attribute.
Returns:
(QuantizedArray): The sum of all values along axis 1 as an encrypted integer tensor.
method tree_sum
tree_sumtree_sum(input_qarray, is_calibration=False)Large sum without overflow (only MSB remains).
Args:
input_qarray: Enctyped integer tensor.is_calibration: Whether we are calibrating the tree sum. If so, it will create all the quantizers for the downscaling.
Returns:
(numpy.ndarray): The MSB (based on the precision self.n_bits) of the integers sum.
class QuantizedErf
QuantizedErfQuantized erf op.
class QuantizedNot
QuantizedNotQuantized Not op.
class QuantizedBrevitasQuant
QuantizedBrevitasQuantBrevitas uniform quantization with encrypted input.
method __init__
__init____init__(
n_bits_output: int,
int_input_names: Set[str] = None,
constant_inputs: Optional[Dict[str, Any], Dict[int, Any]] = None,
input_quant_opts: Optional[QuantizationOptions] = None,
**attrs
) → NoneConstruct the Brevitas quantization operator.
Args:
n_bits_output(int): Number of bits for the operator's quantization of outputs. Not used, will be overridden by the bit_width in ONNXint_input_names(Optional[Set[str]]): Names of input integer tensors. Default to None.constant_inputs(Optional[Dict]): Input constant tensor.scale(float): Quantizer scalezero_point(float): Quantizer zero-pointbit_width(int): Number of bits of the integer representationinput_quant_opts(Optional[QuantizationOptions]): Options for the input quantizer. Default to None. attrs (dict):rounding_mode(str): Rounding mode (default and only accepted option is "ROUND")signed(int): Whether this op quantizes to signed integers (default 1),narrow(int): Whether this op quantizes to a narrow range of integers e.g. [-2n_bits-1 .. 2n_bits-1] (default 0),
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayQuantize values.
Args:
q_inputs: an encrypted integer tensor at index 0 and one constant shape at index 1attrs: additional optional reshape options
Returns:
result(QuantizedArray): reshaped encrypted integer tensor
class QuantizedTranspose
QuantizedTransposeTranspose operator for quantized inputs.
This operator performs quantization, transposes the encrypted data, then dequantizes again.
method q_impl
q_implq_impl(*q_inputs: QuantizedArray, **attrs) → QuantizedArrayReshape the input integer encrypted tensor.
Args:
q_inputs: an encrypted integer tensor at index 0 and one constant shape at index 1attrs: additional optional reshape options
Returns:
result(QuantizedArray): reshaped encrypted integer tensor
Last updated
Was this helpful?