What Phase 1 validates

The current pilot runs a set of built-in workloads and measures performance and power on a single GPU at a time. This is a validation path and does not require production deployment.

Built-in workloads Provided for you. No workload integration required for Phase 1.
Single-GPU testing Pilot targets one GPU per run, even on multi-GPU servers.
Multi-GPU modules An NVIDIA A100 or H100 module may have 8 GPUs. We validate by running the pilot on one GPU at a time.
What you get Repeatable baseline vs. optimized comparison for the tested GPU, plus logs and results for review.

GPU targets & driver expectations

Vulkan is required

A working Vulkan runtime is required for pilot execution and validation, because the pilot uses the SPIR-V execution path.

Mode A — Headless (recommended)

For lab and data center environments, we recommend running in true headless mode (no remote desktop), using a dummy display only if required for Vulkan/SDL rendering. This avoids session-lifecycle issues associated with interactive remote visualization.

Create the headless script

cd ~/chameleon
cat > chameleon_start_onprem_headless.sh << 'ENDOFSCRIPT'
#!/usr/bin/env bash
set -euo pipefail

DISPLAY_NUMBER="${DISPLAY_NUMBER:-99}"
export DISPLAY=":${DISPLAY_NUMBER}"
X_RES="${X_RES:-1920}"
X_HI="${X_HI:-1080}"
X_DEPTH="${X_DEPTH:-24}"

CHAMELEON_BIN="${CHAMELEON_BIN:-$HOME/chameleon/Essence__LNX_X64.w.elf}"
WORKDIR="${WORKDIR:-$HOME/chameleon}"
LOGDIR="${LOGDIR:-$HOME/.local/state/chameleon/Log}"
mkdir -p "$LOGDIR"

clean_locks() {
  sudo rm -f /tmp/.X${DISPLAY_NUMBER}-lock
  sudo rm -f /tmp/.X11-unix/X${DISPLAY_NUMBER}
}

start_xvfb() {
  Xvfb "${DISPLAY}" -screen 0 "${X_RES}x${X_HI}x${X_DEPTH}" \
    -ac +extension GLX +render -noreset \
    >"$LOGDIR/xvfb.log" 2>&1 &
  sleep 2
}

start_chameleon() {
  if [ ! -f "$CHAMELEON_BIN" ]; then
    echo "[start] ERROR: Chameleon binary not found at: $CHAMELEON_BIN"
    exit 1
  fi
  chmod +x "$CHAMELEON_BIN"
  cd "$WORKDIR"
  DISPLAY="${DISPLAY}" "$CHAMELEON_BIN" >"$LOGDIR/chameleon.log" 2>&1 &
}

stop_all() {
  pkill -f Xvfb || true
  pkill -f Essence || true
  clean_locks
}

case "${1:-start}" in
  start) clean_locks; start_xvfb; start_chameleon; echo "[start] Headless mode running. Logs: $LOGDIR" ;;
  stop)  stop_all ;;
  restart) stop_all; sleep 2; "$0" start ;;
  status) pgrep -fa Essence || echo "Chameleon not running" ;;
  logs)  tail -f "$LOGDIR"/*.log ;;
  *) echo "Usage: $0 {start|stop|restart|status|logs}" ;;
esac
ENDOFSCRIPT

chmod +x chameleon_start_onprem_headless.sh

Run it

./chameleon_start_onprem_headless.sh start
./chameleon_start_onprem_headless.sh status
./chameleon_start_onprem_headless.sh logs
Note

If your environment already provides a valid display and rendering path, you can remove Xvfb and run the binary directly. Keep headless as the default to avoid session-lifecycle instability.


Mode B — Interactive (optional)

Use this only if you need a remote desktop view. It starts Xvfb + x11vnc + noVNC. Interactive sessions can introduce lifecycle issues in some environments, so headless is preferred for validation.

Create the interactive script

cd ~/chameleon
cat > chameleon_start_onprem_interactive.sh << 'ENDOFSCRIPT'
#!/usr/bin/env bash
set -euo pipefail

DISPLAY_NUMBER="${DISPLAY_NUMBER:-99}"
export DISPLAY=":${DISPLAY_NUMBER}"
VNC_PORT="${VNC_PORT:-5901}"
NOVNC_PORT="${NOVNC_PORT:-6080}"

CHAMELEON_BIN="${CHAMELEON_BIN:-$HOME/chameleon/Essence__LNX_X64.w.elf}"
WORKDIR="${WORKDIR:-$HOME/chameleon}"
LOGDIR="${LOGDIR:-$HOME/.local/state/chameleon/Log}"
mkdir -p "$LOGDIR"

clean_locks() { sudo rm -f /tmp/.X${DISPLAY_NUMBER}-lock /tmp/.X11-unix/X${DISPLAY_NUMBER}; }
start_xvfb() { Xvfb "${DISPLAY}" -screen 0 "1920x1080x24" -ac +extension GLX +render -noreset & sleep 2; }
start_vnc() { x11vnc -display "${DISPLAY}" -rfbport "${VNC_PORT}" -forever -shared -nopw & }
start_websockify() { websockify --web=/usr/share/novnc/ "${NOVNC_PORT}" "localhost:${VNC_PORT}" & }
start_chameleon() { chmod +x "$CHAMELEON_BIN"; cd "$WORKDIR"; "$CHAMELEON_BIN" >"$LOGDIR/chameleon.log" 2>&1 & }
stop_all() { pkill -f Xvfb || true; pkill -f x11vnc || true; pkill -f websockify || true; pkill -f Essence || true; clean_locks; }

case "${1:-start}" in
  start) clean_locks; start_xvfb; start_vnc; start_websockify; start_chameleon; echo "[start] noVNC on port ${NOVNC_PORT}" ;;
  stop) stop_all ;;
  restart) stop_all; sleep 2; "$0" start ;;
  status) pgrep -fa Essence || echo "Chameleon not running" ;;
  logs) tail -f "$LOGDIR"/*.log ;;
esac
ENDOFSCRIPT

chmod +x chameleon_start_onprem_interactive.sh

Connect via noVNC

ssh -L 6080:localhost:6080 user@YOUR_ONPREM_HOST
http://localhost:6080/vnc.html
Access restriction

Keep access restricted (source IP, VPN, or bastion). If you don't need interactive viewing, use the headless script instead.


What happens next

Step 1 · Scope Share your target hardware and OS — GPU model, driver version, Linux distro.
Step 2 · Package We provide the Chameleon binary, startup scripts, and this runbook for Phase 1 validation.
Step 3 · Run You run the pilot on a chosen GPU and capture the results.
Step 4 · Review We review results together and discuss multi-GPU and multi-node expansion requirements.
Step 5 · Report We produce a results report covering performance, energy, utilization, and recommended next steps.