pytorch / pytorch/TensorRT

🐛 [Bug] select_scatter decomposition caused compilation failure

Open
#2,877 0 comments 0 reactions 1 assignee View on GitHub

@apbose is already working on this.

Since Jun 4, 2024.

bug story: Operator Coverage & Converters
Dominant language
Python
Stars
3k
Forks
410
Avg merge
3d 18h
Merged PRs (30d)
78

Description

Bug Description

The culprit seems to be https://github.com/pytorch/TensorRT/commit/65833002c58b4f02a37224bb516994f2c97faad3.

holy@HOLYWU:~$ python3 test.py
INFO:torch_tensorrt.dynamo.utils:Using Default Torch-TRT Runtime (as requested by user)
INFO:torch_tensorrt.dynamo.utils:Compilation Settings: CompilationSettings(enabled_precisions={<dtype.f16: 6>}, debug=True, workspace_size=0, min_block_size=1, torch_executed_ops=set(), pass_through_build_failures=False, max_aux_streams=None, version_compatible=False, optimization_level=None, use_python_runtime=False, truncate_double=True, use_fast_partitioner=True, enable_experimental_decompositions=False, device=Device(type=DeviceType.GPU, gpu_id=0), require_full_compilation=False, disable_tf32=False, assume_dynamic_shape_support=False, sparse_weights=False, refit=False, engine_capability=<EngineCapability.STANDARD: 1>, num_avg_timing_iters=1, dla_sram_size=1048576, dla_local_dram_size=1073741824, dla_global_dram_size=536870912, dryrun=False, hardware_compatible=False)

DEBUG:torch_tensorrt.dynamo.backend.backends:Pre-AOT Autograd graph:
graph():
    %l_x_ : torch.Tensor [num_users=2] = placeholder[target=L_x_]
    %setitem : [num_users=0] = call_function[target=operator.setitem](args = (%l_x_, (slice(None, None, None), slice(None, None, None), 0, 0), 3.1415926), kwargs = {})
    return (l_x_,)
DEBUG:torch_tensorrt.dynamo.lowering._repair_input_aliasing:Inserted auxiliary clone nodes for placeholders:
graph():
    %l_x_ : torch.Tensor [num_users=1] = placeholder[target=L_x_]
    %clone_default : [num_users=2] = call_function[target=torch.ops.aten.clone.default](args = (%l_x_,), kwargs = {})
    %setitem : [num_users=0] = call_function[target=operator.setitem](args = (%clone_default, (slice(None, None, None), slice(None, None, None), 0, 0), 3.1415926), kwargs = {})
    return (clone_default,)
DEBUG:torch_tensorrt.dynamo.lowering._remove_sym_nodes:Removed SymInt placeholders:
graph():
    %l_x_ : torch.Tensor [num_users=1] = placeholder[target=L_x_]
    %clone_default : [num_users=2] = call_function[target=torch.ops.aten.clone.default](args = (%l_x_,), kwargs = {})
    %setitem : [num_users=0] = call_function[target=operator.setitem](args = (%clone_default, (slice(None, None, None), slice(None, None, None), 0, 0), 3.1415926), kwargs = {})
    return (clone_default,)
