Skip to content

Commit 25ed804

Browse files
Adapt python op converters covered in paddle-3-beta2 for TRT 10 (#69510)
* Adapt `paddle.tensorrt.converter` to TRT 10 This commit includes basic migration to TRT 10 API, and also enable those converter who are tested with existing unittest to TRT10 For those 2 converter which is NOT included in this commit: - python/paddle/tensorrt/impls/attribute.py - python/paddle/tensorrt/impls/common.py Need to fix these 2 behavior issues in later commit. * Adapt "pd_op.shape" TRT op converter to TRT10 Although `IShapeLayer` supports shape in int64 since TRT10, some paddle native op kernel only implements their input shape tensor (if exists) in int32. Hence, there is a workaround in `trt_shape` to cast the result of TRT `IShapeLayer` back to int32 to be more compatible with other paddle op. (see python/paddle/tensorrt/converter_utils.py) Please remove the workaround when all paddle op supports their shape in int64. Also, since `IShapeLayer` return shape in int64 in TRT10, the "pd_op.shape64" will be seamlessly supported in TRT10 w/o any extra workaround. * Fix converter error in TRT10 for interpolation ops Error detail: { (%1) = "pd_op.bilinear_interp" [id:28] (%2, %3, <<NULL VALUE>>, <<NULL VALUE>>) {__l_trt__:true,align_corners:false,align_mode:(Int32)0,data_format:"NCHW",interp_method:"bilinear",out_d:(Int32)-1,out_h:(Int32)12,out_w:(Int32)12,scale:[],stop_gradient:[true]} : (builtin.tensor<-1x3x6x10xf32>, builtin.tensor<2xi32>, <<NULL TYPE>>, <<NULL TYPE>>) -> builtin.tensor<-1x3x12x12xf32> () = "cf.yield" [id:36] (%1) {} : (builtin.tensor<-1x3x12x12xf32>) -> } [TRT] [E] ITensor::getDimensions: Error Code 4: API Usage Error ((Unnamed Layer* 6) [Concatenation]: concat input tensors 0 and 2 have incompatible types Int64 and Int32) [TRT] [E] IBuilder::buildSerializedNetwork: Error Code 4: API Usage Error ((Unnamed Layer* 6) [Concatenation]: concat input tensors 0 and 2 have incompatible types Int64 and Int32) The error happened in "python/paddle/tensorrt/impls/common.py" because IConcatenationLayer requires all input to be same dtype. The (shape)tensor passed from paddle op will be int32, while the TRT IShapeLayer supports int64 shape; thereby, cannot be concatenated with each other. Here, we call `trt_shape` to get shape tensor whose dtype aligned with the dtype from paddle op. * Add int64 in TRT->paddle dtype mapping function * Fix "test_converter_math" by enable op for TRT 10 test_converter_math can pass unittest with environment with TRT 10.6 * Adapt 3 manipulation converters to TRT 10 - "pd_op.expand" - "pd_op.expand_as" - "pd_op.slice"
1 parent cd595c6 commit 25ed804

File tree

17 files changed

+91
-49
lines changed

17 files changed

+91
-49
lines changed

paddle/fluid/framework/new_executor/instruction/tensorrt_engine_instruction.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,12 @@ static phi::DataType TRT2PaddleDataType(nvinfer1::DataType type) {
233233
return phi::DataType::FLOAT16;
234234
case nvinfer1::DataType::kINT8:
235235
return phi::DataType::INT8;
236+
#if IS_TRT_VERSION_GE(9000)
237+
case nvinfer1::DataType::kINT64:
238+
VLOG(4) << "get nvinfer1::DataType::kINT64 from TRT op, and will output "
239+
"to paddle. Does the downstream paddle op here support int64?";
240+
return phi::DataType::INT64;
241+
#endif
236242
#if IS_TRT_VERSION_GE(7000)
237243
case nvinfer1::DataType::kBOOL:
238244
return phi::DataType::BOOL;

python/paddle/tensorrt/converter.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,9 @@ def convert_subgraph_to_trt(self, program, group_op):
448448
config.set_flag(trt.BuilderFlag.PREFER_PRECISION_CONSTRAINTS)
449449

450450
trt_engine = builder.build_serialized_network(network, config)
451+
assert (
452+
trt_engine is not None
453+
), 'Failed to build engine. please see ERROR log from trt.Logger'
451454
trt_params = paddle.base.libpaddle.TRTEngineParams()
452455
trt_params.min_input_shape = min_shape_map
453456
trt_params.max_input_shape = max_shape_map

python/paddle/tensorrt/converter_utils.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
sys.path.append(parent_dir)
2626

2727

28+
from tensorrt import INetworkDefinition, ITensor
29+
2830
from paddle.base.log_helper import get_logger
2931

3032
_logger = get_logger(
@@ -243,9 +245,17 @@ def trt_cast(network, input, dtype):
243245
return identity_layer.get_output(0)
244246

245247

246-
def trt_shape(network, input):
248+
def trt_shape(network: INetworkDefinition, input: ITensor) -> ITensor:
249+
"""
250+
Add a IShapeLayer to get the shape of `input` ITensor.
251+
This includes a workaround that casting the shape result(int64) from TRT10 back to int32.
252+
Many existing paddle op kernels only support input shape tensor as int32
253+
, to make TRT op more compatible with other paddle op, we cast back to int32.
254+
NOTE: please remove this workaround when all paddle op supports shape tensor in int64
255+
"""
247256
shape_layer = network.add_shape(input)
248257
if version_list[0] >= 10: # trt_version >=10
258+
# workaround
249259
return trt_cast(network, shape_layer.get_output(0), trt.int32)
250260
return shape_layer.get_output(0)
251261

python/paddle/tensorrt/impls/activation.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,17 @@
3535
}
3636

3737

38-
@converter_registry.register("pd_op.relu", trt_version="8.x")
39-
@converter_registry.register("pd_op.tanh", trt_version="8.x")
40-
@converter_registry.register("pd_op.sigmoid", trt_version="8.x")
38+
@converter_registry.register("pd_op.relu", trt_version="trt_version_ge=8.0")
39+
@converter_registry.register("pd_op.tanh", trt_version="trt_version_ge=8.0")
40+
@converter_registry.register("pd_op.sigmoid", trt_version="trt_version_ge=8.0")
4141
def activation_converter(network, paddle_op, inputs):
4242
layer = network.add_activation(
4343
inputs[0], activation_type_map[paddle_op.name()]
4444
)
4545
return layer.get_output(0)
4646

4747

48-
@converter_registry.register("pd_op.softmax", trt_version="8.x")
48+
@converter_registry.register("pd_op.softmax", trt_version="trt_version_ge=8.0")
4949
def softmax_converter(network, paddle_op, inputs):
5050
axis = paddle_op.attrs().get("axis", 0)
5151
if axis < 0:
@@ -56,7 +56,7 @@ def softmax_converter(network, paddle_op, inputs):
5656
return softmax_layer.get_output(0)
5757

5858

59-
@converter_registry.register("pd_op.gelu", trt_version="8.x")
59+
@converter_registry.register("pd_op.gelu", trt_version="trt_version_ge=8.0")
6060
def gelu_converter(network, paddle_op, inputs):
6161
input_val = inputs[0]
6262
approximate = paddle_op.attrs()["approximate"]
@@ -79,7 +79,9 @@ def gelu_converter(network, paddle_op, inputs):
7979
return layer.get_output(0)
8080

8181

82-
@converter_registry.register("pd_op.hardsigmoid", trt_version="8.x")
82+
@converter_registry.register(
83+
"pd_op.hardsigmoid", trt_version="trt_version_ge=8.0"
84+
)
8385
def hardsigmoid_converter(network, paddle_op, inputs):
8486
x = inputs[0]
8587
slope = paddle_op.attrs()["slope"]
@@ -92,7 +94,9 @@ def hardsigmoid_converter(network, paddle_op, inputs):
9294
return hardsigmoid_layer.get_output(0)
9395

9496

95-
@converter_registry.register("pd_op.hardswish", trt_version="8.x")
97+
@converter_registry.register(
98+
"pd_op.hardswish", trt_version="trt_version_ge=8.0"
99+
)
96100
def hardswish_converter(network, paddle_op, inputs):
97101
x = inputs[0]
98102
threshold = 6.0

python/paddle/tensorrt/impls/attribute.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,16 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
from paddle.tensorrt.converter_utils import trt_shape
1516
from paddle.tensorrt.register import converter_registry
1617

1718

18-
@converter_registry.register("pd_op.shape", trt_version="8.x")
19+
@converter_registry.register("pd_op.shape", trt_version="trt_version_ge=8.0")
1920
def shape_converter(network, paddle_op, inputs):
20-
input_tensor = inputs[0]
21-
shape_layer = network.add_shape(input_tensor)
22-
return shape_layer.get_output(0)
21+
return trt_shape(network, inputs[0])
2322

2423

25-
@converter_registry.register("pd_op.shape64", trt_version="8.x")
24+
@converter_registry.register("pd_op.shape64", trt_version="trt_version_ge=8.0")
2625
def shape64_converter(network, paddle_op, inputs):
2726
input_tensor = inputs[0]
2827
shape_layer = network.add_shape(input_tensor)

python/paddle/tensorrt/impls/common.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import numpy as np
1717
import tensorrt as trt
1818

19-
from paddle.tensorrt.converter_utils import get_shape_tensor_element
19+
from paddle.tensorrt.converter_utils import get_shape_tensor_element, trt_shape
2020
from paddle.tensorrt.register import converter_registry
2121
from paddle.tensorrt.util import get_trt_version_list
2222

@@ -48,7 +48,9 @@ def dropout_converter(network, paddle_op, inputs):
4848
return scale_layer.get_output(0)
4949

5050

51-
@converter_registry.register("pd_op.bilinear_interp", trt_version="8.x")
51+
@converter_registry.register(
52+
"pd_op.bilinear_interp", trt_version="trt_version_ge=8.0"
53+
)
5254
def bilinear_interp_converter(network, paddle_op, inputs):
5355
input_tensor = inputs[0]
5456
data_format = paddle_op.attrs().get("data_format")
@@ -139,7 +141,7 @@ def bilinear_interp_converter(network, paddle_op, inputs):
139141
else:
140142
if outsize_tensor is not None:
141143
outsize_itensors = []
142-
input_shape_tensor = network.add_shape(input_tensor).get_output(0)
144+
input_shape_tensor = trt_shape(network, input_tensor)
143145
batch_dim = get_shape_tensor_element(network, input_shape_tensor, 0)
144146
outsize_itensors.append(batch_dim)
145147
if data_format == "NCHW":
@@ -162,7 +164,9 @@ def bilinear_interp_converter(network, paddle_op, inputs):
162164
return resize_layer.get_output(0)
163165

164166

165-
@converter_registry.register("pd_op.nearest_interp", trt_version="8.x")
167+
@converter_registry.register(
168+
"pd_op.nearest_interp", trt_version="trt_version_ge=8.0"
169+
)
166170
def nearest_interp_converter(network, paddle_op, inputs):
167171
input_tensor = inputs[0]
168172
data_format = paddle_op.attrs().get("data_format")
@@ -254,7 +258,7 @@ def nearest_interp_converter(network, paddle_op, inputs):
254258
)
255259
if outsize_tensor is not None:
256260
outsize_itensors = []
257-
input_shape_tensor = network.add_shape(input_tensor).get_output(0)
261+
input_shape_tensor = trt_shape(network, input_tensor)
258262
batch_dim = get_shape_tensor_element(network, input_shape_tensor, 0)
259263
outsize_itensors.append(batch_dim)
260264
if data_format == "NCHW":

python/paddle/tensorrt/impls/conv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919

2020
@converter_registry.register("pd_op.depthwise_conv2d", trt_version="8.x")
21-
@converter_registry.register("pd_op.conv2d", trt_version="8.x")
21+
@converter_registry.register("pd_op.conv2d", trt_version="trt_version_ge=8.0")
2222
@converter_registry.register("pd_op.conv2d_transpose", trt_version="8.x")
2323
@converter_registry.register(
2424
"pd_op.depthwise_conv2d_transpose", trt_version="8.x"

python/paddle/tensorrt/impls/creation.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929
from paddle.tensorrt.register import converter_registry
3030

3131

32-
@converter_registry.register("pd_op.full_int_array", trt_version="8.x")
32+
@converter_registry.register(
33+
"pd_op.full_int_array", trt_version="trt_version_ge=8.0"
34+
)
3335
def full_int_array_converter(network, paddle_op, inputs):
3436
value = paddle_op.attrs()["value"]
3537
if len(value) == 0:
@@ -39,7 +41,7 @@ def full_int_array_converter(network, paddle_op, inputs):
3941
return full_int_array_layer.get_output(0)
4042

4143

42-
@converter_registry.register("pd_op.full", trt_version="8.x")
44+
@converter_registry.register("pd_op.full", trt_version="trt_version_ge=8.0")
4345
def full_converter(network, paddle_op, inputs):
4446
shape = paddle_op.attrs()["shape"]
4547
value = paddle_op.attrs().get("value", 1.0)

python/paddle/tensorrt/impls/linalg.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
from paddle.tensorrt.register import converter_registry
2626

2727

28-
@converter_registry.register("pd_op.matmul", trt_version="8.x")
28+
@converter_registry.register("pd_op.matmul", trt_version="trt_version_ge=8.0")
2929
def matmul_converter(network, paddle_op, inputs):
3030
weight_shape = paddle_op.operands()[1].source().shape
3131
transpose_x = paddle_op.attrs()["transpose_x"]
@@ -61,7 +61,9 @@ def matmul_converter(network, paddle_op, inputs):
6161
return out.get_output(0)
6262

6363

64-
@converter_registry.register("pd_op.transpose", trt_version="8.x")
64+
@converter_registry.register(
65+
"pd_op.transpose", trt_version="trt_version_ge=8.0"
66+
)
6567
def transpose_converter(network, paddle_op, inputs):
6668
perm = paddle_op.attrs()["perm"]
6769
transposed_tensor = network.add_shuffle(inputs[0])

python/paddle/tensorrt/impls/manipulation.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
from ..util import get_trt_version_list
4545

4646

47-
@converter_registry.register("pd_op.reshape", trt_version="8.x")
47+
@converter_registry.register("pd_op.reshape", trt_version="trt_version_ge=8.0")
4848
def reshape_converter(network, paddle_op, inputs):
4949
x = inputs[0]
5050
is_constant_shape = False
@@ -87,7 +87,7 @@ def gather_nd_converter(network, paddle_op, inputs):
8787
return non_zero_layer.get_output(0)
8888

8989

90-
@converter_registry.register("pd_op.flatten", trt_version="8.x")
90+
@converter_registry.register("pd_op.flatten", trt_version="trt_version_ge=8.0")
9191
def flatten_converter(network, paddle_op, inputs):
9292
input_val = inputs[0]
9393
input_val_shape = paddle_op.operands()[0].source().shape
@@ -172,7 +172,7 @@ def flatten_converter(network, paddle_op, inputs):
172172

173173

174174
# In the converter, pd_op.concat has three inputs, because builtin.combine has two inputs.
175-
@converter_registry.register("pd_op.concat", trt_version="8.x")
175+
@converter_registry.register("pd_op.concat", trt_version="trt_version_ge=8.0")
176176
def concat_converter(network, paddle_op, inputs):
177177
input_tensors = inputs[0]
178178
axis_tensor = inputs[1]
@@ -187,8 +187,12 @@ def concat_converter(network, paddle_op, inputs):
187187
return concat_layer.get_output(0)
188188

189189

190-
@converter_registry.register("pd_op.unsqueeze", trt_version="8.x")
191-
@converter_registry.register("pd_op.unsqueeze_", trt_version="8.x")
190+
@converter_registry.register(
191+
"pd_op.unsqueeze", trt_version="trt_version_ge=8.0"
192+
)
193+
@converter_registry.register(
194+
"pd_op.unsqueeze_", trt_version="trt_version_ge=8.0"
195+
)
192196
def unsqueeze_converter(network, paddle_op, inputs):
193197
x = inputs[0]
194198
input_dims = x.shape
@@ -235,8 +239,8 @@ def unsqueeze_converter(network, paddle_op, inputs):
235239
return layer.get_output(0)
236240

237241

238-
@converter_registry.register("pd_op.squeeze", trt_version="8.x")
239-
@converter_registry.register("pd_op.squeeze_", trt_version="8.x")
242+
@converter_registry.register("pd_op.squeeze", trt_version="trt_version_ge=8.0")
243+
@converter_registry.register("pd_op.squeeze_", trt_version="trt_version_ge=8.0")
240244
def squeeze_converter(network, paddle_op, inputs):
241245
input_val = inputs[0]
242246
input_shape = input_val.shape
@@ -260,7 +264,7 @@ def squeeze_converter(network, paddle_op, inputs):
260264
return layer.get_output(0)
261265

262266

263-
@converter_registry.register("pd_op.expand", trt_version="8.x")
267+
@converter_registry.register("pd_op.expand", trt_version="trt_version_ge=8.0")
264268
def expand_converter(network, paddle_op, inputs):
265269
input = inputs[0]
266270
input_dims = input.shape
@@ -282,7 +286,9 @@ def expand_converter(network, paddle_op, inputs):
282286
return trt_expand(network, input, rank, shape_tensor, shape_rank)
283287

284288

285-
@converter_registry.register("pd_op.expand_as", trt_version="8.x")
289+
@converter_registry.register(
290+
"pd_op.expand_as", trt_version="trt_version_ge=8.0"
291+
)
286292
def expand_as_converter(network, paddle_op, inputs):
287293
input = inputs[0]
288294
input_dims = input.shape
@@ -328,15 +334,15 @@ def cast_converter(network, paddle_op, inputs):
328334
return cast_layer.get_output(0)
329335

330336

331-
@converter_registry.register("pd_op.slice", trt_version="8.x")
337+
@converter_registry.register("pd_op.slice", trt_version="trt_version_ge=8.0")
332338
def slice_converter(network, paddle_op, inputs):
333339
input_tensor = inputs[0]
334340
axes = paddle_op.attrs()["axes"]
335341
decrease_axis = paddle_op.attrs().get("decrease_axis")
336342

337343
starts_op = paddle_op.operands()[1].source().get_defining_op()
338344
ends_op = paddle_op.operands()[2].source().get_defining_op()
339-
input_shape_tensor = network.add_shape(input_tensor).get_output(0)
345+
input_shape_tensor = trt_shape(network, input_tensor)
340346
input_rank = len(input_tensor.shape)
341347

342348
starts_tensor = []

0 commit comments

Comments
 (0)