9
9
import pytest
10
10
import numpy as np
11
11
12
-
13
- # enumerate possible combinations for training mode and parameter server for a classification model
14
- @pytest .mark .parametrize ('mode,parameter_server_mode' , [('synchronous' , None ),
15
- ('asynchronous' , 'http' ),
16
- ('asynchronous' , 'socket' ),
17
- ('hogwild' , 'http' ),
18
- ('hogwild' , 'socket' )])
19
- def test_training_classification (spark_context , mode , parameter_server_mode , mnist_data , classification_model ):
12
+ # enumerate possible combinations for training mode and parameter server for a classification model while also validatiing
13
+ # multiple workers for repartitioning
14
+ @pytest .mark .parametrize ('mode,parameter_server_mode,num_workers' ,
15
+ [('synchronous' , None , None ),
16
+ ('synchronous' , None , 2 ),
17
+ ('asynchronous' , 'http' , None ),
18
+ ('asynchronous' , 'http' , 2 ),
19
+ ('asynchronous' , 'socket' , None ),
20
+ ('asynchronous' , 'socket' , 2 ),
21
+ ('hogwild' , 'http' , None ),
22
+ ('hogwild' , 'http' , 2 ),
23
+ ('hogwild' , 'socket' , None ),
24
+ ('hogwild' , 'socket' , 2 )])
25
+ def test_training_classification (spark_context , mode , parameter_server_mode , num_workers , mnist_data , classification_model ):
20
26
# Define basic parameters
21
27
batch_size = 64
22
28
epochs = 10
@@ -33,7 +39,7 @@ def test_training_classification(spark_context, mode, parameter_server_mode, mni
33
39
rdd = to_simple_rdd (spark_context , x_train , y_train )
34
40
35
41
# Initialize SparkModel from keras model and Spark context
36
- spark_model = SparkModel (classification_model , frequency = 'epoch' ,
42
+ spark_model = SparkModel (classification_model , frequency = 'epoch' , num_workers = num_workers ,
37
43
mode = mode , parameter_server_mode = parameter_server_mode , port = 4000 + random .randint (0 , 800 ))
38
44
39
45
# Train Spark model
@@ -57,13 +63,21 @@ def test_training_classification(spark_context, mode, parameter_server_mode, mni
57
63
assert isclose (evals [1 ], spark_model .master_network .evaluate (x_test , y_test )[1 ], abs_tol = 0.01 )
58
64
59
65
60
- # enumerate possible combinations for training mode and parameter server for a regression model
61
- @pytest .mark .parametrize ('mode,parameter_server_mode' , [('synchronous' , None ),
62
- ('asynchronous' , 'http' ),
63
- ('asynchronous' , 'socket' ),
64
- ('hogwild' , 'http' ),
65
- ('hogwild' , 'socket' )])
66
- def test_training_regression (spark_context , mode , parameter_server_mode , boston_housing_dataset , regression_model ):
66
+ # enumerate possible combinations for training mode and parameter server for a regression model while also validating
67
+ # multiple workers for repartitioning
68
+ @pytest .mark .parametrize ('mode,parameter_server_mode,num_workers' ,
69
+ [('synchronous' , None , None ),
70
+ ('synchronous' , None , 2 ),
71
+ ('asynchronous' , 'http' , None ),
72
+ ('asynchronous' , 'http' , 2 ),
73
+ ('asynchronous' , 'socket' , None ),
74
+ ('asynchronous' , 'socket' , 2 ),
75
+ ('hogwild' , 'http' , None ),
76
+ ('hogwild' , 'http' , 2 ),
77
+ ('hogwild' , 'socket' , None ),
78
+ ('hogwild' , 'socket' , 2 )])
79
+ def test_training_regression (spark_context , mode , parameter_server_mode , num_workers , boston_housing_dataset ,
80
+ regression_model ):
67
81
x_train , y_train , x_test , y_test = boston_housing_dataset
68
82
rdd = to_simple_rdd (spark_context , x_train , y_train )
69
83
@@ -72,7 +86,7 @@ def test_training_regression(spark_context, mode, parameter_server_mode, boston_
72
86
epochs = 10
73
87
sgd = SGD (lr = 0.0000001 )
74
88
regression_model .compile (sgd , 'mse' , ['mae' ])
75
- spark_model = SparkModel (regression_model , frequency = 'epoch' , mode = mode ,
89
+ spark_model = SparkModel (regression_model , frequency = 'epoch' , mode = mode , num_workers = num_workers ,
76
90
parameter_server_mode = parameter_server_mode , port = 4000 + random .randint (0 , 800 ))
77
91
78
92
# Train Spark model
@@ -92,44 +106,5 @@ def test_training_regression(spark_context, mode, parameter_server_mode, boston_
92
106
assert all (np .isclose (x , y , 0.01 ) for x , y in zip (predictions , spark_model .master_network .predict (x_test )))
93
107
94
108
# assert we get the same evaluation results when calling evaluate on keras model directly
95
- assert isclose (evals [0 ], spark_model .master_network .evaluate (x_test , y_test )[0 ], abs_tol = 0.01 )
96
- assert isclose (evals [1 ], spark_model .master_network .evaluate (x_test , y_test )[1 ], abs_tol = 0.01 )
97
-
98
-
99
- def test_bug203_using_multiple_workers (spark_context , boston_housing_dataset , regression_model ):
100
- x_train , y_train , x_test , y_test = boston_housing_dataset
101
- rdd = to_simple_rdd (spark_context , x_train , y_train )
102
-
103
- # Define basic parameters
104
- batch_size = 32
105
- epochs = 10
106
- sgd = SGD (lr = 0.0000001 )
107
- import tensorflow as tf
108
- regression_model .compile (sgd , 'mse' , ['mae' ])
109
-
110
- spark_model_multiple_workers = SparkModel (regression_model ,
111
- frequency = "epoch" ,
112
- port = 4000 + random .randint (0 , 800 ),
113
- mode = "synchronous" ,
114
- num_workers = 2 )
115
-
116
- # Train Spark model
117
- spark_model_multiple_workers .fit (rdd , epochs = epochs , batch_size = batch_size , verbose = 0 , validation_split = 0.1 )
118
-
119
- # run inference on trained spark model
120
- predictions = spark_model_multiple_workers .predict (x_test )
121
- # run evaluation on trained spark model
122
- evals = spark_model_multiple_workers .evaluate (x_test , y_test )
123
-
124
- # assert we can supply rdd and get same prediction results when supplying numpy array
125
- test_rdd = spark_context .parallelize (x_test )
126
- assert all (np .isclose (x , y , 0.01 ) for x , y in zip (predictions , spark_model_multiple_workers .predict (test_rdd )))
127
-
128
- # assert we get the same prediction result with calling predict on keras model directly
129
- assert all (np .isclose (x , y , 0.01 ) for x , y in zip (predictions , spark_model_multiple_workers .master_network .predict (x_test ))), (predictions , spark_model_multiple_workers .master_network .predict (x_test ))
130
-
131
- # assert we get the same evaluation results when calling evaluate on keras model directly
132
- assert isclose (evals [0 ], spark_model_multiple_workers .master_network .evaluate (x_test , y_test )[0 ], abs_tol = 1.0 )
133
- assert isclose (evals [1 ], spark_model_multiple_workers .master_network .evaluate (x_test , y_test )[1 ], abs_tol = 1.0 )
134
-
135
-
109
+ assert isclose (evals [0 ], spark_model .master_network .evaluate (x_test , y_test )[0 ], abs_tol = 1.0 )
110
+ assert isclose (evals [1 ], spark_model .master_network .evaluate (x_test , y_test )[1 ], abs_tol = 1.0 )
0 commit comments