@@ -84,18 +84,19 @@ def bls_square(_=None):
8484 if infer_response .has_error ():
8585 return False
8686
87- output0 = pb_utils .get_output_tensor_by_name (infer_response , 'OUT' )
88- if output0 is None :
89- return False
87+ if len (infer_response .output_tensors ()) > 0 :
88+ output0 = pb_utils .get_output_tensor_by_name (infer_response , 'OUT' )
89+ if output0 is None :
90+ return False
9091
91- expected_output = input0 .as_numpy ()
92+ expected_output = input0 .as_numpy ()
9293
93- if not np .all (expected_output == output0 .as_numpy ()):
94- return False
94+ if not np .all (expected_output == output0 .as_numpy ()):
95+ return False
9596
9697 response_count += 1
9798
98- if not np .all (response_count == input0 .as_numpy ()):
99+ if not np .all (input0 .as_numpy () == response_count - 1 ):
99100 return False
100101
101102 return True
@@ -459,14 +460,16 @@ def test_gpu_bls(self):
459460 def test_multiprocess (self ):
460461 # Test multiprocess Pool with sync BLS
461462 if self ._is_decoupled :
462- func_name = bls_square
463+ # Fixme: DLIS-4630
464+ # func_name = bls_square
465+ pass
463466 else :
464467 func_name = bls_add_sub
465468
466- pool = Pool (10 )
467- pool .map (func_name , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ])
468- pool .close ()
469- pool .join ()
469+ pool = Pool (10 )
470+ pool .map (func_name , [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ])
471+ pool .close ()
472+ pool .join ()
470473
471474 def test_bls_sync (self ):
472475 infer_request = pb_utils .InferenceRequest (
@@ -553,6 +556,99 @@ def test_timeout(self):
553556 infer_response .error ().message ())
554557 self .assertTrue (len (infer_response .output_tensors ()) == 0 )
555558
559+ def _test_response_iterator_square (self ,
560+ expected_output_cnt ,
561+ expected_output_value ,
562+ response_iterator ):
563+ response_count = 0
564+ expected_output_cnt = np .array ([expected_output_cnt ], dtype = np .int32 )
565+
566+ for infer_response in response_iterator :
567+ self .assertFalse (infer_response .has_error ())
568+ if len (infer_response .output_tensors ()) > 0 :
569+ output0 = pb_utils .get_output_tensor_by_name (infer_response , 'OUT' )
570+ self .assertIsNotNone (output0 )
571+ self .assertEqual (expected_output_value , output0 .as_numpy ())
572+
573+ response_count += 1
574+
575+ self .assertEqual (response_count , expected_output_cnt )
576+
577+ # Make sure the iterator is exhausted.
578+ with self .assertRaises (StopIteration ):
579+ next (response_iterator )
580+
581+ return response_iterator
582+
583+ def test_response_iterator (self ):
584+ if self ._is_decoupled :
585+ # Test the response iterator for decoupled responses. The request
586+ # has 4 decoupled responses followed by an empty response.
587+ response_value = 4
588+ input0_np = np .array ([response_value ], dtype = np .int32 )
589+ input0 = pb_utils .Tensor ('IN' , input0_np )
590+ infer_request = pb_utils .InferenceRequest (
591+ model_name = 'square_int32' ,
592+ inputs = [input0 ],
593+ requested_output_names = ['OUT' ])
594+ infer_responses = infer_request .exec (decoupled = True )
595+
596+ # case 1. Use Next() to get the next response first, then use
597+ # for-loop to get the remaining responses.
598+ infer_response = next (infer_responses )
599+ self .assertFalse (infer_response .has_error ())
600+ output0 = pb_utils .get_output_tensor_by_name (infer_response , 'OUT' )
601+ self .assertIsNotNone (output0 )
602+ self .assertEqual (response_value , output0 .as_numpy ())
603+ # The iterator now should only have 4 remaining responses.
604+ infer_responses = self ._test_response_iterator_square (
605+ 4 , response_value , infer_responses )
606+
607+ # case 2. Call for-loop to get all the responses multiple times.
608+ infer_responses = self ._test_response_iterator_square (
609+ 5 , response_value , infer_responses )
610+ infer_responses = self ._test_response_iterator_square (
611+ 5 , response_value , infer_responses )
612+ infer_responses = self ._test_response_iterator_square (
613+ 5 , response_value , infer_responses )
614+
615+ # case 3. Break from the iteration, then use Next() and for-loop to
616+ # get the remaining responses.
617+ response_count = 0
618+ for infer_response in infer_responses :
619+ self .assertFalse (infer_response .has_error ())
620+ output0 = pb_utils .get_output_tensor_by_name (infer_response ,
621+ 'OUT' )
622+ self .assertIsNotNone (output0 )
623+ self .assertEqual (response_value , output0 .as_numpy ())
624+
625+ response_count += 1
626+ if response_count == 2 :
627+ break
628+
629+ infer_response = next (infer_responses )
630+ self .assertFalse (infer_response .has_error ())
631+ output0 = pb_utils .get_output_tensor_by_name (infer_response , 'OUT' )
632+ self .assertIsNotNone (output0 )
633+ self .assertEqual (response_value , output0 .as_numpy ())
634+
635+ # The iterator now should only have 2 remaining responses.
636+ infer_responses = self ._test_response_iterator_square (
637+ 2 , response_value , infer_responses )
638+
639+ # case 4. Delete the iterator before all the responses have been
640+ # retrieved.
641+ infer_responses = infer_request .exec (decoupled = True )
642+
643+ infer_response = next (infer_responses )
644+ self .assertFalse (infer_response .has_error ())
645+ output0 = pb_utils .get_output_tensor_by_name (infer_response , 'OUT' )
646+ self .assertIsNotNone (output0 )
647+ self .assertEqual (response_value , output0 .as_numpy ())
648+
649+ del infer_responses
650+
651+
556652class TritonPythonModel :
557653
558654 def execute (self , requests ):
0 commit comments