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.
GPU targets & driver expectations
A working Vulkan runtime is required for pilot execution and validation, because the pilot uses the SPIR-V execution path.
- NVIDIA: Supported via NVIDIA driver stack + Vulkan support for the SPIR-V execution path.
- AMD: Supported via AMD GPU driver stack + Vulkan (RADV/AMDGPU where applicable) for SPIR-V execution. We'll confirm the best known-good path for your distro and driver.
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
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
Keep access restricted (source IP, VPN, or bastion). If you don't need interactive viewing, use the headless script instead.