Skip to content

Commit db71d6d

Browse files
Small fixes for grouped benchmark run
1 parent f1e9620 commit db71d6d

File tree

4 files changed

+104
-14
lines changed

4 files changed

+104
-14
lines changed

loadgen/benchmark/repro.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ class QSL : public mlperf::QuerySampleLibrary {
3333
const std::string& Name() override { return mName; }
3434
size_t TotalSampleCount() override { return 1000000; }
3535
size_t PerformanceSampleCount() override { return TotalSampleCount(); }
36+
size_t GroupSize(size_t i) override { return 1; }
37+
size_t GroupOf(size_t i) override { return i; }
38+
size_t NumberOfGroups() override { return TotalSampleCount(); }
3639
void LoadSamplesToRam(const std::vector<mlperf::QuerySampleIndex>&) override {
3740
}
3841
void UnloadSamplesFromRam(

loadgen/bindings/python_api.cc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class QuerySampleLibraryTrampoline : public QuerySampleLibrary {
113113
size_t TotalSampleCount() override { return total_sample_count_; }
114114
size_t PerformanceSampleCount() override { return performance_sample_count_; }
115115
size_t GroupSize(size_t i) override { return 1; }
116+
size_t GroupOf(size_t i) override { return i; }
116117
size_t NumberOfGroups() override { return total_sample_count_; }
117118

118119
void LoadSamplesToRam(const std::vector<QuerySampleIndex>& samples) override {
@@ -157,7 +158,7 @@ class GroupedQuerySampleLibraryTrampoline : public QuerySampleLibrary {
157158
for(ssize_t i = 0; i < group_sizes.shape()[0]; i++){
158159
group_sizes_.push_back(ptr[i]);
159160
total_sample_count_ += ptr[i];
160-
for(ssize_t j = 0; j < ptr[i]; j++){
161+
for(size_t j = 0; j < ptr[i]; j++){
161162
group_idx_.push_back(i);
162163
}
163164
}
@@ -330,7 +331,7 @@ void StartTestWithLogSettings(uintptr_t sut, uintptr_t qsl,
330331
audit_config_filename);
331332
}
332333

333-
void StartTestWithGroupedTest(
334+
void StartTestWithGroupedQSL(
334335
uintptr_t sut, uintptr_t qsl, mlperf::TestSettings test_settings,
335336
const std::string& audit_config_filename){
336337
pybind11::gil_scoped_release gil_releaser;
@@ -551,7 +552,7 @@ PYBIND11_MODULE(mlperf_loadgen, m) {
551552
"Destroy the object created by ConstructQDL.");
552553

553554
m.def("ConstructGroupedQSL", &py::ConstructGroupedQSL,
554-
"Construct the query sample library.");
555+
"Construct grouped query sample library.");
555556
m.def("DestroyGroupedQSL", &py::DestroyQSL,
556557
"Destroy the object created by ConstructGroupedQSL.");
557558

@@ -577,6 +578,9 @@ PYBIND11_MODULE(mlperf_loadgen, m) {
577578
"IssueQuery calls have finished.",
578579
pybind11::arg("responses"),
579580
pybind11::arg("response_cb") = ResponseCallback{});
581+
m.def("StartTestWithGroupedQSL", &py::StartTestWithGroupedQSL,
582+
"Run tests on a SUT created by ConstructSUT() and a QSL created by"
583+
"ConstructGroupedQSL");
580584
}
581585

582586
} // namespace py
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# Copyright 2019 The MLPerf Authors. All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
# =============================================================================
15+
16+
"""Python demo showing how to use the MLPerf Inference load generator bindings.
17+
"""
18+
19+
from __future__ import print_function
20+
21+
import threading
22+
import time
23+
24+
import numpy as np
25+
from absl import app
26+
import mlperf_loadgen
27+
28+
29+
def load_samples_to_ram(query_samples):
30+
del query_samples
31+
return
32+
33+
34+
def unload_samples_from_ram(query_samples):
35+
del query_samples
36+
return
37+
38+
39+
def process_query_async(query_samples):
40+
time.sleep(0.001)
41+
responses = []
42+
for s in query_samples:
43+
print(s.index)
44+
responses.append(mlperf_loadgen.QuerySampleResponse(s.id, 0, 0))
45+
mlperf_loadgen.QuerySamplesComplete(responses)
46+
47+
48+
def issue_query(query_samples):
49+
threading.Thread(target=process_query_async, args=[query_samples]).start()
50+
51+
52+
def flush_queries():
53+
pass
54+
55+
56+
def main(argv):
57+
del argv
58+
settings = mlperf_loadgen.TestSettings()
59+
settings.scenario = mlperf_loadgen.TestScenario.Server
60+
settings.mode = mlperf_loadgen.TestMode.PerformanceOnly
61+
settings.server_target_qps = 100
62+
settings.server_target_latency_ns = 100000000
63+
settings.min_query_count = 100
64+
settings.min_duration_ms = 10000
65+
settings.server_constant_gen = True
66+
settings.use_grouped_qsl = True
67+
68+
sut = mlperf_loadgen.ConstructSUT(issue_query, flush_queries)
69+
qsl = mlperf_loadgen.ConstructGroupedQSL(
70+
np.array([16 for _ in range(64)] + [32 for _ in range(32)], dtype=np.uint64), 16*128, load_samples_to_ram, unload_samples_from_ram
71+
)
72+
73+
# qsl = mlperf_loadgen.ConstructQSL(
74+
# 1024, 128, load_samples_to_ram, unload_samples_from_ram
75+
# )
76+
mlperf_loadgen.StartTestWithGroupedQSL(sut, qsl, settings, "")
77+
mlperf_loadgen.DestroyQSL(qsl)
78+
mlperf_loadgen.DestroySUT(sut)
79+
80+
81+
if __name__ == "__main__":
82+
app.run(main)

loadgen/loadgen.cc

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ auto ScheduleDistribution<TestScenario::Server>(double qps) {
208208
}
209209

210210
auto ScheduleConstantDistribution(double qps){
211-
return [dist = std::uniform_real_distribution<>(1.0 / qps)](auto& gen) mutable {
211+
return [dist = std::uniform_real_distribution<>(1.0 / qps, 1.0 / qps)](auto& gen) mutable {
212212
return std::chrono::duration_cast<std::chrono::nanoseconds>(
213213
std::chrono::duration<double>(dist(gen)));
214214
};
@@ -353,7 +353,7 @@ std::vector<QueryMetadata> GenerateQueries(
353353
std::vector<size_t> groups;
354354
std::vector<size_t> groups_first;
355355
size_t number_of_groups = 0;
356-
size_t g, group_size;
356+
size_t g = 0, group_size = 1;
357357

358358
if (settings.use_grouped_qsl) {
359359
size_t current_idx = 0;
@@ -362,10 +362,9 @@ std::vector<QueryMetadata> GenerateQueries(
362362
size_t current_group = qsl->GroupOf(loaded_samples[current_idx]);
363363
groups.push_back(current_group);
364364
groups_first.push_back(current_idx);
365-
current_idx += qsl->GroupSize(loaded_samples[current_idx]);
365+
current_idx += qsl->GroupSize(current_group);
366366
number_of_groups++;
367367
}
368-
369368
}
370369

371370
auto grouped_sample_distribution = SampleDistribution<mode>(
@@ -419,7 +418,7 @@ std::vector<QueryMetadata> GenerateQueries(
419418
}
420419
} else if (settings.use_grouped_qsl) {
421420
g = grouped_sample_distribution(sample_rng);
422-
group_size = qsl->GroupSize(loaded_samples[groups_first[g]]);
421+
group_size = qsl->GroupSize(qsl->GroupOf(groups_first[g]));
423422
} else {
424423
for (auto& s : samples) {
425424
s = loaded_samples[settings.performance_issue_unique
@@ -430,23 +429,24 @@ std::vector<QueryMetadata> GenerateQueries(
430429
: sample_distribution(sample_rng)];
431430
}
432431
}
432+
prev_timestamp = timestamp;
433433
if (!settings.use_grouped_qsl) {
434434
queries.emplace_back(samples, timestamp, response_delegate, sequence_gen);
435435
} else {
436436
for (size_t i = 0; i < group_size; i++){
437437
samples[0] = loaded_samples[groups_first[g]+i];
438438
queries.emplace_back(samples, timestamp, response_delegate, sequence_gen);
439+
timestamp += schedule_constant_distribution(schedule_rng);
439440
}
441+
prev_timestamp = timestamp - schedule_constant_distribution(schedule_rng);
440442
}
441-
prev_timestamp = timestamp;
442-
if (settings.server_constant_gen && (scenario == TestScenario::Server)){
443-
if(!settings.use_grouped_qsl){
443+
444+
if (!settings.use_grouped_qsl){
445+
if (settings.server_constant_gen && (scenario == TestScenario::Server)){
444446
timestamp += schedule_constant_distribution(schedule_rng);
445447
} else {
446-
timestamp += group_size * schedule_constant_distribution(schedule_rng);
448+
timestamp += schedule_distribution(schedule_rng);
447449
}
448-
} else {
449-
timestamp += schedule_distribution(schedule_rng);
450450
}
451451
// In equal_issue mode, the min_queries will be bumped up by a multiple of
452452
// the dataset size if the test time has not met the threshold.
@@ -455,6 +455,7 @@ std::vector<QueryMetadata> GenerateQueries(
455455
(scenario != TestScenario::Offline)) {
456456
min_queries += loaded_samples.size();
457457
}
458+
458459
}
459460

460461
// See if we need to create a "remainder" query for offline+accuracy to

0 commit comments

Comments
 (0)