DEBUG:torch_tensorrt.dynamo.backend.backends:Post-AOT Autograd graph:
graph():
    %arg0_1 : [num_users=1] = placeholder[target=arg0_1]
    %clone : [num_users=2] = call_function[target=torch.ops.aten.clone.default](args = (%arg0_1,), kwargs = {})
    %_tensor_constant0 : [num_users=1] = get_attr[target=_tensor_constant0]
    %lift_fresh_copy : [num_users=1] = call_function[target=torch.ops.aten.lift_fresh_copy.default](args = (%_tensor_constant0,), kwargs = {})
    %slice_1 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%clone, 0, 0, 9223372036854775807), kwargs = {})
    %slice_2 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_1, 1, 0, 9223372036854775807), kwargs = {})
    %select : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_2, 2, 0), kwargs = {})
    %select_1 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%select, 2, 0), kwargs = {})
    %copy : [num_users=1] = call_function[target=torch.ops.aten.copy.default](args = (%select_1, %lift_fresh_copy), kwargs = {})
    %slice_3 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%clone, 0, 0, 9223372036854775807), kwargs = {})
    %slice_4 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_3, 1, 0, 9223372036854775807), kwargs = {})
    %select_2 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_4, 2, 0), kwargs = {})
    %unsqueeze : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%copy, 2), kwargs = {})
    %empty_strided : [num_users=1] = call_function[target=torch.ops.aten.empty_strided.default](args = ([1, 1], [1, 1]), kwargs = {dtype: torch.int64, layout: torch.strided, device: cpu, pin_memory: False})
    %full_like : [num_users=1] = call_function[target=torch.ops.aten.full_like.default](args = (%empty_strided, 1), kwargs = {pin_memory: False})
    %mul : [num_users=1] = call_function[target=torch.ops.aten.mul.Tensor](args = (%full_like, 0), kwargs = {})
    %unsqueeze_1 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%mul, 2), kwargs = {})
    %cat : [num_users=1] = call_function[target=torch.ops.aten.cat.default](args = ([%unsqueeze_1], 2), kwargs = {})
    %_to_copy : [num_users=1] = call_function[target=torch.ops.aten._to_copy.default](args = (%cat,), kwargs = {dtype: torch.int64, layout: torch.strided, device: cuda:0})
    %scatter : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%select_2, 2, %_to_copy, %unsqueeze), kwargs = {})
    %unsqueeze_2 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%scatter, 2), kwargs = {})
    %empty_strided_1 : [num_users=1] = call_function[target=torch.ops.aten.empty_strided.default](args = ([1, 1, 4], [4, 4, 1]), kwargs = {dtype: torch.int64, layout: torch.strided, device: cpu, pin_memory: False})
    %full_like_1 : [num_users=1] = call_function[target=torch.ops.aten.full_like.default](args = (%empty_strided_1, 1), kwargs = {pin_memory: False})
    %mul_1 : [num_users=1] = call_function[target=torch.ops.aten.mul.Tensor](args = (%full_like_1, 0), kwargs = {})
    %cat_1 : [num_users=1] = call_function[target=torch.ops.aten.cat.default](args = ([%mul_1], 2), kwargs = {})
    %view : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%cat_1, [1, 1, 1, 4]), kwargs = {})
    %_to_copy_1 : [num_users=1] = call_function[target=torch.ops.aten._to_copy.default](args = (%view,), kwargs = {dtype: torch.int64, layout: torch.strided, device: cuda:0})
    %scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%slice_4, 2, %_to_copy_1, %unsqueeze_2), kwargs = {})
    return (scatter_1,)
