Skip to content

Commit 5c31578

Browse files
authored
Add iteration timestamp to CSV and JSON (openvinotoolkit#1070)
The json file adds two fields, start and end, to indicate the start and end timestamps of processing each prompt. [qwen2-0.5b.txt](https://github.com/user-attachments/files/17531006/qwen2-0.5b.txt) [qwen2-0.5b.json](https://github.com/user-attachments/files/17531002/qwen2-0.5b.json) [qwen2-0.5b.csv](https://github.com/user-attachments/files/17531005/qwen2-0.5b.csv)
1 parent 93f56be commit 5c31578

7 files changed

+78
-15
lines changed

tools/llm_bench/benchmark.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ def main():
181181
if args.memory_consumption:
182182
mem_consumption.start_collect_mem_consumption_thread()
183183
try:
184-
iter_data_list, pretrain_time = CASE_TO_BENCH[model_args['use_case']](
184+
iter_data_list, pretrain_time, iter_timestamp = CASE_TO_BENCH[model_args['use_case']](
185185
model_path, framework, args.device, model_args, args.num_iters, mem_consumption)
186186
if args.report is not None or args.report_json is not None:
187187
model_precision = ''
@@ -200,6 +200,7 @@ def main():
200200
iter_data_list,
201201
pretrain_time,
202202
model_precision,
203+
iter_timestamp
203204
)
204205
if args.report_json is not None:
205206
llm_bench_utils.output_json.write_result(
@@ -211,6 +212,7 @@ def main():
211212
iter_data_list,
212213
pretrain_time,
213214
model_precision,
215+
iter_timestamp
214216
)
215217
except Exception:
216218
log.error('An exception occurred')

tools/llm_bench/llm_bench_utils/model_utils.py

+10
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,13 @@ def get_model_precision(model_name_list):
272272
if model_precision != 'unknown':
273273
break
274274
return model_precision
275+
276+
277+
def init_timestamp(num_iters, prompt_list, prompt_idx_list):
278+
iter_timestamp = {}
279+
for num in range(num_iters + 1):
280+
iter_timestamp[num] = {}
281+
for idx, input_text in enumerate(prompt_list):
282+
p_idx = prompt_idx_list[idx]
283+
iter_timestamp[num][p_idx] = {}
284+
return iter_timestamp

tools/llm_bench/llm_bench_utils/output_csv.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import numpy as np
66
import copy
77
from pathlib import Path
8+
import llm_bench_utils.output_json as output_json
89

910

1011
def output_comments(result, use_case, writer):
@@ -86,7 +87,7 @@ def output_avg_min_median(iter_data_list):
8687
return result
8788

8889

89-
def gen_data_to_csv(result, iter_data, pretrain_time):
90+
def gen_data_to_csv(result, iter_data, pretrain_time, iter_timestamp):
9091
generation_time = iter_data['generation_time']
9192
latency = iter_data['latency']
9293
first_latency = iter_data['first_token_latency']
@@ -128,9 +129,10 @@ def gen_data_to_csv(result, iter_data, pretrain_time):
128129
result['prompt_idx'] = iter_data['prompt_idx']
129130
result['tokenization_time'] = round(token_time, 5) if token_time != '' else token_time
130131
result['detokenization_time'] = round(detoken_time, 5) if detoken_time != '' else detoken_time
132+
result['start'], result['end'] = output_json.get_timestamp(iter_data['iteration'], iter_data['prompt_idx'], iter_timestamp)
131133

132134

133-
def write_result(report_file, model, framework, device, model_args, iter_data_list, pretrain_time, model_precision):
135+
def write_result(report_file, model, framework, device, model_args, iter_data_list, pretrain_time, model_precision, iter_timestamp):
134136
header = [
135137
'iteration',
136138
'model',
@@ -156,6 +158,8 @@ def write_result(report_file, model, framework, device, model_args, iter_data_li
156158
'tokenization_time',
157159
'detokenization_time',
158160
'result_md5',
161+
'start',
162+
'end'
159163
]
160164
out_file = Path(report_file)
161165

@@ -174,13 +178,13 @@ def write_result(report_file, model, framework, device, model_args, iter_data_li
174178
for i in range(len(iter_data_list)):
175179
iter_data = iter_data_list[i]
176180
pre_time = '' if i > 0 else result['pretrain_time(s)']
177-
gen_data_to_csv(result, iter_data, pre_time)
181+
gen_data_to_csv(result, iter_data, pre_time, iter_timestamp)
178182
writer.writerow(result)
179183

180184
res_data = output_avg_min_median(iter_data_list)
181185

182186
for key in res_data.keys():
183187
for data in res_data[key]:
184-
gen_data_to_csv(result, data, '')
188+
gen_data_to_csv(result, data, '', iter_timestamp)
185189
writer.writerow(result)
186190
output_comments(result, model_args['use_case'], writer)

tools/llm_bench/llm_bench_utils/output_json.py

+16-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22

33

4-
def write_result(report_file, model, framework, device, model_args, iter_data_list, pretrain_time, model_precision):
4+
def write_result(report_file, model, framework, device, model_args, iter_data_list, pretrain_time, model_precision, iter_timestamp):
55
metadata = {'model': model, 'framework': framework, 'device': device, 'precision': model_precision,
66
'num_beams': model_args['num_beams'], 'batch_size': model_args['batch_size']}
77
result = []
@@ -24,6 +24,8 @@ def write_result(report_file, model, framework, device, model_args, iter_data_li
2424
for idx_md5 in range(len(iter_data['result_md5'])):
2525
result_md5.append(iter_data['result_md5'][idx_md5])
2626

27+
timestamp_start, timestamp_end = get_timestamp(iter_data['iteration'], iter_data['prompt_idx'], iter_timestamp)
28+
2729
res_data = {
2830
'iteration': iter_data['iteration'],
2931
'input_size': iter_data['input_size'],
@@ -42,6 +44,8 @@ def write_result(report_file, model, framework, device, model_args, iter_data_li
4244
'prompt_idx': iter_data['prompt_idx'],
4345
'tokenization_time': round(tokenization_time, 5) if tokenization_time != '' else tokenization_time,
4446
'detokenization_time': round(detokenization_time, 5) if detokenization_time != '' else detokenization_time,
47+
'start': timestamp_start,
48+
'end': timestamp_end
4549
}
4650

4751
result.append(res_data)
@@ -50,3 +54,14 @@ def write_result(report_file, model, framework, device, model_args, iter_data_li
5054

5155
with open(report_file, 'w') as outfile:
5256
json.dump(output_result, outfile)
57+
58+
59+
def get_timestamp(iter_idx, prompt_idx, iter_timestamp):
60+
timestamp_start = ''
61+
timestamp_end = ''
62+
if iter_idx in iter_timestamp.keys():
63+
if prompt_idx in iter_timestamp[iter_idx].keys():
64+
timestamp_start = iter_timestamp[iter_idx][prompt_idx]['start']
65+
timestamp_end = iter_timestamp[iter_idx][prompt_idx]['end']
66+
67+
return timestamp_start, timestamp_end

tools/llm_bench/task/image_generation.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# SPDX-License-Identifier: Apache-2.0
44
import os
55
import time
6+
import datetime
67
from PIL import Image
78
import hashlib
89
import logging as log
@@ -121,14 +122,25 @@ def run_image_generation_benchmark(model_path, framework, device, args, num_iter
121122

122123
# if num_iters == 0, just output warm-up data
123124
proc_id = os.getpid()
125+
iter_timestamp = model_utils.init_timestamp(num_iters, image_list, prompt_idx_list)
124126
if args['subsequent'] is False:
125127
for num in range(num_iters + 1):
126128
for image_id, image_param in enumerate(image_list):
129+
p_idx = prompt_idx_list[image_id]
130+
iter_timestamp[num][p_idx]['start'] = datetime.datetime.now().isoformat()
127131
run_image_generation(image_param, num, prompt_idx_list[image_id], pipe, args, iter_data_list, proc_id, mem_consumption)
132+
iter_timestamp[num][p_idx]['end'] = datetime.datetime.now().isoformat()
133+
prefix = '[warm-up]' if num == 0 else '[{}]'.format(num)
134+
log.info(f"{prefix}[P{p_idx}] start: {iter_timestamp[num][p_idx]['start']}, end: {iter_timestamp[num][p_idx]['end']}")
128135
else:
129136
for image_id, image_param in enumerate(image_list):
137+
p_idx = prompt_idx_list[image_id]
130138
for num in range(num_iters + 1):
131-
run_image_generation(image_param, num, prompt_idx_list[image_id], pipe, args, iter_data_list, proc_id, mem_consumption)
139+
iter_timestamp[num][p_idx]['start'] = datetime.datetime.now().isoformat()
140+
run_image_generation(image_param, num, p_idx, pipe, args, iter_data_list, proc_id, mem_consumption)
141+
iter_timestamp[num][p_idx]['end'] = datetime.datetime.now().isoformat()
142+
prefix = '[warm-up]' if num == 0 else '[{}]'.format(num)
143+
log.info(f"{prefix}[P{p_idx}] start: {iter_timestamp[num][p_idx]['start']}, end: {iter_timestamp[num][p_idx]['end']}")
132144

133145
metrics_print.print_average(iter_data_list, prompt_idx_list, args['batch_size'], False)
134-
return iter_data_list, pretrain_time
146+
return iter_data_list, pretrain_time, iter_timestamp

tools/llm_bench/task/super_resolution_generation.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# SPDX-License-Identifier: Apache-2.0
44
import os
55
import time
6+
import datetime
67
from pathlib import Path
78
from PIL import Image
89
import hashlib
@@ -116,14 +117,20 @@ def run_ldm_super_resolution_benchmark(model_path, framework, device, args, num_
116117

117118
# if num_iters == 0, just output warm-up data
118119
proc_id = os.getpid()
120+
iter_timestamp = model_utils.init_timestamp(num_iters, image_list, prompt_idx_list)
119121
for num in range(num_iters + 1):
120122
for image_id, img in enumerate(image_list):
123+
p_idx = prompt_idx_list[image_id]
121124
if num == 0:
122125
if args["output_dir"] is not None:
123-
llm_bench_utils.output_file.output_image_input_text(str(img['prompt']), args, prompt_idx_list[image_id], None, proc_id)
124-
log.info(f"[{'warm-up' if num == 0 else num}][P{prompt_idx_list[image_id]}] Input image={img['prompt']}")
126+
llm_bench_utils.output_file.output_image_input_text(str(img['prompt']), args, p_idx, None, proc_id)
127+
log.info(f"[{'warm-up' if num == 0 else num}][P{p_idx}] Input image={img['prompt']}")
128+
iter_timestamp[num][p_idx]['start'] = datetime.datetime.now().isoformat()
125129
run_ldm_super_resolution(img, num, pipe, args, framework, iter_data_list, prompt_idx_list[image_id], tm_list, proc_id, mem_consumption)
130+
iter_timestamp[num][p_idx]['end'] = datetime.datetime.now().isoformat()
126131
tm_list.clear()
132+
prefix = '[warm-up]' if num == 0 else '[{}]'.format(num)
133+
log.info(f"{prefix}[P{p_idx}] start: {iter_timestamp[num][p_idx]['start']}, end: {iter_timestamp[num][p_idx]['end']}")
127134
metrics_print.print_average(iter_data_list, prompt_idx_list, 1, False)
128135

129-
return iter_data_list, pretrain_time
136+
return iter_data_list, pretrain_time, iter_timestamp

tools/llm_bench/task/text_generation.py

+17-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# SPDX-License-Identifier: Apache-2.0
44
import os
55
import time
6+
import datetime
67
import logging as log
78
import llm_bench_utils.ov_utils
89
import llm_bench_utils.pt_utils
@@ -421,21 +422,33 @@ def run_text_generation_benchmark(model_path, framework, device, args, num_iters
421422
text_gen_fn = run_text_generation_genai_with_stream
422423
else:
423424
text_gen_fn = run_text_generation_genai
425+
424426
proc_id = os.getpid()
427+
iter_timestamp = model_utils.init_timestamp(num_iters, text_list, prompt_idx_list)
425428
if args['subsequent'] is False:
426429
for num in range(num_iters + 1):
427430
for idx, input_text in enumerate(text_list):
431+
p_idx = prompt_idx_list[idx]
428432
if num == 0:
429-
log.info(f'[warm-up][P{prompt_idx_list[idx]}] Input text: {input_text}')
433+
log.info(f'[warm-up][P{p_idx}] Input text: {input_text}')
434+
iter_timestamp[num][p_idx]['start'] = datetime.datetime.now().isoformat()
430435
text_gen_fn(input_text, num, model, tokenizer, args, iter_data_list, md5_list,
431-
prompt_idx_list[idx], bench_hook, model_precision, proc_id, mem_consumption)
436+
p_idx, bench_hook, model_precision, proc_id, mem_consumption)
437+
iter_timestamp[num][p_idx]['end'] = datetime.datetime.now().isoformat()
438+
prefix = '[warm-up]' if num == 0 else '[{}]'.format(num)
439+
log.info(f"{prefix}[P{p_idx}] start: {iter_timestamp[num][p_idx]['start']}, end: {iter_timestamp[num][p_idx]['end']}")
432440
else:
433441
for idx, input_text in enumerate(text_list):
442+
p_idx = prompt_idx_list[idx]
434443
for num in range(num_iters + 1):
435444
if num == 0:
436-
log.info(f'[warm-up][P{prompt_idx_list[idx]}] Input text: {input_text}')
445+
log.info(f'[warm-up][P{p_idx}] Input text: {input_text}')
446+
iter_timestamp[num][p_idx]['start'] = datetime.datetime.now().isoformat()
437447
text_gen_fn(input_text, num, model, tokenizer, args, iter_data_list, md5_list,
438448
prompt_idx_list[idx], bench_hook, model_precision, proc_id, mem_consumption)
449+
iter_timestamp[num][p_idx]['end'] = datetime.datetime.now().isoformat()
450+
prefix = '[warm-up]' if num == 0 else '[{}]'.format(num)
451+
log.info(f"{prefix}[P{p_idx}] start: {iter_timestamp[num][p_idx]['start']}, end: {iter_timestamp[num][p_idx]['end']}")
439452

440453
metrics_print.print_average(iter_data_list, prompt_idx_list, args['batch_size'], True)
441-
return iter_data_list, pretrain_time
454+
return iter_data_list, pretrain_time, iter_timestamp

0 commit comments

Comments
 (0)