Files

191 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AIPerf 0.10.0 Schema 2.0 Migration Guide
> Session artifact: migrated 12 configs from old flat format to new envelope format. All errors encountered are documented here with fixes.
## The Old Format (DEPRECATED)
```yaml
url: "https://ai.noris.de/v1"
endpoint_type: "chat"
model: "vllm/gemma-4-31b-it"
extra-headers:
Authorization: "Bearer ${API_KEY}"
streaming: true
tokenizer: "builtin"
request_count: 50
concurrency: 1
```
**Result with AIPerf 0.10.0:** `1 validation error for AIPerfConfig`
## The New Format (Schema 2.0)
```yaml
schema_version: "2.0"
benchmark:
models:
items:
- name: "vllm/gemma-4-31b-it"
strategy: "round_robin"
endpoint:
urls:
- "https://ai.noris.de/v1"
type: "chat"
api_key: "${API_KEY}"
streaming: true
headers:
Authorization: "Bearer ${API_KEY}"
datasets:
- type: "synthetic" # or "public" for ShareGPT
name: "main"
entries: 100
isl:
type: "fixed"
value: 512
osl:
type: "fixed"
value: 128
phases:
- type: "concurrency"
name: "profiling"
# ONE OF THESE IS MANDATORY:
requests: 50 # total requests
# OR duration: 600 # seconds
# OR sessions: 1 # concurrent sessions
tokenizer:
name: "builtin"
```
## Critical Validation Errors and Fixes
### Error: `Phase 'profiling': at least one of 'requests', 'duration', or 'sessions' must be specified`
**Cause:** Phase definition without termination condition.
**Fix:** Add `requests: N` or `duration: N` or `sessions: N`.
```yaml
phases:
- type: "concurrency"
name: "profiling"
requests: 50 # <-- REQUIRED
```
### Error: `api_key must be a valid string`
**Cause:** AIPerf's Pydantic model validates `api_key` eagerly. Even though `--api-key` CLI flag is present, the YAML's `api_key` field still gets parsed.
**Fix:** Either:
1. Set a dummy value: `api_key: "dummy"` (CLI `--api-key` overrides it)
2. Use env var syntax: `api_key: "${API_KEY}"` (works if env var is set during config load)
3. Use `headers` dict instead for auth
**Best practice:** Use both:
```yaml
endpoint:
api_key: "${API_KEY}" # satisfies validation
headers:
Authorization: "Bearer ${API_KEY}"
```
### Error: `model` not found in schema
**Cause:** Old flat `model` key at top level. New format nests under `benchmark.models.items[].name`.
**Fix:**
```yaml
benchmark:
models:
items:
- name: "vllm/gemma-4-31b-it"
```
### Error: `extra-headers` not found
**Cause:** Old key name. New format uses `endpoint.headers`.
**Fix:**
```yaml
benchmark:
endpoint:
headers:
Authorization: "Bearer ${API_KEY}"
```
### Error: `endpoint_type` not found
**Cause:** Old key name. New format uses `endpoint.type`.
**Fix:**
```yaml
benchmark:
endpoint:
type: "chat"
```
### Error: NumPy X86_V2 crash
```
RuntimeError: NumPy was built with baseline optimizations:
(X86_V2) but your machine doesn't support: (X86_V2).
```
**Cause:** AIPerf installs NumPy 2.x, which requires CPU features not present on older x86_64 VMs.
**Fix:**
```bash
pip install "numpy<2.0" --force-reinstall
```
### Error: ShareGPT download timeout
**Cause:** First run with `type: "public"` dataset downloads ShareGPT from HuggingFace (~500MB, 25 min).
**Fix:** Wait, or use `type: "synthetic"` for quick validation.
## Synthetic Dataset Format
For fixed ISL/OSL (reproducible capacity tests):
```yaml
datasets:
- type: "synthetic"
name: "main"
entries: 100
isl:
type: "fixed"
value: 512
osl:
type: "fixed"
value: 128
```
Distribution types: `fixed`, `normal`, `lognormal`, `multimodal`, `empirical`.
## CLI Override Compatibility
Flags that work with Schema 2.0 YAML configs:
- `--concurrency N` → overrides phase concurrency
- `--request-count N` → overrides phase.requests
- `--duration N` → overrides phase.duration
- `--artifact-dir PATH` → sets output directory
- `--ui simple|dashboard` → UI mode
- `--api-key KEY` → overrides endpoint.api_key
- `--no-gpu-telemetry` → skips DCGM
- `--no-server-metrics` → skips Prometheus scraping
## Orchestrator Pattern: YAML + CLI Sweeps
```bash
AIPERF="./venv/bin/aiperf" # always use venv path, never rely on PATH
for conc in 1 5 10; do
"$AIPERF" profile \
--config sales.yaml \
--concurrency "$conc" \
--request-count 50 \
--artifact-dir "results/sales/conc${conc}"
done
```
**Critical:** In background processes (cron, systemd, nohup), `PATH` may not include the venv. Always use absolute path to `venv/bin/aiperf`.