From 42febfa928af0a066727b9d6b1d2dbe15bf10886 Mon Sep 17 00:00:00 2001 From: Luo Tao Date: Mon, 23 Apr 2018 21:19:25 +0800 Subject: [PATCH] tensorrt convert init --- .../fluid/inference/tensorrt/CMakeLists.txt | 2 + .../inference/tensorrt/convert/CMakeLists.txt | 2 + .../inference/tensorrt/convert/convert.cc | 51 +++++++++++++++ .../inference/tensorrt/convert/convert.h | 64 +++++++++++++++++++ .../tensorrt/convert/convert_test.cc | 38 +++++++++++ 5 files changed, 157 insertions(+) create mode 100644 paddle/fluid/inference/tensorrt/convert/CMakeLists.txt create mode 100644 paddle/fluid/inference/tensorrt/convert/convert.cc create mode 100644 paddle/fluid/inference/tensorrt/convert/convert.h create mode 100644 paddle/fluid/inference/tensorrt/convert/convert_test.cc diff --git a/paddle/fluid/inference/tensorrt/CMakeLists.txt b/paddle/fluid/inference/tensorrt/CMakeLists.txt index e39c0daac..37f038f1f 100644 --- a/paddle/fluid/inference/tensorrt/CMakeLists.txt +++ b/paddle/fluid/inference/tensorrt/CMakeLists.txt @@ -1 +1,3 @@ nv_test(test_tensorrt SRCS test_tensorrt.cc DEPS dynload_cuda device_context dynamic_loader) +cc_library(tensorrt DEPS tensorrt_convert) +add_subdirectory(convert) diff --git a/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt b/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt new file mode 100644 index 000000000..c35d61ef0 --- /dev/null +++ b/paddle/fluid/inference/tensorrt/convert/CMakeLists.txt @@ -0,0 +1,2 @@ +nv_library(tensorrt_convert SRCS convert.cc DEPS dynload_cuda) +nv_test(tensorrt_convert_test SRCS convert_test.cc DEPS tensorrt paddle_fluid) diff --git a/paddle/fluid/inference/tensorrt/convert/convert.cc b/paddle/fluid/inference/tensorrt/convert/convert.cc new file mode 100644 index 000000000..be813cf93 --- /dev/null +++ b/paddle/fluid/inference/tensorrt/convert/convert.cc @@ -0,0 +1,51 @@ +/* Copyright (c) 2018 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. */ + +#include "paddle/fluid/inference/tensorrt/convert/convert.h" + +namespace paddle { +namespace inference { +namespace tensorrt { + +void TensorRTConverter::ConvertOp(const framework::OpDesc& op) { + std::string type = op.Type(); + PADDLE_ENFORCE(op_registry_.count(type), "No converter registered for op: %s", + type); + std::function op_converter = + op_registry_.at(type); + op_converter(op); +} + +void TensorRTConverter::ConvertBlock(const framework::BlockDesc& block) { + for (auto op : block.AllOps()) { + ConvertOp(*op); + } +} + +void TensorRTConverter::RegisterOpConverters() { + op_registry_["mul"] = ConvertMul; + op_registry_["conv2d"] = ConvertConv2D; +} + +void TensorRTConverter::ConvertMul(const framework::OpDesc& op) { + LOG(INFO) << "convert a fluid mul op to tensorrt fc layer without bias"; +} + +void TensorRTConverter::ConvertConv2D(const framework::OpDesc& op) { + LOG(INFO) << "convert a fluid Conv2d op to tensorrt conv layer without bias"; +} + +} // namespace tensorrt +} // namespace inference +} // namespace paddle diff --git a/paddle/fluid/inference/tensorrt/convert/convert.h b/paddle/fluid/inference/tensorrt/convert/convert.h new file mode 100644 index 000000000..a02915203 --- /dev/null +++ b/paddle/fluid/inference/tensorrt/convert/convert.h @@ -0,0 +1,64 @@ +/* Copyright (c) 2018 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. */ + +#pragma once + +#include +#include +#include +#include + +#include "paddle/fluid/framework/block_desc.h" +#include "paddle/fluid/framework/scope.h" + +namespace paddle { +namespace inference { +namespace tensorrt { + +class TensorRTConverter { + public: + explicit TensorRTConverter(const framework::Scope& scope) : scope_(scope) { + this->RegisterOpConverters(); + } + + // convert fluid op to tensorrt layer + void ConvertOp(const framework::OpDesc& op); + + // convert fluid block to tensorrt network + void ConvertBlock(const framework::BlockDesc& block); + + private: + // convert op registry, whose key is the fluid op type, and value is the + // convert tensorrt function name + std::unordered_map> + op_registry_; + // fluid inference scope + const framework::Scope& scope_; + // tensorrt input/output tensor list, whose key is the fluid variable name, + // and value is the pointer position of tensorrt tensor + std::unordered_map tr_tensors_; + + // register different op converters + void RegisterOpConverters(); + + // convert a fluid Mul op to tensorrt fc layer without bias + static void ConvertMul(const framework::OpDesc& op); + + // convert a fluid Conv2d op to tensorrt conv layer without bias + static void ConvertConv2D(const framework::OpDesc& op); +}; + +} // namespace tensorrt +} // namespace inference +} // namespace paddle diff --git a/paddle/fluid/inference/tensorrt/convert/convert_test.cc b/paddle/fluid/inference/tensorrt/convert/convert_test.cc new file mode 100644 index 000000000..dd1526b78 --- /dev/null +++ b/paddle/fluid/inference/tensorrt/convert/convert_test.cc @@ -0,0 +1,38 @@ +/* Copyright (c) 2018 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. */ + +#include "paddle/fluid/inference/tensorrt/convert/convert.h" +#include +#include "paddle/fluid/framework/program_desc.h" + +namespace paddle { +namespace inference { +namespace tensorrt { + +TEST(tensorrt, ConvertBlock) { + framework::ProgramDesc prog; + auto* block = prog.MutableBlock(0); + auto* mul_op = block->AppendOp(); + mul_op->SetType("mul"); + auto* conv2d_op = block->AppendOp(); + conv2d_op->SetType("conv2d"); + + framework::Scope scope; + TensorRTConverter converter(scope); + converter.ConvertBlock(*block); +} + +} // namespace tensorrt +} // namespace inference +} // namespace paddle -- GitLab