mirror of
https://github.com/gryf/coach.git
synced 2025-12-17 19:20:19 +01:00
139 lines
5.7 KiB
Python
139 lines
5.7 KiB
Python
#
|
|
# Copyright (c) 2017 Intel Corporation
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
import sys
|
|
sys.path.append('.')
|
|
from subprocess import Popen
|
|
import argparse
|
|
from rl_coach.utils import set_gpu, force_list
|
|
|
|
"""
|
|
This script makes it easier to run multiple instances of a given preset.
|
|
Each instance uses a different seed, and optionally, multiple environment levels can be configured as well.
|
|
"""
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-p', '--preset',
|
|
help="(string) The preset to run",
|
|
default=None,
|
|
type=str)
|
|
parser.add_argument('-s', '--seeds',
|
|
help="(int) Number of seeds to run",
|
|
default=5,
|
|
type=int)
|
|
parser.add_argument('-lvl', '--level',
|
|
help="(string) Environment level to use. This can be defined as a comma separated list.",
|
|
default=None,
|
|
type=str)
|
|
parser.add_argument('-g', '--gpu',
|
|
help="(int) The gpu to use. This can be defined as a comma separated list. For example,"
|
|
" 0,1 will use both gpu's 0 and 1, by switching between them for each run instance",
|
|
default='0',
|
|
type=str)
|
|
parser.add_argument('-n', '--num_workers',
|
|
help="(int) The number of workers to use for each run",
|
|
default=1,
|
|
type=int)
|
|
parser.add_argument('-d', '--dir_prefix',
|
|
help="(str) A prefix for the directory name. If not given, the directory name will match "
|
|
"the preset name, followed by the environment level",
|
|
default='',
|
|
type=str)
|
|
parser.add_argument('-lsd', '--level_as_sub_dir',
|
|
help="(flag) Store each level in it's own sub directory where the root directory name matches "
|
|
"the preset name",
|
|
action='store_true')
|
|
parser.add_argument('-ssd', '--seed_as_sub_dir',
|
|
help="(flag) Store each seed in it's own sub directory where the root directory name matches "
|
|
"the preset name",
|
|
action='store_true')
|
|
parser.add_argument('-ew', '--evaluation_worker',
|
|
help="(flag) Start an additional worker that will only do evaluation",
|
|
action='store_true')
|
|
parser.add_argument('-c', '--use_cpu',
|
|
help="(flag) Use the cpu instead of the gpu",
|
|
action='store_true')
|
|
parser.add_argument('-f', '--framework',
|
|
help="(string) Neural network framework. Available values: tensorflow, mxnet",
|
|
default='tensorflow',
|
|
type=str)
|
|
args = parser.parse_args()
|
|
|
|
# dir_prefix = "benchmark_"
|
|
# preset = 'Mujoco_DDPG' # 'Mujoco_DDPG'
|
|
# levels = ["inverted_pendulum"]
|
|
# num_seeds = 5
|
|
# num_workers = 1
|
|
# gpu = [0, 1]
|
|
#
|
|
|
|
# if no arg is given
|
|
if len(sys.argv) == 1:
|
|
parser.print_help()
|
|
exit(0)
|
|
|
|
dir_prefix = args.dir_prefix
|
|
preset = args.preset
|
|
levels = args.level.split(',') if args.level is not None else [None]
|
|
num_seeds = args.seeds
|
|
num_workers = args.num_workers
|
|
framework = args.framework
|
|
gpu = [int(gpu) for gpu in args.gpu.split(',')]
|
|
level_as_sub_dir = args.level_as_sub_dir
|
|
|
|
processes = []
|
|
gpu_list = force_list(gpu)
|
|
curr_gpu_idx = 0
|
|
for level in levels:
|
|
if dir_prefix != "":
|
|
dir_prefix += "_"
|
|
for seed in range(num_seeds):
|
|
# select the next gpu for this run
|
|
set_gpu(gpu_list[curr_gpu_idx])
|
|
|
|
command = ['python3', 'rl_coach/coach.py', '-ns', '-p', '{}'.format(preset),
|
|
'--seed', '{}'.format(seed), '-n', '{}'.format(num_workers),
|
|
'--framework', framework]
|
|
if args.use_cpu:
|
|
command.append("-c")
|
|
if args.evaluation_worker:
|
|
command.append("-ew")
|
|
if args.seed_as_sub_dir:
|
|
seed = ''
|
|
if level is not None:
|
|
command.extend(['-lvl', '{}'.format(level)])
|
|
if level_as_sub_dir:
|
|
separator = "/"
|
|
else:
|
|
separator = "_"
|
|
command.extend(['-e', '{dir_prefix}{preset}_{seed}_{separator}{level}_{num_workers}_workers'.format(
|
|
dir_prefix=dir_prefix, preset=preset, seed=seed, level=level, separator=separator,
|
|
num_workers=args.num_workers)])
|
|
else:
|
|
command.extend(['-e', '{dir_prefix}{preset}_{seed}_{num_workers}_workers'.format(
|
|
dir_prefix=dir_prefix, preset=preset, seed=seed, num_workers=args.num_workers)])
|
|
print(command)
|
|
|
|
p = Popen(command)
|
|
processes.append(p)
|
|
|
|
# for each run, select the next gpu from the available gpus
|
|
curr_gpu_idx = (curr_gpu_idx + 1) % len(gpu_list)
|
|
|
|
for p in processes:
|
|
p.wait()
|