Skip to main content

BYOE (Bring Your Own Endpoint)

BYOE lets you benchmark any OpenAI-compatible model server endpoint that you already operate. Metrum Insights sends benchmark traffic to your endpoint, collects performance metrics, and stores them in the same results pipeline as managed workloads - but it does not start, stop, or manage the model server itself.

In the Web UI, BYOE endpoints are managed under Endpoints (BYOE) in the sidebar.


When to Use BYOE

Use BYOE when:

  • Your model server is already running and you just want to measure its performance.
  • The endpoint runs on infrastructure Metrum does not manage (Kubernetes clusters, on-prem servers, third-party cloud APIs).
  • You are testing against a commercial API like OpenAI, OpenRouter, Together, Groq, Fireworks, or Anthropic-compatible services.
  • The accelerator is non-NVIDIA or uses a vendor-specific runtime that Metrum cannot launch.
  • You are using a custom serving stack (litellm proxy, TGI, llama.cpp server, or a custom gateway).
  • You want to compare your self-hosted endpoint against a managed cloud API using the same scenarios and metrics.

Use a managed workload (not BYOE) when you want Metrum to handle the full lifecycle: start the model server, run readiness checks, execute the benchmark, and tear down the server.


How BYOE Works

Step 1: Register the Endpoint

An endpoint registration tells Metrum where your model server is, what kind of API it exposes, and what model it serves. You register an endpoint once and reuse it across multiple workloads and projects.

Key fields when registering an endpoint:

FieldWhat it means
Endpoint CodeA stable identifier you choose (e.g. prod-llama70b-vllm)
Endpoint NameA human-readable label
ProviderWhat kind of server this is (vLLM-compatible, SGLang-compatible, OpenAI, OpenRouter, Together, Groq, Fireworks, litellm proxy, custom OpenAI-compatible, etc.)
TransportThe API shape: openai_chat_completions for text/vision LLMs, openai_audio_transcriptions for ASR, openai_images_generations for image generation
API Base URLThe base URL up to /v1 (e.g. https://api.openai.com/v1 or http://my-server:8000/v1)
Model IdentifierThe model name sent in requests (e.g. gpt-4o, meta-llama/Llama-3.1-70B-Instruct)
API KeyOptional, encrypted at rest using AES-256-GCM. Never logged or exposed in API responses
Healthcheck PathPath used to verify the endpoint is alive before benchmarking (default: /v1/models)
Max Concurrent RequestsUpper bound on concurrency the endpoint can handle (default: 8)
Advisory Cost ClassWhether this is free, self_hosted, or paid - used for cost-aware reporting

Step 2: Create a BYOE Workload

A BYOE workload binds a benchmark tool to your registered endpoint. This tells Metrum which tool to use for generating traffic and which endpoint to target.

The workload specifies:

  • Which benchmark tool to use (metrumbench-llm, metrumbench-vlm, metrumbench-asr, InferenceX, metrumbench-imagegen, genai-perf, or vllm_bench)
  • Which registered endpoint to target
  • The model, framework, and version metadata for result tracking

Once the workload exists, you create scenarios under it just like managed workloads: define concurrency, token lengths, request counts, and other traffic parameters.

Step 3: Run Scenarios

When a BYOE scenario executes:

  1. The system resolves the endpoint URL, model identifier, and API key from the endpoint registration.
  2. The benchmark tool command is built with endpoint-specific arguments (URL, API key, model name).
  3. The benchmark worker sends traffic directly to your endpoint.
  4. Results are collected, ingested, and stored in the same output tables and views as managed workloads.

The key difference from managed workloads: manage_model_server is set to false. The agent skips framework launch, readiness checks, and teardown for BYOE jobs.


Supported Providers

Metrum ships with these pre-registered provider types:

ProviderDescription
vllm_compatibleSelf-hosted vLLM or any vLLM-compatible endpoint
sglang_compatibleSelf-hosted SGLang endpoint
tgi_compatibleHugging Face Text Generation Inference
llama_cpp_serverllama.cpp HTTP server
litellm_proxyLiteLLM proxy that normalizes multiple backends
dummy_model_serverMetrum's dummy model server for testing
openaiOpenAI's production API
openrouterOpenRouter aggregation service
togetherTogether AI
groqGroq inference API
fireworksFireworks AI
anthropic_compatAnthropic-compatible endpoints
custom_openai_compatibleCatch-all for any OpenAI-compatible endpoint

Supported Transports

The transport type determines which API shape the benchmark tool uses and which tools are compatible with the endpoint:

TransportAPI PathCompatible Tools
openai_chat_completionsPOST /v1/chat/completionsmetrumbench-llm, metrumbench-vlm, InferenceX, genai-perf, vllm_bench, metrumbench-imagegen
openai_audio_transcriptionsPOST /v1/audio/transcriptionsmetrumbench-asr
openai_images_generationsPOST /v1/images/generationsmetrumbench-imagegen

Transport-tool compatibility is enforced at the database level. You cannot accidentally bind metrumbench-asr to a chat completions endpoint or metrumbench-llm to an audio transcription endpoint.


Endpoint Security

API Key Handling

  • API keys are encrypted at rest using AES-256-GCM with a server-side encryption key.
  • Keys are never returned in API list responses. A has_api_key boolean flag indicates whether a key is stored.
  • Keys are only decrypted at runtime when the benchmark worker needs to authenticate against the endpoint.
  • The api_key_hash (SHA-256) is stored in invocation records for audit without exposing the actual key.

Endpoint Readiness

Before sending benchmark traffic, BYOE workloads can perform a healthcheck against the configured healthcheck path (default /v1/models). This verifies the endpoint is alive and responding before the benchmark starts.


How BYOE Results Flow

BYOE results use the exact same pipeline as managed workloads:

  1. The benchmark tool writes its output (JSONL summary for metrumbench-llm/metrumbench-vlm/ metrumbench-asr, JSON summary for metrumbench-imagegen, scalar metrics for InferenceX).
  2. The agent daemon reads the output and maps it to the tool-specific database tables.
  3. Results are queryable through the same views: v_metrumbench_llm_outputs, v_metrumbench_vlm_outputs, v_metrumbench_asr_outputs, v_inferencex_outputs, v_metrumbench_imagegen_outputs, and v_benchmark_results.
  4. The Web UI shows BYOE job results alongside managed job results in the project workspace.

There is no difference in result quality, schema, or metric calculations between BYOE and managed runs. The only difference is that BYOE jobs skip framework lifecycle management.


Comparing BYOE and Managed Workloads

AspectManaged WorkloadBYOE Workload
Model server startupMetrum starts the model serverYou start the model server
Readiness checksMetrum verifies the model is loaded and readyOptional healthcheck against your endpoint
Benchmark executionSame tool, same metricsSame tool, same metrics
Model server teardownMetrum stops the model serverYou manage teardown
Telemetry collectionGPU utilization, memory, power from the workerNot available unless you attach external telemetry
Framework launch commandResolved from command templates and engine argsNot applicable
Results storageSame database tables and viewsSame database tables and views
Cost trackingCloud provider costs tracked when availableYou supply cost information

Web UI Workflow

  1. Navigate to Endpoints (BYOE) in the sidebar.
  2. Click Register Endpoint and fill in the endpoint details: code, name, provider, transport, URL, model identifier, and optional API key.
  3. Open your project and create a workload that references the registered endpoint.
  4. Add scenarios with the desired traffic shape (concurrency, ISL, OSL, request count).
  5. Execute scenarios. The benchmark worker sends traffic directly to your endpoint.
  6. Review results on the project results page, the same as managed workloads.

API Examples

Register an Endpoint

curl -fsS -X POST "$METRUM_API_URL/rpc/create_model_endpoint" \
-H "Authorization: Bearer $METRUM_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"p_endpoint_code\":\"my-vllm-endpoint\",
\"p_endpoint_name\":\"My vLLM Server\",
\"p_provider_code\":\"vllm_compatible\",
\"p_transport_code\":\"openai_chat_completions\",
\"p_api_base_url\":\"http://my-server:8000/v1\",
\"p_model_identifier\":\"meta-llama/Llama-3.1-70B-Instruct\",
\"p_owner_account_id\":\"$METRUM_ACCOUNT_ID\",
\"p_org_id\":\"$METRUM_ORG_ID\",
\"p_healthcheck_path\":\"/v1/models\",
\"p_max_concurrent_requests\":32,
\"p_advisory_cost_class\":\"self_hosted\"
}" | jq

