<bdo id='lx1Eu'></bdo><ul id='lx1Eu'></ul>

      <small id='lx1Eu'></small><noframes id='lx1Eu'>

    1. <legend id='lx1Eu'><style id='lx1Eu'><dir id='lx1Eu'><q id='lx1Eu'></q></dir></style></legend>

      <i id='lx1Eu'><tr id='lx1Eu'><dt id='lx1Eu'><q id='lx1Eu'><span id='lx1Eu'><b id='lx1Eu'><form id='lx1Eu'><ins id='lx1Eu'></ins><ul id='lx1Eu'></ul><sub id='lx1Eu'></sub></form><legend id='lx1Eu'></legend><bdo id='lx1Eu'><pre id='lx1Eu'><center id='lx1Eu'></center></pre></bdo></b><th id='lx1Eu'></th></span></q></dt></tr></i><div id='lx1Eu'><tfoot id='lx1Eu'></tfoot><dl id='lx1Eu'><fieldset id='lx1Eu'></fieldset></dl></div>
      <tfoot id='lx1Eu'></tfoot>

      多线程会降低GPU性能

      Multithreading degrades GPU performance(多线程会降低GPU性能)
      <i id='hXCK8'><tr id='hXCK8'><dt id='hXCK8'><q id='hXCK8'><span id='hXCK8'><b id='hXCK8'><form id='hXCK8'><ins id='hXCK8'></ins><ul id='hXCK8'></ul><sub id='hXCK8'></sub></form><legend id='hXCK8'></legend><bdo id='hXCK8'><pre id='hXCK8'><center id='hXCK8'></center></pre></bdo></b><th id='hXCK8'></th></span></q></dt></tr></i><div id='hXCK8'><tfoot id='hXCK8'></tfoot><dl id='hXCK8'><fieldset id='hXCK8'></fieldset></dl></div>

        <tbody id='hXCK8'></tbody>

        <legend id='hXCK8'><style id='hXCK8'><dir id='hXCK8'><q id='hXCK8'></q></dir></style></legend>
          <bdo id='hXCK8'></bdo><ul id='hXCK8'></ul>

          <small id='hXCK8'></small><noframes id='hXCK8'>

            <tfoot id='hXCK8'></tfoot>

                本文介绍了多线程会降低GPU性能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                在我的Python应用程序中,我使用Detectron2对图像运行预测,并检测图像中所有人的关键点。

                我希望(使用aiortc)对流式传输到我的应用程序LIVE的帧运行预测,但我发现预测时间要糟糕得多,因为它现在运行在新线程上(服务器占用了主线程)。

                在线程上运行预测需要1.5到4秒,这是很长的时间。

                在主线程(不含视频流部分)上运行预测时,我得到的预测时间小于1秒

                我的问题是为什么会发生这种情况,我如何修复它?为什么从新线程使用GPU时,GPU性能会如此急剧下降?

                备注:

                1. 代码在使用Tesla P100 GPU的Google Colab中进行测试,并通过从视频文件中读取帧来模拟视频流。

                2. 我使用this question中的代码计算对帧运行预测所需的时间。

                我尝试切换到多进程,但无法使用CUDA(我使用import multiprocessingimport torch.multiprocessing都尝试了import torch.multiprocessingset_stratup_method('spawn')),只是在进程上调用start时卡住了。

                示例代码:

                from detectron2 import model_zoo
                from detectron2.engine import DefaultPredictor
                from detectron2.config import get_cfg
                
                import threading
                from typing import List
                import numpy as np
                import timeit
                import cv2
                
                # Prepare the configuration file
                cfg = get_cfg()
                cfg.merge_from_file(model_zoo.get_config_file("COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml"))
                cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7  # set threshold for this model
                cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml")
                
                cfg.MODEL.DEVICE = "cuda"
                predictor = DefaultPredictor(cfg)
                
                
                def get_frames(video: cv2.VideoCapture):
                    frames = list()
                    while True:
                        has_frame, frame = video.read()
                        if not has_frame:
                            break
                        frames.append(frame)
                    return frames
                
                class CodeTimer:
                    # Source: https://stackoverflow.com/a/52749808/9977758
                    def __init__(self, name=None):
                        self.name = " '" + name + "'" if name else ''
                
                    def __enter__(self):
                        self.start = timeit.default_timer()
                
                    def __exit__(self, exc_type, exc_value, traceback):
                        self.took = (timeit.default_timer() - self.start) * 1000.0
                        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')
                
                video = cv2.VideoCapture('DemoVideo.mp4')
                num_frames = round(video.get(cv2.CAP_PROP_FRAME_COUNT))
                frames_buffer = list()
                predictions = list()
                
                def send_frames():
                    # This function emulates the stream, so here we "get" a frame and add it to our buffer
                    for frame in get_frames(video):
                        frames_buffer.append(frame)
                        # Simulate delays between frames
                        time.sleep(random.uniform(0.3, 2.1))
                
                def predict_frames():
                    predicted_frames = 0  # The number of frames predicted so far
                    while predicted_frames < num_frames:  # Stop after we predicted all frames
                        buffer_length = len(frames_buffer)
                        if buffer_length <= predicted_frames:
                            continue  # Wait until we get a new frame
                
                        # Read all the frames from the point we stopped
                        for frame in frames_buffer[predicted_frames:]:
                            # Measure the prediction time
                            with CodeTimer('In stream prediction'):
                                predictions.append(predictor(frame))
                            predicted_frames += 1
                
                
                t1 = threading.Thread(target=send_frames)
                t1.start()
                t2 = threading.Thread(target=predict_frames)
                t2.start()
                t1.join()
                t2.join()
                

                推荐答案

                问题出在您的硬件、库或示例代码与实际代码之间的差异。

                我在NVIDIA Jetson Xavier上实现了您的代码。我使用以下命令安装了所有需要的库:

                # first create your virtual env
                virtualenv -p python3 detectron_gpu
                source detectron_gpu/bin/activate
                
                #torch for jetson
                wget https://nvidia.box.com/shared/static/p57jwntv436lfrd78inwl7iml6p13fzh.whl -O torch-1.8.0-cp36-cp36m-linux_aarch64.whl
                sudo apt-get install python3-pip libopenblas-base libopenmpi-dev 
                pip3 install Cython
                pip3 install numpy torch-1.8.0-cp36-cp36m-linux_aarch64.whl
                
                # torchvision
                pip install 'git+https://github.com/pytorch/vision.git@v0.9.0'
                
                # detectron
                python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'
                
                # ipython bindings (optional)
                pip install ipykernel cloudpickle 
                
                # opencv
                pip install opencv-python
                

                之后,我在示例视频上运行您的示例脚本,并收到以下输出:

                Code block 'In stream prediction' took: 2932.241764000537 ms
                Code block 'In stream prediction' took: 409.69691300051636 ms
                Code block 'In stream prediction' took: 410.03823099981673 ms
                Code block 'In stream prediction' took: 409.4023269999525 ms
                

                在第一次通过之后,检测器始终需要大约400ms来运行检测。这对杰森·泽维尔来说似乎很合适。我没有经历您所描述的速度减慢。

                我必须指出,Jetson是一种特定的硬件。在此硬件中,CPU和GPU共享RAM内存。因此,我不必将数据从CPU传输到GPU。因此,如果您的速度减慢是由CPU和GPU内存之间的传输引起的,我的设置中不会遇到此问题。

                这篇关于多线程会降低GPU性能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                groupby multiple coords along a single dimension in xarray(在xarray中按单个维度的多个坐标分组)
                Group by and Sum in Pandas without losing columns(Pandas中的GROUP BY AND SUM不丢失列)
                Group by + New Column + Grab value former row based on conditionals(GROUP BY+新列+基于条件的前一行抓取值)
                Groupby and interpolate in Pandas(PANDA中的Groupby算法和插值算法)
                Pandas - Group Rows based on a column and replace NaN with non-null values(PANAS-基于列对行进行分组,并将NaN替换为非空值)
                Grouping pandas DataFrame by 10 minute intervals(按10分钟间隔对 pandas 数据帧进行分组)

                <small id='QWZue'></small><noframes id='QWZue'>

                <tfoot id='QWZue'></tfoot>
                  <tbody id='QWZue'></tbody>
              • <legend id='QWZue'><style id='QWZue'><dir id='QWZue'><q id='QWZue'></q></dir></style></legend>

                  • <i id='QWZue'><tr id='QWZue'><dt id='QWZue'><q id='QWZue'><span id='QWZue'><b id='QWZue'><form id='QWZue'><ins id='QWZue'></ins><ul id='QWZue'></ul><sub id='QWZue'></sub></form><legend id='QWZue'></legend><bdo id='QWZue'><pre id='QWZue'><center id='QWZue'></center></pre></bdo></b><th id='QWZue'></th></span></q></dt></tr></i><div id='QWZue'><tfoot id='QWZue'></tfoot><dl id='QWZue'><fieldset id='QWZue'></fieldset></dl></div>
                        • <bdo id='QWZue'></bdo><ul id='QWZue'></ul>