@@ -10,6 +10,7 @@ use std::time::Instant;
10
10
11
11
use criterion:: BenchmarkId ;
12
12
use criterion:: Criterion ;
13
+ use criterion:: Throughput ;
13
14
use criterion:: criterion_group;
14
15
use criterion:: criterion_main;
15
16
use hyperactor_mesh:: ProcMesh ;
@@ -21,6 +22,8 @@ use hyperactor_mesh::alloc::LocalAllocator;
21
22
use hyperactor_mesh:: extent;
22
23
use hyperactor_mesh:: selection:: dsl:: all;
23
24
use hyperactor_mesh:: selection:: dsl:: true_;
25
+ use hyperactor_mesh:: shape;
26
+ use tokio:: time:: Duration ;
24
27
25
28
mod bench_actor;
26
29
use bench_actor:: BenchActor ;
@@ -48,16 +51,18 @@ fn bench_actor_scaling(c: &mut Criterion) {
48
51
. unwrap ( ) ;
49
52
50
53
let proc_mesh = ProcMesh :: allocate ( alloc) . await . unwrap ( ) ;
51
- let trainer_mesh: RootActorMesh < BenchActor > =
52
- proc_mesh. spawn ( "trainer" , & ( ) ) . await . unwrap ( ) ;
54
+ let actor_mesh: RootActorMesh < BenchActor > = proc_mesh
55
+ . spawn ( "bench" , & ( Duration :: from_millis ( 0 ) ) )
56
+ . await
57
+ . unwrap ( ) ;
53
58
let client = proc_mesh. client ( ) ;
54
59
55
60
let start = Instant :: now ( ) ;
56
61
for i in 0 ..iters {
57
62
let ( tx, mut rx) = client. open_port ( ) ;
58
63
let payload = vec ! [ 0u8 ; message_size] ;
59
64
60
- trainer_mesh
65
+ actor_mesh
61
66
. cast (
62
67
all ( true_ ( ) ) ,
63
68
BenchMessage {
@@ -83,5 +88,90 @@ fn bench_actor_scaling(c: &mut Criterion) {
83
88
group. finish ( ) ;
84
89
}
85
90
86
- criterion_group ! ( benches, bench_actor_scaling) ;
91
+ fn format_size ( size : usize ) -> String {
92
+ if size >= 1_000_000_000 {
93
+ format ! ( "{}GB" , size / 1_000_000_000 )
94
+ } else if size >= 1_000_000 {
95
+ format ! ( "{}MB" , size / 1_000_000 )
96
+ } else if size >= 1_000 {
97
+ format ! ( "{}KB" , size / 1_000 )
98
+ } else {
99
+ format ! ( "{}B" , size)
100
+ }
101
+ }
102
+
103
+ // Benchmark how long it takes to send a message of size X to an actor mesh of 10 actors
104
+ fn bench_actor_mesh_message_sizes ( c : & mut Criterion ) {
105
+ let mut group = c. benchmark_group ( "actor_mesh_message_sizes" ) ;
106
+ group. sample_size ( 10 ) ;
107
+ let actor_counts = vec ! [ 1 , 10 ] ;
108
+ let message_sizes: Vec < usize > = vec ! [
109
+ 10_000 ,
110
+ 100_000 ,
111
+ 1_000_000 ,
112
+ 10_000_000 ,
113
+ 100_000_000 ,
114
+ 1_000_000_000 ,
115
+ ] ;
116
+
117
+ for message_size in message_sizes {
118
+ for & actor_count in & actor_counts {
119
+ group. throughput ( Throughput :: Bytes ( ( message_size * actor_count) as u64 ) ) ;
120
+ group. sampling_mode ( criterion:: SamplingMode :: Flat ) ;
121
+ group. sample_size ( 10 ) ;
122
+ group. bench_function (
123
+ format ! ( "actors/{}/size/{}" , actor_count, format_size( message_size) ) ,
124
+ |b| {
125
+ let mut b = b. to_async ( Runtime :: new ( ) . unwrap ( ) ) ;
126
+ b. iter_custom ( |iters| async move {
127
+ let alloc = LocalAllocator
128
+ . allocate ( AllocSpec {
129
+ extent : extent ! ( gpus = actor_count) ,
130
+ constraints : Default :: default ( ) ,
131
+ } )
132
+ . await
133
+ . unwrap ( ) ;
134
+
135
+ let proc_mesh = ProcMesh :: allocate ( alloc) . await . unwrap ( ) ;
136
+ let actor_mesh: RootActorMesh < BenchActor > = proc_mesh
137
+ . spawn ( "bench" , & ( Duration :: from_millis ( 0 ) ) )
138
+ . await
139
+ . unwrap ( ) ;
140
+
141
+ let client = proc_mesh. client ( ) ;
142
+
143
+ let start = Instant :: now ( ) ;
144
+ for i in 0 ..iters {
145
+ let ( tx, mut rx) = client. open_port ( ) ;
146
+ let payload = vec ! [ 0u8 ; message_size] ;
147
+
148
+ actor_mesh
149
+ . cast (
150
+ all ( true_ ( ) ) ,
151
+ BenchMessage {
152
+ step : i as usize ,
153
+ reply : tx. bind ( ) ,
154
+ payload,
155
+ } ,
156
+ )
157
+ . unwrap ( ) ;
158
+
159
+ let mut msg_rcv = 0 ;
160
+ while msg_rcv < actor_count {
161
+ let _ = rx. recv ( ) . await . unwrap ( ) ;
162
+ msg_rcv += 1 ;
163
+ }
164
+ }
165
+
166
+ start. elapsed ( )
167
+ } ) ;
168
+ } ,
169
+ ) ;
170
+ }
171
+ }
172
+
173
+ group. finish ( ) ;
174
+ }
175
+
176
+ criterion_group ! ( benches, bench_actor_scaling, bench_actor_mesh_message_sizes) ;
87
177
criterion_main ! ( benches) ;
0 commit comments