hls4ml.optimization.dsp_aware_pruning.objectives package

Submodules

hls4ml.optimization.dsp_aware_pruning.objectives.gpu_objectives module

class hls4ml.optimization.dsp_aware_pruning.objectives.gpu_objectives.GPUFLOPEstimator

Bases: ObjectiveEstimator

classmethod is_layer_optimizable(layer_attributes)

For a given layer, checks whether optimizations make sense, with respect to the given objective(s) Furthermore, it returns the type of optimization (structured, unstructured etc.) Most suitable for minimizing the objective(s).

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

tuple containing

  • optimizable (boolean): can optimizations be applied to this layer

  • optimization_attributes (hls4ml.optimization.attributes.OptimizationAttributes):

    Most suitable approach for optimization

Examples

  • Metric = Total weights, Layer = Dense, shape = (4, 4) -> return True, unstructured

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<8, 0> -> return False

    (Vivado doesn’t use DSP when precision < 9)

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<16, 6> ->

    return True, pattern structure, both pruning and weight sharing

classmethod layer_resources(layer_attributes)

For a given layer, how many units of the metric are used, given a generic weight matrix

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

total resources (w.r.t every dimension of the objective) used

Return type:

resources (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4) -> return [16] [regardless of layer sparsity]

classmethod layer_savings(layer_attributes)

For a given layer, how many units of the metric are saved, when optimizing one structure The structure type, alongside its parameters (e.g. block shape) are stored in layer attributes For best results, OptimizationAttributes in layer_attribtues should be obtained from is_layer_optimizable

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

savings achieved (one for every dimension of objective)

With OptimizationAttributes from layer_attributes

Return type:

savings (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4): - structure_type == unstructured -> return [1] - structure_type == structured -> return [4]

hls4ml.optimization.dsp_aware_pruning.objectives.vivado_objectives module

class hls4ml.optimization.dsp_aware_pruning.objectives.vivado_objectives.VivadoDSPEstimator

Bases: ObjectiveEstimator

classmethod is_layer_optimizable(layer_attributes)

For a given layer, checks whether optimizations make sense, with respect to the given objective(s) Furthermore, it returns the type of optimization (structured, unstructured etc.) Most suitable for minimizing the objective(s).

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

tuple containing

  • optimizable (boolean): can optimizations be applied to this layer

  • optimization_attributes (hls4ml.optimization.attributes.OptimizationAttributes):

    Most suitable approach for optimization

Examples

  • Metric = Total weights, Layer = Dense, shape = (4, 4) -> return True, unstructured

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<8, 0> -> return False

    (Vivado doesn’t use DSP when precision < 9)

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<16, 6> ->

    return True, pattern structure, both pruning and weight sharing

classmethod layer_resources(layer_attributes)

For a given layer, how many units of the metric are used, given a generic weight matrix

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

total resources (w.r.t every dimension of the objective) used

Return type:

resources (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4) -> return [16] [regardless of layer sparsity]

classmethod layer_savings(layer_attributes)

For a given layer, how many units of the metric are saved, when optimizing one structure The structure type, alongside its parameters (e.g. block shape) are stored in layer attributes For best results, OptimizationAttributes in layer_attribtues should be obtained from is_layer_optimizable

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

savings achieved (one for every dimension of objective)

With OptimizationAttributes from layer_attributes

Return type:

savings (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4): - structure_type == unstructured -> return [1] - structure_type == structured -> return [4]

class hls4ml.optimization.dsp_aware_pruning.objectives.vivado_objectives.VivadoFFEstimator

Bases: ObjectiveEstimator

classmethod is_layer_optimizable(layer_attributes)

For a given layer, checks whether optimizations make sense, with respect to the given objective(s) Furthermore, it returns the type of optimization (structured, unstructured etc.) Most suitable for minimizing the objective(s).

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

tuple containing

  • optimizable (boolean): can optimizations be applied to this layer

  • optimization_attributes (hls4ml.optimization.attributes.OptimizationAttributes):

    Most suitable approach for optimization

Examples

  • Metric = Total weights, Layer = Dense, shape = (4, 4) -> return True, unstructured

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<8, 0> -> return False

    (Vivado doesn’t use DSP when precision < 9)

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<16, 6> ->

    return True, pattern structure, both pruning and weight sharing

classmethod layer_resources(layer_attributes)

For a given layer, how many units of the metric are used, given a generic weight matrix

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

total resources (w.r.t every dimension of the objective) used

Return type:

resources (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4) -> return [16] [regardless of layer sparsity]

classmethod layer_savings(layer_attributes)

For a given layer, how many units of the metric are saved, when optimizing one structure The structure type, alongside its parameters (e.g. block shape) are stored in layer attributes For best results, OptimizationAttributes in layer_attribtues should be obtained from is_layer_optimizable

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

savings achieved (one for every dimension of objective)

With OptimizationAttributes from layer_attributes

Return type:

savings (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4): - structure_type == unstructured -> return [1] - structure_type == structured -> return [4]

class hls4ml.optimization.dsp_aware_pruning.objectives.vivado_objectives.VivadoMultiObjectiveEstimator

Bases: ObjectiveEstimator

