[ 
https://issues.apache.org/jira/browse/MADLIB-1338?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16851381#comment-16851381
 ] 

Frank McQuillan commented on MADLIB-1338:
-----------------------------------------

LGTM

Re-tested, all look OK except (4) which can be cleaned up in a later story.

(1)
What is the final list of metrics that are supported and those that are not 
supported?

See:
https://www.pivotaltracker.com/n/projects/695473/stories/165776969/comments/202255072
https://docs.google.com/document/d/1RXC8bA4vZ3H3AmGbYtLHqi4fZ7WcMCVSXWNiSwRfZvo/edit

loss function not supported
'sparse_categorical_crossentropy'

metrics not supported
'sparse_categorical_accuracy'
'top_k_categorical_accuracy'
'sparse_top_k_categorical_accuracy'


(2)
fit with validation dataset, compute metrics at the end

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='categorical_crossentropy', 
optimizer='adam', metrics=['accuracy'] $$,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                3,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );
INFO:  Processed 60 images: Fit took 0.54990196228 sec, Total was 
0.758991956711 sec  (seg0 slice1 10.128.0.41:40000 pid=26679)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.555626153946 sec, Total was 
0.75802898407 sec  (seg1 slice1 10.128.0.41:40001 pid=26680)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 1: 2.43494582176 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Processed 60 images: Fit took 0.620418787003 sec, Total was 
0.787483930588 sec  (seg0 slice1 10.128.0.41:40000 pid=26679)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.660104036331 sec, Total was 
0.832265853882 sec  (seg1 slice1 10.128.0.41:40001 pid=26680)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 2: 0.834777832031 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Processed 60 images: Fit took 0.574198007584 sec, Total was 
0.753618955612 sec  (seg0 slice1 10.128.0.41:40000 pid=26679)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.534913063049 sec, Total was 
0.704334020615 sec  (seg1 slice1 10.128.0.41:40001 pid=26680)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 3: 0.756074905396 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 3: 0.210503101349 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set metric after iteration 3: 0.324999988079.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set loss after iteration 3: 1.0396116972.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 3: 0.190848112106 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set metric after iteration 3: 0.366666674614.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set loss after iteration 3: 1.06409192085.
CONTEXT:  PL/Python function "madlib_keras_fit"
 madlib_keras_fit
------------------

(1 row)

Time: 6817.188 ms
{code}

Verbose output: FIXED

INFO:  Time for training in iteration 3: 0.756074905396 sec
INFO:  Time for evaluation in iteration 3: 0.210503101349 sec.

Clarified training vs evaluation in INFO message: FIXED


(3)
fit with validation dataset, compute metrics at the end (con't)

{code}
madlib=# select * from iris_model_summary;
-[ RECORD 1 
]-------------+--------------------------------------------------------------------------
source_table              | iris_train_packed
model                     | iris_model
dependent_varname         | class_text
independent_varname       | attributes
model_arch_table          | model_arch_library
model_arch_id             | 1
compile_params            |  loss='categorical_crossentropy', optimizer='adam', 
metrics=['accuracy']
fit_params                |  batch_size=16, epochs=1
num_iterations            | 3
validation_table          | iris_test_packed
metrics_compute_frequency | 3
name                      | Sophia L.
description               | Simple MLP model on iris dataset
model_type                | madlib_keras
model_size                | 0.7939453125
start_training_time       | 2019-05-23 22:33:08.611677
end_training_time         | 2019-05-23 22:33:13.250892
metrics_elapsed_time      | {4.63921880722046}
madlib_version            | 1.16-dev
num_classes               | 3
class_values              | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype         | character varying
normalizing_const         | 1
metrics_type              | {accuracy}
training_metrics_final    | 0.324999988079
training_loss_final       | 1.0396116972
training_metrics          | {0.324999988079071}
training_loss             | {1.03961169719696}
validation_metrics_final  | 0.366666674614
validation_loss_final     | 1.06409192085
validation_metrics        | {0.366666674613953}
validation_loss           | {1.06409192085266}
metrics_iters             | {3}
{code}

Change to elapsed time looks better:

start_training_time       | 2019-05-23 22:33:08.611677
end_training_time         | 2019-05-23 22:33:13.250892
metrics_elapsed_time      | {4.63921880722046}

13.250892 - 8.611677 = 4.639215

OK


(4)
fit with validation dataset, compute metrics every iteration

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='categorical_crossentropy', 
optimizer='adam', metrics=['accuracy'] $$,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                1,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );
INFO:  Processed 60 images: Fit took 0.535367012024 sec, Total was 
0.746275901794 sec  (seg1 slice1 10.128.0.41:40001 pid=11506)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.554301023483 sec, Total was 
0.752547979355 sec  (seg0 slice1 10.128.0.41:40000 pid=11505)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 1: 3.40036702156 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 1: 0.195158958435 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set metric after iteration 1: 0.666666686535.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set loss after iteration 1: 0.938332438469.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 1: 0.332806825638 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set metric after iteration 1: 0.666666686535.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set loss after iteration 1: 0.944462954998.
CONTEXT:  PL/Python function "madlib_keras_fit"

