File size: 2,125 Bytes
7e2a2a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import argparse
import copy
import os
import yaml
import sys
sys.path.append('.')
from configs import parse_config

if __name__ == '__main__':
    # parse arguments
    parser = argparse.ArgumentParser(description='Config Generator')
    parser.add_argument('--input', type=str, required=True)
    parser.add_argument('--output_folder', type=str, required=True)
    args = parser.parse_args()

    with open(args.input, 'rt') as f:
        template_config = yaml.safe_load(f)

    if not os.path.exists(args.output_folder):
        os.makedirs(args.output_folder)

    # check template and copy config
    config = copy.deepcopy(template_config)
    group_sizes = []
    for key in config:
        if 'option_group' in config[key]:
            group_sizes.append(len(config[key]['option_group']))
            del config[key]['option_group']
    is_same_size = True
    for i in range(1, len(group_sizes)):
        is_same_size = is_same_size and group_sizes[i] == group_sizes[i - 1]
    assert len(group_sizes) > 0, 'Template config should have at least one option group.'
    assert is_same_size, 'All option groups should have the same size.'

    # generate all configs
    cmds = []
    for idx in range(group_sizes[0]):
        dst_config = copy.deepcopy(config)
        for key in dst_config:
            if 'option_group' in template_config[key]:
                for option, value in template_config[key]['option_group'][idx].items():
                    dst_config[key][option] = value
        dst_config['common']['name'] += f'{idx:02d}'
        dst_fn = dst_config['common']['name']
        dst_path = os.path.join(args.output_folder, dst_fn + '.yaml')
        with open(dst_path, 'wt') as f:
            yaml.safe_dump(dst_config, f)

        cmds.append(f'nohup python3 train.py --cfg_file {dst_path} > stdio/{dst_fn}.log 2>&1 &')

        # try to load config
        try:
            parse_config(dst_path)
        except Exception as e:
            print('\033[1;31m==========\nError:\033[0m', e, '\n\033[1;31m==========\033[0m')
            exit(-1)

    for cmd in cmds:
        print('')
        print(cmd)