-
François LAURENT authoredFrançois LAURENT authored
larvatagger.sh 6.17 KiB
#!/bin/bash
cmd=$1; shift
if [ -z "$LARVATAGGER_IMAGE" ]; then
if [ "$cmd" = "build" -o -n "$(docker images | grep '^larvatagger ')" ]; then
LARVATAGGER_IMAGE=larvatagger
else
LARVATAGGER_IMAGE=flaur/larvatagger
fi
fi
HOST_UID=$(id -u $USER)
HOST_GID=$(id -g $USER)
RUN_ARGS="-u $HOST_UID:$HOST_GID -v $(pwd):/data"
RUN_ARGS="-e HOST_UID=$HOST_UID -e HOST_GID=$HOST_GID -v $(pwd):/data"
case "$cmd" in
build)
if ! [ -f recipes/Dockerfile ]; then
echo "the build command can only be run from the project root directory"
exit 1
fi
TARGET=base
while ! [ -z "$1" ]; do
if [ "$1" = "--dev" -o "$1" = "--stable" ]; then
BUILD=$1; shift
elif [ "$1" = "--get-backend" -o "$1" = "--with-default-backend" ]; then
DOCKER_ARGS="--build-arg BACKEND=MaggotUBA/20230311 $DOCKER_ARGS"; shift
TARGET=backend
elif [ "$1" = "--with-backend" ]; then
DOCKER_ARGS="--build-arg BACKEND=$2 $DOCKER_ARGS"; shift 2
TARGET=backend
elif [ "${1:0:15}" = "--with-backend=" ]; then
DOCKER_ARGS="--build-arg BACKEND=${1:15} $DOCKER_ARGS"; shift
TARGET=backend
elif [ "$1" = "--no-cache" ]; then
DOCKER_ARGS="--no-cache $DOCKER_ARGS"; shift
else
echo "argument not supported: $1"; shift
exit 1
fi
done
DOCKER_ARGS="--target $TARGET $DOCKER_ARGS"
if [ "$BUILD" == "--dev" ]; then
if ! [[ "$LARVATAGGER_IMAGE" == *:* ]]; then LARVATAGGER_IMAGE="${LARVATAGGER_IMAGE}:dev"; fi
PROJECT_ROOT=$(basename $(pwd))
cd ..
DOCKER_BUILDKIT=1 docker build -t "$LARVATAGGER_IMAGE" -f "$PROJECT_ROOT/recipes/Dockerfile.local" ${DOCKER_ARGS}.
elif [ "$BUILD" == "--stable" ]; then
if ! [[ "$LARVATAGGER_IMAGE" == *:* ]]; then LARVATAGGER_IMAGE="${LARVATAGGER_IMAGE}:stable"; fi
docker build -t "$LARVATAGGER_IMAGE" -f recipes/Dockerfile ${DOCKER_ARGS}.
else
if ! [[ "$LARVATAGGER_IMAGE" == *:* ]]; then LARVATAGGER_IMAGE="${LARVATAGGER_IMAGE}:latest"; fi
if [ -z "$LARVATAGGER_DEFAULT_BRANCH" ]; then LARVATAGGER_DEFAULT_BRANCH=dev; fi
docker build -t "$LARVATAGGER_IMAGE" -f recipes/Dockerfile ${DOCKER_ARGS}--build-arg BRANCH=$LARVATAGGER_DEFAULT_BRANCH .
fi
;;
open)
if [ -z "$LARVATAGGER_PORT" -o "$LARVATAGGER_PORT" == "9284" ]; then
DOCKER_ARGS="-p 9284:9284"
TAGGER_ARGS=
else
DOCKER_ARGS="-p $LARVATAGGER_PORT:$LARVATAGGER_PORT"
TAGGER_ARGS="--port=$LARVATAGGER_PORT"
fi
file=$1; shift
# undocumented feature
backend=MaggotUBA
while [ -n "$1" -a "$1" = "--external-instance" ]; do
instance=$2; shift 2
if [ -z "$(which realpath)" ]; then
echo "realpath: command not found"
echo "on macOS: brew install coreutils"
exit 1
fi
RUN_ARGS="$RUN_ARGS --mount type=bind,src=$(realpath $instance),dst=/app/$backend/models/$(basename $instance)"
done
exec docker run $RUN_ARGS -i $DOCKER_ARGS "$LARVATAGGER_IMAGE" open "/data/$file" $TAGGER_ARGS $@
;;
import | merge)
file=$1; shift
docker run $RUN_ARGS "$LARVATAGGER_IMAGE" $cmd "/data/$file" $@
;;
train)
data_repository=$1; shift
tagger=$1; shift
external_models_dir=models
path=$(dirname $tagger)
if [ "$path" != "." ]; then
external_models_dir=$path
tagger=$(basename $tagger)
fi
backend=MaggotUBA
while [ -n "$1" ]; do
if [ "$1" = "--backend" ]; then
backend=$2; shift 2
elif [ "${1:0:10}" = "--backend=" ]; then
backend="${1:10}"; shift
elif [ "$1" = "--gpus" -o "$1" == "--cpus" -o "$1" = "-m" -o "$1" = "--memory" ]; then
RUN_ARGS="$RUN_ARGS $1 $2"; shift 2
elif [ "$1" = "--rm" -o "${1:0:7}" = "--gpus=" -o "${1:0:7}" = "--cpus=" -o "${1:0:9}" = "--memory=" ]; then
RUN_ARGS="$RUN_ARGS $1"; shift
else
break
fi
done
if [ -n "$external_models_dir" ]; then
if [ -z "$(which realpath)" ]; then
# macOS without coreutils
src=$(cd $external_models_dir; pwd -P)
else
src=$(realpath $external_models_dir)
fi
mkdir -p "$external_models_dir"
RUN_ARGS="$RUN_ARGS --mount type=bind,src=$src,dst=/app/$backend/models"
fi
echo "docker run $RUN_ARGS \"$LARVATAGGER_IMAGE\" train \"/app/$backend\" \"/data/$data_repository\" \"$tagger\" $@"
docker run $RUN_ARGS "$LARVATAGGER_IMAGE" train "/app/$backend" "/data/$data_repository" "$tagger" $@
;;
predict)
data_file=$1; shift
backend=MaggotUBA
tagger="20230311"
while [ -n "$1" ]; do
if [ "${1:0:16}" = "--model-instance" ]; then
if [ "$1" = "--model-instance" ]; then
tagger=$2; shift 2
elif [ "${1:0:17}" = "--model-instance=" ]; then
tagger="${1:17}"; shift
else
echo "argument not supported: $1"
exit 1
fi
if [ -d "$tagger" ]; then
tagger_path=$tagger
tagger=$(basename $tagger_path)
fi
elif [ "$1" = "--backend" ]; then
backend=$2; shift 2
elif [ "${1:0:10}" = "--backend=" ]; then
backend="${1:10}"; shift
elif [ "$1" = "--gpus" -o "$1" == "--cpus" -o "$1" = "-m" -o "$1" = "--memory" ]; then
RUN_ARGS="$RUN_ARGS $1 $2"; shift 2
elif [ "$1" = "--rm" -o "${1:0:7}" = "--gpus=" -o "${1:0:7}" = "--cpus=" -o "${1:0:9}" = "--memory=" ]; then
RUN_ARGS="$RUN_ARGS $1"; shift
else
break
fi
done
if [ -n "$tagger_path" ]; then
if [ -z "$(which realpath)" ]; then
echo "realpath: command not found"
echo "on macOS: brew install coreutils"
exit 1
fi
RUN_ARGS="$RUN_ARGS --mount type=bind,src=$(realpath $tagger_path),dst=/app/$backend/models/$tagger"
fi
echo "docker run $RUN_ARGS \"$LARVATAGGER_IMAGE\" predict \"/app/$backend\" \"$tagger\" \"/data/$data_file\" $@"
docker run $RUN_ARGS "$LARVATAGGER_IMAGE" predict "/app/$backend" "$tagger" "/data/$data_file" $@
;;
--more-help)
echo 'For most switches, arguments are passed to larvatagger.jl.'
echo 'larvatagger.jl extra arguments must come after larvatagger.sh arguments.'
echo 'Printing larvatagger.jl --help...'
echo
docker run "$LARVATAGGER_IMAGE" --help
;;
-V|--version)
docker run "$LARVATAGGER_IMAGE" --version
;;
--update)
if [ -n "$(docker images | grep '^larvatagger latest ')" ]; then
docker rmi -f larvatagger:latest
fi
docker pull flaur/larvatagger:latest
;;
*)
echo "usage: $0 build [--stable] [--with-default-backend]"
echo " $0 open <filepath>"
echo " $0 import <filepath> [<outputfilename>] [--id=<runid>] [--framerate=<fps>]"
echo " $0 train <datarepository> <taggername> [--backend <name>]"
echo " [--rm] [--cpus <c>] [--gpus <g>] [--memory <m>]"
echo " $0 predict <datafile> [--backend <name>] [--model-instance <taggername>]"
echo " [--rm] [--cpus <c>] [--gpus <g>] [--memory <m>]"
echo " $0 --more-help"
echo " $0 --version"
echo " $0 --update"
;;
esac