Skip to content

Commit 983a568

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

File tree

4 files changed

+105
-16
lines changed

4 files changed

+105
-16
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: 8 additions & 4 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;
@@ -339,7 +340,7 @@ void StartTestWithGroupedTest(
339340
GroupedQuerySampleLibraryTrampoline* qsl_cast =
340341
reinterpret_cast<GroupedQuerySampleLibraryTrampoline*>(qsl);
341342
LogSettings default_log_settings;
342-
assert(TestSettings.use_grouped_qsl);
343+
assert(test_settings.use_grouped_qsl);
343344
mlperf::StartTest(sut_cast, qsl_cast, test_settings, default_log_settings,
344345
audit_config_filename);
345346
}
@@ -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 & 12 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
};
@@ -349,11 +349,10 @@ std::vector<QueryMetadata> GenerateQueries(
349349
QuerySampleIndex same_sample = settings.performance_issue_same_index;
350350

351351
// Variables for handling group test
352-
QuerySampleIndex global_idx = 0;
353352
std::vector<size_t> groups;
354353
std::vector<size_t> groups_first;
355354
size_t number_of_groups = 0;
356-
size_t g, group_size;
355+
size_t g = 0, group_size = 1;
357356

358357
if (settings.use_grouped_qsl) {
359358
size_t current_idx = 0;
@@ -362,10 +361,9 @@ std::vector<QueryMetadata> GenerateQueries(
362361
size_t current_group = qsl->GroupOf(loaded_samples[current_idx]);
363362
groups.push_back(current_group);
364363
groups_first.push_back(current_idx);
365-
current_idx += qsl->GroupSize(loaded_samples[current_idx]);
364+
current_idx += qsl->GroupSize(current_group);
366365
number_of_groups++;
367366
}
368-
369367
}
370368

371369
auto grouped_sample_distribution = SampleDistribution<mode>(
@@ -419,7 +417,7 @@ std::vector<QueryMetadata> GenerateQueries(
419417
}
420418
} else if (settings.use_grouped_qsl) {
421419
g = grouped_sample_distribution(sample_rng);
422-
group_size = qsl->GroupSize(loaded_samples[groups_first[g]]);
420+
group_size = qsl->GroupSize(qsl->GroupOf(groups_first[g]));
423421
} else {
424422
for (auto& s : samples) {
425423
s = loaded_samples[settings.performance_issue_unique
@@ -430,23 +428,24 @@ std::vector<QueryMetadata> GenerateQueries(
430428
: sample_distribution(sample_rng)];
431429
}
432430
}
431+
prev_timestamp = timestamp;
433432
if (!settings.use_grouped_qsl) {
434433
queries.emplace_back(samples, timestamp, response_delegate, sequence_gen);
435434
} else {
436435
for (size_t i = 0; i < group_size; i++){
437436
samples[0] = loaded_samples[groups_first[g]+i];
438437
queries.emplace_back(samples, timestamp, response_delegate, sequence_gen);
438+
timestamp += schedule_constant_distribution(schedule_rng);
439439
}
440+
prev_timestamp = timestamp - schedule_constant_distribution(schedule_rng);
440441
}
441-
prev_timestamp = timestamp;
442-
if (settings.server_constant_gen && (scenario == TestScenario::Server)){
443-
if(!settings.use_grouped_qsl){
442+
443+
if (!settings.use_grouped_qsl){
444+
if (settings.server_constant_gen && (scenario == TestScenario::Server)){
444445
timestamp += schedule_constant_distribution(schedule_rng);
445446
} else {
446-
timestamp += group_size * schedule_constant_distribution(schedule_rng);
447+
timestamp += schedule_distribution(schedule_rng);
447448
}
448-
} else {
449-
timestamp += schedule_distribution(schedule_rng);
450449
}
451450
// In equal_issue mode, the min_queries will be bumped up by a multiple of
452451
// the dataset size if the test time has not met the threshold.
@@ -455,6 +454,7 @@ std::vector<QueryMetadata> GenerateQueries(
455454
(scenario != TestScenario::Offline)) {
456455
min_queries += loaded_samples.size();
457456
}
457+
458458
}
459459

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

0 commit comments

Comments
 (0)