Files

112 lines
3.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 Background-Process & Orchestrator Pitfalls
Session artifact: debugging why a full 12-run benchmark suite silently failed with `aiperf: command not found` despite successful manual runs.
## The Problem: `aiperf: command not found` in Background
The background process (started via `bash -lic`) did not inherit the venv-activated PATH. All 12 runs produced:
```
./scripts/run-suite.sh: line 90: aiperf: command not found
```
**Root cause:** `aiperf` was installed into a Python venv, but the background shell did not activate the venv before running the orchestrator.
## The Fix: Absolute Path to venv Binary
In the orchestrator script, define an absolute path variable:
```bash
AIPERF="$BASE_DIR/venv/bin/aiperf"
if [ ! -x "$AIPERF" ]; then
echo "ERROR: AIPerf not found at $AIPERF"
exit 1
fi
```
Then call `"$AIPERF" profile ...` everywhere instead of plain `aiperf profile`.
## ShareGPT Pre-Download Strategy
`type: "public"` datasets download ShareGPT from HuggingFace on first use (~25 minutes). To avoid this delay during production benchmark runs, perform a pre-download:
```bash
# Pre-download ShareGPT into AIPerf's local cache
venv/bin/aiperf profile \
--config configs/<any-model>/sales.yaml \
--concurrency 1 --request-count 1 \
--no-gpu-telemetry --no-server-metrics \
--artifact-dir /tmp/predownload
```
Subsequent sales-scenario runs will use the cached dataset instantly.
## AIPerf 0.10.0 CLI Flag Reference
Critical flags used in this session:
| Flag | What it does | Status |
|------|-------------|--------|
| `--ui simple` | Minimal UI mode (no TUI) | ✅ Works |
| `--ui dashboard` | Full TUI dashboard | ✅ Works |
| `--artifact-dir PATH` | Output directory for CSV/JSON/logs | ✅ Works |
| `--no-gpu-telemetry` | Skip DCGM/GPU metrics | ✅ Works |
| `--no-server-metrics` | Skip Prometheus scraping | ✅ Works |
| `--request-count N` | Total requests (overrides YAML `requests`) | ✅ Works |
| `--concurrency N` | Concurrent sessions | ✅ Works |
| `--simple` | ❌ NOT a flag; use `--ui simple` | ❌ Rejected |
| `--output PATH` | ❌ NOT a flag; use `--artifact-dir` | ❌ Rejected |
| `--output-artifact-dir PATH` | Alias for `--artifact-dir` | ✅ Works |
| `--api-key KEY` | Overrides YAML `api_key` | ✅ Works |
## The `api_key` + `requests`/`duration`/`sessions` Interaction
Sequence of errors encountered:
1. `api_key must be a valid string` — this appeared when `phases[].requests` was missing.
2. With `requests: 50` and `sessions: 1` added to phases → config validated.
3. **Lesson:** The `api_key` error was misleading. The real issue was always a missing `requests`/`duration`/`sessions` in the phase definition.
Pattern that works:
```yaml
phases:
- type: "concurrency"
name: "profiling"
requests: 50 # REQUIRED
sessions: 1 # optional, default 1
```
## Complete Working Config (Single File)
```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: "${NORIS_API_KEY}"
streaming: true
headers:
Authorization: "Bearer ${NORIS_API_KEY}"
datasets:
- type: "synthetic"
name: "main"
entries: 100
isl:
type: "fixed"
value: 512
osl:
type: "fixed"
value: 128
phases:
- type: "concurrency"
name: "profiling"
requests: 50
sessions: 1
tokenizer:
name: "builtin"
```