ご回答ありがとうございます。
>nvinfer/empycustom/emcustomのintervalを0にするとこの問題は発生しないので、
もし間違っていたら申し訳ないのですが、3DCNNを例にとりますと、
emi_stream_config.jsonの
["empycustom"]["process-interval"] = 0 とするという解釈で問題ないでしょうか?
上記を前提として、3DCNNに対して以下2点試してみましたが、
何れも signalに "emcustom" が存在しないという結果でした。
→ 外側の動きとしてはupload actionが発生しないので、前回の調査結果と同じです。
--- 調査内容 ---------------------------------------------------------------
■環境
AIBox (Light), toolkit version = 2.4.0b0
Application : 3DCNN
end_user_stream.json へ、 probability >= 0 の時 uploadするように設定
① 3DCNNの"process-interval" = 0 とする
stream.log : Resulting JSON object: {'frame': [{'frame_num': 895, 'buf_pts': 89625076468, 'timestamp': '2023-03-27T13:26:41.585+0900', 'frame_width': 640, 'frame_height': 360, 'object': []}]}
→ "emcustom" は存在しない
terminal (Gst.debug) :
INFO:toolkit:[gstd] 0:01:52.148529096 10002 0x7f5c003190 DEBUG python video_classification.py:115:process_ip: mapping a buffer
INFO:toolkit:[gstd] 0:01:52.148687016 10002 0x7f5c003190 DEBUG python video_classification.py:118:process_ip: frame_meta = {'frame_num': 895, 'buf_pts': 89625076468, 'ntp_timestamp': 1679891198399293000, 'source_frame_width': 1280, 'source_frame_height': 720, 'num_surfaces_per_frame': 1, 'object': []}
INFO:toolkit:[gstd] 0:01:52.148737903 10002 0x7f5c003190 DEBUG python video_classification.py:124:process_ip: creating an array of (w,h) = (640, 360)
INFO:toolkit:[gstd] 0:01:52.185542509 10002 0x7f5c003190 DEBUG python video_classification.py:145:process_ip: running an infernce on an array of torch.Size([1, 3, 16, 112, 112]) at cuda:0
INFO:toolkit:[gstd] 0:01:52.210532778 10002 0x7f5c003190 DEBUG python video_classification.py:147:process_ip: inference result of torch.Size([1, 400])
INFO:toolkit:[gstd] 0:01:53.775689544 10002 0x7f5c003190 DEBUG python video_classification.py:150:process_ip: topk = marching(tensor([[20.4992]], device='cuda:0') at tensor([[192]], device='cuda:0'))
INFO:toolkit:[gstd] 0:01:53.775992676 10002 0x7f5c003190 DEBUG python video_classification.py:162:process_ip: removed the first item, cuda_list size = 15
INFO:toolkit:[gstd] 0:01:53.776716235 10002 0x7f5c003190 DEBUG python video_classification.py:164:process_ip: cuda memory allocated, list size = 141879808, 15
INFO:toolkit:[gstd] 0:01:53.776758475 10002 0x7f5c003190 DEBUG python video_classification.py:168:process_ip: unmapping a buffer
INFO:toolkit:[gstd] 0:01:53.777022492 10002 0x7f5c003190 WARN python gstempycustom.py:468:_add_emcustom_meta_to_buffer: Ignoring invalid JSON string
→ 推論は実行されているが、Ignoring invalid JSON string が発生している
※3DCNNのコードは未編集
→ out_metaの形式が良くない?
Ignoringが発生しないように out_metaを変形 (out_meta_str = json.dumps(out_meta_dict))
② ① + out_meta変形処理追加
stream.log : Resulting JSON object: {'frame': [{'frame_num': 929, 'buf_pts': 93026727060, 'timestamp': '2023-03-27T13:33:52.195+0900', 'frame_width': 640, 'frame_height': 360, 'object': []}]}
→ "emcustom" は存在しない
terminal (Gst.debug) :
INFO:toolkit:[gstd] 0:01:56.936531866 10538 0x7f703a1b20 DEBUG python video_classification.py:115:process_ip: mapping a buffer
INFO:toolkit:[gstd] 0:01:56.936912551 10538 0x7f703a1b20 DEBUG python video_classification.py:119:process_ip: frame_meta = {'frame_num': 929, 'buf_pts': 93026727060, 'ntp_timestamp': 1679891629034057000, 'source_frame_width': 1280, 'source_frame_height': 720, 'num_surfaces_per_frame': 1, 'object': []}
INFO:toolkit:[gstd] 0:01:56.937097659 10538 0x7f703a1b20 DEBUG python video_classification.py:125:process_ip: creating an array of (w,h) = (640, 360)
INFO:toolkit:[gstd] 0:01:56.989251095 10538 0x7f703a1b20 DEBUG python video_classification.py:145:process_ip: running an infernce on an array of torch.Size([1, 3, 16, 112, 112]) at cuda:0
INFO:toolkit:[gstd] 0:01:57.013707596 10538 0x7f703a1b20 DEBUG python video_classification.py:147:process_ip: inference result of torch.Size([1, 400])
INFO:toolkit:[gstd] 0:01:58.637588570 10538 0x7f703a1b20 DEBUG python video_classification.py:150:process_ip: topk = dancing_gangnam_style(tensor([[16.2151]], device='cuda:0') at tensor([[86]], device='cuda:0'))
INFO:toolkit:[gstd] 0:01:58.637871961 10538 0x7f703a1b20 DEBUG python video_classification.py:162:process_ip: removed the first item, cuda_list size = 15
INFO:toolkit:[gstd] 0:01:58.638653592 10538 0x7f703a1b20 DEBUG python video_classification.py:164:process_ip: cuda memory allocated, list size = 141879808, 15
INFO:toolkit:[gstd] 0:01:58.638712656 10538 0x7f703a1b20 DEBUG python video_classification.py:168:process_ip: unmapping a buffer
INFO:toolkit:[gstd] 0:01:58.641739647 10538 0x7f703a1b20 DEBUG python gstempycustom.py:404:do_transform_ip: transform_ip
INFO:toolkit:[gstd] 0:01:58.641820117 10538 0x7f703a1b20 LOG python gstempycustom.py:429:do_transform_ip: Skipping buffer processing
INFO:toolkit:[gstd] 0:01:58.644301784 10538 0x7f703a1b20 DEBUG python gstempycustom.py:404:do_transform_ip: transform_ip
INFO:toolkit:[gstd] 0:01:58.644399806 10538 0x7f703a1b20 LOG python gstempycustom.py:429:do_transform_ip: Skipping buffer processing
→ 推論は実行され、out_metaのverifyは正常
→ upload が実施されてない
------------------------------------------------------------------
また、以前ご相談させていただいた件と関連するのですが、
EMPyCustomへかなり重たい処理を実装した際、イベント処理が間に合わずメモリリークするという話だったかと思います。
v2.4で動作させるために0にする場合、同様の処理負荷問題が再発すると思いますが、
どのような処置をすればよいでしょうか?
※上記①②の3DCNNはprocess-interval = 0 としたとき20frameで動作していましたが、20frameが厳しい場合を想定しています。