diff --git a/cli.py b/cli.py index 7989df5..9c56067 100644 --- a/cli.py +++ b/cli.py @@ -1,4 +1,5 @@ import numpy as np +from deco import concurrent from lib.RLTrader import RLTrader from lib.cli.RLTraderCLI import RLTraderCLI @@ -8,16 +9,26 @@ trader_cli = RLTraderCLI() args = trader_cli.get_args() + +@concurrent(processes=args.proc_number) +def run_concurrent_optimize(trader: RLTrader, args): + trader.optimize(args.trials, args.trials, args.parallel_jobs) + + if __name__ == '__main__': logger = init_logger(__name__, show_debug=args.debug) trader = RLTrader(**vars(args), logger=logger) if args.command == 'optimize': - trader.optimize(n_trials=args.trials, n_parallel_jobs=args.parallel_jobs) + run_concurrent_optimize(trader, args) elif args.command == 'train': trader.train(n_epochs=args.epochs) elif args.command == 'test': trader.test(model_epoch=args.model_epoch, should_render=args.no_render) elif args.command == 'opt-train-test': - trader.optimize(args.trials, args.parallel_jobs) - trader.train(n_epochs=args.train_epochs, test_trained_model=args.no_test, render_trained_model=args.no_render) + run_concurrent_optimize(trader, args) + trader.train( + n_epochs=args.train_epochs, + test_trained_model=args.no_test, + render_trained_model=args.no_render + ) diff --git a/lib/RLTrader.py b/lib/RLTrader.py index 931ed91..97b3ca9 100644 --- a/lib/RLTrader.py +++ b/lib/RLTrader.py @@ -4,6 +4,8 @@ from os import path from typing import Dict + +from deco import concurrent from stable_baselines.common.base_class import BaseRLModel from stable_baselines.common.policies import BasePolicy, MlpPolicy from stable_baselines.common.vec_env import DummyVecEnv, SubprocVecEnv @@ -160,6 +162,7 @@ def optimize_params(self, trial, n_prune_evals_per_trial: int = 2, n_tests_per_e return -1 * last_reward + @concurrent def optimize(self, n_trials: int = 100, n_parallel_jobs: int = 1, *optimize_params): try: self.optuna_study.optimize( diff --git a/lib/cli/RLTraderCLI.py b/lib/cli/RLTraderCLI.py index a687658..eba08b3 100644 --- a/lib/cli/RLTraderCLI.py +++ b/lib/cli/RLTraderCLI.py @@ -1,6 +1,6 @@ import argparse import os - +import multiprocessing class RLTraderCLI: def __init__(self): @@ -32,10 +32,12 @@ def __init__(self): opt_train_test_parser.add_argument('--train-epochs', type=int, default=10, help='Train for how many epochs') opt_train_test_parser.add_argument('--no-render', action='store_false', help='Should render the model') opt_train_test_parser.add_argument('--no-test', action='store_false', help='Should test the model') + opt_train_test_parser.add_argument('--proc-number', type=int, default=multiprocessing.cpu_count(), help='How many processes to spawn') optimize_parser = subparsers.add_parser('optimize', description='Optimize model parameters') optimize_parser.add_argument('--trials', type=int, default=1, help='Number of trials') optimize_parser.add_argument('--parallel-jobs', type=int, default=1, help='How many jobs in parallel') + optimize_parser.add_argument('--proc-number', type=int, default=multiprocessing.cpu_count(), help='How many processes to spawn') optimize_parser.add_argument('--verbose-model', type=int, default=1, help='Verbose model', dest='model_verbose') diff --git a/requirements.no-gpu.txt b/requirements.no-gpu.txt index 59baad1..9ad3e5d 100644 --- a/requirements.no-gpu.txt +++ b/requirements.no-gpu.txt @@ -9,4 +9,5 @@ ta statsmodels==0.10.0rc2 empyrical tensorflow -ccxt \ No newline at end of file +ccxt +deco \ No newline at end of file diff --git a/requirements.tests.txt b/requirements.tests.txt index d6995e2..f8017f2 100644 --- a/requirements.tests.txt +++ b/requirements.tests.txt @@ -1,2 +1,3 @@ -r requirements.no-gpu.txt -pytest \ No newline at end of file +pytest +deco \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 5554142..9ff48e3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,5 @@ statsmodels==0.10.0rc2 empyrical tensorflow-gpu ccxt -psycopg2 \ No newline at end of file +psycopg2 +deco \ No newline at end of file