def test_consumer(fileutils): """Run three processes, each one of the first two processes puts a tensor on the DB; the third process accesses the tensors put by the two producers. Finally, the tensor is used to run a model by each producer and the consumer accesses the two results. """ test_dir = fileutils.make_test_dir("smartredis_ensemble_consumer_test") exp = Experiment("smartredis_ensemble_consumer", exp_path=test_dir, launcher="local") # create and start a database orc = Orchestrator(port=REDIS_PORT) exp.generate(orc) exp.start(orc, block=False) rs_prod = RunSettings("python", "producer.py") rs_consumer = RunSettings("python", "consumer.py") params = {"mult": [1, -10]} ensemble = Ensemble(name="producer", params=params, run_settings=rs_prod, perm_strat="step") consumer = Model("consumer", params={}, path=ensemble.path, run_settings=rs_consumer) ensemble.add_model(consumer) ensemble.register_incoming_entity(ensemble[0]) ensemble.register_incoming_entity(ensemble[1]) config = fileutils.get_test_conf_path("smartredis") ensemble.attach_generator_files(to_copy=[config]) exp.generate(ensemble) # start the models exp.start(ensemble, summary=False) # get and confirm statuses statuses = exp.get_status(ensemble) assert all([stat == constants.STATUS_COMPLETED for stat in statuses]) # stop the orchestrator exp.stop(orc) print(exp.summary())
def test_exchange(fileutils): """Run two processes, each process puts a tensor on the DB, then accesses the other process's tensor. Finally, the tensor is used to run a model. """ test_dir = fileutils.make_test_dir("smartredis_ensemble_exchange_test") exp = Experiment("smartredis_ensemble_exchange", exp_path=test_dir, launcher="local") # create and start a database orc = Orchestrator(port=REDIS_PORT) exp.generate(orc) exp.start(orc, block=False) rs = RunSettings("python", "producer.py --exchange") params = {"mult": [1, -10]} ensemble = Ensemble( name="producer", params=params, run_settings=rs, perm_strat="step", ) ensemble.register_incoming_entity(ensemble[0]) ensemble.register_incoming_entity(ensemble[1]) config = fileutils.get_test_conf_path("smartredis") ensemble.attach_generator_files(to_copy=[config]) exp.generate(ensemble) # start the models exp.start(ensemble, summary=False) # get and confirm statuses statuses = exp.get_status(ensemble) assert all([stat == constants.STATUS_COMPLETED for stat in statuses]) # stop the orchestrator exp.stop(orc) print(exp.summary())
def test_summary(fileutils, wlmutils): """Fairly rudimentary test of the summary dataframe""" exp_name = "test-launch-summary" exp = Experiment(exp_name, launcher=wlmutils.get_test_launcher()) test_dir = fileutils.make_test_dir(exp_name) sleep = fileutils.get_test_conf_path("sleep.py") bad = fileutils.get_test_conf_path("bad.py") sleep_settings = wlmutils.get_run_settings("python", f"{sleep} --time=3") bad_settings = wlmutils.get_run_settings("python", f"{bad} --time=6") sleep = exp.create_model("sleep", path=test_dir, run_settings=sleep_settings) bad = exp.create_model("bad", path=test_dir, run_settings=bad_settings) # start and poll exp.start(sleep, bad) assert exp.get_status(bad)[0] == constants.STATUS_FAILED assert exp.get_status(sleep)[0] == constants.STATUS_COMPLETED summary_df = exp.summary() print(summary_df) row = summary_df.loc[0] assert sleep.name == row["Name"] assert sleep.type == row["Entity-Type"] assert 0 == int(row["RunID"]) assert 0 == int(row["Returncode"]) row_1 = summary_df.loc[1] assert bad.name == row_1["Name"] assert bad.type == row_1["Entity-Type"] assert 0 == int(row_1["RunID"]) assert 0 != int(row_1["Returncode"])