INFO:  Processed 60 images: Fit took 0.887582063675 sec, Total was 
1.15123796463 sec  (seg0 slice1 10.128.0.41:40000 pid=11505)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.860605955124 sec, Total was 
1.12788796425 sec  (seg1 slice1 10.128.0.41:40001 pid=11506)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 2: 1.15389895439 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 2: 0.192572116852 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set metric after iteration 2: 0.666666686535.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set loss after iteration 2: 0.900591552258.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 2: 0.212724208832 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set metric after iteration 2: 0.666666686535.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set loss after iteration 2: 0.912341833115.
CONTEXT:  PL/Python function "madlib_keras_fit"

INFO:  Processed 60 images: Fit took 0.607415914536 sec, Total was 
0.850666046143 sec  (seg0 slice1 10.128.0.41:40000 pid=11505)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.609027862549 sec, Total was 
0.850383996964 sec  (seg1 slice1 10.128.0.41:40001 pid=11506)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 3: 0.852729082108 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 3: 0.213857889175 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set metric after iteration 3: 0.666666686535.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set loss after iteration 3: 0.865503013134.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 3: 0.254362106323 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set metric after iteration 3: 0.666666686535.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set loss after iteration 3: 0.878823339939.
CONTEXT:  PL/Python function "madlib_keras_fit"
-[ RECORD 1 ]----+-
madlib_keras_fit |

Time: 7409.327 ms
{code}

What is this saying?

INFO:  Processed 60 images: Fit took 0.535367012024 sec, Total was 
0.746275901794 sec  (seg1 slice1 10.128.0.41:40001 pid=11506)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.554301023483 sec, Total was 
0.752547979355 sec  (seg0 slice1 10.128.0.41:40000 pid=11505)

Why does 'time for evaluation' repeat for every iteration and have different 
times? e.g.,

INFO:  Time for evaluation in iteration 3: 0.213857889175 sec.
INFO:  Time for evaluation in iteration 3: 0.254362106323 sec.

{code}
madlib=# select * from iris_model_summary;
-[ RECORD 1 
]-------------+--------------------------------------------------------------------------
source_table              | iris_train_packed
model                     | iris_model
dependent_varname         | class_text
independent_varname       | attributes
model_arch_table          | model_arch_library
model_arch_id             | 1
compile_params            |  loss='categorical_crossentropy', optimizer='adam', 
metrics=['accuracy']
fit_params                |  batch_size=16, epochs=1
num_iterations            | 3
validation_table          | iris_test_packed
metrics_compute_frequency | 1
name                      | Sophia L.
description               | Simple MLP model on iris dataset
model_type                | madlib_keras
model_size                | 0.7939453125
start_training_time       | 2019-05-23 22:38:33.342727
end_training_time         | 2019-05-23 22:38:39.344795
metrics_elapsed_time      | {3.45014500617981,4.83612895011902,6.00208592414856}
madlib_version            | 1.16-dev
num_classes               | 3
class_values              | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype         | character varying
normalizing_const         | 1
metrics_type              | {accuracy}
training_metrics_final    | 0.358333319426
training_loss_final       | 1.15425133705
training_metrics          | 
{0.358333319425583,0.358333319425583,0.358333319425583}
training_loss             | {1.35349214076996,1.23959410190582,1.15425133705139}
validation_metrics_final  | 0.233333334327
validation_loss_final     | 1.31097722054
validation_metrics        | 
{0.233333334326744,0.233333334326744,0.233333334326744}
validation_loss           | {1.57807862758636,1.42993664741516,1.31097722053528}
metrics_iters             | {1,2,3}

Time intervals look OK:

metrics_elapsed_time = start_training_time - start_training_time
6.00208592414856 = 22:38:39.344795 - 22:38:33.342727


