llm-speed-bench 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +339 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/README.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# LLM Speed Bench
|
|
2
|
+
|
|
3
|
+
`llm-speed-bench` is a command-line interface (CLI) tool for benchmarking the performance of Large Language Model (LLM) providers that offer an OpenAI-compatible API.
|
|
4
|
+
|
|
5
|
+
It is designed to provide detailed, actionable data on the output speed and latency characteristics of different models and providers. It measures key performance indicators from the moment a request is sent until the final token of the response is received, with a focus on streaming APIs.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
* **OpenAI-Compatible:** Works with any API that adheres to the OpenAI specification for streaming chat completions.
|
|
10
|
+
* **Streaming First:** Benchmarks performance by leveraging the provider's streaming API to get detailed timing data.
|
|
11
|
+
* **Detailed Performance Metrics:** Collects and calculates a comprehensive set of metrics, including token counts, time to first token, inter-token latency, and overall throughput.
|
|
12
|
+
* **Flexible Configuration:** Manage inputs via both command-line arguments and environment variables.
|
|
13
|
+
* **Multiple Output Formats:** Presents results in a clean, human-readable format, with an option for machine-readable JSON.
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
1. **Clone the repository:**
|
|
18
|
+
```bash
|
|
19
|
+
git clone https://github.com/your-username/llm-speed-bench.git
|
|
20
|
+
cd llm-speed-bench
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
2. **Install dependencies:**
|
|
24
|
+
```bash
|
|
25
|
+
npm install
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
3. **Build the project:**
|
|
29
|
+
```bash
|
|
30
|
+
npm run build
|
|
31
|
+
```
|
|
32
|
+
This will compile the TypeScript code into JavaScript and place the executable in the `dist/` directory.
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
You can run the tool using the compiled executable located at `dist/index.js`. Configuration can be provided through command-line arguments or environment variables.
|
|
37
|
+
|
|
38
|
+
### Configuration
|
|
39
|
+
|
|
40
|
+
The tool requires four pieces of information to run:
|
|
41
|
+
|
|
42
|
+
| Parameter | CLI Argument | Environment Variable | Required | Description |
|
|
43
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
44
|
+
| API Base URL | `--api-base-url <url>` | `LLM_API_BASE_URL` | Yes | The base URL for the OpenAI-compatible API. |
|
|
45
|
+
| API Key | `--api-key <key>` | `LLM_API_KEY` | Yes | The authentication key for the API. |
|
|
46
|
+
| Model Name | `--model <name>` | `LLM_MODEL_NAME` | Yes | The specific model to be benchmarked (e.g., `gpt-4o`). |
|
|
47
|
+
| Prompt | `--prompt <text>` | `LLM_PROMPT` | Yes | The input text to send to the model. |
|
|
48
|
+
|
|
49
|
+
### Examples
|
|
50
|
+
|
|
51
|
+
#### Using Command-Line Arguments
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
./dist/index.js \
|
|
55
|
+
--api-base-url "https://api.openai.com/v1" \
|
|
56
|
+
--api-key "sk-..." \
|
|
57
|
+
--model "gpt-4o" \
|
|
58
|
+
--prompt "Tell me a short story about a robot who discovers music."
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
#### Using Environment Variables
|
|
62
|
+
|
|
63
|
+
You can create a `.env` file in the project root or export the variables in your shell:
|
|
64
|
+
|
|
65
|
+
**`.env` file:**
|
|
66
|
+
```
|
|
67
|
+
LLM_API_BASE_URL="https://api.openai.com/v1"
|
|
68
|
+
LLM_API_KEY="sk-..."
|
|
69
|
+
LLM_MODEL_NAME="gpt-4o"
|
|
70
|
+
LLM_PROMPT="Tell me a short story about a robot who discovers music."
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then, run the tool:
|
|
74
|
+
```bash
|
|
75
|
+
./dist/index.js
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
#### Getting JSON Output
|
|
79
|
+
|
|
80
|
+
To get the results in a machine-readable JSON format, use the `--json` flag:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
./dist/index.js --json > results.json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Output Format
|
|
87
|
+
|
|
88
|
+
### Standard Output
|
|
89
|
+
|
|
90
|
+
The default output is a human-readable summary:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
LLM Benchmark Results
|
|
94
|
+
=======================
|
|
95
|
+
|
|
96
|
+
Configuration
|
|
97
|
+
-----------------------
|
|
98
|
+
Provider API Base: https://api.groq.com/openai
|
|
99
|
+
Model: llama3-70b-8192
|
|
100
|
+
|
|
101
|
+
Metrics
|
|
102
|
+
-----------------------
|
|
103
|
+
Time to First Token: 152 ms
|
|
104
|
+
Total Wall Clock Time: 2,130 ms
|
|
105
|
+
Overall Output Rate: 234.7 tokens/sec
|
|
106
|
+
|
|
107
|
+
Token Counts
|
|
108
|
+
-----------------------
|
|
109
|
+
Prompt Tokens: 35 (estimated)
|
|
110
|
+
Output Tokens: 450
|
|
111
|
+
|
|
112
|
+
Inter-Token Latency (ms)
|
|
113
|
+
-----------------------
|
|
114
|
+
Min: 2 ms
|
|
115
|
+
Mean: 4.1 ms
|
|
116
|
+
Median: 4 ms
|
|
117
|
+
Max: 15 ms
|
|
118
|
+
p90: 6 ms
|
|
119
|
+
p95: 8 ms
|
|
120
|
+
p99: 12 ms
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### JSON Output (`--json`)
|
|
124
|
+
|
|
125
|
+
The JSON output includes all the calculated metrics and configuration details.
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"configuration": {
|
|
130
|
+
"apiBaseUrl": "https://api.groq.com/openai",
|
|
131
|
+
"model": "llama3-70b-8192"
|
|
132
|
+
},
|
|
133
|
+
"metrics": {
|
|
134
|
+
"timeToFirstTokenMs": 152,
|
|
135
|
+
"totalWallClockTimeMs": 2130,
|
|
136
|
+
"overallOutputRateTps": 234.7
|
|
137
|
+
},
|
|
138
|
+
"tokenCounts": {
|
|
139
|
+
"promptTokens": 35,
|
|
140
|
+
"outputTokens": 450
|
|
141
|
+
},
|
|
142
|
+
"interTokenLatencyMs": {
|
|
143
|
+
"min": 2,
|
|
144
|
+
"mean": 4.1,
|
|
145
|
+
"median": 4,
|
|
146
|
+
"max": 15,
|
|
147
|
+
"p90": 6,
|
|
148
|
+
"p95": 8,
|
|
149
|
+
"p99": 12
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Development
|
|
155
|
+
|
|
156
|
+
### Running with ts-node
|
|
157
|
+
|
|
158
|
+
To run the tool in development mode without building, you can use `ts-node`:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
npx ts-node src/index.ts --api-base-url ...
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Local Installation and Testing
|
|
165
|
+
|
|
166
|
+
To test the CLI locally as if it were globally installed, you can use `npm link`. This is the best way to test the final command-line experience before publishing.
|
|
167
|
+
|
|
168
|
+
1. **Build the project:**
|
|
169
|
+
Make sure your latest changes are compiled.
|
|
170
|
+
```bash
|
|
171
|
+
npm run build
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
2. **Link the package:**
|
|
175
|
+
This creates a global symbolic link to your local project.
|
|
176
|
+
```bash
|
|
177
|
+
npm link
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
3. **Run the command globally:**
|
|
181
|
+
You can now run the command from any directory.
|
|
182
|
+
```bash
|
|
183
|
+
llm-speed-bench --api-base-url "..." --api-key "..."
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
4. **Rebuild after changes:**
|
|
187
|
+
Whenever you change the source code, just re-run the build command. The symbolic link will ensure your global command always uses the latest compiled code.
|
|
188
|
+
```bash
|
|
189
|
+
npm run build
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
5. **Unlink the package:**
|
|
193
|
+
When you're done with local testing, you can remove the global link.
|
|
194
|
+
```bash
|
|
195
|
+
npm unlink llm-speed-bench
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
process.env.DOTENV_CONFIG_SILENT = 'true';
|
|
3
|
+
import yargs from 'yargs';
|
|
4
|
+
import { hideBin } from 'yargs/helpers';
|
|
5
|
+
import dotenv from 'dotenv';
|
|
6
|
+
import { get_encoding } from 'tiktoken';
|
|
7
|
+
// Load environment variables from .env file
|
|
8
|
+
dotenv.config({ quiet: true });
|
|
9
|
+
// --- Utility Functions ---
|
|
10
|
+
/**
|
|
11
|
+
* Calculates percentile values from a sorted array of numbers.
|
|
12
|
+
* @param arr - A sorted array of numbers.
|
|
13
|
+
* @param p - The percentile to calculate (0-100).
|
|
14
|
+
* @returns The value at the given percentile.
|
|
15
|
+
*/
|
|
16
|
+
const percentile = (arr, p) => {
|
|
17
|
+
if (arr.length === 0)
|
|
18
|
+
return 0;
|
|
19
|
+
const k = (p / 100) * (arr.length - 1);
|
|
20
|
+
const f = Math.floor(k);
|
|
21
|
+
const c = Math.ceil(k);
|
|
22
|
+
if (f === c) {
|
|
23
|
+
return arr[f];
|
|
24
|
+
}
|
|
25
|
+
const fVal = arr[f];
|
|
26
|
+
const cVal = arr[c];
|
|
27
|
+
return fVal * (c - k) + cVal * (k - f);
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Calculates statistical metrics for a list of latencies.
|
|
31
|
+
* @param latencies - An array of numbers.
|
|
32
|
+
* @returns An object with min, max, mean, median, and percentile stats.
|
|
33
|
+
*/
|
|
34
|
+
const calculateLatencyStats = (latencies) => {
|
|
35
|
+
if (latencies.length === 0) {
|
|
36
|
+
return { min: 0, max: 0, mean: 0, median: 0, p90: 0, p95: 0, p99: 0 };
|
|
37
|
+
}
|
|
38
|
+
const sorted = [...latencies].sort((a, b) => a - b);
|
|
39
|
+
const sum = sorted.reduce((a, b) => a + b, 0);
|
|
40
|
+
const mean = sum / sorted.length;
|
|
41
|
+
const min = sorted[0];
|
|
42
|
+
const max = sorted[sorted.length - 1];
|
|
43
|
+
if (min === undefined || max === undefined) {
|
|
44
|
+
// This path should be unreachable due to the length check above,
|
|
45
|
+
// but it satisfies the strict type checker.
|
|
46
|
+
return { min: 0, max: 0, mean: 0, median: 0, p90: 0, p95: 0, p99: 0 };
|
|
47
|
+
}
|
|
48
|
+
const median = percentile(sorted, 50);
|
|
49
|
+
const p90 = percentile(sorted, 90);
|
|
50
|
+
const p95 = percentile(sorted, 95);
|
|
51
|
+
const p99 = percentile(sorted, 99);
|
|
52
|
+
return {
|
|
53
|
+
min: parseFloat(min.toFixed(2)),
|
|
54
|
+
max: parseFloat(max.toFixed(2)),
|
|
55
|
+
mean: parseFloat(mean.toFixed(2)),
|
|
56
|
+
median: parseFloat(median.toFixed(2)),
|
|
57
|
+
p90: parseFloat(p90.toFixed(2)),
|
|
58
|
+
p95: parseFloat(p95.toFixed(2)),
|
|
59
|
+
p99: parseFloat(p99.toFixed(2)),
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
// --- Main Application Logic ---
|
|
63
|
+
class ProgressIndicator {
|
|
64
|
+
constructor(isJson) {
|
|
65
|
+
this.isJson = isJson;
|
|
66
|
+
this.stream = process.stderr;
|
|
67
|
+
this.spinner = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
68
|
+
this.frame = 0;
|
|
69
|
+
this.message = '';
|
|
70
|
+
}
|
|
71
|
+
render() {
|
|
72
|
+
if (this.isJson)
|
|
73
|
+
return;
|
|
74
|
+
this.stream.clearLine(0);
|
|
75
|
+
this.stream.cursorTo(0);
|
|
76
|
+
const spinnerFrame = this.spinner[this.frame];
|
|
77
|
+
this.stream.write(`${spinnerFrame} ${this.message}`);
|
|
78
|
+
this.frame = (this.frame + 1) % this.spinner.length;
|
|
79
|
+
}
|
|
80
|
+
start(message) {
|
|
81
|
+
if (this.isJson)
|
|
82
|
+
return;
|
|
83
|
+
this.message = message;
|
|
84
|
+
this.timer = setInterval(() => this.render(), 80);
|
|
85
|
+
}
|
|
86
|
+
update(message) {
|
|
87
|
+
if (this.isJson)
|
|
88
|
+
return;
|
|
89
|
+
this.message = message;
|
|
90
|
+
}
|
|
91
|
+
stop(finalMessage) {
|
|
92
|
+
if (this.isJson)
|
|
93
|
+
return;
|
|
94
|
+
if (this.timer) {
|
|
95
|
+
clearInterval(this.timer);
|
|
96
|
+
this.timer = undefined;
|
|
97
|
+
}
|
|
98
|
+
this.stream.clearLine(0);
|
|
99
|
+
this.stream.cursorTo(0);
|
|
100
|
+
this.stream.write(`✅ ${finalMessage}\n`);
|
|
101
|
+
}
|
|
102
|
+
clear() {
|
|
103
|
+
if (this.isJson)
|
|
104
|
+
return;
|
|
105
|
+
this.stream.clearLine(0);
|
|
106
|
+
this.stream.cursorTo(0);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parses command-line arguments and environment variables.
|
|
111
|
+
* @returns The configuration object.
|
|
112
|
+
*/
|
|
113
|
+
async function getConfig() {
|
|
114
|
+
const argv = await yargs(hideBin(process.argv))
|
|
115
|
+
.option('api-base-url', {
|
|
116
|
+
alias: 'u',
|
|
117
|
+
type: 'string',
|
|
118
|
+
description: 'The base URL for the OpenAI-compatible API endpoint.',
|
|
119
|
+
default: process.env.LLM_API_URL,
|
|
120
|
+
})
|
|
121
|
+
.option('api-key', {
|
|
122
|
+
alias: 'k',
|
|
123
|
+
type: 'string',
|
|
124
|
+
description: 'The authentication key for the API.',
|
|
125
|
+
default: process.env.LLM_API_KEY,
|
|
126
|
+
})
|
|
127
|
+
.option('model', {
|
|
128
|
+
alias: 'm',
|
|
129
|
+
type: 'string',
|
|
130
|
+
description: 'The specific model to be benchmarked.',
|
|
131
|
+
default: process.env.LLM_MODEL_NAME,
|
|
132
|
+
})
|
|
133
|
+
.option('prompt', {
|
|
134
|
+
alias: 'p',
|
|
135
|
+
type: 'string',
|
|
136
|
+
description: 'The input text to send to the model.',
|
|
137
|
+
default: process.env.LLM_PROMPT,
|
|
138
|
+
})
|
|
139
|
+
.option('json', {
|
|
140
|
+
type: 'boolean',
|
|
141
|
+
description: 'Output the results in JSON format.',
|
|
142
|
+
default: false,
|
|
143
|
+
})
|
|
144
|
+
.help()
|
|
145
|
+
.alias('help', 'h')
|
|
146
|
+
.parse();
|
|
147
|
+
if (!argv.apiBaseUrl || !argv.apiKey || !argv.model || !argv.prompt) {
|
|
148
|
+
console.error('Error: Missing required arguments.');
|
|
149
|
+
console.error('Please provide api-base-url, api-key, model, and prompt via CLI arguments or environment variables.');
|
|
150
|
+
// Throwing an error is cleaner and more explicit for type checkers
|
|
151
|
+
throw new Error('Missing required arguments.');
|
|
152
|
+
}
|
|
153
|
+
const config = {
|
|
154
|
+
apiBaseUrl: argv.apiBaseUrl,
|
|
155
|
+
apiKey: argv.apiKey,
|
|
156
|
+
model: argv.model,
|
|
157
|
+
prompt: argv.prompt,
|
|
158
|
+
json: argv.json ?? false,
|
|
159
|
+
};
|
|
160
|
+
return config;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Runs the benchmark against the specified LLM provider.
|
|
164
|
+
* @param config - The configuration object.
|
|
165
|
+
*/
|
|
166
|
+
async function runBenchmark(config) {
|
|
167
|
+
const { apiBaseUrl, apiKey, model, prompt, json } = config;
|
|
168
|
+
const progress = new ProgressIndicator(json);
|
|
169
|
+
progress.start('Connecting...');
|
|
170
|
+
const T_start = performance.now();
|
|
171
|
+
let T_first_token = null;
|
|
172
|
+
const interTokenLatencies = [];
|
|
173
|
+
let lastChunkTime = 0;
|
|
174
|
+
let outputTokens = 0;
|
|
175
|
+
try {
|
|
176
|
+
const url = new URL(apiBaseUrl);
|
|
177
|
+
if (!url.pathname.endsWith('/')) {
|
|
178
|
+
url.pathname += '/';
|
|
179
|
+
}
|
|
180
|
+
let finalUrl;
|
|
181
|
+
if (url.pathname.endsWith('/v1/')) {
|
|
182
|
+
finalUrl = new URL('chat/completions', url);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
finalUrl = new URL('v1/chat/completions', url);
|
|
186
|
+
}
|
|
187
|
+
progress.update('Sending Request...');
|
|
188
|
+
const response = await fetch(finalUrl, {
|
|
189
|
+
method: 'POST',
|
|
190
|
+
headers: {
|
|
191
|
+
'Content-Type': 'application/json',
|
|
192
|
+
Authorization: `Bearer ${apiKey}`,
|
|
193
|
+
},
|
|
194
|
+
body: JSON.stringify({
|
|
195
|
+
model,
|
|
196
|
+
messages: [{ role: 'user', content: prompt }],
|
|
197
|
+
stream: true,
|
|
198
|
+
}),
|
|
199
|
+
});
|
|
200
|
+
if (!response.ok || !response.body) {
|
|
201
|
+
const errorBody = await response.text();
|
|
202
|
+
throw new Error(`API Error: ${response.status} ${response.statusText} - ${errorBody}`);
|
|
203
|
+
}
|
|
204
|
+
progress.update('Waiting for First Token...');
|
|
205
|
+
const reader = response.body.getReader();
|
|
206
|
+
const decoder = new TextDecoder();
|
|
207
|
+
while (true) {
|
|
208
|
+
const { done, value } = await reader.read();
|
|
209
|
+
if (done) {
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
const chunkTime = performance.now();
|
|
213
|
+
if (T_first_token === null) {
|
|
214
|
+
T_first_token = chunkTime;
|
|
215
|
+
}
|
|
216
|
+
if (lastChunkTime > 0) {
|
|
217
|
+
interTokenLatencies.push(chunkTime - lastChunkTime);
|
|
218
|
+
}
|
|
219
|
+
lastChunkTime = chunkTime;
|
|
220
|
+
const chunk = decoder.decode(value, { stream: true });
|
|
221
|
+
const lines = chunk.split('\n').filter((line) => line.trim().startsWith('data:'));
|
|
222
|
+
for (const line of lines) {
|
|
223
|
+
const data = line.substring(5).trim();
|
|
224
|
+
if (data === '[DONE]') {
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
const parsed = JSON.parse(data);
|
|
229
|
+
const content = parsed.choices[0]?.delta?.content;
|
|
230
|
+
if (content) {
|
|
231
|
+
outputTokens++;
|
|
232
|
+
const elapsedS = (performance.now() - T_first_token) / 1000;
|
|
233
|
+
const tokensPerSecond = elapsedS > 0 ? outputTokens / elapsedS : 0;
|
|
234
|
+
progress.update(`Receiving Tokens... (${outputTokens} tokens received @ ${tokensPerSecond.toFixed(2)} tokens/s)`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
238
|
+
// Ignore parsing errors for non-JSON lines
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const T_end = performance.now();
|
|
243
|
+
progress.stop('Finished receiving tokens.');
|
|
244
|
+
const totalWallClockTimeMs = T_end - T_start;
|
|
245
|
+
const timeToFirstTokenMs = T_first_token ? T_first_token - T_start : 0;
|
|
246
|
+
// Estimate prompt tokens using tiktoken
|
|
247
|
+
const encoding = get_encoding('cl100k_base');
|
|
248
|
+
const promptTokens = encoding.encode(prompt).length;
|
|
249
|
+
encoding.free();
|
|
250
|
+
const outputDurationS = (totalWallClockTimeMs - timeToFirstTokenMs) / 1000;
|
|
251
|
+
const overallOutputRateTps = outputDurationS > 0 ? outputTokens / outputDurationS : 0;
|
|
252
|
+
const latencyStats = calculateLatencyStats(interTokenLatencies);
|
|
253
|
+
const results = {
|
|
254
|
+
configuration: {
|
|
255
|
+
apiBaseUrl,
|
|
256
|
+
model,
|
|
257
|
+
},
|
|
258
|
+
metrics: {
|
|
259
|
+
timeToFirstTokenMs: parseFloat(timeToFirstTokenMs.toFixed(2)),
|
|
260
|
+
totalWallClockTimeMs: parseFloat(totalWallClockTimeMs.toFixed(2)),
|
|
261
|
+
overallOutputRateTps: parseFloat(overallOutputRateTps.toFixed(2)),
|
|
262
|
+
},
|
|
263
|
+
tokenCounts: {
|
|
264
|
+
promptTokens,
|
|
265
|
+
outputTokens,
|
|
266
|
+
},
|
|
267
|
+
interTokenLatencyMs: {
|
|
268
|
+
...latencyStats,
|
|
269
|
+
latencies: interTokenLatencies,
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
printResults(results, config.json);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
console.error('An error occurred during the benchmark:', error);
|
|
276
|
+
process.exit(1);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Prints the benchmark results to the console.
|
|
281
|
+
* @param results - The benchmark results object.
|
|
282
|
+
* @param asJson - Whether to print in JSON format.
|
|
283
|
+
*/
|
|
284
|
+
function printResults(results, asJson) {
|
|
285
|
+
if (asJson) {
|
|
286
|
+
// Create a new object for JSON output that doesn't include the full latencies array
|
|
287
|
+
const jsonOutput = {
|
|
288
|
+
...results,
|
|
289
|
+
interTokenLatencyMs: {
|
|
290
|
+
...results.interTokenLatencyMs,
|
|
291
|
+
latencies: undefined, // Remove the detailed list for the final JSON output
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
// delete jsonOutput.interTokenLatencyMs.latencies;
|
|
295
|
+
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
console.log('LLM Benchmark Results');
|
|
299
|
+
console.log('=======================');
|
|
300
|
+
console.log();
|
|
301
|
+
console.log('Configuration');
|
|
302
|
+
console.log('-----------------------');
|
|
303
|
+
console.log(`Provider API Base: ${results.configuration.apiBaseUrl}`);
|
|
304
|
+
console.log(`Model: ${results.configuration.model}`);
|
|
305
|
+
console.log();
|
|
306
|
+
console.log('Metrics');
|
|
307
|
+
console.log('-----------------------');
|
|
308
|
+
console.log(`Time to First Token: ${results.metrics.timeToFirstTokenMs} ms`);
|
|
309
|
+
console.log(`Total Wall Clock Time: ${results.metrics.totalWallClockTimeMs} ms`);
|
|
310
|
+
console.log(`Overall Output Rate: ${results.metrics.overallOutputRateTps} tokens/sec`);
|
|
311
|
+
console.log();
|
|
312
|
+
console.log('Token Counts');
|
|
313
|
+
console.log('-----------------------');
|
|
314
|
+
console.log(`Prompt Tokens: ${results.tokenCounts.promptTokens} (estimated)`);
|
|
315
|
+
console.log(`Output Tokens: ${results.tokenCounts.outputTokens}`);
|
|
316
|
+
console.log();
|
|
317
|
+
console.log('Inter-Token Latency (ms)');
|
|
318
|
+
console.log('-----------------------');
|
|
319
|
+
console.log(`Min: ${results.interTokenLatencyMs.min} ms`);
|
|
320
|
+
console.log(`Mean: ${results.interTokenLatencyMs.mean} ms`);
|
|
321
|
+
console.log(`Median: ${results.interTokenLatencyMs.median} ms`);
|
|
322
|
+
console.log(`Max: ${results.interTokenLatencyMs.max} ms`);
|
|
323
|
+
console.log(`p90: ${results.interTokenLatencyMs.p90} ms`);
|
|
324
|
+
console.log(`p95: ${results.interTokenLatencyMs.p95} ms`);
|
|
325
|
+
console.log(`p99: ${results.interTokenLatencyMs.p99} ms`);
|
|
326
|
+
}
|
|
327
|
+
// --- Entry Point ---
|
|
328
|
+
(async () => {
|
|
329
|
+
try {
|
|
330
|
+
const config = await getConfig();
|
|
331
|
+
await runBenchmark(config);
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
// Catch errors from getConfig and exit gracefully
|
|
335
|
+
// The error message is already printed inside getConfig
|
|
336
|
+
process.exit(1);
|
|
337
|
+
}
|
|
338
|
+
})();
|
|
339
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "llm-speed-bench",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A CLI tool to benchmark the performance of OpenAI-compatible LLM providers.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"llm-speed-bench": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"start": "ts-node src/index.ts",
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"llm",
|
|
20
|
+
"benchmark",
|
|
21
|
+
"performance",
|
|
22
|
+
"openai",
|
|
23
|
+
"speed"
|
|
24
|
+
],
|
|
25
|
+
"author": "",
|
|
26
|
+
"license": "ISC",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@types/node": "^24.3.0",
|
|
29
|
+
"@types/yargs": "^17.0.33",
|
|
30
|
+
"dotenv": "^17.2.2",
|
|
31
|
+
"tiktoken": "^1.0.22",
|
|
32
|
+
"ts-node": "^10.9.2",
|
|
33
|
+
"typescript": "^5.9.2",
|
|
34
|
+
"yargs": "^18.0.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@typescript-eslint/eslint-plugin": "^8.42.0",
|
|
38
|
+
"@typescript-eslint/parser": "^8.42.0",
|
|
39
|
+
"eslint": "^9.34.0"
|
|
40
|
+
}
|
|
41
|
+
}
|