Initial commit (codex)
This commit is contained in:
131
run_sumka.sh
Executable file
131
run_sumka.sh
Executable file
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -Eeuo pipefail
|
||||
|
||||
if [[ $# -lt 1 ]]; then
|
||||
echo "Usage: $0 WORK_DIR [SUMKA_ARGUMENT ...]" >&2
|
||||
exit 64
|
||||
fi
|
||||
|
||||
work_dir=$1
|
||||
shift
|
||||
|
||||
if [[ ! -d "$work_dir" ]]; then
|
||||
echo "Work directory does not exist: $work_dir" >&2
|
||||
exit 66
|
||||
fi
|
||||
|
||||
input_found=false
|
||||
for extension in mp4 mkv avi mp3 m4a wav; do
|
||||
if [[ -f "$work_dir/input.$extension" ]]; then
|
||||
input_found=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [[ "$input_found" != true ]]; then
|
||||
echo "No supported input file found in: $work_dir" >&2
|
||||
exit 66
|
||||
fi
|
||||
|
||||
: "${AI_API_KEY:?AI_API_KEY is required}"
|
||||
|
||||
sumka_image=${SUMKA_IMAGE:-sumka:amd}
|
||||
container_name=${SUMKA_CONTAINER_NAME:-matrix-sumka-job}
|
||||
cache_volume=${SUMKA_CACHE_VOLUME:-whisper-cache}
|
||||
tmpfs_size=${SUMKA_TMPFS_SIZE:-8g}
|
||||
|
||||
docker_args=(
|
||||
run
|
||||
--rm
|
||||
--name "$container_name"
|
||||
--env AI_API_KEY
|
||||
--mount "type=volume,src=${cache_volume},dst=/tmp/sumka-cache/whisper"
|
||||
--tmpfs "/tmp:rw,size=${tmpfs_size}"
|
||||
)
|
||||
|
||||
gpu_kind=${SUMKA_GPU:-auto}
|
||||
if [[ "$gpu_kind" == auto ]]; then
|
||||
case "$sumka_image" in
|
||||
*nvidia*) gpu_kind=nvidia ;;
|
||||
*amd*) gpu_kind=amd ;;
|
||||
*) gpu_kind=amd ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
case "$gpu_kind" in
|
||||
nvidia)
|
||||
docker_args+=(--gpus all)
|
||||
;;
|
||||
amd)
|
||||
docker_args+=(
|
||||
--device=/dev/kfd
|
||||
--device=/dev/dri
|
||||
--group-add video
|
||||
--security-opt seccomp=unconfined
|
||||
)
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported SUMKA_GPU value: $gpu_kind (expected amd or nvidia)" >&2
|
||||
exit 64
|
||||
;;
|
||||
esac
|
||||
|
||||
volumes_from=${SUMKA_VOLUMES_FROM:-}
|
||||
if [[ -z "$volumes_from" && -f /.dockerenv ]]; then
|
||||
# Docker uses the short container ID as the default hostname. Unlike a
|
||||
# Compose service name, it also works for `docker compose run` containers.
|
||||
volumes_from=${HOSTNAME:-}
|
||||
fi
|
||||
|
||||
if [[ -n "$volumes_from" ]]; then
|
||||
# The sibling sumka container sees the bot's /runtime bind mount at the
|
||||
# same path, independently of how the bot container itself was named.
|
||||
docker_args+=(
|
||||
--volumes-from "${volumes_from}:rw"
|
||||
--workdir "$work_dir"
|
||||
)
|
||||
else
|
||||
# Direct host/.venv launch: mount only this job's directory.
|
||||
work_dir=$(realpath "$work_dir")
|
||||
docker_args+=(
|
||||
--mount "type=bind,src=${work_dir},dst=/work"
|
||||
--workdir /work
|
||||
)
|
||||
fi
|
||||
|
||||
signal_exit_code=0
|
||||
|
||||
stop_container() {
|
||||
docker stop --time 10 "$container_name" >/dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
on_term() {
|
||||
signal_exit_code=143
|
||||
stop_container
|
||||
}
|
||||
|
||||
on_int() {
|
||||
signal_exit_code=130
|
||||
stop_container
|
||||
}
|
||||
|
||||
on_hup() {
|
||||
signal_exit_code=129
|
||||
stop_container
|
||||
}
|
||||
|
||||
trap on_term TERM
|
||||
trap on_int INT
|
||||
trap on_hup HUP
|
||||
|
||||
set +e
|
||||
docker "${docker_args[@]}" "$sumka_image" "$@" &
|
||||
docker_pid=$!
|
||||
wait "$docker_pid"
|
||||
exit_code=$?
|
||||
set -e
|
||||
|
||||
if [[ $signal_exit_code -ne 0 ]]; then
|
||||
exit "$signal_exit_code"
|
||||
fi
|
||||
exit "$exit_code"
|
||||
Reference in New Issue
Block a user