(5)
fit with validation dataset, compute metrics at different iteration

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='categorical_crossentropy', 
optimizer='adam', metrics=['accuracy'] $$,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                2,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );

madlib=# select * from iris_model_summary;
-[ RECORD 1 
]-------------+--------------------------------------------------------------------------
source_table              | iris_train_packed
model                     | iris_model
dependent_varname         | class_text
independent_varname       | attributes
model_arch_table          | model_arch_library
model_arch_id             | 1
compile_params            |  loss='categorical_crossentropy', optimizer='adam', 
metrics=['accuracy']
fit_params                |  batch_size=16, epochs=1
num_iterations            | 3
validation_table          | iris_test_packed
metrics_compute_frequency | 2
name                      | Sophia L.
description               | Simple MLP model on iris dataset
model_type                | madlib_keras
model_size                | 0.7939453125
start_training_time       | 2019-05-29 20:01:42.08684
end_training_time         | 2019-05-29 20:01:48.658938
metrics_elapsed_time      | {5.42638921737671,6.57209706306458}
madlib_version            | 1.16-dev
num_classes               | 3
class_values              | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype         | character varying
normalizing_const         | 1
metrics_type              | {accuracy}
training_metrics_final    | 0.341666668653
training_loss_final       | 1.35804212093
training_metrics          | {0.349999994039536,0.341666668653488}
training_loss             | {1.42269325256348,1.35804212093353}
validation_metrics_final  | 0.266666680574
validation_loss_final     | 1.50677502155
validation_metrics        | {0.266666680574417,0.266666680574417}
validation_loss           | {1.58999609947205,1.50677502155304}
metrics_iters             | {2,3}

Time: 22.104 ms
{code}

Looks OK {2,3}


(6)
fit with no validation dataset, compute metrics at different iteration

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='categorical_crossentropy', 
optimizer='adam', metrics=['accuracy'] $$,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               NULL,    -- validation_table
                                2,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );

madlib=# select * from iris_model_summary;
-[ RECORD 1 
]-------------+--------------------------------------------------------------------------
source_table              | iris_train_packed
model                     | iris_model
dependent_varname         | class_text
independent_varname       | attributes
model_arch_table          | model_arch_library
model_arch_id             | 1
compile_params            |  loss='categorical_crossentropy', optimizer='adam', 
metrics=['accuracy']
fit_params                |  batch_size=16, epochs=1
num_iterations            | 3
validation_table          |
metrics_compute_frequency | 2
name                      | Sophia L.
description               | Simple MLP model on iris dataset
model_type                | madlib_keras
model_size                | 0.7939453125
start_training_time       | 2019-05-29 20:02:54.856595
end_training_time         | 2019-05-29 20:03:01.289986
metrics_elapsed_time      | {4.89847302436829,6.4333918094635}
madlib_version            | 1.16-dev
num_classes               | 3
class_values              | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype         | character varying
normalizing_const         | 1
metrics_type              | {accuracy}
training_metrics_final    | 0.316666662693
training_loss_final       | 2.19523310661
training_metrics          | {0.316666662693024,0.316666662693024}
training_loss             | {2.31425333023071,2.19523310661316}
validation_metrics_final  |
validation_loss_final     |
validation_metrics        |
validation_loss           |
metrics_iters             | {2,3}
{code}

Looks OK


(7)
a different metric

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='categorical_crossentropy', 
optimizer='adam', metrics=['mae'] $$,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                3,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );

madlib=# select * from iris_model_summary;
-[ RECORD 1 
]-------------+---------------------------------------------------------------------
source_table              | iris_train_packed
model                     | iris_model
dependent_varname         | class_text
independent_varname       | attributes
model_arch_table          | model_arch_library
model_arch_id             | 1
compile_params            |  loss='categorical_crossentropy', optimizer='adam', 
metrics=['mae']
fit_params                |  batch_size=16, epochs=1
num_iterations            | 3
validation_table          | iris_test_packed
metrics_compute_frequency | 3
name                      | Sophia L.
description               | Simple MLP model on iris dataset
model_type                | madlib_keras
model_size                | 0.7939453125
start_training_time       | 2019-05-29 20:05:39.270399
end_training_time         | 2019-05-29 20:05:42.27942
metrics_elapsed_time      | {3.00901985168457}
madlib_version            | 1.16-dev
num_classes               | 3
class_values              | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype         | character varying
normalizing_const         | 1
metrics_type              | {mae}
training_metrics_final    | 0.46932977438
training_loss_final       | 1.41450297832
training_metrics          | {0.46932977437973}
training_loss             | {1.41450297832489}
validation_metrics_final  | 0.461133390665
validation_loss_final     | 1.38406682014
validation_metrics        | {0.461133390665054}
validation_loss           | {1.38406682014465}
metrics_iters             | {3}
{code}

