In [ ]:
import itertools
import random
import os
import sys
sys.path.insert(0,'..')
import psutil

from btgym import BTgymEnv
from btgym.monitor import BTgymMonitor

In [ ]:
env = BTgymEnv(filename='../examples/data/DAT_ASCII_EURUSD_M1_2016.csv',
               state_shape=(30,4),
               skip_frame=10,
               start_cash=100,
               drawdown_call=90,
               render_enabled=True,
               render_ylabel='Price Lines',
               render_size_episode=(12,8),
               render_size_human=(8, 3.5),
               render_size_agent=(10, 3.5),
               render_dpi=75,
               verbose=0,
              )

In [ ]:
# Adding up monitors:
# Due to tensorboard log reading routine it's better to use rule:
# One writer (= monitor) --> one subdirectory.

# Essense metrics for one step:
step_monitor = BTgymMonitor(subdir='/Step/Metrics',
                            scalars={'step/reward',
                                     'step/drawdown',
                                     'step/broker_value',
                                    },
                           )
# ..for episode:
episode_monitor = BTgymMonitor(subdir='/Episode',
                               scalars={'process/episode/cpu_time_sec',
                                        'episode/value',
                                        'episode/reward'
                                       },
                              )
# State pictures:
images_monitor = BTgymMonitor(subdir='/Step/Image',
                              images={'human', 'agent', 'episode'},
                             )


# Process resources usage by related processes:
env_monitor = BTgymMonitor(subdir='/Process/BTgymEnvironment',
                           scalars={'process/cpu_usage_percent',
                                    'process/vmemory_usage_percent',
                                   },
                          )

server_monitor = BTgymMonitor(subdir='/Process/BTgymServer',
                              scalars={'process/cpu_usage_percent',
                                       'process/vmemory_usage_percent',
                                      },
                             )

tb_monitor = BTgymMonitor(subdir='/Process/TensorboardServer',
                          scalars={'process/cpu_usage_percent',
                                   'process/vmemory_usage_percent',
                                  },
                         )

system_monitor = BTgymMonitor(subdir='/Process/System',
                              scalars={'process/cpu_usage_percent',
                                       'process/vmemory_usage_percent',
                                      },
                             )

###############################################

# Number episodes to run:
num_episodes = 500

# Retrieve step visualisations every... step
render_step = 100

# System recources usage to monitor:
# Environment (current process):
env_p = psutil.Process()

# BTgymServer process:
o = env.reset()
server_p = psutil.Process(env.server.pid)

# Tensorboard process:
# Here is the convinient method to start tensorboard server. Since we use all defaults,
# point webbrowser to localhost:6006 to see output. 
# Call it just once for any monitor.
system_monitor.tensorboard.start()
# ...procsess is here:
tb_p = system_monitor.tensorboard.process

# Main loop:
global_step = 0
for episode in range(num_episodes):
    o = env.reset()
    # For every-skip-frame do:
    for step in itertools.count():
        
        # Choose random action:
        rnd_action = int((env.action_space.n)*random.random())
        
        # Take a step:
        o, r, d, i = env.step(rnd_action)
        last_i = i[0] # pull most recent info record

        # Write step summary:
        step_monitor.write(
            feed_dict={'step/reward': r,
                       'step/drawdown': last_i['drawdown'],
                       'step/broker_value': last_i['broker_value'],
                      },
            global_step=global_step + last_i['step'],
            )

        # procesess:
        system_monitor.write(
            feed_dict={'process/cpu_usage_percent': psutil.cpu_percent(interval=None),
                       'process/vmemory_usage_percent': psutil.virtual_memory()[2],
                      },
            global_step=global_step + last_i['step'],
            )
        
        env_monitor.write(
            feed_dict={'process/cpu_usage_percent': env_p.cpu_percent(),
                       'process/vmemory_usage_percent': env_p.memory_percent(memtype="vms"),
                        },
            global_step=global_step + last_i['step'],
            )
        
        server_monitor.write(
            feed_dict={'process/cpu_usage_percent': server_p.cpu_percent(),
                       'process/vmemory_usage_percent': server_p.memory_percent(memtype="vms"),
                      },
            global_step=global_step + last_i['step'],
            )
        
        tb_monitor.write(
            feed_dict={'process/cpu_usage_percent': tb_p.cpu_percent(),
                       'process/vmemory_usage_percent': tb_p.memory_percent(memtype="vms"),
                      },
            global_step=global_step + last_i['step'],
            )
        
        # Heavy matplotlib memory leak test:
        if last_i['step'] % render_step == 0 or d:
            images_monitor.write(
                feed_dict={'human': env.render('human')[None,:],
                           'agent': env.render('agent')[None,:],
                           'episode': env.render('episode')[None,:],
                          },
                global_step=global_step + last_i['step'],
            )

        if d:
            break

    global_step += last_i['step']
    
    # Write after every episode:
    episode_stat = env.get_stat()
    episode_monitor.write(
        feed_dict={'process/episode/cpu_time_sec': episode_stat['runtime'].total_seconds(),
                   'episode/value': last_i['broker_value'],
                   'episode/reward': r,
                  },
        global_step=episode_stat['episode'],
    )
 
    print('Episode {}: {} actions made, global step: {}\n'.format(episode, step + 1, global_step))

In [ ]:
# Clean up:

env.close()

#This will shut down tensorboard:
system_monitor.tensorboard.stop()

# Close all monitor writers:
step_monitor.close()
episode_monitor.close()
images_monitor.close()
system_monitor.close()
env_monitor.close()
server_monitor.close()
tb_monitor.close()

In [ ]:
env.renderer.params

In [ ]: