def test_TrackingCallback_multiple_epochs(tmpdir):
    loader = FakeDataLoader((10, 10), (1, ))
    model = fake_model_fn((10, 10))
    model.compile(loss='binary_crossentropy')
    hook = TrackingCallback(tmpdir, batch_size=1, warmup_steps=0)
    model.fit(loader.to_dataset(batch_size=1), callbacks=[hook], epochs=5)

    # We expect 5 calls to epoch duration & train samples per sec
    # Followed by one call to train duration at the end
    expected_calls = zip(['epoch_duration' for i in range(5)],
                         ['train_samples_per_sec' for i in range(5)])
    expected_calls = list(chain.from_iterable(expected_calls))
    expected_calls.append('train_duration')

    db = TrackingClient(tmpdir / 'logs.json')
    assert len(db.get_metric('epoch_log')) == 5
    assert len(db.get_metric('train_log')) == 1

    epoch_logs = db.get_metric('epoch_log')
    assert isinstance(epoch_logs, list)

    for log in epoch_logs:
        log = log['data']
        assert 'duration' in log
        assert 'loss' in log
        assert 'samples_per_sec' in log

    train_log = db.get_metric('train_log')[0]
    log = train_log['data']
    assert 'duration' in log
    assert 'samples_per_sec' in log
def test_DeviceLogger(mocker, tmpdir):

    logger = DeviceLogger(tmpdir, interval=0.1)

    logger.start()
    time.sleep(1)
    logger.cancel()

    assert (tmpdir / 'devices.json').exists()

    db = TrackingClient(tmpdir / 'devices.json')
    logs = db.get_metric('device_log')
    assert len(logs) > 1

    if logs[0] == {}:
        return

    for log in logs:
        log = log['data']
        gpu = log['gpu_0']
        assert 'execution_mode' in log
        assert 'name' in log
        assert 'utilization' in gpu
        assert 'power' in gpu
        assert 'memory' in gpu
        assert 'free' in gpu['memory']
        assert 'used' in gpu['memory']
def test_HostLogger(mocker, tmpdir):

    logger = HostLogger(tmpdir, interval=0.1)

    logger.start()
    time.sleep(1)
    logger.cancel()

    assert (tmpdir / 'host.json').exists()

    db = TrackingClient(tmpdir / 'host.json')
    logs = db.get_metric('host_log')
    assert len(logs) > 1

    for log in logs:
        log = log['data']
        assert 'execution_mode' in log
        assert 'name' in log
        assert 'cpu' in log
        assert 'percent' in log['cpu']
        assert 'memory' in log
        assert 'free' in log['memory']
        assert 'used' in log['memory']
        assert 'available' in log['memory']
        assert 'utilization' in log['memory']
        assert 'disk' in log
        assert 'net' in log
def test_TrackingCallback(tmpdir):
    loader = FakeDataLoader((10, 10), (1, ))
    model = fake_model_fn((10, 10))
    model.compile(loss='binary_crossentropy')
    hook = TrackingCallback(tmpdir, batch_size=1)
    model.fit(loader.to_dataset(batch_size=1), callbacks=[hook])

    db = TrackingClient(tmpdir / 'logs.json')
    assert len(db.get_metric('train_log')) == 1