aboutsummaryrefslogtreecommitdiff
path: root/ethosu/vela/mark_tensors.py
diff options
context:
space:
mode:
authorLouis Verhaard <louis.verhaard@arm.com>2020-05-07 08:12:58 +0200
committerTim Hall <tim.hall@arm.com>2020-06-18 17:53:52 +0100
commit3c07c97e0202c1cf01eba06c24b37a8f15ff7a7c (patch)
tree5856b7727a99b3c0baa00f5486f0c3b53e8e38e6 /ethosu/vela/mark_tensors.py
parent86d49935c3736c7aaa419abda07fa20c37c991a8 (diff)
downloadethos-u-vela-3c07c97e0202c1cf01eba06c24b37a8f15ff7a7c.tar.gz
MLBEDSW-1941: Bug fix shared weights
If same weight tensor was used with different block configs, errors would occur. Fixed by always cloning weight tensors, using a global weight compression cache and modifying the linear allocator to detect multiple usage of same weight compression. Change-Id: I91ca59176e1c59c66e0ac7a4227f2b5f0b47053f Signed-off-by: Louis Verhaard <louis.verhaard@arm.com>
Diffstat (limited to 'ethosu/vela/mark_tensors.py')
-rw-r--r--ethosu/vela/mark_tensors.py17
1 files changed, 5 insertions, 12 deletions
diff --git a/ethosu/vela/mark_tensors.py b/ethosu/vela/mark_tensors.py
index e7b3e50f..cd70446b 100644
--- a/ethosu/vela/mark_tensors.py
+++ b/ethosu/vela/mark_tensors.py
@@ -17,7 +17,6 @@
# Mark purpose and select formats for Tensors. Also compresses the weights.
from . import rewrite_graph
from . import weight_compressor
-from .architecture_features import Block
from .operation import NpuBlockType
from .tensor import TensorFormat
from .tensor import TensorPurpose
@@ -348,18 +347,12 @@ def mark_tensor_format(nng, arch, verbose_tensor_format=False):
for tens, fmt in formats_for_tensor.items():
tens.set_format(fmt, arch)
if fmt == TensorFormat.WeightsCompressed and tens.values is not None:
- npu_block_type = find_npu_usage_of_tensor(tens)
- if len(tens.ops) == 1 and tens.ops[0].type == "DMA":
- weight_compressor.compress_weights(tens, arch, npu_block_type, Block(32, 32, 32), 32)
+ src_tens = tens.get_dma_src_tensor()
+ if src_tens is not None:
+ npu_block_type = find_npu_usage_of_tensor(tens)
+ weight_compressor.compress_weights(arch, nng, tens, npu_block_type, 32, 32)
# Alias compressed weights back into source tensor
- src_tens = tens.ops[0].inputs[0]
- src_tens.compressed_values = tens.compressed_values
- src_tens.storage_shape = tens.storage_shape
- src_tens.brick_size = tens.brick_size
- src_tens.weight_compression_scales = tens.weight_compression_scales
- src_tens.weight_compressed_offsets = tens.weight_compressed_offsets
- src_tens.compression_scale_for_worst_weight_stream = tens.compression_scale_for_worst_weight_stream
- src_tens.storage_compression_scale = tens.storage_compression_scale
+ src_tens.copy_compressed_weight_info(tens)
if verbose_tensor_format:
nng.print_passes_with_tensors()