11#! /bin/bash
22
33# defaults
4- USEDOCKER= " "
4+ CONTAINER=apptainer
55VERBOSE=" "
66VERBOSE_ARGS=" --log-verbose=1 --log-error=1 --log-warning=1 --log-info=1"
77WTIME=600
@@ -42,7 +42,7 @@ usage() {
4242 $ECHO " -c \t don't cleanup temporary dir (for debugging)"
4343 $ECHO " -C [dir] \t directory containing Nvidia compatibility drivers (checks CMSSW_BASE by default if available)"
4444 $ECHO " -D \t dry run: print container commands rather than executing them"
45- $ECHO " -d \t use Docker instead of Apptainer "
45+ $ECHO " -d [exe] \t container choice: Apptainer, Docker, Podman (default: ${CONTAINER} ) "
4646 $ECHO " -E [path] \t include extra path(s) for executables (default: ${EXTRAPATH} )"
4747 $ECHO " -f \t force reuse of (possibly) existing container instance"
4848 $ECHO " -g [device] \t device choice: auto (try to detect GPU), CPU, GPU (default: ${DEVICE} )"
@@ -73,15 +73,15 @@ if [ -e /run/shm ]; then
7373 SHM=/run/shm
7474fi
7575
76- while getopts " cC:Ddfg :i:I:M:m:n:P:p:r:s:t:vw:h" opt; do
76+ while getopts " cC:Dd:fg :i:I:M:m:n:P:p:r:s:t:vw:h" opt; do
7777 case " $opt " in
7878 c) CLEANUP=" "
7979 ;;
8080 C) COMPAT_USR=" $OPTARG "
8181 ;;
8282 D) DRYRUN=echo
8383 ;;
84- d) USEDOCKER=true
84+ d) CONTAINER= " $OPTARG "
8585 ;;
8686 f) FORCE=true
8787 ;;
@@ -130,6 +130,13 @@ if [[ ! " auto cpu gpu " =~ " $DEVICE " ]]; then
130130 exit 1
131131fi
132132
133+ # check acceptable values for container choice
134+ CONTAINER=" ${CONTAINER,,} "
135+ if [[ ! " apptainer docker podman " =~ " $CONTAINER " ]]; then
136+ echo " Unsupported container value: $CONTAINER "
137+ exit 1
138+ fi
139+
133140if [ " $RETRIES " -le 0 ]; then
134141 RETRIES=1
135142fi
@@ -147,9 +154,13 @@ if [ -n "$EXTRAPATH" ]; then
147154fi
148155
149156# find executables
150- if [ -n " $USEDOCKER " ]; then
157+ if [ " $CONTAINER " == " docker " ]; then
151158 if [ -z " $DOCKER " ]; then
152- DOCKER=" sudo docker"
159+ DOCKER=" docker"
160+ fi
161+ elif [ " $CONTAINER " == " podman" ]; then
162+ if [ -z " $PODMAN " ]; then
163+ PODMAN=" podman"
153164 fi
154165else
155166 if [ -z " $APPTAINER " ]; then
@@ -246,6 +257,29 @@ start_docker(){
246257 ${IMAGE} tritonserver $PORTARGS $REPOARGS $VERBOSE
247258}
248259
260+ start_podman (){
261+ # mount all model repositories
262+ MOUNTARGS=" "
263+ REPOARGS=" "
264+ for REPO in ${REPOS[@]} ; do
265+ MOUNTARGS=" $MOUNTARGS --volume $REPO :$REPO "
266+ REPOARGS=" $REPOARGS --model-repository=${REPO} "
267+ done
268+
269+ # compatibility driver environment
270+ if [ -n " $COMPAT " ]; then
271+ MOUNTARGS=" $MOUNTARGS --volume $COMPAT "
272+ if [ -n " $COMPAT_SCRIPT_MOUNT " ]; then
273+ MOUNTARGS=" $MOUNTARGS --volume $COMPAT_SCRIPT_MOUNT "
274+ fi
275+ fi
276+
277+ $DRYRUN $PODMAN run -d --name ${SERVER} \
278+ --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
279+ -p${HTTPPORT} :${HTTPPORT} -p${GRPCPORT} :${GRPCPORT} -p${METRPORT} :${METRPORT} $EXTRA $MOUNTARGS \
280+ ${IMAGE} tritonserver $PORTARGS $REPOARGS $VERBOSE
281+ }
282+
249283start_apptainer (){
250284 # triton server image may need to modify contents of opt/tritonserver/lib/
251285 # but cvmfs is read-only
@@ -305,6 +339,16 @@ stop_docker(){
305339 $DRYRUN $DOCKER rm ${SERVER}
306340}
307341
342+ stop_podman (){
343+ # keep log
344+ if [ -z " $DRYRUN " ]; then
345+ if [ -n " $VERBOSE " ]; then $PODMAN logs ${SERVER} >& " $LOG " ; fi
346+ fi
347+
348+ $DRYRUN $PODMAN stop ${SERVER}
349+ $DRYRUN $PODMAN rm ${SERVER}
350+ }
351+
308352stop_apptainer (){
309353 $DRYRUN $APPTAINER instance stop ${SERVER}
310354}
@@ -314,6 +358,11 @@ test_docker(){
314358 ${DOCKER} logs ${SERVER} | & grep " $1 "
315359}
316360
361+ test_podman (){
362+ # podman logs print to stdout
363+ ${PODMAN} logs ${SERVER} | grep " $1 "
364+ }
365+
317366test_apptainer (){
318367 grep " $1 " $LOG
319368}
@@ -462,6 +511,10 @@ driver_docker(){
462511 $DOCKER run --rm --entrypoint env ${IMAGE} | grep " CUDA_DRIVER_VERSION="
463512}
464513
514+ driver_podman (){
515+ $PODMAN run --rm --entrypoint env ${IMAGE} | grep " CUDA_DRIVER_VERSION="
516+ }
517+
465518driver_apptainer (){
466519 D2S=${SANDBOX} /.singularity.d/env/10-docker2singularity.sh
467520 if [ -f " $D2S " ]; then
@@ -536,20 +589,33 @@ extra_docker(){
536589 EXTRA=" --gpus all"
537590 fi
538591}
592+ extra_podman (){
593+ if [ " $DEVICE " == gpu ]; then
594+ EXTRA=" --device nvidia.com/gpu=all"
595+ fi
596+ }
539597extra_apptainer (){
540598 if [ " $DEVICE " == gpu ]; then
541599 EXTRA=" --nv"
542600 fi
543601}
544602
545- if [ -n " $USEDOCKER " ]; then
603+ if [ " $CONTAINER " == " docker " ]; then
546604 START_FN=start_docker
547605 EXTRA_FN=extra_docker
548606 TEST_FN=test_docker
549607 STOP_FN=stop_docker
550608 DRIVER_FN=driver_docker
551609 COMPAT_FN=compat_docker
552610 PROG_NAME=Docker
611+ elif [ " $CONTAINER " == " podman" ]; then
612+ START_FN=start_podman
613+ EXTRA_FN=extra_podman
614+ TEST_FN=test_podman
615+ STOP_FN=stop_podman
616+ DRIVER_FN=driver_podman
617+ COMPAT_FN=compat_podman
618+ PROG_NAME=Podman
553619else
554620 START_FN=start_apptainer
555621 EXTRA_FN=extra_apptainer
0 commit comments