前提・実現したいこと
パイプラインを使った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
該当のソースコード
メイン関数側(一部抜粋)
python
1from utils.pipeline import Pipeline, EOS 2 3pipeline = Pipeline([ 4 yolov3_fnc, 5 ]) 6pipeline.start()
yolov3_fncはhttps://github.com/jkjung-avt/tensorrt_demosをモジュール化しています。
パイプラインモジュール
python
1import threading 2import time 3import queue 4 5 6EOS = -1 7 8 9class Worker(object): 10 11 def __init__(self, method, in_queue, out_queue): 12 self.method = method 13 self.in_queue = in_queue 14 self.out_queue = out_queue 15 16 def _run(self): 17 while True: 18 19 data = self.in_queue.get() 20 data = self.method(data) 21 self.out_queue.put(data) 22 23 if data is EOS: 24 break 25 26 def start(self): 27 self.thread = threading.Thread(target=self._run) 28 self.thread.start() 29 30 31class Pipeline(object): 32 33 def __init__(self, methods, queue_size=10): 34 35 self.workers = [] 36 37 in_queue = queue.Queue(queue_size) 38 out_queue = queue.Queue(queue_size) 39 40 for method in methods: 41 42 self.workers.append(Worker(method, in_queue, out_queue)) 43 44 in_queue = out_queue 45 out_queue = queue.Queue(queue_size) 46 47 self.running = False 48 49 def _put(self): 50 while self.running: 51 try: 52 self.workers[0].in_queue.put_nowait({}) 53 except: 54 time.sleep(1e-6) # 1 microsecond 55 56 def _get(self): 57 while True: 58 data = self.workers[-1].out_queue.get() 59 if data == EOS: 60 self.running = False 61 break 62 63 def start(self): 64 65 # start workers 66 for w in self.workers: 67 w.start() 68 69 self.running = True 70 71 # start pusher/puller 72 self.put_thread = threading.Thread(target=self._put) 73 self.get_thread = threading.Thread(target=self._get) 74 self.put_thread.start() 75 self.get_thread.start() 76 77 def stop(self): 78 self.workers[0].in_queue.put(EOS) 79 self.put_thread.join() 80 self.get_thread.join() 81
試したこと
・yolov3_fncを組み込まなければパイプライン処理は動作します。
・yolov3_fncはパイプライン処理でない、普通のシングルスレッド処理であれば動作します。
補足情報(FW/ツールのバージョンなど)
- 実装ハード
Jetson AGX Xavier (JetPack 4.4 Developer Preview をインストール)
Dockerコンテナレポジトリの「nvcr.io/nvidia/jetson-pose:r32.4.2」を使用。
あなたの回答
tips
プレビュー