Looks OK



(8)
multiple metrics

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='categorical_crossentropy', 
optimizer='adam', metrics=['acc', 'mae'] $$,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                3,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );
INFO:  Model architecture size: 1KB
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Model state (serialized) size: 0MB
CONTEXT:  PL/Python function "madlib_keras_fit"
ERROR:  plpy.SPIError: plpy.Error: Only at most one metric is supported. 
(plpython.c:5038)  (seg0 slice1 10.128.0.41:40000 pid=24904) (plpython.c:5038)
DETAIL:
Traceback (most recent call last):
  PL/Python function "fit_transition", line 6, in <module>
    return madlib_keras.fit_transition(**globals())
  PL/Python function "fit_transition", line 430, in fit_transition
  PL/Python function "fit_transition", line 101, in compile_and_set_weights
  PL/Python function "fit_transition", line 288, in compile_model
  PL/Python function "fit_transition", line 176, in 
parse_and_validate_compile_params
  PL/Python function "fit_transition", line 190, in _validate_metrics
  PL/Python function "fit_transition", line 96, in _assert
PL/Python function "fit_transition"
CONTEXT:  Traceback (most recent call last):
  PL/Python function "madlib_keras_fit", line 21, in <module>
    madlib_keras.fit(**globals())
  PL/Python function "madlib_keras_fit", line 198, in fit
PL/Python function "madlib_keras_fit"
{code}

Looks OK


(9)
no metrics

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='categorical_crossentropy', 
optimizer='adam' $$,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                3,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );

madlib=# select * from iris_model_summary;
-[ RECORD 1 ]-------------+----------------------------------------------------
source_table              | iris_train_packed
model                     | iris_model
dependent_varname         | class_text
independent_varname       | attributes
model_arch_table          | model_arch_library
model_arch_id             | 1
compile_params            |  loss='categorical_crossentropy', optimizer='adam'
fit_params                |  batch_size=16, epochs=1
num_iterations            | 3
validation_table          | iris_test_packed
metrics_compute_frequency | 3
name                      | Sophia L.
description               | Simple MLP model on iris dataset
model_type                | madlib_keras
model_size                | 0.7939453125
start_training_time       | 2019-05-29 20:07:28.589684
end_training_time         | 2019-05-29 20:07:34.462567
metrics_elapsed_time      | {5.87289786338806}
madlib_version            | 1.16-dev
num_classes               | 3
class_values              | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype         | character varying
normalizing_const         | 1
metrics_type              |
training_metrics_final    |
training_loss_final       | 1.10092568398
training_metrics          |
training_loss             | {1.10092568397522}
validation_metrics_final  |
validation_loss_final     | 1.15330994129
validation_metrics        |
validation_loss           | {1.15330994129181}
metrics_iters             | {3}
{code}

Looks OK, now left it blank (not 0 like before)


(10)
no fit param

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='categorical_crossentropy', 
optimizer='adam', metrics=['accuracy'] $$,  -- compile_params
                                NULL,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                3,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );
-[ RECORD 1 
]-------------+--------------------------------------------------------------------------
source_table              | iris_train_packed
model                     | iris_model
dependent_varname         | class_text
independent_varname       | attributes
model_arch_table          | model_arch_library
model_arch_id             | 1
compile_params            |  loss='categorical_crossentropy', optimizer='adam', 
metrics=['accuracy']
fit_params                |
num_iterations            | 3
validation_table          | iris_test_packed
metrics_compute_frequency | 3
name                      | Sophia L.
description               | Simple MLP model on iris dataset
model_type                | madlib_keras
model_size                | 0.7939453125
start_training_time       | 2019-05-29 20:09:15.684927
end_training_time         | 2019-05-29 20:09:21.254505
metrics_elapsed_time      | {5.56954598426819}
madlib_version            | 1.16-dev
num_classes               | 3
class_values              | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype         | character varying
normalizing_const         | 1
metrics_type              | {accuracy}
training_metrics_final    | 0.316666662693
training_loss_final       | 3.12867188454
training_metrics          | {0.316666662693024}
training_loss             | {3.12867188453674}
validation_metrics_final  | 0.40000000596
validation_loss_final     | 2.71730542183
validation_metrics        | {0.400000005960464}
validation_loss           | {2.71730542182922}
metrics_iters             | {3}
{code}