classmethod is_layer_optimizable(layer_attributes)

For a given layer, checks whether optimizations make sense, with respect to the given objective(s) Furthermore, it returns the type of optimization (structured, unstructured etc.) Most suitable for minimizing the objective(s).

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

tuple containing

  • optimizable (boolean): can optimizations be applied to this layer

  • optimization_attributes (hls4ml.optimization.attributes.OptimizationAttributes):

    Most suitable approach for optimization

Examples

  • Metric = Total weights, Layer = Dense, shape = (4, 4) -> return True, unstructured

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<8, 0> -> return False

    (Vivado doesn’t use DSP when precision < 9)

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<16, 6> ->

    return True, pattern structure, both pruning and weight sharing

classmethod layer_resources(layer_attributes)

For a given layer, how many units of the metric are used, given a generic weight matrix

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

total resources (w.r.t every dimension of the objective) used

Return type:

resources (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4) -> return [16] [regardless of layer sparsity]

classmethod layer_savings(layer_attributes)

For a given layer, how many units of the metric are saved, when optimizing one structure The structure type, alongside its parameters (e.g. block shape) are stored in layer attributes For best results, OptimizationAttributes in layer_attribtues should be obtained from is_layer_optimizable

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

savings achieved (one for every dimension of objective)

With OptimizationAttributes from layer_attributes

Return type:

savings (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4): - structure_type == unstructured -> return [1] - structure_type == structured -> return [4]

Module contents

class hls4ml.optimization.dsp_aware_pruning.objectives.ObjectiveEstimator

Bases: ABC

Abstract class with methods for estimating the utilization and savings of a certain layer, with respect to some objective For each objective, an inherited class is written with the correct implementation of the below methods The objectives can be multi-dimensional, e.g. DSPs and BRAM Care needs to be taken when optimizing several objectives, especially if conflicting

abstract is_layer_optimizable(layer_attributes)

For a given layer, checks whether optimizations make sense, with respect to the given objective(s) Furthermore, it returns the type of optimization (structured, unstructured etc.) Most suitable for minimizing the objective(s).

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

tuple containing

  • optimizable (boolean): can optimizations be applied to this layer

  • optimization_attributes (hls4ml.optimization.attributes.OptimizationAttributes):

    Most suitable approach for optimization

Examples

  • Metric = Total weights, Layer = Dense, shape = (4, 4) -> return True, unstructured

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<8, 0> -> return False

    (Vivado doesn’t use DSP when precision < 9)

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<16, 6> ->

    return True, pattern structure, both pruning and weight sharing

abstract layer_resources(layer_attributes)

For a given layer, how many units of the metric are used, given a generic weight matrix

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

total resources (w.r.t every dimension of the objective) used

Return type:

resources (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4) -> return [16] [regardless of layer sparsity]

abstract layer_savings(layer_attributes)

For a given layer, how many units of the metric are saved, when optimizing one structure The structure type, alongside its parameters (e.g. block shape) are stored in layer attributes For best results, OptimizationAttributes in layer_attribtues should be obtained from is_layer_optimizable

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

savings achieved (one for every dimension of objective)

With OptimizationAttributes from layer_attributes

Return type:

savings (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4): - structure_type == unstructured -> return [1] - structure_type == structured -> return [4]

class hls4ml.optimization.dsp_aware_pruning.objectives.ParameterEstimator

Bases: ObjectiveEstimator

A class containing objective estimation with the goal of minimizing The number of non-zero weights in a layer [corresponds to unstructured pruning]

classmethod is_layer_optimizable(layer_attributes)

For a given layer, checks whether optimizations make sense, with respect to the given objective(s) Furthermore, it returns the type of optimization (structured, unstructured etc.) Most suitable for minimizing the objective(s).

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

tuple containing

  • optimizable (boolean): can optimizations be applied to this layer

  • optimization_attributes (hls4ml.optimization.attributes.OptimizationAttributes):

    Most suitable approach for optimization

Examples

  • Metric = Total weights, Layer = Dense, shape = (4, 4) -> return True, unstructured

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<8, 0> -> return False

    (Vivado doesn’t use DSP when precision < 9)

  • Metric = DSP, Layer = Dense, Precision = ap_fixed<16, 6> ->

    return True, pattern structure, both pruning and weight sharing

classmethod layer_resources(layer_attributes)

For a given layer, how many units of the metric are used, given a generic weight matrix

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

total resources (w.r.t every dimension of the objective) used

Return type:

resources (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4) -> return [16] [regardless of layer sparsity]

classmethod layer_savings(layer_attributes)

For a given layer, how many units of the metric are saved, when optimizing one structure The structure type, alongside its parameters (e.g. block shape) are stored in layer attributes For best results, OptimizationAttributes in layer_attribtues should be obtained from is_layer_optimizable

Parameters:

layer_attributes (hls4ml.optimization.attributes.LayerAttributes) – Layer attributes

Returns:

savings achieved (one for every dimension of objective)

With OptimizationAttributes from layer_attributes

Return type:

savings (list, int)

Example

Metric = Total weights, Layer = Dense, shape = (4, 4): - structure_type == unstructured -> return [1] - structure_type == structured -> return [4]