質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.12%

スレッド処理上でTensorRTが実行できない。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 69

xsteviax

score 11

前提・実現したいこと

パイプラインを使ったAIシステムを構築したい。
そのために以下のエラーを解消し、推論結果を表示させたい。

発生している問題・エラーメッセージ

スレッド処理上にTensorRTの処理(yolov3_fnc)を実装したところ以下のエラーメッセージが何度も常に表示され、推論結果が表示できませんでした。スレッド上のTensorRTに対し、CUDAの有効なリソースハンドルを確認し割り当てるにはどうしたらいいでしょうか?

[TensorRT] ERROR: ../rtSafe/cuda/reformat.cu (918) - Cuda Error in NCHWToNCHHW2: 400 (invalid resource handle)
[TensorRT] ERROR: FAILED_EXECUTION: std::exception

該当のソースコード

メイン関数側(一部抜粋)

from utils.pipeline import Pipeline, EOS

pipeline = Pipeline([
        yolov3_fnc,
    ])
pipeline.start()


yolov3_fncはhttps://github.com/jkjung-avt/tensorrt_demosをモジュール化しています。

パイプラインモジュール

import threading
import time
import queue


EOS = -1


class Worker(object):

    def __init__(self, method, in_queue, out_queue):
        self.method = method
        self.in_queue = in_queue
        self.out_queue = out_queue

    def _run(self):
        while True:

            data = self.in_queue.get()
            data = self.method(data)
            self.out_queue.put(data)

            if data is EOS:
                break

    def start(self):
        self.thread = threading.Thread(target=self._run)
        self.thread.start()


class Pipeline(object):

    def __init__(self, methods, queue_size=10):

        self.workers = []

        in_queue = queue.Queue(queue_size)
        out_queue = queue.Queue(queue_size)

        for method in methods:

            self.workers.append(Worker(method, in_queue, out_queue))

            in_queue = out_queue
            out_queue = queue.Queue(queue_size)

        self.running = False

    def _put(self):
        while self.running:
            try:
                self.workers[0].in_queue.put_nowait({})
            except:
                time.sleep(1e-6) # 1 microsecond

    def _get(self):
        while True:
            data = self.workers[-1].out_queue.get()
            if data == EOS:
                self.running = False
                break

    def start(self):

        # start workers
        for w in self.workers:
            w.start()

        self.running = True

        # start pusher/puller
        self.put_thread = threading.Thread(target=self._put)
        self.get_thread = threading.Thread(target=self._get)
        self.put_thread.start()
        self.get_thread.start()

    def stop(self):
        self.workers[0].in_queue.put(EOS)
        self.put_thread.join()
        self.get_thread.join()

試したこと

・yolov3_fncを組み込まなければパイプライン処理は動作します。
・yolov3_fncはパイプライン処理でない、普通のシングルスレッド処理であれば動作します。

補足情報(FW/ツールのバージョンなど)

  • 実装ハード
    Jetson AGX Xavier (JetPack 4.4 Developer Preview をインストール)
    Dockerコンテナレポジトリの「nvcr.io/nvidia/jetson-pose:r32.4.2」を使用。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • yymmt

    2020/07/01 00:53

    やりたい事はTensorRTを単に別スレッドで走らせるだけでなく、GPUのリソースマネジメントもしたい、と言う事でしょうか?GPU決め打ちならcudaSetDevice()が使えるようです。
    https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt_210/tensorrt-user-guide/index.html#multigpu

    キャンセル

  • xsteviax

    2020/07/01 08:39 編集

    コメントありがとうございます。
    単にTensorRTをスレッドで走らせたいだけで、決め打ちでも何でもまずはできれば良いと思っています。
    エラーメッセージに無効なリソースハンドル(invalid resource handle)と合ったので、適切なリソースが割り当てられていないのかなと思った次第です。
    頂いたリンクについて少し見てみようと思います。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる