Би асуултыг хүлээн зөвшөөрсөн: Vanilla ONNX Runtime ашиглан тавтай морилноор YOLOv8 видео хоолой үүсгэх. ямар ч хөнгөн frameworks. ямар ч Python bottlenecks. Just raw C++ grit. Хэрэв та нэрийн сүлжээний хооронд жинхэнэ H.264 видеог дамжуулахыг хүсэж байгаа бол? Python-ийн Global Interpreter Lock (GIL) болон энэ нь мэдрэмжийг хувилбарлахад өвөрмөц ач холбогдолтой юм. Миний хамгийн сүүлийн үеийн үйл явдал нь хялбар зорилготой байна: Vanilla ONNX Runtime болон YOLOv8 сегментийн загвар ашиглан видео stream нь хурдан ач холбогдол үүсгэхийн тулд. Энэ нь харьцуулахад хялбар байсан. FFmpeg олж авах, фрэймс боловсруулах, тэднийг шифрлэдэг. Энд би хязгааргүй 10 FPS прототип нь 29 FPS-ийн зүрхтэй зүрх, "Финальний босоо" богино ууссан. In reality, it was a journey through engineering hell. (Мазохистын бүрэн эх код: видео-yolo-dash-процессор) Видео-yolo-dash процессорууд FogAI Sandbox: Integration өмнө баталгаажуулалт Энэ репозиторын нь байнгын тоглоом биш --- Энэ нь Ялангуяа компьютер үзэл загварууд, хөдөлгүүрийн барилга, оптимизацийн загварууд стресс-тестын тулд энэ орчинд ашиглаж байна. . dedicated testbed FogAI core Хэрэв стратеги (Золоо-Copy тоног төхөөрөмжийн картографын гэх мэт) 29 FPS-д эвдэж чадахгүй байгаа бол, энэ нь аж үйлдвэрийн автономт нерв системд байгаа бизнес биш юм. Previous Chapters in the FogAI Saga: Манифест: Prompts Overrated байна. Энд би Python ямар ч нунтаг AI Node-ийг үүсгэх вэ Ажлын түүх: Prompts Overrated байна: Би Python-ийн ямар ч нунтаг AI Node-ийг бий болгосон (Энэ болдог) Хөгжлийн эх үүсвэр: GitHub: NickZt/FogAi "Memory Copy Tax" Хадгаламжийн Ихэнх компьютерийн үзэл прототипы нь уян хатан байдаг, учир нь тэд хөнгөн цагаан цагааны тоглоом шиг мэдрэмжийг эмч байна. Миний эхний архитектур нь "стандартын" хатуу байсан: FFmpeg H.264 YUV харьцаа формат руу decoded, OpenCV руу конвертировал (BGR) загвар хангах, RGB зураг дээр маск хэрэглэдэг, үүнийг хувиргах YUV, эцэст нь шифрлэдэг. cv::Mat Өнгөрсөн ARM CPU-д 4K фрэймс боловсруулсан, энэ overhead нь зүгээр л байтугай хоорондоо хоолой. That's three unnecessary memory copies and two heavy pixel-format conversions. 30% of your cycles Би үүнийг гүйцэтгэхийн тулд . Frame-ийг өөрчилж байгаа бол, би Hardware Y-plane (Luminance) шууд OpenCV руу Өргөтгөл Zero-Copy Hardware Mapping AVFrame cv::Mat С++ // Mapping the hardware Y-plane natively - zero memcpy, zero overhead. cv::Mat y_plane(yuvFrame->height, yuvFrame->width, CV_8UC1, yuvFrame->data, yuvFrame->linesize); // YOLO segmentation masks now inject binary modifications directly // onto the hardware Y sequence. y_plane(bbox).setTo(0, valid_mask); Цонверсион overhead дамжуулан, би CPU-ийн цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонхны цонх Why? Mutability болон Asynchronous Reorder Профилийг харуулсан, миний утас нэг удаагийн үлгэлийн хавтгай дээр харуулсан байна. Та нэг загвар дээр хэд хэдэн нунтаг үүсгэсэн бол тэд өөр өөр өөрсдийн арилгах, систем segfaulted. YOLO Би concurrent pool-ийг олж авсан models-- нэг нэг ONNX загварын инстанц нь үйлчлүүлэгчийн нунтагтай. The Fix: std::unique_ptr<YOLO_Segment> Гэхдээ энэ нь хатуу байсан: Ажлын ажилчид янз бүрийн цаг хугацаагаар дуусгахад, Frame 2 Frame 1 өмнө дуусгаж болно, видео нь 90s jump-cut шиг буцаж байх ёстой. хязгааргүй H.264 синхронизацийг хангахын тулд. DASH video requires strict frame order. std::map С++ // Reorder buffer logic to keep the stream sequential std::map<int64_t, FramePayload> reorderBuffer; int64_t expected_pts = 0; while (true) { auto payload = inferenceQueue.pop(); // Workers drop processed frames here reorderBuffer[payload.pts] = payload; // Emit frames only when the sequential timestamp flags align while (!reorderBuffer.empty() && reorderBuffer.begin()->first == expected_pts) { auto it = reorderBuffer.begin(); encoder.writeFrame(it->second.yuvFrame, it->second.pts); reorderBuffer.erase(it); expected_pts++; } } The Final Boss: Thread Cache Thrashing Гарын авлага дээр, логик бүрэн байсан. Үнэндээ, миний FPS My Time-To-Inference (TTI) латенц нь 43ms-ээс 890ms-д нэмэгдсэн. 10 FPS I was a victim of CPU Cache Thrashing. Ямар ч би морилноос хуваалцсан байсан ч, үндсэн ML библиотек (OpenCV болон ONNX) өөрсдийн дотоодын нунтаг бий болгон "хэвчжүүлэгч" байсан. ONNX Runtime: харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харьцуулахад харь OpenCV: .setTo() гэх мэт үйл явцыг автоматжуулсан ажилчид. Миний нэрлэгдсэн ажилчид ONNX-ийн нунтагтай, OpenCV-ийн нунтагтай бодож байна. Thousands of context switches were destroying my L1/L2 caches every second. Эдүүлбэр » Хөгжлийн » Хөгжлийн жагсаалт » Хөгжлийн жагсаалт » Хөгжлийн жагсаалт С++ int main() { // Globally disable implicit OpenCV threading cv::setNumThreads(1); // Cap ONNX Runtime to a single thread per op Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(1); session_options.SetInterOpNumThreads(1); } Контекстуйн суулгах шууд олсон байна. Миний CPU-ийн үйл явцны кеш нь синхрончлосон байна. Газрын шугам нь дараа нь хязгааргүй нь ~329ms нь TTI таван. 29 FPS Эго дээрх хадгалах: Ванилын стратеги Би найдвартай асуултууд нь: "Хэв та гүйцэтгэлийн хувьд маш их төвлөрсөн байгаа бол, хөдөлгүүрийн хуваалцах, ягаан туяар optimize биш үү?" Эдүүлбэр Technical Debt avoidance. Хэрэв та хөдөлгүүрийн интернал хакердах бол, та үргэлжлэхгүй хадгалах хоолой бүртгүүлэх болно. Шинэ хувилбар нь шинэ тоног төхөөрөмжийн дэмжлэгтэй буцаж бүх удаа --- гэх мэт (57% префил дэмжлэг) эсвэл --- Та өөрчлөн optimizations manually re-port байх ёстой. , Би үнэгүй эдгээр тоног төхөөрөмжийн шинэчлэлт "хаалттай" болно зүгээр л хувилбар нь хувилбар тоо. ARM KleidiAI Intel DL Boost (VNNI) Vanilla Inference Engine Үүнээс гадна, би шифрлэдэг / шифрлэдэг хоолой optimize биш сонгосон байна. Хэрэв энэ нь юу вэ? эсвэл , Эдгээр чипүүд нь H.264 нь силикон түвшинд хурдасгаж байна. ; кодек нь тэд үүсгэсэн металлтай. Intel QuickSync Rockchip VPU Zero-Copy Bridge Сэтгэгдэл үлдээх: Stop Guessing, Start Profiling АИ-ийг бодит дэлхийд зориулсан масштаб хийх нь бидэнтэй хялбарсан алдартай давтамжуулалттай давтамжуулалтыг хуваалцах хэрэгтэй. Python системийг үйлдвэрлэхэд туслах үед энэ давтамжийн төлбөр хамардаг. Хэрэв та видео дээр уян хатан tensor payloads нь ажиллуулж байгаа бол: Kill пикселийн конверсийг хуваалцах --- харьцуулалтын хавтгай дээр ажилладаг. Таны загварууд тусгаарлах - ажилчид бүр нэг инстанц. Reorder sequential outputs --- async эцсийн цаг нь таны stream-ийг хуваалцах боломжийг олгоно. Ямар ч таны библиотекарууд өөрийн нунтаг үүсгэх боломжийг олгоно. Stay Vanilla --- таны архитектур, хөдөлгүүрийн биш, технологийн борлуулалт бага байхын тулд optimize. Дараа нь FogAI Node? Бид Prepping байна нуль-копийг ажиллуулах ... Grounding DINO