DEBUG:torch_tensorrt.dynamo.lowering.passes.remove_input_alias_fixing_clones:Removing node clone from graph, since it is a clone node which is the only user of placeholder arg0_1 and was inserted by the compiler.
DEBUG:torch_tensorrt.dynamo.lowering.passes.remove_input_alias_fixing_clones:Removed auxiliary clone nodes for placeholders:
graph():
    %arg0_1 : [num_users=2] = placeholder[target=arg0_1]
    %_tensor_constant0 : [num_users=1] = get_attr[target=_tensor_constant0]
    %lift_fresh_copy : [num_users=1] = call_function[target=torch.ops.aten.lift_fresh_copy.default](args = (%_tensor_constant0,), kwargs = {})
    %slice_1 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%arg0_1, 0, 0, 9223372036854775807), kwargs = {})
    %slice_2 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_1, 1, 0, 9223372036854775807), kwargs = {})
    %select : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_2, 2, 0), kwargs = {})
    %select_1 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%select, 2, 0), kwargs = {})
    %copy : [num_users=1] = call_function[target=torch.ops.aten.copy.default](args = (%select_1, %lift_fresh_copy), kwargs = {})
    %slice_3 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%arg0_1, 0, 0, 9223372036854775807), kwargs = {})
    %slice_4 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_3, 1, 0, 9223372036854775807), kwargs = {})
    %select_2 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_4, 2, 0), kwargs = {})
    %unsqueeze : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%copy, 2), kwargs = {})
    %empty_strided : [num_users=1] = call_function[target=torch.ops.aten.empty_strided.default](args = ([1, 1], [1, 1]), kwargs = {dtype: torch.int64, layout: torch.strided, device: cpu, pin_memory: False})
    %full_like : [num_users=1] = call_function[target=torch.ops.aten.full_like.default](args = (%empty_strided, 1), kwargs = {pin_memory: False})
    %mul : [num_users=1] = call_function[target=torch.ops.aten.mul.Tensor](args = (%full_like, 0), kwargs = {})
    %unsqueeze_1 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%mul, 2), kwargs = {})
    %cat : [num_users=1] = call_function[target=torch.ops.aten.cat.default](args = ([%unsqueeze_1], 2), kwargs = {})
    %_to_copy : [num_users=1] = call_function[target=torch.ops.aten._to_copy.default](args = (%cat,), kwargs = {dtype: torch.int64, layout: torch.strided, device: cuda:0})
    %scatter : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%select_2, 2, %_to_copy, %unsqueeze), kwargs = {})
    %unsqueeze_2 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%scatter, 2), kwargs = {})
    %empty_strided_1 : [num_users=1] = call_function[target=torch.ops.aten.empty_strided.default](args = ([1, 1, 4], [4, 4, 1]), kwargs = {dtype: torch.int64, layout: torch.strided, device: cpu, pin_memory: False})
    %full_like_1 : [num_users=1] = call_function[target=torch.ops.aten.full_like.default](args = (%empty_strided_1, 1), kwargs = {pin_memory: False})
    %mul_1 : [num_users=1] = call_function[target=torch.ops.aten.mul.Tensor](args = (%full_like_1, 0), kwargs = {})
    %cat_1 : [num_users=1] = call_function[target=torch.ops.aten.cat.default](args = ([%mul_1], 2), kwargs = {})
    %view : [num_users=1] = call_function[target=torch.ops.aten.view.default](args = (%cat_1, [1, 1, 1, 4]), kwargs = {})
    %_to_copy_1 : [num_users=1] = call_function[target=torch.ops.aten._to_copy.default](args = (%view,), kwargs = {dtype: torch.int64, layout: torch.strided, device: cuda:0})
    %scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%slice_4, 2, %_to_copy_1, %unsqueeze_2), kwargs = {})
    return (scatter_1,)
DEBUG:torch_tensorrt.dynamo.lowering.passes.constant_folding:Graph after constant folding:
graph():
    %arg0_1 : [num_users=2] = placeholder[target=arg0_1]
    %_frozen_param0 : [num_users=1] = get_attr[target=_frozen_param0]
    %slice_1 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%arg0_1, 0, 0, 9223372036854775807), kwargs = {})
    %slice_2 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_1, 1, 0, 9223372036854775807), kwargs = {})
    %select : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_2, 2, 0), kwargs = {})
    %select_1 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%select, 2, 0), kwargs = {})
    %copy : [num_users=1] = call_function[target=torch.ops.aten.copy.default](args = (%select_1, %_frozen_param0), kwargs = {})
    %slice_3 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%arg0_1, 0, 0, 9223372036854775807), kwargs = {})
    %slice_4 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_3, 1, 0, 9223372036854775807), kwargs = {})
    %select_2 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_4, 2, 0), kwargs = {})
    %unsqueeze : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%copy, 2), kwargs = {})
    %_frozen_param1 : [num_users=1] = get_attr[target=_frozen_param1]
    %scatter : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%select_2, 2, %_frozen_param1, %unsqueeze), kwargs = {})
    %unsqueeze_2 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%scatter, 2), kwargs = {})
    %_frozen_param2 : [num_users=1] = get_attr[target=_frozen_param2]
    %scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%slice_4, 2, %_frozen_param2, %unsqueeze_2), kwargs = {})
    return (scatter_1,)
DEBUG:torch_tensorrt.dynamo.partitioning._global_partitioner:
Supported Nodes:
- torch.ops.aten.slice.Tensor + Operator Count: 4
- torch.ops.aten.select.int + Operator Count: 3
- torch.ops.aten.copy.default + Operator Count: 1
- torch.ops.aten.unsqueeze.default + Operator Count: 2
- torch.ops.aten.scatter.src + Operator Count: 2

DEBUG:torch_tensorrt.dynamo.partitioning._global_partitioner:
All Nodes Supported