Looks OK


(11)
no compile params

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                NULL,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                3,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );

madlib=# SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
madlib(#                                'iris_model',          -- model
madlib(#                                'model_arch_library',  -- 
model_arch_table
madlib(#                                 1,  -- model_arch_id
madlib(#                                 NULL,  -- compile_params
madlib(#                                 $$ batch_size=16, epochs=1 $$,  -- 
fit_params
madlib(#                                 3,                   -- num_iterations
madlib(#                                 0,                    -- gpus per host
madlib(#                                'iris_test_packed',    -- 
validation_table
madlib(#                                 3,                 -- metrics compute 
frequency
madlib(#                                'Sophia L.',           -- name
madlib(#                                'Simple MLP model on iris dataset'  -- 
description
madlib(#                               );
ERROR:  plpy.Error: Compile parameters cannot be empty or NULL. 
(plpython.c:5038)
CONTEXT:  Traceback (most recent call last):
  PL/Python function "madlib_keras_fit", line 21, in <module>
    madlib_keras.fit(**globals())
  PL/Python function "madlib_keras_fit", line 42, in wrapper
  PL/Python function "madlib_keras_fit", line 69, in fit
  PL/Python function "madlib_keras_fit", line 96, in _assert
PL/Python function "madlib_keras_fit"
{code}

Looks OK, better error message



(12)
unsupported metric

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='kullback_leibler_divergence', 
optimizer='adam', metrics=[ 'top_k_categorical_accuracy'] $$,  -- compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                3,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );

ERROR:  plpy.SPIError: plpy.Error: Metric top_k_categorical_accuracy is not 
supported. (plpython.c:5038)  (seg0 slice1 10.128.0.41:40000 pid=16057) 
(plpython.c:5038)
DETAIL:
Traceback (most recent call last):
  PL/Python function "fit_transition", line 6, in <module>
    return madlib_keras.fit_transition(**globals())
  PL/Python function "fit_transition", line 452, in fit_transition
  PL/Python function "fit_transition", line 101, in compile_and_set_weights
  PL/Python function "fit_transition", line 299, in compile_model
  PL/Python function "fit_transition", line 187, in 
parse_and_validate_compile_params
  PL/Python function "fit_transition", line 203, in _validate_metrics
  PL/Python function "fit_transition", line 96, in _assert
PL/Python function "fit_transition"
CONTEXT:  Traceback (most recent call last):
  PL/Python function "madlib_keras_fit", line 21, in <module>
    madlib_keras.fit(**globals())
  PL/Python function "madlib_keras_fit", line 42, in wrapper
  PL/Python function "madlib_keras_fit", line 182, in fit
PL/Python function "madlib_keras_fit"
{code}

Looks OK.


(12)
same loss and metric

{code}
DROP TABLE IF EXISTS iris_model, iris_model_summary;
SELECT madlib.madlib_keras_fit('iris_train_packed',   -- source_table
                               'iris_model',          -- model
                               'model_arch_library',  -- model_arch_table
                                1,  -- model_arch_id
                                $$ loss='kullback_leibler_divergence', 
optimizer='adam', metrics=[ 'kullback_leibler_divergence'] $$,  -- 
compile_params
                                $$ batch_size=16, epochs=1 $$,  -- fit_params
                                3,                   -- num_iterations
                                0,                    -- gpus per host
                               'iris_test_packed',    -- validation_table
                                1,                 -- metrics compute frequency
                               'Sophia L.',           -- name
                               'Simple MLP model on iris dataset'  -- 
description
                              );

INFO:  Processed 60 images: Fit took 0.82143497467 sec, Total was 1.03211283684 
sec  (seg0 slice1 10.128.0.41:40000 pid=18434)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.701339960098 sec, Total was 
0.910417079926 sec  (seg1 slice1 10.128.0.41:40001 pid=18435)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 1: 2.95784187317 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 1: 0.375225782394 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set metric after iteration 1: 1.98858952522.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set loss after iteration 1: 1.98858952522.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 1: 0.361536979675 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set metric after iteration 1: 1.77411842346.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set loss after iteration 1: 1.77411842346.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Processed 60 images: Fit took 0.893284082413 sec, Total was 
1.19611501694 sec  (seg0 slice1 10.128.0.41:40000 pid=18434)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.903259992599 sec, Total was 
1.19773983955 sec  (seg1 slice1 10.128.0.41:40001 pid=18435)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 2: 1.2005739212 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 2: 0.342696905136 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set metric after iteration 2: 1.88822972775.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set loss after iteration 2: 1.88822972775.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 2: 0.262344837189 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set metric after iteration 2: 1.68969964981.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set loss after iteration 2: 1.68969964981.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Processed 60 images: Fit took 0.699074983597 sec, Total was 
0.957545042038 sec  (seg0 slice1 10.128.0.41:40000 pid=18434)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Processed 60 images: Fit took 0.71577501297 sec, Total was 
0.968965053558 sec  (seg1 slice1 10.128.0.41:40001 pid=18435)
CONTEXT:  PL/Python function "fit_transition"
INFO:  Time for training in iteration 3: 0.972018957138 sec
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 3: 0.28919506073 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set metric after iteration 3: 1.78998374939.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Training set loss after iteration 3: 1.78998374939.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Time for evaluation in iteration 3: 0.324784994125 sec.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set metric after iteration 3: 1.61077010632.
CONTEXT:  PL/Python function "madlib_keras_fit"
INFO:  Validation set loss after iteration 3: 1.61077010632.
CONTEXT:  PL/Python function "madlib_keras_fit"
-[ RECORD 1 ]----+-
madlib_keras_fit |

madlib=# select * from iris_model_summary;
-[ RECORD 1 
]-------------+-------------------------------------------------------------------------------------------------
source_table              | iris_train_packed
model                     | iris_model
dependent_varname         | class_text
independent_varname       | attributes
model_arch_table          | model_arch_library
model_arch_id             | 1
compile_params            |  loss='kullback_leibler_divergence', 
optimizer='adam', metrics=[ 'kullback_leibler_divergence']
fit_params                |  batch_size=16, epochs=1
num_iterations            | 3
validation_table          | iris_test_packed
metrics_compute_frequency | 1
name                      | Sophia L.
description               | Simple MLP model on iris dataset
model_type                | madlib_keras
model_size                | 0.7939453125
start_training_time       | 2019-05-29 21:37:36.01207
end_training_time         | 2019-05-29 21:37:43.27345
metrics_elapsed_time      | {3.8685519695282,5.67480206489563,7.26137208938599}
madlib_version            | 1.16-dev
num_classes               | 3
class_values              | {Iris-setosa,Iris-versicolor,Iris-virginica}
dependent_vartype         | character varying
normalizing_const         | 1
metrics_type              | {kullback_leibler_divergence}
training_metrics_final    | 1.78998374939
training_loss_final       | 1.78998374939
training_metrics          | {1.98858952522278,1.88822972774506,1.78998374938965}
training_loss             | {1.98858952522278,1.88822972774506,1.78998374938965}
validation_metrics_final  | 1.61077010632
validation_loss_final     | 1.61077010632
validation_metrics        | {1.77411842346191,1.68969964981079,1.61077010631561}
validation_loss           | {1.77411842346191,1.68969964981079,1.61077010631561}
metrics_iters             | {1,2,3}
{code}

looks OK





> DL: Add support for reporting various metrics in fit/evaluate
> -------------------------------------------------------------
>
>                 Key: MADLIB-1338
>                 URL: https://issues.apache.org/jira/browse/MADLIB-1338
>             Project: Apache MADlib
>          Issue Type: New Feature
>          Components: Deep Learning
>            Reporter: Nandish Jayaram
>            Priority: Major
>             Fix For: v1.16
>
>
> The current `madlib_keras.fit()` code reports accuracy as the only metric, 
> along with loss value. But we could ask for different metrics in compile 
> params (`mae`, `binary_accuracy ` etc.), then `Keras.evaluate()` would return 
> back `loss` (by default) and `mean_absolute_error` or `binary_accuracy` 
> (metrics).
>  This JIRA requests support to be able to report any one of these metrics in 
> the output table.
>  Other requirements:
>  1. Remove training loss/accuracy computation from `fit_transition` and 
> instead use the evaluate function to calculate the training loss/metric. See 
> PR [https://github.com/apache/madlib/pull/388 
> |https://github.com/apache/madlib/pull/388/files]for more details
> 2. metric param can be optional
> 3. Maybe we should rename all the related output column as metric instead of 
> metrics



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to