run.py 2.74 KB
Newer Older
Deshui Yu's avatar
Deshui Yu committed
1
2
3
4
5
6
7
#!/usr/bin/env python3

import contextlib
import json
import os
import subprocess
import time
8
import traceback
Deshui Yu's avatar
Deshui Yu committed
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

GREEN = '\33[32m'
RED = '\33[31m'
CLEAR = '\33[0m'

def read_last_line(file_name):
    try:
        *_, last_line = open(file_name)
        return last_line.strip()
    except (FileNotFoundError, ValueError):
        return None

def run():
    os.environ['PATH'] = os.environ['PATH'] + ':' + os.environ['PWD']

    with contextlib.suppress(FileNotFoundError):
        os.remove('tuner_search_space.txt')
    with contextlib.suppress(FileNotFoundError):
        os.remove('tuner_result.txt')
    with contextlib.suppress(FileNotFoundError):
29
        os.remove('/tmp/nni_assessor_result.txt')
Deshui Yu's avatar
Deshui Yu committed
30
31
32
33
34
35
36
37
38
39

    proc = subprocess.run(['nnictl', 'create', '--config', 'local.yml'])
    assert proc.returncode == 0, '`nnictl create` failed with code %d' % proc.returncode

    print('Spawning trials...')
    current_trial = 0

    for _ in range(60):
        time.sleep(1)

40
41
        tuner_status = read_last_line('/tmp/nni_tuner_result.txt')
        assessor_status = read_last_line('/tmp/nni_assessor_result.txt')
Deshui Yu's avatar
Deshui Yu committed
42
43
44
45
46
47
48
49

        assert tuner_status != 'ERROR', 'Tuner exited with error'
        assert assessor_status != 'ERROR', 'Assessor exited with error'

        if tuner_status == 'DONE' and assessor_status == 'DONE':
            break

        if tuner_status is not None:
50
            for line in open('/tmp/nni_tuner_result.txt'):
Deshui Yu's avatar
Deshui Yu committed
51
52
53
54
55
56
                if line.strip() in ('DONE', 'ERROR'):
                    break
                trial = int(line.split(' ')[0])
                if trial > current_trial:
                    current_trial = trial
                    print('Trial #%d done' % trial)
chicm-ms's avatar
chicm-ms committed
57
    subprocess.run(['nnictl', 'log', 'stderr'])
Deshui Yu's avatar
Deshui Yu committed
58
59
60
    assert tuner_status == 'DONE' and assessor_status == 'DONE', 'Failed to finish in 1 min'

    ss1 = json.load(open('search_space.json'))
61
    ss2 = json.load(open('/tmp/nni_tuner_search_space.json'))
Deshui Yu's avatar
Deshui Yu committed
62
63
    assert ss1 == ss2, 'Tuner got wrong search space'

64
    tuner_result = set(open('/tmp/nni_tuner_result.txt'))
Deshui Yu's avatar
Deshui Yu committed
65
66
67
68
69
    expected = set(open('expected_tuner_result.txt'))
    # Trials may complete before NNI gets assessor's result,
    # so it is possible to have more final result than expected
    assert tuner_result.issuperset(expected), 'Bad tuner result'

70
    assessor_result = set(open('/tmp/nni_assessor_result.txt'))
Deshui Yu's avatar
Deshui Yu committed
71
72
73
74
75
76
77
78
    expected = set(open('expected_assessor_result.txt'))
    assert assessor_result == expected, 'Bad assessor result'

if __name__ == '__main__':
    try:
        run()
        # TODO: check the output of rest server
        print(GREEN + 'PASS' + CLEAR)
79
    except Exception as error:
Deshui Yu's avatar
Deshui Yu committed
80
        print(RED + 'FAIL' + CLEAR)
81
        print('%r' % error)
82
        traceback.print_exc()
83
        raise error
Deshui Yu's avatar
Deshui Yu committed
84
85

    subprocess.run(['nnictl', 'stop'])