
วิธีใช้ Tensorrt C ++ API สำหรับการอนุมานการเรียนรู้ของเครื่อง GPU ที่มีประสิทธิภาพสูง
รองรับโมเดลที่มีอินพุตเดี่ยว / หลายตัวและเอาต์พุตเดี่ยว / หลายรายการด้วยการแบตช์
วิดีโอภาพรวมโครงการ รหัสวิดีโอดำน้ำลึก
โครงการนี้กำลังมองหาผู้ดูแลเพื่อช่วยเป็นแนวทางในการเติบโตและการปรับปรุง หากคุณหลงใหลในโครงการนี้และสนใจที่จะมีส่วนร่วมฉันชอบที่จะได้ยินจากคุณ!
โปรดอย่าลังเลที่จะติดต่อผ่าน LinkedIn เพื่อหารือเกี่ยวกับวิธีการมีส่วนร่วม
ฉันอ่านเอกสาร Nvidia Tensorrt ทั้งหมดเพื่อที่คุณจะได้ไม่ต้องทำ!
โครงการนี้แสดงให้เห็นถึงวิธีการใช้ Tensorrt C ++ API สำหรับการอนุมาน GPU ประสิทธิภาพสูงในข้อมูลภาพ ครอบคลุมวิธีการทำสิ่งต่อไปนี้:
คำแนะนำต่อไปนี้ถือว่าคุณใช้ Ubuntu 20.04 หรือ 22.04 คุณจะต้องจัดหาโมเดล ONNX ของคุณเองสำหรับโค้ดตัวอย่างนี้หรือคุณสามารถดาวน์โหลดโมเดลตัวอย่าง (ดูส่วนตรวจสอบความปลอดภัยด้านล่าง)
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev (สำหรับการบันทึก)build_opencv.sh ที่ให้ไว้ใน ./scripts/ /CUDNN_INCLUDE_DIR และ CUDNN_LIBRARY ในสคริปต์CMakeLists.txt และแทนที่ TODO ด้วยเส้นทางไปยังการติดตั้ง Tensorrt ของคุณmkdir buildcd buildcmake ..make -j$(nproc)./run_inference_benchmark --onnx_model ../models/yolov8n.onnx./run_inference_benchmark --trt_model ../models/yolov8n.engine.NVIDIAGeForceRTX3080LaptopGPU.fp16.1.1YOLOv8n จากที่นี่pip3 install ultralytics ก่อน from ultralytics import YOLO
model = YOLO ( "./yolov8n.pt" )
model . fuse ()
model . info ( verbose = False ) # Print model information
model . export ( format = "onnx" , opset = 12 ) # Export the model to onnx using opset 12yolov8n.onnx ในไดเรกทอรี ./models/ /./inputs/team.jpg ควรสร้างเวกเตอร์คุณสมบัติต่อไปนี้: 3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
การเปิดใช้งานความแม่นยำ Int8 สามารถเพิ่มความเร็วในการอนุมานได้ด้วยค่าใช้จ่ายในการลดความแม่นยำเนื่องจากช่วงไดนามิกที่ลดลง สำหรับความแม่นยำ Int8 ผู้ใช้จะต้องจัดหาข้อมูลการสอบเทียบซึ่งเป็นตัวแทนของข้อมูลจริงที่โมเดลจะเห็น ขอแนะนำให้ใช้ภาพการสอบเทียบ 1K+ ในการเปิดใช้งานการอนุมาน INT8 กับรูปแบบการตรวจสอบ Sanity YOLOV8 ต้องดำเนินการตามขั้นตอนต่อไปนี้:
options.precision = Precision::FP16; ไปยัง options.precision = Precision::INT8; ใน main.cppoptions.calibrationDataDirectoryPath = ""; จะต้องเปลี่ยนแปลงใน main.cpp เพื่อระบุเส้นทางที่มีข้อมูลการสอบเทียบwget http://images.cocodataset.org/zips/val2017.zipInt8EntropyCalibrator2::getBatch ใน engine.cpp (ดู TODO ) ถูกต้องสำหรับรุ่นของคุณ.calibration ) เพื่อให้การปรับแต่งโมเดลที่ตามมาสามารถนำกลับมาใช้ใหม่ได้ หากคุณต้องการสร้างข้อมูลการสอบเทียบใหม่คุณต้องลบไฟล์แคชนี้Options.calibrationBatchSize เพื่อให้ทั้งชุดสามารถพอดีกับหน่วยความจำ GPU ของคุณเกณฑ์มาตรฐานทำงานบน RTX 3050 TI แล็ปท็อป GPU, 11th Gen Intel (R) Core (TM) I9-11900H @ 2.50GHz
| แบบอย่าง | ความแม่นยำ | ขนาดแบทช์ | เวลาอนุมาน AVG |
|---|---|---|---|
| yolov8n | fp32 | 1 | 4.732 ms |
| yolov8n | FP16 | 1 | 2.493 ms |
| yolov8n | int8 | 1 | 2.009 ms |
| YOLOV8X | fp32 | 1 | 76.63 ms |
| YOLOV8X | FP16 | 1 | 25.08 ms |
| YOLOV8X | int8 | 1 | 11.62 ms |
สงสัยว่าจะรวมห้องสมุดนี้เข้ากับโครงการของคุณได้อย่างไร? หรืออาจจะอ่านผลลัพธ์ของโมเดล YOLOV8 เพื่อแยกข้อมูลที่มีความหมายได้อย่างไร? ถ้าเป็นเช่นนั้นตรวจสอบสองโครงการล่าสุดของฉัน YOLOV8-TENSORRT-CPP และ YOLOV9-TENSORRT-CPP ซึ่งแสดงให้เห็นถึงวิธีการใช้ TENSORRT C ++ API เพื่อเรียกใช้การอนุมาน YOLOV8/9 (สนับสนุนการตรวจจับวัตถุการแบ่งส่วนความหมายและการประมาณค่าร่างกาย) พวกเขาใช้ประโยชน์จากโครงการนี้ในแบ็กเอนด์!
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.mdinclude/engine ฉันได้เขียนความคิดเห็นมากมายตลอดทั้งรหัสซึ่งควรทำให้ง่ายต่อการเข้าใจสิ่งที่เกิดขึ้นinclude/engine/EngineRunInference.inlinclude/engine/EngineBuildLoadNetwork.inl การใช้งานใช้ไลบรารี spdlog สำหรับการบันทึก คุณสามารถเปลี่ยนระดับบันทึกโดยการตั้งค่าตัวแปรสภาพแวดล้อม LOG_LEVEL เป็นหนึ่งในค่าต่อไปนี้: trace , debug , info , warn , error , critical , off
หากคุณมีปัญหาในการสร้างไฟล์เอ็นจิ้น Tensorrt จากรุ่น ONNX ให้พิจารณาการตั้งค่าตัวแปรสภาพแวดล้อม LOG_LEVEL เพื่อ trace และเรียกใช้แอปพลิเคชันอีกครั้ง สิ่งนี้ควรให้ข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการบิลด์ที่ล้มเหลว
หากโครงการนี้เป็นประโยชน์กับคุณฉันจะขอบคุณถ้าคุณสามารถให้ดาวได้ นั่นจะกระตุ้นให้ฉันให้แน่ใจว่าเป็นข้อมูลล่าสุดและแก้ไขปัญหาได้อย่างรวดเร็ว ฉันยังทำงานให้คำปรึกษาหากคุณต้องการความช่วยเหลือเพิ่มเติม เชื่อมต่อกับฉันบน LinkedIn
loic tetrel | Thomaskleven | วิซิน |
v6.0
v5.0
Engine ได้รับการแก้ไขเพื่อใช้พารามิเตอร์เทมเพลตซึ่งระบุชนิดข้อมูลเอาท์พุทโมเดล ตอนนี้การใช้งานรองรับเอาต์พุตของประเภท float , __half , int8_t , int32_t , bool และ uint8_tOptions ได้รับการตั้งค่าอย่างถูกต้องสำหรับโมเดลของคุณ (ตัวอย่างเช่นหากโมเดลของคุณได้รับการรวบรวมสำหรับ FP32 แต่คุณลองใช้การอนุมาน FP16 มันจะล้มเหลวv4.1
v4.0
v3.0
IExecutionContext::enqueueV3() )driver เป็น run_inference_benchmark และตอนนี้ต้องส่งผ่านเส้นทางไปยังโมเดล ONNX เป็นอาร์กิวเมนต์บรรทัดคำสั่งOptions.doesSupportDynamicBatchSize ที่ถูกลบ การใช้งานตอนนี้ตรวจจับขนาดแบทช์ที่รองรับอัตโนมัติOptions.maxWorkspaceSize MaxWorksPacesize การใช้งานในขณะนี้ไม่ได้ จำกัด หน่วยความจำ GPU ในระหว่างการสร้างแบบจำลองทำให้การใช้งานสามารถใช้พูลหน่วยความจำได้มากเท่าที่มีอยู่สำหรับเลเยอร์ระดับกลางv2.2
v2.1
v2.0
Options.optBatchSizes ถูกลบออกแทนที่ด้วย Options.optBatchSize OPTBATCHSIZEขอบคุณไปที่คนที่ยอดเยี่ยมเหล่านี้ (คีย์อีโมจิ):
โครงการนี้เป็นไปตามข้อกำหนดทั้งหมดของผู้เข้าร่วม การมีส่วนร่วมทุกชนิดยินดีต้อนรับ!