Files
paddlepaddle--paddle/python/paddle/tensorrt/impls/ops.py
T
2026-07-13 12:40:42 +08:00

277 lines
9.0 KiB
Python

# Copyright (c) 2024 PaddlePaddle Authors. All Rights Reserved
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import numpy as np
import tensorrt as trt
from paddle.tensorrt.converter_utils import (
WithFp16,
get_trt_plugin,
set_layer_name,
unary_op_converter,
)
from paddle.tensorrt.register import converter_registry
from paddle.tensorrt.util import (
TensorRTConstantManager,
)
@converter_registry.register("pd_op.sqrt")
@converter_registry.register("pd_op.sqrt_")
@converter_registry.register("pd_op.floor")
@converter_registry.register("pd_op.exp")
@converter_registry.register("pd_op.abs")
@converter_registry.register("pd_op.abs_")
@converter_registry.register("pd_op.sin")
@converter_registry.register("pd_op.cos")
@converter_registry.register("pd_op.sinh")
@converter_registry.register("pd_op.cosh")
@converter_registry.register("pd_op.asinh")
@converter_registry.register("pd_op.acosh")
@converter_registry.register("pd_op.atanh")
@converter_registry.register("pd_op.ceil")
@converter_registry.register("pd_op.tan")
@converter_registry.register("pd_op.asin")
@converter_registry.register("pd_op.acos")
@converter_registry.register("pd_op.atan")
@converter_registry.register("pd_op.reciprocal")
@converter_registry.register("pd_op.erf")
@converter_registry.register("pd_op.rsqrt")
@converter_registry.register("pd_op.sign", trt_version="trt_version_ge=8.2")
@converter_registry.register("pd_op.round", trt_version="trt_version_ge=8.2")
def UnaryOpConverter(network, paddle_op, inputs):
layer_output = unary_op_converter(network, paddle_op, inputs)
return layer_output
@converter_registry.register("pd_op.roi_align")
def roi_align_converter(network, paddle_op, inputs):
x = inputs[0]
rois = inputs[1]
pooled_height = paddle_op.attrs().get("pooled_height")
pooled_width = paddle_op.attrs().get("pooled_width")
spatial_scale = paddle_op.attrs().get("spatial_scale")
sampling_ratio = paddle_op.attrs().get("sampling_ratio")
aligned = paddle_op.attrs().get("aligned")
type_id = int(WithFp16())
plugin_fields = [
trt.PluginField(
"type_id",
np.array([type_id], dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"pooled_height",
np.array(pooled_height, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"pooled_width",
np.array(pooled_width, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"spatial_scale",
np.array(spatial_scale, dtype=np.float32),
trt.PluginFieldType.FLOAT32,
),
trt.PluginField(
"sampling_ratio",
np.array(sampling_ratio, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"aligned",
np.array(aligned, dtype=np.bool_),
trt.PluginFieldType.INT32,
),
]
plugin_field_collection = trt.PluginFieldCollection(plugin_fields)
plugin_name = "pir_roi_align_plugin_dynamic"
plugin_version = "2"
plugin = get_trt_plugin(
plugin_name, plugin_field_collection, plugin_version
)
roi_align_inputs = [x, rois]
roi_align_layer = network.add_plugin_v2(roi_align_inputs, plugin)
set_layer_name(roi_align_layer, paddle_op)
return roi_align_layer.get_output(0)
@converter_registry.register("pd_op.yolo_box")
def YoloBoxOpConverter(network, paddle_op, inputs):
x, imgSize = inputs
class_num = paddle_op.attrs().get("class_num")
anchors = paddle_op.attrs().get("anchors")
downsample_ratio = paddle_op.attrs().get("downsample_ratio")
conf_thresh = paddle_op.attrs().get("conf_thresh")
clip_bbox = paddle_op.attrs().get("clip_bbox")
scale_x_y = paddle_op.attrs().get("scale_x_y")
iou_aware = paddle_op.attrs().get("iou_aware")
iou_aware_factor = paddle_op.attrs().get("iou_aware_factor")
type_id = int(WithFp16())
anchors = np.array(anchors, dtype=np.int32)
plugin_fields = [
trt.PluginField(
"type_id",
np.array([type_id], dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"anchors",
anchors,
trt.PluginFieldType.INT32,
),
trt.PluginField(
"class_num",
np.array(class_num, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"conf_thresh",
np.array(conf_thresh, dtype=np.float32),
trt.PluginFieldType.FLOAT32,
),
trt.PluginField(
"downsample_ratio",
np.array(downsample_ratio, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"clip_bbox",
np.array(clip_bbox, dtype=np.bool_),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"scale_x_y",
np.array(scale_x_y, dtype=np.float32),
trt.PluginFieldType.FLOAT32,
),
trt.PluginField(
"iou_aware",
np.array(iou_aware, dtype=np.bool_),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"iou_aware_factor",
np.array(iou_aware_factor, dtype=np.float32),
trt.PluginFieldType.FLOAT32,
),
]
plugin_field_collection = trt.PluginFieldCollection(plugin_fields)
plugin_name = "yolo_box_plugin_dynamic"
plugin_version = "1"
plugin = get_trt_plugin(
plugin_name, plugin_field_collection, plugin_version
)
yolo_box_inputs = [x, imgSize]
yolo_box_layer = network.add_plugin_v2(yolo_box_inputs, plugin)
set_layer_name(yolo_box_layer, paddle_op)
out0 = yolo_box_layer.get_output(0)
out1 = yolo_box_layer.get_output(1)
return (out0, out1)
@converter_registry.register(
"pd_op.deformable_conv", trt_version="trt_version_ge=8.5"
)
def deformable_conv_converter(network, paddle_op, inputs):
input = inputs[0]
constant_manager = TensorRTConstantManager()
offset = inputs[1]
filter = inputs[2]
mask = inputs[3]
if isinstance(filter, trt.ITensor):
filter_name = (
paddle_op.operands()[2]
.source()
.get_defining_op()
.attrs()['parameter_name']
)
filter = constant_manager.get_constant_value(filter_name)
else:
filter = filter.numpy()
groups = paddle_op.attrs().get("groups")
deformable_groups = paddle_op.attrs().get("deformable_groups")
im2col_step = paddle_op.attrs().get("im2col_step")
strides = paddle_op.attrs().get("strides")
paddings = paddle_op.attrs().get("paddings")
dilations = paddle_op.attrs().get("dilations")
kernel_dims = paddle_op.operands()[2].source().shape
plugin_fields = [
trt.PluginField(
"with_fp16",
np.array([False], dtype=np.bool_),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"weights",
filter,
trt.PluginFieldType.FLOAT32,
),
trt.PluginField(
"kernel_dims",
np.array(kernel_dims, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"strides",
np.array(strides, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"paddings",
np.array(paddings, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"dilations",
np.array(dilations, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"groups",
np.array(groups, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"deformable_groups",
np.array(deformable_groups, dtype=np.int32),
trt.PluginFieldType.INT32,
),
trt.PluginField(
"im2col_step",
np.array(im2col_step, dtype=np.int32),
trt.PluginFieldType.INT32,
),
]
plugin_field_collection = trt.PluginFieldCollection(plugin_fields)
plugin_name = "pir_deformable_conv_plugin"
plugin_version = "1"
plugin = get_trt_plugin(
plugin_name, plugin_field_collection, plugin_version
)
deformable_conv_layer = network.add_plugin_v2(
[inputs[0], inputs[1], inputs[3]], plugin
)
set_layer_name(deformable_conv_layer, paddle_op)
return deformable_conv_layer.get_output(0)