diff --git a/vllm-logs.sh b/vllm-logs.sh new file mode 100755 index 0000000..f3b6624 --- /dev/null +++ b/vllm-logs.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +set -uo pipefail + +CONTAINER="${VLLM_CONTAINER:-vllm}" +LOG_FILE="${VLLM_LOG_FILE:-/var/log/vllm.log}" +SOURCE="docker" +TAIL="" +SINCE="10m" + +usage() { + cat <&2; exit 2 ;; + esac +done + +if [ "$SOURCE" = "file" ]; then + [ -r "$LOG_FILE" ] || { echo "cannot read $LOG_FILE" >&2; exit 1; } + if [ -n "$TAIL" ]; then + tail -n "$TAIL" -f "$LOG_FILE" + else + tail -n 200 -f "$LOG_FILE" + fi +else + if ! docker inspect --format '{{.Name}}' "$CONTAINER" >/dev/null 2>&1; then + echo "container not found: $CONTAINER" >&2 + exit 1 + fi + ARGS=(logs -f) + [ -n "$TAIL" ] && ARGS+=(--tail "$TAIL") + [ -n "$SINCE" ] && ARGS+=(--since "$SINCE") + docker "${ARGS[@]}" "$CONTAINER" 2>&1 +fi | gawk ' +function fmt_pct(v, got) { + return got ? sprintf("%5.1f%%", v) : " n/a" +} + +function flush_pending() { + if (!have) return + printf "\033[37m[%s]\033[0m \033[36mPP\033[0m: \033[32m%6.1f t/s\033[0m | \033[31mTG\033[0m: \033[32m%6.1f t/s\033[0m | \033[33mK/V Cache\033[0m: \033[36m%6s\033[0m | \033[35mPfx Cache\033[0m: \033[36m%5.1f%%\033[0m | \033[34mDraft Acc\033[0m: \033[36m%6s\033[0m\n", \ + pending_ts, pending_pp, pending_tg, fmt_pct(pending_kv, got_kv), pending_pfx, fmt_pct(pending_draft, got_draft) + fflush() + have = 0 +} + +/Avg prompt throughput:/ { + flush_pending() + if (match($0, /INFO ([0-9-]{5} [0-9:]{8})/, t)) pending_ts = t[1] + match($0, /Avg prompt throughput: ([0-9.]+)/, p); pending_pp = p[1] + 0 + match($0, /Avg generation throughput: ([0-9.]+)/, g); pending_tg = g[1] + 0 + if (match($0, /Prefix cache hit rate: ([0-9.]+)/, c)) pending_pfx = c[1] + 0 + if (match($0, /KV cache usage: ([0-9.]+)/, k)) { + pending_kv = k[1] + 0 + got_kv = 1 + } else { + got_kv = 0 + } + if (match($0, /Avg Draft acceptance rate: ([0-9.]+)/, d)) { + pending_draft = d[1] + 0 + got_draft = 1 + } else { + got_draft = 0 + } + have = 1 + next +} + +/Avg Draft acceptance rate:/ { + if (!have) next + if (match($0, /INFO ([0-9-]{5} [0-9:]{8})/, t) && t[1] != pending_ts) next + match($0, /Avg Draft acceptance rate: ([0-9.]+)/, d) + pending_draft = d[1] + 0 + got_draft = 1 + flush_pending() +} + +END { flush_pending() } +'