List Registered Endpoints

curl -fsS -X POST "$METRUM_API_URL/rpc/list_model_endpoints" \
-H "Authorization: Bearer $METRUM_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"p_owner_account_id\":\"$METRUM_ACCOUNT_ID\",
\"p_org_id\":\"$METRUM_ORG_ID\",
\"p_include_inactive\":false
}" | jq

Create a BYOE Workload

curl -fsS -X POST "$METRUM_API_URL/rpc/create_shared_workload_byoe" \
-H "Authorization: Bearer $METRUM_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"p_workload_name\":\"LLaMA 70B metrumbench-llm BYOE\",
\"p_workload_code\":\"llama70b-metrumbench-llm-byoe\",
\"p_tool_code\":\"metrumbench-llm\",
\"p_endpoint_code\":\"my-vllm-endpoint\",
\"p_owner_account_id\":\"$METRUM_ACCOUNT_ID\",
\"p_org_id\":\"$METRUM_ORG_ID\"
}" | jq

Run a Scenario

After attaching the workload to a project and creating scenarios, execute as normal. BYOE jobs automatically set p_manage_model_server to false:

curl -fsS -X POST "$METRUM_API_URL/rpc/execute_scenario" \
-H "Authorization: Bearer $METRUM_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"p_owner_account_id\":\"$METRUM_ACCOUNT_ID\",
\"p_project_name\":\"$PROJECT_NAME\",
\"p_workload_code\":\"llama70b-metrumbench-llm-byoe\",
\"p_scenario_code\":\"isl128-osl128-c32\",
\"p_server_hostname\":\"$SERVER_HOSTNAME\",
\"p_manage_model_server\":false,
\"p_job_name\":\"byoe-isl128-osl128-c32\"
}" | jq

Report Considerations

When reporting BYOE results, document which parts are outside Metrum Insights control:

  • Model server startup, configuration, and teardown
  • Autoscaling and load balancer behavior
  • Endpoint authentication and authorization
  • GPU utilization and power telemetry (unless externally collected)
  • Cloud costs and infrastructure charges
  • Custom accelerator health and driver status
  • Network topology between the benchmark worker and the endpoint

These caveats help readers understand the boundary between what Metrum measured and what you managed.