forked from PaddlePaddle/FastDeploy
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Benchmark]Benchmark cpp for YOLOv5 (PaddlePaddle#1224)
* add GPL lisence * add GPL-3.0 lisence * add GPL-3.0 lisence * add GPL-3.0 lisence * support yolov8 * add pybind for yolov8 * add yolov8 readme * add cpp benchmark * add cpu and gpu mem * public part split * add runtime mode * fixed bugs * add cpu_thread_nums * deal with comments * deal with comments * deal with comments * rm useless code * add FASTDEPLOY_DECL * add FASTDEPLOY_DECL
- Loading branch information
1 parent
e90e1ff
commit c487359
Showing
27 changed files
with
422 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
PROJECT(infer_demo C CXX) | ||
CMAKE_MINIMUM_REQUIRED (VERSION 3.10) | ||
|
||
# specify the decompress directory of FastDeploy SDK | ||
option(FASTDEPLOY_INSTALL_DIR "Path of downloaded fastdeploy sdk.") | ||
include(${FASTDEPLOY_INSTALL_DIR}/utils/gflags.cmake) | ||
include(${FASTDEPLOY_INSTALL_DIR}/FastDeploy.cmake) | ||
|
||
include_directories(${FASTDEPLOY_INCS}) | ||
|
||
add_executable(benchmark_yolov5 ${PROJECT_SOURCE_DIR}/benchmark_yolov5.cc) | ||
|
||
if(UNIX AND (NOT APPLE) AND (NOT ANDROID)) | ||
target_link_libraries(benchmark_yolov5 ${FASTDEPLOY_LIBS} gflags pthread) | ||
else() | ||
target_link_libraries(benchmark_yolov5 ${FASTDEPLOY_LIBS} gflags) | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,110 @@ | ||
// Copyright (c) 2023 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 "fastdeploy/benchmark/utils.h" | ||
#include "fastdeploy/vision.h" | ||
#include "flags.h" | ||
|
||
bool RunModel(std::string model_file, std::string image_file, size_t warmup, | ||
size_t repeats, size_t dump_period, std::string cpu_mem_file_name, | ||
std::string gpu_mem_file_name) { | ||
// Initialization | ||
auto option = fastdeploy::RuntimeOption(); | ||
if (!CreateRuntimeOption(&option)) { | ||
PrintUsage(); | ||
return false; | ||
} | ||
if (FLAGS_profile_mode == "runtime") { | ||
option.EnableProfiling(FLAGS_include_h2d_d2h, repeats, warmup); | ||
} | ||
auto model = fastdeploy::vision::detection::YOLOv5(model_file, "", option); | ||
if (!model.Initialized()) { | ||
std::cerr << "Failed to initialize." << std::endl; | ||
return false; | ||
} | ||
auto im = cv::imread(image_file); | ||
// For Runtime | ||
if (FLAGS_profile_mode == "runtime") { | ||
fastdeploy::vision::DetectionResult res; | ||
if (!model.Predict(im, &res)) { | ||
std::cerr << "Failed to predict." << std::endl; | ||
return false; | ||
} | ||
double profile_time = model.GetProfileTime() * 1000; | ||
std::cout << "Runtime(ms): " << profile_time << "ms." << std::endl; | ||
auto vis_im = fastdeploy::vision::VisDetection(im, res); | ||
cv::imwrite("vis_result.jpg", vis_im); | ||
std::cout << "Visualized result saved in ./vis_result.jpg" << std::endl; | ||
} else { | ||
// For End2End | ||
// Step1: warm up for warmup times | ||
std::cout << "Warmup " << warmup << " times..." << std::endl; | ||
for (int i = 0; i < warmup; i++) { | ||
fastdeploy::vision::DetectionResult res; | ||
if (!model.Predict(im, &res)) { | ||
std::cerr << "Failed to predict." << std::endl; | ||
return false; | ||
} | ||
} | ||
std::vector<float> end2end_statis; | ||
// Step2: repeat for repeats times | ||
std::cout << "Counting time..." << std::endl; | ||
fastdeploy::TimeCounter tc; | ||
fastdeploy::vision::DetectionResult res; | ||
for (int i = 0; i < repeats; i++) { | ||
if (FLAGS_collect_memory_info && i % dump_period == 0) { | ||
fastdeploy::benchmark::DumpCurrentCpuMemoryUsage(cpu_mem_file_name); | ||
fastdeploy::benchmark::DumpCurrentGpuMemoryUsage(gpu_mem_file_name, | ||
FLAGS_device_id); | ||
} | ||
tc.Start(); | ||
if (!model.Predict(im, &res)) { | ||
std::cerr << "Failed to predict." << std::endl; | ||
return false; | ||
} | ||
tc.End(); | ||
end2end_statis.push_back(tc.Duration() * 1000); | ||
} | ||
float end2end = std::accumulate(end2end_statis.end() - repeats, | ||
end2end_statis.end(), 0.f) / | ||
repeats; | ||
std::cout << "End2End(ms): " << end2end << "ms." << std::endl; | ||
auto vis_im = fastdeploy::vision::VisDetection(im, res); | ||
cv::imwrite("vis_result.jpg", vis_im); | ||
std::cout << "Visualized result saved in ./vis_result.jpg" << std::endl; | ||
} | ||
|
||
return true; | ||
} | ||
|
||
int main(int argc, char* argv[]) { | ||
google::ParseCommandLineFlags(&argc, &argv, true); | ||
int repeats = FLAGS_repeat; | ||
int warmup = FLAGS_warmup; | ||
int dump_period = FLAGS_dump_period; | ||
std::string cpu_mem_file_name = "result_cpu.txt"; | ||
std::string gpu_mem_file_name = "result_gpu.txt"; | ||
// Run model | ||
if (RunModel(FLAGS_model, FLAGS_image, warmup, repeats, dump_period, | ||
cpu_mem_file_name, gpu_mem_file_name) != true) { | ||
exit(1); | ||
} | ||
if (FLAGS_collect_memory_info) { | ||
float cpu_mem = fastdeploy::benchmark::GetCpuMemoryUsage(cpu_mem_file_name); | ||
float gpu_mem = fastdeploy::benchmark::GetGpuMemoryUsage(gpu_mem_file_name); | ||
std::cout << "cpu_rss_mb: " << cpu_mem << "MB." << std::endl; | ||
std::cout << "gpu_rss_mb: " << gpu_mem << "MB." << std::endl; | ||
} | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
// Copyright (c) 2023 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 "gflags/gflags.h" | ||
#include "fastdeploy/utils/perf.h" | ||
|
||
DEFINE_string(model, "", "Directory of the inference model."); | ||
DEFINE_string(image, "", "Path of the image file."); | ||
DEFINE_string(device, "cpu", | ||
"Type of inference device, support 'cpu' or 'gpu'."); | ||
DEFINE_int32(device_id, 0, "device(gpu) id."); | ||
DEFINE_int32(warmup, 200, "Number of warmup for profiling."); | ||
DEFINE_int32(repeat, 1000, "Number of repeats for profiling."); | ||
DEFINE_string(profile_mode, "runtime", "runtime or end2end."); | ||
DEFINE_string(backend, "default", | ||
"The inference runtime backend, support: ['default', 'ort', " | ||
"'paddle', 'ov', 'trt', 'paddle_trt']"); | ||
DEFINE_int32(cpu_thread_nums, 8, "Set numbers of cpu thread."); | ||
DEFINE_bool( | ||
include_h2d_d2h, false, "Whether run profiling with h2d and d2h."); | ||
DEFINE_bool( | ||
use_fp16, false, | ||
"Whether to use FP16 mode, only support 'trt' and 'paddle_trt' backend"); | ||
DEFINE_bool( | ||
collect_memory_info, false, "Whether to collect memory info"); | ||
DEFINE_int32(dump_period, 100, "How often to collect memory info."); | ||
|
||
void PrintUsage() { | ||
std::cout << "Usage: infer_demo --model model_path --image img_path --device " | ||
"[cpu|gpu] --backend " | ||
"[default|ort|paddle|ov|trt|paddle_trt] " | ||
"--use_fp16 false" | ||
<< std::endl; | ||
std::cout << "Default value of device: cpu" << std::endl; | ||
std::cout << "Default value of backend: default" << std::endl; | ||
std::cout << "Default value of use_fp16: false" << std::endl; | ||
} | ||
|
||
bool CreateRuntimeOption(fastdeploy::RuntimeOption* option) { | ||
if (FLAGS_device == "gpu") { | ||
option->UseGpu(); | ||
if (FLAGS_backend == "ort") { | ||
option->UseOrtBackend(); | ||
} else if (FLAGS_backend == "paddle") { | ||
option->UsePaddleInferBackend(); | ||
} else if (FLAGS_backend == "trt" || FLAGS_backend == "paddle_trt") { | ||
option->UseTrtBackend(); | ||
option->SetTrtInputShape("input", {1, 3, 112, 112}); | ||
if (FLAGS_backend == "paddle_trt") { | ||
option->EnablePaddleToTrt(); | ||
} | ||
if (FLAGS_use_fp16) { | ||
option->EnableTrtFP16(); | ||
} | ||
} else if (FLAGS_backend == "default") { | ||
return true; | ||
} else { | ||
std::cout << "While inference with GPU, only support " | ||
"default/ort/paddle/trt/paddle_trt now, " | ||
<< FLAGS_backend << " is not supported." << std::endl; | ||
return false; | ||
} | ||
} else if (FLAGS_device == "cpu") { | ||
option->SetCpuThreadNum(FLAGS_cpu_thread_nums); | ||
if (FLAGS_backend == "ort") { | ||
option->UseOrtBackend(); | ||
} else if (FLAGS_backend == "ov") { | ||
option->UseOpenVINOBackend(); | ||
} else if (FLAGS_backend == "paddle") { | ||
option->UsePaddleInferBackend(); | ||
} else if (FLAGS_backend == "default") { | ||
return true; | ||
} else { | ||
std::cout << "While inference with CPU, only support " | ||
"default/ort/ov/paddle now, " | ||
<< FLAGS_backend << " is not supported." << std::endl; | ||
return false; | ||
} | ||
} else { | ||
std::cerr << "Only support device CPU/GPU now, " << FLAGS_device | ||
<< " is not supported." << std::endl; | ||
return false; | ||
} | ||
|
||
return true; | ||
} |
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.