| #!/usr/bin/env bash |
| set -Eeuo pipefail |
|
|
| ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" |
|
|
| if [ -n "${OPENPI_PYTHON:-}" ]; then |
| PY="$OPENPI_PYTHON" |
| elif [ -x "$ROOT/.venv/bin/python" ]; then |
| PY="$ROOT/.venv/bin/python" |
| else |
| PY="$(command -v python3 || true)" |
| fi |
|
|
| if [ -z "$PY" ] || [ ! -x "$PY" ]; then |
| echo "ERROR: no usable Python interpreter found" |
| exit 1 |
| fi |
|
|
| PORT="${LOOPBACK_PORT:-18080}" |
| GPU="${LOOPBACK_GPU:-0}" |
| LOG="${LOOPBACK_LOG:-/tmp/streampi_piperx_loopback.log}" |
| MAX_LATENCY="${LOOPBACK_MAX_LATENCY_SECONDS:-2.0}" |
|
|
| if ss -ltn 2>/dev/null | grep -q ":${PORT} "; then |
| echo "ERROR: port $PORT is already occupied" |
| exit 1 |
| fi |
|
|
| rm -f "$LOG" |
|
|
| cleanup() { |
| if [ -n "${SERVER_PID:-}" ] && |
| kill -0 "$SERVER_PID" 2>/dev/null; then |
| kill "$SERVER_PID" 2>/dev/null || true |
| wait "$SERVER_PID" 2>/dev/null || true |
| fi |
| } |
| trap cleanup EXIT INT TERM |
|
|
| POLICY_HOST=127.0.0.1 \ |
| POLICY_PORT="$PORT" \ |
| POLICY_GPU="$GPU" \ |
| OPENPI_PYTHON="$PY" \ |
| "$ROOT/scripts/start_policy_server.sh" \ |
| >"$LOG" 2>&1 & |
|
|
| SERVER_PID=$! |
| echo "SERVER_PID=$SERVER_PID" |
| echo "SERVER_LOG=$LOG" |
|
|
| READY=0 |
| for attempt in $(seq 1 300); do |
| if ! kill -0 "$SERVER_PID" 2>/dev/null; then |
| echo "ERROR: server exited during startup" |
| tail -160 "$LOG" |
| exit 1 |
| fi |
|
|
| if ss -ltn 2>/dev/null | grep -q ":${PORT} "; then |
| READY=1 |
| break |
| fi |
|
|
| if [ $((attempt % 5)) -eq 0 ]; then |
| echo "[waiting] elapsed=$((attempt * 2))s" |
| tail -5 "$LOG" || true |
| fi |
|
|
| sleep 2 |
| done |
|
|
| if [ "$READY" -ne 1 ]; then |
| echo "ERROR: server startup timeout" |
| tail -200 "$LOG" |
| exit 1 |
| fi |
|
|
| echo "SERVER_READY" |
|
|
| POLICY_HOST=127.0.0.1 \ |
| POLICY_PORT="$PORT" \ |
| OPENPI_CLIENT_PYTHON="$PY" \ |
| WARMUP_STEPS=3 \ |
| "$ROOT/scripts/warmup_policy.sh" |
|
|
| echo |
| echo "===== POST-WARMUP VALIDATION =====" |
|
|
| export PYTHONDONTWRITEBYTECODE=1 |
| export PYTHONPATH="$ROOT:$ROOT/packages/openpi-client/src" |
|
|
| "$PY" "$ROOT/deployment/smoke_client.py" \ |
| --host 127.0.0.1 \ |
| --port "$PORT" \ |
| --steps 4 \ |
| --reset-check \ |
| --max-latency-seconds "$MAX_LATENCY" |
|
|
| echo |
| echo "===== SERVER LOG TAIL =====" |
| tail -100 "$LOG" |
|
|
| echo "LOOPBACK_TEST_OK" |
|
|