A command-line tool for node provisioning (CUDA toolkit, Nvidia recommended drivers, libraries) and GPU bandwidth benchmarking via nvbandwidth. See https://github.com/NVIDIA/nvbandwidth.
Supports all major NVIDIA GPU architectures including the CoreSpan 5090 Inference System (Blackwell / RTX 5090, GB202). The provisioning script automatically detects the RTX 5090, selects CUDA 12.8, and installs driver 570+.
curl -sL https://raw.githubusercontent.com/corespan/aistudio-cli/master/install.sh | bashThis downloads the latest release binary for your platform and installs it to /usr/local/bin. Requires curl, tar, and sudo.
cd ai-studio-cli
go mod tidy
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o ai-studio-cli .
sudo mv ai-studio-cli /usr/local/bin/Setup is split into two phases. Phase 2 must be run after the reboot that Phase 1 triggers.
Phase 1 — Install dependencies
ai-studio-cli setup dependenciesIf the installation of drivers occurs, the system reboots at the end of Phase 1.
Choosing a container runtime (Docker / Podman)
Phase 1 installs the NVIDIA Container Toolkit and configures GPU access for the
container runtime of your choice. Select it with --runtime:
# Docker (default) — configures the NVIDIA container runtime
ai-studio-cli setup dependencies --runtime docker
# Podman — generates a CDI spec (/etc/cdi/nvidia.yaml) and installs podman
ai-studio-cli setup dependencies --runtime podman
# Both
ai-studio-cli setup dependencies --runtime bothThe toolkit package is identical for both; only the access mechanism differs —
Docker uses the NVIDIA container runtime, while Podman uses the Container Device
Interface (CDI). With Podman, run GPU containers via
podman run --device nvidia.com/gpu=all .... The CDI spec is regenerated
automatically after driver updates/reboots when the nvidia-cdi-refresh
service is available (NVIDIA Container Toolkit ≥ 1.18).
Phase 2 — Build nvbandwidth
Run this to verify drivers, clone nvbandwidth from GitHub, and compile it.
ai-studio-cli setup nvbandwidthPhase 3 — Install vLLM Dependencies (Optional)
If you intend to run inference benchmarks using the container fallback strategy, you must install a container runtime and the NVIDIA Container Toolkit. Choose the runtime with --runtime (default docker):
# Docker (default)
ai-studio-cli setup vllm
# Podman — installs podman + podman-compose and generates a CDI spec
ai-studio-cli setup vllm --runtime podman
# Both
ai-studio-cli setup vllm --runtime bothnvbandwidth must be installed first via setup nvbandwidth above.
# List all available test cases
ai-studio-cli nvbandwidth list
# Run all test cases
ai-studio-cli nvbandwidth run
# Run a specific test case
ai-studio-cli nvbandwidth test host_to_device_memcpy_sm| Flag | Short | Default | Description |
|---|---|---|---|
--buffer-size |
-b |
512 |
Memcpy buffer size in MiB |
--samples |
-i |
3 |
Number of benchmark iterations |
--verbose |
-v |
Enable verbose output | |
--json |
-j |
Output results as JSON | |
--skip-verify |
-s |
Skip data verification after copy | |
--use-mean |
-m |
Use arithmetic mean instead of median |
The CoreSpan 5090 Inference System connects multiple RTX 5090 GPUs via NVLink. Use the dedicated nvlink subcommand to validate peer-to-peer interconnect health and bandwidth:
ai-studio-cli nvbandwidth nvlinkThis runs six peer-to-peer testcases covering unidirectional and bidirectional NVLink transfers as well as all-to-host / host-to-all patterns.
# JSON output (for monitoring / alerting pipelines)
ai-studio-cli nvbandwidth nvlink --json
# Larger buffer and more samples for sustained-bandwidth measurement
ai-studio-cli nvbandwidth nvlink --buffer-size 1024 --samples 10The same flags as run and test apply.
The bench subcommand provides an automated way for testing LLM serving performance (Throughput, TTFT, TPOT) using vllm.
The CLI comes bundled with a default, optimized compose file (configured for Qwen2.5-32B-Instruct with FP8 and PP-4 and TP-1). If you don't provide a compose file, it will use this default automatically:
# Simplest case — uses the built-in default compose
ai-studio-cli bench --requests 200 --concurrency 20 --max-tokens 1024
# With Apache Bench
ai-studio-cli ab-bench --requests 200 --concurrency 20 --max-tokens 1024The bench, ab-bench, and vllm commands work with either runtime. By default the runtime is auto-detected (Docker preferred, then Podman); override it with --runtime:
# Force Podman — uses podman-compose and CDI device passthrough
ai-studio-cli bench --runtime podman --requests 200 --concurrency 20Under Podman the bundled compose file is automatically adapted (the GPU deploy.resources reservation is rewritten to the CDI devices: [nvidia.com/gpu=all] form, which podman-compose understands). If you supply your own --compose-file for Podman, use the CDI device syntax yourself.
To keep the server running after the benchmark (e.g., for follow-up runs):
ai-studio-cli bench --keep-server --requests 200Note: If the server is already running on the endpoint, the CLI detects it and skips the compose-up step automatically.
If you need full control over the Docker Compose configuration, provide your own file:
ai-studio-cli bench --compose-file docker-compose.yaml --requests 200 --concurrency 20Before running benchmarks with the built-in vLLM server, ensure you have a container runtime (Docker Engine or Podman + podman-compose) and the NVIDIA Container Toolkit installed. Run ai-studio-cli setup vllm --runtime <docker|podman|both> to install them.
If you prefer to manage the vLLM server separately:
# Start the server
ai-studio-cli vllm up --compose-file docker-compose.yaml
# Check status
ai-studio-cli vllm status
# View logs
ai-studio-cli vllm logs -f
# Stop the server
ai-studio-cli vllm downBring Your Own Server: If you already have vLLM running natively or on another machine, skip the compose steps entirely and pass
--endpoint http://<ip>:<port>directly to thebenchcommands.
If you don't provide a dataset, the tool defaults to the random dataset. It will automatically generate synthetic gibberish requests based on your token length flags. This is the best way to test maximum theoretical hardware throughput.
ai-studio-cli bench --endpoint http://<ip>:<port> --input-len 512 --max-tokens 256 --concurrency 64Provide an exact string to test. The CLI will automatically generate a temporary dataset behind the scenes, repeating your prompt for the requested amount.
ai-studio-cli bench --endpoint http://<ip>:<port> --prompt "Explain the concept of machine learning." --requests 100 --concurrency 10For realistic testing, you can download this standard dataset available:
Setup — Download the standard dataset:
HuggingFace now requires a free account token to download this dataset. Ensure your HF_TOKEN is exported, then run:
wget --header="Authorization: Bearer $HF_TOKEN" https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.jsonRun the benchmark:
ai-studio-cli bench --endpoint http://<ip>:<port> --dataset sharegpt --dataset-path ./ShareGPT_V3_unfiltered_cleaned_split.json --requests 1000 --concurrency 32The benchmarking tool automatically determines the best way to run the test:
- Local Execution: If
vllmis installed locally in your Python environment (e.g., viapip install vllm), it will run the benchmark natively to avoid overhead. - Container Fallback: If
vllmis missing (common on fresh nodes), it automatically falls back to pulling and running thevllm/vllm-openai:latestimage with the active runtime (Docker or Podman, per--runtime). The benchmark client container uses host networking to reach your inference server (no GPU is requested — the client is a plain load generator).
Results are automatically saved to a structured directory in the following format:
bench-results/{model}/{gpu_tag}/{timestamp}/benchmark_result.json
- Model Name: If you don't specify
--model, the tool hits the/v1/modelsendpoint of your inference server to auto-detect the served model. - GPU Tag: The tool reads
nvidia-smito auto-detect your hardware (e.g.,A100-SXM4-80GB). You can override this with--gpu-tag.
| Flag | Default | Description |
|---|---|---|
--endpoint |
http://[IP_ADDRESS]:[PORT] |
Address of the vLLM OpenAI-compatible server |
--model |
(auto-detected) | Name of the model to request |
--dataset |
random |
Dataset type: random, sharegpt, custom |
--dataset-path |
Path to dataset JSON (if using sharegpt) |
|
--prompt |
Single custom prompt string to use | |
--requests |
1000 |
Number of requests to process |
--concurrency |
10 |
Number of concurrent requests |
--gpu-tag |
(auto-detected) | Override the detected GPU tag for the results folder |
--compose-file |
Custom docker-compose.yml; overrides the built-in default | |
--keep-server |
false |
Leave the vLLM server running after the benchmark |
--server-timeout |
900 |
Seconds to wait for the vLLM server to become ready |
A built-in web dashboard for visualising and comparing benchmark results. The entire UI is embedded in the binary — no additional files or dependencies needed.
# Launch the dashboard
ai-studio-cli bench-ui --port 8050 --open
# Point to a different results directory
ai-studio-cli bench-ui --result-dir /path/to/bench-resultsThe dashboard provides:
- KPI cards — Total throughput, output throughput, TTFT, and TPOT at a glance
- Performance trend chart — Visualise metrics across runs with configurable Y-axis
- Model config bar — Shows TP/PP, quantization, dtype, max model length, GPU memory utilization
- Filterable table — Filter by model, GPU, and precision; search across all runs
- Sidebar navigation — Quickly switch between benchmark runs
| Flag | Default | Description |
|---|---|---|
--port |
9090 |
HTTP listen port for the dashboard |
--result-dir |
bench-results |
Root of the structured benchmark results directory |
--open |
false |
Automatically open the dashboard in the default browser |
- Sudo Password: The tool will securely prompt for your sudo password interactively during setup.