#!/usr/bin/env bash # SPDX-License-Identifier: Apache-2.0 # # CPU device test: runs both server bench and vLLM e2e tests # in the same environment to avoid repeated vLLM installation. # # Usage: cpu_device_test.sh [mode] # mode: server_bench, vllm_e2e, or all (default) # # Environment variables: # LMCACHE_BENCH_TRANSFER_MODE engine_driven|lmcache_driven # (default: engine_driven) # LMCACHE_E2E_TRANSPORT_MODE engine_driven|lmcache_driven|shm|pickle # (default: engine_driven) # LMCACHE_E2E_DATA_MODE shm|pickle (default: shm) # LMCACHE_HTTP_PORT_BENCH HTTP port for bench (default: 18080) # LMCACHE_ZMQ_PORT_BENCH ZMQ port for bench (default: 15555) # LMCACHE_HTTP_PORT_E2E HTTP port for e2e (default: 18081) # LMCACHE_ZMQ_PORT_E2E ZMQ port for e2e (default: 15557) # VLLM_PORT_E2E HTTP port for vLLM (default: 18000) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" OS="$(uname -s)" TEST_MODE="${1:-all}" echo "==> CPU device test (OS: ${OS}, Mode: ${TEST_MODE})" echo " Python: $(python3 --version 2>&1 || true)" # Configuration BENCH_TRANSFER_MODE="${LMCACHE_BENCH_TRANSFER_MODE:-engine_driven}" E2E_TRANSPORT_MODE="${LMCACHE_E2E_TRANSPORT_MODE:-engine_driven}" E2E_DATA_MODE="${LMCACHE_E2E_DATA_MODE:-shm}" HTTP_PORT_BENCH="${LMCACHE_HTTP_PORT_BENCH:-18080}" ZMQ_PORT_BENCH="${LMCACHE_ZMQ_PORT_BENCH:-15555}" HTTP_PORT_E2E="${LMCACHE_HTTP_PORT_E2E:-18081}" ZMQ_PORT_E2E="${LMCACHE_ZMQ_PORT_E2E:-15557}" VLLM_PORT_E2E="${VLLM_PORT_E2E:-18000}" # Validate modes case "${BENCH_TRANSFER_MODE}" in lmcache_driven|engine_driven) ;; *) echo "!! Unknown LMCACHE_BENCH_TRANSFER_MODE='${BENCH_TRANSFER_MODE}'" exit 1 ;; esac # Map user-facing LMCACHE_E2E_TRANSPORT_MODE to internal representation. # shm/pickle are aliases for lmcache_driven mode with sub-mode selection. case "${E2E_TRANSPORT_MODE}" in lmcache_driven|engine_driven) MAPPED_TRANSPORT_MODE="${E2E_TRANSPORT_MODE}" MAPPED_DATA_MODE="${E2E_DATA_MODE}" ;; shm) MAPPED_TRANSPORT_MODE="engine_driven" MAPPED_DATA_MODE="shm" ;; pickle) MAPPED_TRANSPORT_MODE="engine_driven" MAPPED_DATA_MODE="pickle" ;; *) echo "!! Unknown LMCACHE_E2E_TRANSPORT_MODE='${E2E_TRANSPORT_MODE}'" echo " Valid values: engine_driven, lmcache_driven, shm, pickle" exit 1 ;; esac echo " Bench transfer mode: ${BENCH_TRANSFER_MODE}" echo " E2E transport mode: ${E2E_TRANSPORT_MODE}" echo " Ports: bench=${HTTP_PORT_BENCH}/${ZMQ_PORT_BENCH}, e2e=${HTTP_PORT_E2E}/${ZMQ_PORT_E2E}/${VLLM_PORT_E2E}" # Reap any LMCache/vLLM children started by this run on exit so the # next workflow step does not collide on default ZMQ/HTTP ports. cleanup_processes_safe() { local rc=$? set +e # Kill child processes started by this shell first (e.g. lmcache server # backgrounded by the shared validation script). pkill -P $$ 2>/dev/null || true sleep 1 pkill -9 -P $$ 2>/dev/null || true return $rc } trap cleanup_processes_safe EXIT # Function to run server bench test run_server_bench() { echo "" echo "==> Running CPU server bench test" # Set environment for bench test export LMCACHE_BENCH_TRANSFER_MODE="${BENCH_TRANSFER_MODE}" export LMCACHE_HTTP_PORT="${HTTP_PORT_BENCH}" export LMCACHE_ZMQ_PORT="${ZMQ_PORT_BENCH}" export LMCACHE_LOG_FILE="/tmp/cpu_device_bench_${BENCH_TRANSFER_MODE}_lmcache.log" export BENCH_OUTPUT_LOG="/tmp/cpu_device_bench_${BENCH_TRANSFER_MODE}_output.log" export LMCACHE_HEALTHCHECK_TIMEOUT="30" export BENCH_NUM_REQUESTS="3" export BENCH_NUM_TOKENS="512" # Run bench test bash "${SCRIPT_DIR}/cpu_server_bench_test.sh" echo "==> CPU server bench test completed successfully" } # Function to run vLLM e2e test run_vllm_e2e() { echo "" echo "==> Running CPU vLLM e2e test" # Set environment for e2e test export LMCACHE_TRANSPORT_MODE="${MAPPED_TRANSPORT_MODE}" export LMCACHE_DATA_MODE="${MAPPED_DATA_MODE}" export LMCACHE_HTTP_PORT="${HTTP_PORT_E2E}" export LMCACHE_ZMQ_PORT="${ZMQ_PORT_E2E}" export VLLM_PORT="${VLLM_PORT_E2E}" export LMCACHE_LOG_FILE="/tmp/cpu_device_e2e_${E2E_TRANSPORT_MODE}_lmcache.log" export VLLM_LOG_FILE="/tmp/cpu_device_e2e_${E2E_TRANSPORT_MODE}_vllm.log" export LMCACHE_HEALTHCHECK_TIMEOUT="30" export VLLM_READY_TIMEOUT="300" # Run e2e test bash "${SCRIPT_DIR}/cpu_vllm_e2e_test.sh" echo "==> CPU vLLM e2e test completed successfully" } # Determine which tests to run case "${TEST_MODE}" in "server_bench") run_server_bench ;; "vllm_e2e") run_vllm_e2e ;; "all") run_server_bench run_vllm_e2e ;; *) echo "!! Unknown test mode: ${TEST_MODE}" echo " Supported modes: server_bench, vllm_e2e, all" exit 1 ;; esac echo "" echo "==> CPU device test passed for modes:" echo " Test mode: ${TEST_MODE}" echo " Server bench: ${BENCH_TRANSFER_MODE}" echo " vLLM e2e: ${E2E_TRANSPORT_MODE}"