kaylorchen / rk3588-yolo-demo

The project is a multi-threaded inference demo of Yolo running on the RK3588 platform, which has been adapted for reading video files and camera feeds. The demo uses the Yolov8n model for file inference, with a maximum inference frame rate of up to 100 frames per second.
MIT License
196 stars 26 forks source link

请问您推较大的模型时是否会发生内存泄漏问题。 #3

Closed chakloong883 closed 5 months ago

chakloong883 commented 6 months ago

我在参考您的方案修改yolov5的demo,发现循环时设置较小的延时,并且推理较大的模型(如yolov5m),设置线程数为3时可能会发生内存泄漏问题,请问您有没有遇到类似的情况。

kaylorchen commented 6 months ago

我这边没有遇到内存泄漏的问题。 之前倒是有一个重复释放内存的问题,不过那个bug我已经修复了。

chakloong883 commented 6 months ago

我这边没有遇到内存泄漏的问题。 之前倒是有一个重复释放内存的问题,不过那个bug我已经修复了。

好的,想问一下您在推理时加了一把outputslock,请问为什么需要加这个outputs_lock_呀

kaylorchen commented 6 months ago

我这边没有遇到内存泄漏的问题。 之前倒是有一个重复释放内存的问题,不过那个bug我已经修复了。

好的,想问一下您在推理时加了一把outputslock,请问为什么需要加这个outputs_lock_呀

就是解决上面我说的内存重复释放的问题。这个是线程安全的问题,没有这个锁的话。你在操作同一个推理的输出的时候会发生 写内存 写内存 释放 释放, 第二次写覆盖了第一次写的,但是第二次释放的时候会重复释放。

chakloong883 commented 6 months ago

我这边没有遇到内存泄漏的问题。 之前倒是有一个重复释放内存的问题,不过那个bug我已经修复了。

好的,想问一下您在推理时加了一把outputslock,请问为什么需要加这个outputs_lock_呀

就是解决上面我说的内存重复释放的问题。这个是线程安全的问题,没有这个锁的话。你在操作同一个推理的输出的时候会发生 写内存 写内存 释放 释放, 第二次写覆盖了第一次写的,但是第二次释放的时候会重复释放。

好的,感谢

chakloong883 commented 6 months ago

内存 释放 释放, 第二次写覆盖了

我发现在循环使用线程池的时候,如果调用时间占用较长的话,资源有可能得不到有效释放,越积越多,比如下面的例子,内存占用会逐渐增大。在推理较大的模型时,推理时间较长,应该也像这样的效果。

#include <iostream>
#include <memory>
#include "ThreadPool.h"
int main() {
    ThreadPool pool(4);
    while(true) {
        pool.enqueue([]{
            unsigned char* data = new unsigned char[640*640*3];
            std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 延时1s
            delete []data;

        });
        printf("count+1\n");
    } 
}
kaylorchen commented 6 months ago

内存 释放 释放, 第二次写覆盖了

我发现在循环使用线程池的时候,如果调用时间占用较长的话,资源有可能得不到有效释放,越积越多,比如下面的例子,内存占用会逐渐增大。在推理较大的模型时,推理时间较长,应该也像这样的效果。

#include <iostream>
#include <memory>
#include "ThreadPool.h"
int main() {
    ThreadPool pool(4);
    while(true) {
        pool.enqueue([]{
            unsigned char* data = new unsigned char[640*640*3];
            std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 延时1s
            delete []data;

        });
        printf("count+1\n");
    } 
}

阿 这。。。我觉得你应该去了解一下缓存队列是什么。 或者类似的了解一下生产者和消费者模型,处理不不过来可能会积累的哈

chakloong883 commented 6 months ago

内存 释放 释放, 第二次写覆盖了

我发现在循环使用线程池的时候,如果调用时间占用较长的话,资源有可能得不到有效释放,越积越多,比如下面的例子,内存占用会逐渐增大。在推理较大的模型时,推理时间较长,应该也像这样的效果。

#include <iostream>
#include <memory>
#include "ThreadPool.h"
int main() {
    ThreadPool pool(4);
    while(true) {
        pool.enqueue([]{
            unsigned char* data = new unsigned char[640*640*3];
            std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 延时1s
            delete []data;

        });
        printf("count+1\n");
    } 
}

阿 这。。。我觉得你应该去了解一下缓存队列是什么。 或者类似的了解一下生产者和消费者模型,处理不不过来可能会积累的哈

好的