Source code for xuance.engine.run_offlinerl
import os
import numpy as np
from copy import deepcopy
from xuance.environment import make_envs
from xuance.engine import RunnerBase
try:
from xuance.common import load_d4rl_dataset
except:
pass
[docs]
class RunnerOfflineRL(RunnerBase):
def __init__(self, config):
self.config = config
self.env_id = self.config.env_id
super(RunnerOfflineRL, self).__init__(self.config)
self.config.observation_space = self.envs.observation_space
self.config.action_space = self.envs.action_space
dataset, state_mean, state_std = load_d4rl_dataset(
dataset_name=config.dataset,
max_episode_steps=config.test_steps // config.test_episode,
obsnorm=config.normalize_obs_offline,
rewnorm=config.normalize_reward_offline
)
self.config.state_mean = state_mean
self.config.state_std = state_std
from xuance.torch.agents import REGISTRY_Agents
self.agent = REGISTRY_Agents[self.config.agent](self.config, self.envs)
self.agent.load_dataset(dataset=dataset)
if self.agent.distributed_training:
self.rank = int(os.environ['RANK'])
[docs]
def run(self):
if self.config.test_mode:
def env_fn():
self.config.parallels = self.config.test_episode
return make_envs(self.config)
self.agent.load_model(self.agent.model_dir_load)
scores = self.agent.test(env_fn, self.config.test_episode)
self.rprint(f"Mean Score: {np.mean(scores)}, Std: {np.std(scores)}")
self.rprint("Finish testing.")
else:
self.agent.train(self.config.running_steps)
self.agent.save_model("final_train_model.pth")
self.rprint("Finish training.")
self.agent.finish()
self.envs.close()
[docs]
def benchmark(self):
# test environment
def env_fn():
config_test = deepcopy(self.config)
config_test.parallels = config_test.test_episode
return make_envs(config_test)
eval_interval = self.config.eval_interval
test_episode = self.config.test_episode
num_epoch = int(self.config.running_steps / eval_interval)
test_scores = self.agent.test(env_fn, test_episode) if self.rank == 0 else 0.0
best_scores_info = {"mean": np.mean(test_scores),
"std": np.std(test_scores),
"step": self.agent.current_step}
for i_epoch in range(num_epoch):
self.rprint("Epoch: %d/%d:" % (i_epoch, num_epoch))
self.agent.train(eval_interval)
if self.rank == 0:
test_scores = self.agent.test(env_fn, test_episode)
if np.mean(test_scores) > best_scores_info["mean"]:
best_scores_info = {"mean": np.mean(test_scores),
"std": np.std(test_scores),
"step": self.agent.current_step}
# save best model
self.agent.save_model(model_name="best_model.pth")
print(f"Normalized-Test-Episode-Rewards: {test_scores}")
print(f"D4RL-Score: %.3f" % np.mean(test_scores))
# end benchmarking
self.rprint("Best Model Score: %.2f, std=%.2f" % (best_scores_info["mean"], best_scores_info["std"]))
self.agent.finish()
self.envs.close()