DEBUG:torch_tensorrt.dynamo._compiler:Detected support for 12 operators out of 12 in subgraph.
DEBUG:torch_tensorrt.dynamo.partitioning._adjacency_partitioner:
Number of TensorRT-Accelerated Engines Generated: 1
DEBUG:torch_tensorrt.dynamo.partitioning._adjacency_partitioner:
Supported Nodes:
- torch.ops.aten.slice.Tensor + Operator Count: 4
- torch.ops.aten.select.int + Operator Count: 3
- torch.ops.aten.copy.default + Operator Count: 1
- torch.ops.aten.unsqueeze.default + Operator Count: 2
- torch.ops.aten.scatter.src + Operator Count: 2

DEBUG:torch_tensorrt.dynamo.partitioning._adjacency_partitioner:
All Nodes Supported

DEBUG:torch_tensorrt.dynamo._compiler:Submodule name: _run_on_acc_0
 Input shapes: [(1, 1, 4, 4)]
 graph():
    %arg0_1 : [num_users=2] = placeholder[target=arg0_1]
    %slice_1 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%arg0_1, 0, 0, 9223372036854775807), kwargs = {})
    %slice_2 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_1, 1, 0, 9223372036854775807), kwargs = {})
    %select : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_2, 2, 0), kwargs = {})
    %select_1 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%select, 2, 0), kwargs = {})
    %_frozen_param0 : [num_users=1] = get_attr[target=_frozen_param0]
    %copy : [num_users=1] = call_function[target=torch.ops.aten.copy.default](args = (%select_1, %_frozen_param0), kwargs = {})
    %slice_3 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%arg0_1, 0, 0, 9223372036854775807), kwargs = {})
    %slice_4 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_3, 1, 0, 9223372036854775807), kwargs = {})
    %select_2 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_4, 2, 0), kwargs = {})
    %unsqueeze : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%copy, 2), kwargs = {})
    %_frozen_param1 : [num_users=1] = get_attr[target=_frozen_param1]
    %scatter : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%select_2, 2, %_frozen_param1, %unsqueeze), kwargs = {})
    %unsqueeze_2 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%scatter, 2), kwargs = {})
    %_frozen_param2 : [num_users=1] = get_attr[target=_frozen_param2]
    %scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%slice_4, 2, %_frozen_param2, %unsqueeze_2), kwargs = {})
    return scatter_1
