@@ -241,6 +241,186 @@ kill $SERVER_PID
241241wait $SERVER_PID
242242
243243
244+ # ####### Test parallel-step failed enqueue path in ensemble scheduler ########
245+ PARALLEL_FAILED_ENQUEUE_MODEL_DIR=" ` pwd` /parallel_failed_enqueue_test_models"
246+ rm -rf ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR}
247+
248+ mkdir -p ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /ensemble_parallel_step_failed_enqueue/1
249+ mkdir -p ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /decoupled_producer_parallel_queue/1
250+ mkdir -p ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /slow_consumer_queue_limited/1
251+ mkdir -p ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /fast_consumer/1
252+ mkdir -p ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /join_add_sub/1
253+
254+ # Producer emits repeated responses with a larger payload value so the
255+ # queue-limited branch fills first.
256+ cp ${BACKPRESSURE_TEST_MODEL_DIR} /decoupled_producer/1/model.py \
257+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /decoupled_producer_parallel_queue/1
258+ cp ${BACKPRESSURE_TEST_MODEL_DIR} /decoupled_producer/config.pbtxt \
259+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /decoupled_producer_parallel_queue/
260+ sed -i ' s/name: "decoupled_producer"/name: "decoupled_producer_parallel_queue"/g' \
261+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /decoupled_producer_parallel_queue/config.pbtxt
262+ sed -i ' s/0.5/2.0/g' \
263+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /decoupled_producer_parallel_queue/1/model.py
264+
265+ # Queue-limited branch used to trigger a failed enqueue.
266+ cp ../python_models/ground_truth/model.py \
267+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /slow_consumer_queue_limited/1
268+ cp ../python_models/ground_truth/config.pbtxt \
269+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /slow_consumer_queue_limited/
270+ sed -i ' s/name: "ground_truth"/name: "slow_consumer_queue_limited"/g' \
271+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /slow_consumer_queue_limited/config.pbtxt
272+ sed -i ' s/max_batch_size: 64/max_batch_size: 1/g' \
273+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /slow_consumer_queue_limited/config.pbtxt
274+ cat >> ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /slow_consumer_queue_limited/config.pbtxt << 'EOF '
275+
276+ dynamic_batching {
277+ preferred_batch_size: [ 1 ]
278+ default_queue_policy {
279+ max_queue_size: 1
280+ }
281+ }
282+ EOF
283+
284+ # Parallel branch with the same interface and no added delay.
285+ cp ../python_models/ground_truth/model.py ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /fast_consumer/1
286+ cp ../python_models/ground_truth/config.pbtxt ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /fast_consumer/
287+ sed -i ' s/name: "ground_truth"/name: "fast_consumer"/g' \
288+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /fast_consumer/config.pbtxt
289+ sed -i ' s/max_batch_size: 64/max_batch_size: 1/g' \
290+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /fast_consumer/config.pbtxt
291+ sed -i ' s/time.sleep(delay)/time.sleep(0)/g' \
292+ ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /fast_consumer/1/model.py
293+
294+ # Join both parallel branches into the ensemble output.
295+ cp ../python_models/join_add_sub/model.py ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /join_add_sub/1
296+ cp ../python_models/join_add_sub/config.pbtxt ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /join_add_sub/
297+
298+ cat > ${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} /ensemble_parallel_step_failed_enqueue/config.pbtxt << 'EOF '
299+ name: "ensemble_parallel_step_failed_enqueue"
300+ platform: "ensemble"
301+ max_batch_size: 0
302+
303+ input [
304+ {
305+ name: "IN"
306+ data_type: TYPE_INT32
307+ dims: [ 1 ]
308+ }
309+ ]
310+
311+ output [
312+ {
313+ name: "OUT"
314+ data_type: TYPE_FP32
315+ dims: [ 1 ]
316+ }
317+ ]
318+
319+ ensemble_scheduling {
320+ step [
321+ {
322+ model_name: "decoupled_producer_parallel_queue"
323+ model_version: -1
324+ input_map {
325+ key: "IN"
326+ value: "IN"
327+ }
328+ output_map {
329+ key: "OUT"
330+ value: "intermediate"
331+ }
332+ },
333+ {
334+ model_name: "slow_consumer_queue_limited"
335+ model_version: -1
336+ input_map {
337+ key: "INPUT0"
338+ value: "intermediate"
339+ }
340+ output_map {
341+ key: "OUTPUT0"
342+ value: "slow_out"
343+ }
344+ },
345+ {
346+ model_name: "fast_consumer"
347+ model_version: -1
348+ input_map {
349+ key: "INPUT0"
350+ value: "intermediate"
351+ }
352+ output_map {
353+ key: "OUTPUT0"
354+ value: "fast_out"
355+ }
356+ },
357+ {
358+ model_name: "join_add_sub"
359+ model_version: -1
360+ input_map {
361+ key: "INPUT0"
362+ value: "slow_out"
363+ }
364+ input_map {
365+ key: "INPUT1"
366+ value: "fast_out"
367+ }
368+ output_map {
369+ key: "OUTPUT0"
370+ value: "OUT"
371+ }
372+ }
373+ ]
374+ }
375+ EOF
376+
377+ BACKPRESSURE_TEST_PY=./ensemble_backpressure_test.py
378+ TEST_NAME=" EnsembleParallelFailedEnqueueTest.test_parallel_step_failed_enqueue"
379+ SERVER_LOG=" ./ensemble_parallel_failed_enqueue_test_server.log"
380+ CLIENT_LOG=" ./ensemble_parallel_failed_enqueue_test_client.log"
381+ rm -f $SERVER_LOG $CLIENT_LOG
382+
383+ SERVER_ARGS=" --model-repository=${PARALLEL_FAILED_ENQUEUE_MODEL_DIR} "
384+ run_server
385+ if [ " $SERVER_PID " == " 0" ]; then
386+ echo -e " \n***\n*** Failed to start $SERVER \n***"
387+ cat $SERVER_LOG
388+ exit 1
389+ fi
390+
391+ set +e
392+ PARALLEL_FAILED_ENQUEUE_LOOPS=${PARALLEL_FAILED_ENQUEUE_LOOPS:- 1} \
393+ python $BACKPRESSURE_TEST_PY $TEST_NAME -v >> $CLIENT_LOG 2>&1
394+ if [ $? -ne 0 ]; then
395+ RET=1
396+ cat $CLIENT_LOG
397+ else
398+ check_test_results $TEST_RESULT_FILE 1
399+ if [ $? -ne 0 ]; then
400+ cat $CLIENT_LOG
401+ echo -e " \n***\n*** Test Result Verification Failed\n***"
402+ RET=1
403+ fi
404+ fi
405+
406+ if ! kill -0 $SERVER_PID > /dev/null 2>&1 ; then
407+ cat $SERVER_LOG
408+ echo -e " \n***\n*** Server exited during parallel failed enqueue test\n***"
409+ RET=1
410+ else
411+ wait_for_server_live $SERVER_PID 5
412+ if [ " $WAIT_RET " != " 0" ]; then
413+ cat $SERVER_LOG
414+ echo -e " \n***\n*** Server did not remain live after parallel failed enqueue test\n***"
415+ RET=1
416+ fi
417+ fi
418+ set -e
419+
420+ kill $SERVER_PID > /dev/null 2>&1 || true
421+ wait $SERVER_PID > /dev/null 2>&1 || true
422+
423+
244424# ####### Test backpressure feature - 'max_inflight_requests' config option ########
245425ENSEMBLE_BACKPRESSURE_TEST_MODEL_DIR=" ` pwd` /ensemble_backpressure_test_models"
246426rm -rf ${ENSEMBLE_BACKPRESSURE_TEST_MODEL_DIR}
0 commit comments