Repository: vllm-project/guidellm
Issue: benchmark result save to html error
Root cause: Interface Contract Mismatch

**Describe the bug**

command: 
```
guidellm benchmark \
  --target "https://chat.d.run/" \
 --model "public/qwen2.5-72b-awq" \
  --rate-type throughput \
  --max-seconds 10 \
  --max-requests 10 \
  --data "/Users/guangli.bao/go/ShareGPT.json" \
  --output-path=benchmarks.html
```
console error:

```
Saving benchmarks report...
/Users/guangli.bao/miniforge3/envs/myenv/lib/python3.11/site-packages/pydantic/main.py:463: UserWarning: Pydantic serializer warnings:
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p50', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p90', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p95', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p99', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p50', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p90', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p95', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p99', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p50', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p90', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p95', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p99', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p50', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p90', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p95', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p99', input_type=str])
  return self.__pydantic_serializer__.to_python(
Benchmarks report saved to benchmarks.html

Benchmarking complete.
```

**Expected behavior**
save to html report without error

**Environment**
Include all relevant environment information:
1. OS [e.g. Ubuntu 20.04]: macos 12.0.1
2. Python version [e.g. 3.12.2]: Python 3.11.5
3. guidellm version: guidellm version: 0.4.0.dev2
4. npm local server version: guidellm@0.1.0 serve
5. conda version: conda 25.3.1
6. others: 
pydantic                      2.11.7
pydantic_core                 2.33.2
pydantic-settings             2.10.1

**To Reproduce**
Exact steps to reproduce the behavior:

step1:  npm run serve to start local UI server
step2: do benchmark test in conda env, save benchmarks.html in local path 

**Errors**
If applicable, add a full print-out of any errors or exceptions that are raised or include screenshots to help explain your problem.

```
guidellm benchmark \
  --target "https://chat.d.run/" \
 --model "public/qwen2.5-72b-awq" \
  --rate-type throughput \
  --max-seconds 10 \
  --max-requests 10 \
  --data "/Users/guangli.bao/go/ShareGPT.json" \
  --output-path=benchmarks.html
Creating backend...
Backend openai_http connected to https://chat.d.run/ for model public/qwen2.5-72b-awq.
Creating request loader...
Created loader with 2660 unique requests from /Users/guangli.bao/go/ShareGPT.json.


╭─ Benchmarks ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ [09:58:… 10… through… (complet… Req:    0.3 req/s,    7.33s Lat,     2.3 Conc,       3 Comp,        7 Inc,        0 E… │
│                                 Tok:   68.3 gen/s,   71.8 tot/s, 259.9ms TTFT,   32.5ms ITL,    11 Prompt,      217 G… │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Generating... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (1/1) [ 0:00:10 < 0:00:00 ]


Benchmarks Metadata:
    Run id:b00b3ef3-467f-42eb-8018-efb3b8378c7f
    Duration:16.8 seconds
    Profile:type=throughput, strategies=['throughput'], max_concurrency=None
    Args:max_number=10, max_duration=10.0, warmup_number=None, warmup_duration=None, cooldown_number=None,
    cooldown_duration=None
    Worker:type_='generative_requests_worker' backend_type='openai_http' backend_target='https://chat.d.run'
    backend_model='public/qwen2.5-72b-awq' backend_info={'max_output_tokens': 16384, 'timeout': 300, 'http2': True,
    'follow_redirects': True, 'headers': {'Authorization': 'Bearer sk-yp9FwV4Jxe6ZASZruiqakV6Omu5VLgHJO0zsMG3Oc1E'},
    'text_completions_path': '/v1/completions', 'chat_completions_path': '/v1/chat/completions'}
    Request Loader:type_='generative_request_loader' data='/Users/guangli.bao/go/ShareGPT.json' data_args=None
    processor='public/qwen2.5-72b-awq' processor_args=None
    Extras:None


Benchmarks Info:
==========================================================================================================================
=======================
Metadata                                   |||| Requests Made  ||| Prompt Tok/Req ||| Output Tok/Req ||| Prompt Tok Total
||| Output Tok Total||
 Benchmark| Start Time| End Time| Duration (s)|  Comp|  Inc|  Err|  Comp|  Inc|  Err|  Comp|   Inc| Err|   Comp|   Inc|
Err|  Comp|   Inc|  Err
----------|-----------|---------|-------------|------|-----|-----|------|-----|-----|------|------|----|-------|------|---
---|------|------|-----
throughput|   09:59:04| 09:59:14|         10.0|     3|    7|    0|  11.0|  0.0|  0.0| 217.3| 299.1| 0.0|     33|     0|
0|   652|  2094|    0
==========================================================================================================================
=======================


Benchmarks Stats:
==========================================================================================================================
========================
Metadata  | Request Stats         || Out Tok/sec| Tot Tok/sec| Req Latency (sec)  ||| TTFT (ms)         ||| ITL (ms)
||| TPOT (ms)       ||
 Benchmark| Per Second| Concurrency|        mean|        mean|  mean|  median|   p99|  mean| median|   p99| mean| median|
p99| mean| median|  p99
----------|-----------|------------|------------|------------|------|--------|------|------|-------|------|-----|-------|-
----|-----|-------|-----
throughput|       0.31|        2.31|        68.3|        71.8|  7.33|    7.91|  9.53| 259.9|  259.9| 260.2| 32.5|   32.5|
32.6| 32.4|   32.4| 32.4
==========================================================================================================================
========================

Saving benchmarks report...
/Users/guangli.bao/miniforge3/envs/myenv/lib/python3.11/site-packages/pydantic/main.py:463: UserWarning: Pydantic serializer warnings:
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p50', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p90', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p95', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p99', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p50', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p90', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p95', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p99', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p50', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p90', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p95', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p99', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p50', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p90', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p95', input_type=str])
  PydanticSerializationUnexpectedValue(Expected `float` - serialized value may not be as expected [input_value='p99', input_type=str])
  return self.__pydantic_serializer__.to_python(
Benchmarks report saved to benchmarks.html

Benchmarking complete.
```

[benchmarks.html](https://github.com/user-attachments/files/22266817/benchmarks.html)

**Additional context**
Add any other context about the problem here. Also include any relevant files.



fixed.