INFO:torch_tensorrt [TensorRT Conversion Context]:[MemUsageChange] Init CUDA: CPU +2, GPU +0, now: CPU 141, GPU 1009 (MiB)
INFO:torch_tensorrt [TensorRT Conversion Context]:[MemUsageChange] Init builder kernel library: CPU +1764, GPU +310, now: CPU 2041, GPU 1319 (MiB)
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Graph to be compiled to TensorRT: graph():
    %arg0_1 : [num_users=2] = placeholder[target=arg0_1]
    %slice_1 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%arg0_1, 0, 0, 9223372036854775807), kwargs = {})
    %slice_2 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_1, 1, 0, 9223372036854775807), kwargs = {})
    %select : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_2, 2, 0), kwargs = {})
    %select_1 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%select, 2, 0), kwargs = {})
    %_frozen_param0 : [num_users=1] = get_attr[target=_frozen_param0]
    %copy : [num_users=1] = call_function[target=torch.ops.aten.copy.default](args = (%select_1, %_frozen_param0), kwargs = {})
    %slice_3 : [num_users=1] = call_function[target=torch.ops.aten.slice.Tensor](args = (%arg0_1, 0, 0, 9223372036854775807), kwargs = {})
    %slice_4 : [num_users=2] = call_function[target=torch.ops.aten.slice.Tensor](args = (%slice_3, 1, 0, 9223372036854775807), kwargs = {})
    %select_2 : [num_users=1] = call_function[target=torch.ops.aten.select.int](args = (%slice_4, 2, 0), kwargs = {})
    %unsqueeze : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%copy, 2), kwargs = {})
    %_frozen_param1 : [num_users=1] = get_attr[target=_frozen_param1]
    %scatter : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%select_2, 2, %_frozen_param1, %unsqueeze), kwargs = {})
    %unsqueeze_2 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%scatter, 2), kwargs = {})
    %_frozen_param2 : [num_users=1] = get_attr[target=_frozen_param2]
    %scatter_1 : [num_users=1] = call_function[target=torch.ops.aten.scatter.src](args = (%slice_4, 2, %_frozen_param2, %unsqueeze_2), kwargs = {})
    return scatter_1
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Adding input to in-progress INetwork: arg0_1 [shape=[1, 1, 4, 4], dtype=DataType.HALF]
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node slice_1 (kind: aten.slice.Tensor, args: ('arg0_1 <tensorrt.ITensor [shape=(1, 1, 4, 4), dtype=DataType.HALF]>', 0, 0, 9223372036854775807))
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node slice_2 (kind: aten.slice.Tensor, args: ('[SLICE]-[unknown_ir_ops.slice.Tensor]-[slice_1]_output <tensorrt.ITensor [shape=(1, 1, 4, 4), dtype=DataType.HALF]>', 1, 0, 9223372036854775807))
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node select (kind: aten.select.int, args: ('[SLICE]-[unknown_ir_ops.slice.Tensor]-[slice_2]_output <tensorrt.ITensor [shape=(1, 1, 4, 4), dtype=DataType.HALF]>', 2, 0))
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node select_1 (kind: aten.select.int, args: ('(Unnamed Layer* 4) [Shuffle]_output <tensorrt.ITensor [shape=(1, 1, 4), dtype=DataType.HALF]>', 2, 0))
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node copy (kind: aten.copy.default, args: ('(Unnamed Layer* 7) [Shuffle]_output <tensorrt.ITensor [shape=(1, 1), dtype=DataType.HALF]>', '<torch.Tensor as np.ndarray [shape=(), dtype=float16]>'))
DEBUG:torch_tensorrt.dynamo.conversion.converter_utils:Freezing tensor copy_constant_1 to TRT IConstantLayer
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node slice_3 (kind: aten.slice.Tensor, args: ('arg0_1 <tensorrt.ITensor [shape=(1, 1, 4, 4), dtype=DataType.HALF]>', 0, 0, 9223372036854775807))
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node slice_4 (kind: aten.slice.Tensor, args: ('[SLICE]-[unknown_ir_ops.slice.Tensor]-[slice_3]_output <tensorrt.ITensor [shape=(1, 1, 4, 4), dtype=DataType.HALF]>', 1, 0, 9223372036854775807))
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node select_2 (kind: aten.select.int, args: ('[SLICE]-[unknown_ir_ops.slice.Tensor]-[slice_4]_output <tensorrt.ITensor [shape=(1, 1, 4, 4), dtype=DataType.HALF]>', 2, 0))
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node unsqueeze (kind: aten.unsqueeze.default, args: ('Forced Cast ITensor copy_constant_1_output from DataType.HALF to DataType.HALF - [aten_ops.torch.ops.aten.copy.default]-[copy]_output <tensorrt.ITensor [shape=(), dtype=DataType.HALF]>', 2))
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node scatter (kind: aten.scatter.src, args: ('(Unnamed Layer* 14) [Shuffle]_output <tensorrt.ITensor [shape=(1, 1, 4), dtype=DataType.HALF]>', 2, '<torch.Tensor as np.ndarray [shape=(1, 1, 1), dtype=int64]>', '[SHUFFLE]-[aten_ops.unsqueeze.default]-[unsqueeze]_output <tensorrt.ITensor [shape=(1,), dtype=DataType.HALF]>'))
DEBUG:torch_tensorrt.dynamo.conversion.converter_utils:Freezing tensor scatter_constant_2 to TRT IConstantLayer
ERROR:torch_tensorrt [TensorRT Conversion Context]:4: [SCATTER]-[aten_ops.scatter.src]-[scatter_scatter_layer]: ScatterLayer in elements mode all inputs tensors rank must be same.
DEBUG:torch_tensorrt.dynamo.conversion._TRTInterpreter:Converting node unsqueeze_2 (kind: aten.unsqueeze.default, args: ('[SCATTER]-[aten_ops.scatter.src]-[scatter_scatter_layer]_output <tensorrt.ITensor [shape=(1, 1, 4), dtype=DataType.HALF]>', 2))
ERROR:torch_tensorrt [TensorRT Conversion Context]:4: [graphShapeAnalyzer.cpp::needTypeAndDimensions::2276] Error Code 4: Internal Error ([SCATTER]-[aten_ops.scatter.src]-[scatter_scatter_layer]: output shape can not be computed)
Traceback (most recent call last):
  File "/home/holy/test.py", line 30, in <module>
    print(optimized_model(*inputs))
  File "/home/holy/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1545, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1554, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/eval_frame.py", line 421, in _fn
    return fn(*args, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1545, in _wrapped_call_impl
    return self._call_impl(*args, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1554, in _call_impl
    return forward_call(*args, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/convert_frame.py", line 1077, in catch_errors
    return callback(frame, cache_entry, hooks, frame_state, skip=1)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/convert_frame.py", line 918, in _convert_frame
    result = inner_convert(
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/convert_frame.py", line 456, in _convert_frame_assert
    return _compile(
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_utils_internal.py", line 83, in wrapper_function
    return StrobelightCompileTimeProfiler.profile_compile_time(
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_strobelight/compile_time_profiler.py", line 129, in profile_compile_time
    return func(*args, **kwargs)
  File "/usr/lib/python3.10/contextlib.py", line 79, in inner
    return func(*args, **kwds)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/convert_frame.py", line 799, in _compile
    guarded_code = compile_inner(code, one_graph, hooks, transform)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/utils.py", line 218, in time_wrapper
    r = func(*args, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/convert_frame.py", line 618, in compile_inner
    out_code = transform_code_object(code, transform)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/bytecode_transformation.py", line 1184, in transform_code_object
    transformations(instructions, code_options)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/convert_frame.py", line 177, in _fn
    return fn(*args, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/convert_frame.py", line 564, in transform
    tracer.run()
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/symbolic_convert.py", line 2248, in run
    super().run()
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/symbolic_convert.py", line 888, in run
    while self.step():
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/symbolic_convert.py", line 803, in step
    self.dispatch_table[inst.opcode](self, inst)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/symbolic_convert.py", line 2439, in RETURN_VALUE
    self._return(inst)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/symbolic_convert.py", line 2424, in _return
    self.output.compile_subgraph(
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/output_graph.py", line 1097, in compile_subgraph
    self.compile_and_call_fx_graph(tx, list(reversed(stack_values)), root)
  File "/usr/lib/python3.10/contextlib.py", line 79, in inner
    return func(*args, **kwds)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/output_graph.py", line 1314, in compile_and_call_fx_graph
    compiled_fn = self.call_user_compiler(gm)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/utils.py", line 218, in time_wrapper
    r = func(*args, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/output_graph.py", line 1405, in call_user_compiler
    raise BackendCompilerFailed(self.compiler_fn, e).with_traceback(
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/output_graph.py", line 1386, in call_user_compiler
    compiled_fn = compiler_fn(gm, self.example_inputs())
  File "/home/holy/.local/lib/python3.10/site-packages/torch/_dynamo/repro/after_dynamo.py", line 127, in debug_wrapper
    compiled_gm = compiler_fn(gm, example_inputs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/__init__.py", line 1831, in __call__
    return self.compiler_fn(model_, inputs_, **self.kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/backend/backends.py", line 43, in torch_tensorrt_backend
    return DEFAULT_BACKEND(gm, sample_inputs, **kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/backend/backends.py", line 51, in aot_torch_tensorrt_aten_backend
    return _pretraced_backend(gm, sample_inputs, settings)
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/backend/backends.py", line 102, in _pretraced_backend
    trt_compiled = compile_module(
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/_compiler.py", line 408, in compile_module
    trt_module = convert_module(
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/conversion/_conversion.py", line 106, in convert_module
    interpreter_result = interpret_module_to_result(module, inputs, settings)
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/conversion/_conversion.py", line 87, in interpret_module_to_result
    interpreter_result = interpreter.run()
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/conversion/_TRTInterpreter.py", line 308, in run
    super().run()
  File "/home/holy/.local/lib/python3.10/site-packages/torch/fx/interpreter.py", line 145, in run
    self.env[node] = self.run_node(node)
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/conversion/_TRTInterpreter.py", line 347, in run_node
    trt_node: torch.fx.Node = super().run_node(n)
  File "/home/holy/.local/lib/python3.10/site-packages/torch/fx/interpreter.py", line 202, in run_node
    return getattr(self, n.op)(n.target, args, kwargs)
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/conversion/_TRTInterpreter.py", line 443, in call_function
    return converter(self.ctx, target, args, kwargs, self._cur_node_name)
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/conversion/aten_ops_converters.py", line 613, in aten_ops_unsqueeze
    return impl.unsqueeze.unsqueeze(
  File "/home/holy/.local/lib/python3.10/site-packages/torch_tensorrt/dynamo/conversion/impl/unsqueeze.py", line 32, in unsqueeze
    input_shape_size = len(input_val.shape)
torch._dynamo.exc.BackendCompilerFailed: backend='torch_tensorrt_backend' raised:
ValueError: __len__() should return >= 0

While executing %unsqueeze_2 : [num_users=1] = call_function[target=torch.ops.aten.unsqueeze.default](args = (%scatter, 2), kwargs = {_itensor_to_tensor_meta: {<tensorrt_bindings.tensorrt.ITensor object at 0x7fd623671cf0>: ((1, 1, 4, 4), torch.float16, False, (16, 16, 4, 1), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd6236681f0>: ((1, 1, 4, 4), torch.float16, False, (16, 16, 4, 1), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd6236720f0>: ((1, 1, 4, 4), torch.float16, False, (16, 16, 4, 1), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd6236722b0>: ((1, 1, 4), torch.float16, False, (16, 16, 1), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd6236726f0>: ((1, 1), torch.float16, False, (16, 16), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd623673130>: ((1, 1), torch.float16, False, (16, 16), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd623673670>: ((1, 1, 4, 4), torch.float16, False, (16, 16, 4, 1), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd623673cb0>: ((1, 1, 4, 4), torch.float16, False, (16, 16, 4, 1), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd6236881b0>: ((1, 1, 4), torch.float16, False, (16, 16, 1), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd623688b70>: ((1, 1, 1), torch.float16, False, (16, 16, 1), torch.contiguous_format, False, {}), <tensorrt_bindings.tensorrt.ITensor object at 0x7fd623689cf0>: ((1, 1, 4), torch.float16, False, (4, 4, 1), torch.contiguous_format, False, {})}})
Original traceback:
None

Set TORCH_LOGS="+dynamo" and TORCHDYNAMO_VERBOSE=1 for more information


You can suppress this exception and fall back to eager by setting:
    import torch._dynamo
    torch._dynamo.config.suppress_errors = True

To Reproduce

import torch
import torch.nn as nn
import torch_tensorrt


class MyModule(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, x):
        x[:, :, 0, 0] = 3.1415926
        return x


device = torch.device("cuda", 0)
model = MyModule().eval().to(device).half()
inputs = [torch.zeros((1, 1, 4, 4), dtype=torch.half, device=device)]

optimized_model = torch_tensorrt.compile(
    model,
    ir="torch_compile",
    inputs=inputs,
    enabled_precisions={torch.half},
    debug=True,
    min_block_size=1,
    truncate_double=True,
    device=device,
)

print(optimized_model(*inputs))

Environment

  • Torch-TensorRT Version (e.g. 1.0.0): 2.4.0.dev20240601+cu124
  • PyTorch Version (e.g. 1.0): 2.4.0.dev20240601+cu124
  • CPU Architecture: x64
  • OS (e.g., Linux): Ubuntu 22.04
  • How you installed PyTorch (conda, pip, libtorch, source): pip
  • Build command you used (if compiling from source):
  • Are you using local sources or building from archives:
  • Python version: 3.10.12
  • CUDA version: 12.4
  • GPU models and configuration: RTX 3050
  • Any other relevant information:

Additional context

Although https://github.com/pytorch/TensorRT/blob/91637208e2e81ceac890a7f334ab535f695cabca/py/torch_tensorrt/dynamo/lowering/_decomposition_groups.py#L120 has nothing to do with this issue, this line should still be removed in favor of Torch-TRT's own decomposition.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.