diff --git a/.travis.yml b/.travis.yml index 694915038..339a0f606 100644 --- a/.travis.yml +++ b/.travis.yml @@ -41,7 +41,6 @@ script: --ignore=tensor2tensor/problems_test.py --ignore=tensor2tensor/bin/t2t_trainer_test.py --ignore=tensor2tensor/data_generators/algorithmic_math_test.py - --ignore=tensor2tensor/rl/rl_trainer_lib_test.py - pytest tensor2tensor/utils/registry_test.py - pytest tensor2tensor/utils/trainer_lib_test.py - pytest tensor2tensor/visualization/visualization_test.py diff --git a/tensor2tensor/data_generators/gym.py b/tensor2tensor/data_generators/gym.py index 06b5ad0f3..c50b0db6b 100644 --- a/tensor2tensor/data_generators/gym.py +++ b/tensor2tensor/data_generators/gym.py @@ -35,8 +35,6 @@ import tensorflow as tf - - flags = tf.flags FLAGS = flags.FLAGS @@ -50,6 +48,17 @@ def __init__(self, *args, **kwargs): super(GymDiscreteProblem, self).__init__(*args, **kwargs) self._env = None + def example_reading_spec(self, label_repr=None): + + data_fields = { + "inputs": tf.FixedLenFeature([210, 160, 3], tf.int64), + "inputs_prev": tf.FixedLenFeature([210, 160, 3], tf.int64), + "targets": tf.FixedLenFeature([210, 160, 3], tf.int64), + "action": tf.FixedLenFeature([1], tf.int64) + } + + return data_fields, None + @property def env_name(self): # This is the name of the Gym environment for this problem. @@ -133,7 +142,7 @@ class GymPongRandom5k(GymDiscreteProblem): @property def env_name(self): - return "Pong-v0" + return "PongNoFrameskip-v4" @property def num_actions(self): @@ -148,21 +157,30 @@ def num_steps(self): return 5000 + @registry.register_problem class GymPongTrajectoriesFromPolicy(GymDiscreteProblem): """Pong game, loaded actions.""" - def __init__(self, event_dir, *args, **kwargs): + def __init__(self, *args, **kwargs): super(GymPongTrajectoriesFromPolicy, self).__init__(*args, **kwargs) self._env = None - self._event_dir = event_dir + self._last_policy_op = None + self._max_frame_pl = None + self._last_action = self.env.action_space.sample() + self._skip = 4 + self._skip_step = 0 + self._obs_buffer = np.zeros((2,) + self.env.observation_space.shape, + dtype=np.uint8) + + def generator(self, data_dir, tmp_dir): env_spec = lambda: atari_wrappers.wrap_atari( # pylint: disable=g-long-lambda gym.make("PongNoFrameskip-v4"), warp=False, frame_skip=4, frame_stack=False) hparams = rl.atari_base() - with tf.variable_scope("train"): + with tf.variable_scope("train", reuse=tf.AUTO_REUSE): policy_lambda = hparams.network policy_factory = tf.make_template( "network", @@ -173,14 +191,13 @@ def __init__(self, event_dir, *args, **kwargs): self._max_frame_pl, 0), 0)) policy = actor_critic.policy self._last_policy_op = policy.mode() - self._last_action = self.env.action_space.sample() - self._skip = 4 - self._skip_step = 0 - self._obs_buffer = np.zeros((2,) + self.env.observation_space.shape, - dtype=np.uint8) - self._sess = tf.Session() - model_saver = tf.train.Saver(tf.global_variables(".*network_parameters.*")) - model_saver.restore(self._sess, FLAGS.model_path) + with tf.Session() as sess: + model_saver = tf.train.Saver( + tf.global_variables(".*network_parameters.*")) + model_saver.restore(sess, FLAGS.model_path) + for item in super(GymPongTrajectoriesFromPolicy, + self).generator(data_dir, tmp_dir): + yield item # TODO(blazej0): For training of atari agents wrappers are usually used. # Below we have a hacky solution which is a workaround to be used together @@ -191,7 +208,7 @@ def get_action(self, observation=None): self._skip_step = (self._skip_step + 1) % self._skip if self._skip_step == 0: max_frame = self._obs_buffer.max(axis=0) - self._last_action = int(self._sess.run( + self._last_action = int(tf.get_default_session().run( self._last_policy_op, feed_dict={self._max_frame_pl: max_frame})[0, 0]) return self._last_action diff --git a/tensor2tensor/models/__init__.py b/tensor2tensor/models/__init__.py index 32ef49901..075840f2f 100644 --- a/tensor2tensor/models/__init__.py +++ b/tensor2tensor/models/__init__.py @@ -41,6 +41,7 @@ from tensor2tensor.models.research import aligned from tensor2tensor.models.research import attention_lm from tensor2tensor.models.research import attention_lm_moe +from tensor2tensor.models.research import basic_conv_gen from tensor2tensor.models.research import cycle_gan from tensor2tensor.models.research import gene_expression from tensor2tensor.models.research import multimodel diff --git a/tensor2tensor/models/research/basic_conv_gen.py b/tensor2tensor/models/research/basic_conv_gen.py new file mode 100644 index 000000000..c04e0b891 --- /dev/null +++ b/tensor2tensor/models/research/basic_conv_gen.py @@ -0,0 +1,65 @@ + +# coding=utf-8 +# Copyright 2018 The Tensor2Tensor Authors. +# +# 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. + +"""Basic models for testing simple tasks.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +# Dependency imports + +from tensor2tensor.layers import common_hparams +from tensor2tensor.layers import common_layers +from tensor2tensor.utils import registry +from tensor2tensor.utils import t2t_model + +import tensorflow as tf + + +@registry.register_model +class BasicConvGen(t2t_model.T2TModel): + + def body(self, features): + print(features) + filters = self.hparams.hidden_size + cur_frame = tf.to_float(features["inputs"]) + prev_frame = tf.to_float(features["inputs_prev"]) + print(features["inputs"].shape, cur_frame.shape, prev_frame.shape) + action = common_layers.embedding(tf.to_int64(features["action"]), + 10, filters) + action = tf.reshape(action, [-1, 1, 1, filters]) + + frames = tf.concat([cur_frame, prev_frame], axis=3) + h1 = tf.layers.conv2d(frames, filters, kernel_size=(3, 3), padding="SAME") + h2 = tf.layers.conv2d(tf.nn.relu(h1 + action), filters, + kernel_size=(5, 5), padding="SAME") + res = tf.layers.conv2d(tf.nn.relu(h2 + action), 3 * 256, + kernel_size=(3, 3), padding="SAME") + + height = tf.shape(res)[1] + width = tf.shape(res)[2] + res = tf.reshape(res, [-1, height, width, 3, 256]) + return res + + +@registry.register_hparams +def basic_conv_small(): + # """Small conv model.""" + hparams = common_hparams.basic_params1() + hparams.hidden_size = 32 + hparams.batch_size = 2 + return hparams diff --git a/tensor2tensor/notebooks/hello_t2t-rl.ipynb b/tensor2tensor/notebooks/hello_t2t-rl.ipynb new file mode 100644 index 000000000..d7e0eb6e1 --- /dev/null +++ b/tensor2tensor/notebooks/hello_t2t-rl.ipynb @@ -0,0 +1,354 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "colab_type": "code", + "collapsed": true, + "id": "s19ucTii_wYb" + }, + "outputs": [], + "source": [ + "# Copyright 2018 Google LLC.\n", + "\n", + "# Licensed under the Apache License, Version 2.0 (the \"License\");\n", + "# you may not use this file except in compliance with the License.\n", + "# You may obtain a copy of the License at\n", + "\n", + "# https://www.apache.org/licenses/LICENSE-2.0\n", + "\n", + "# Unless required by applicable law or agreed to in writing, software\n", + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", + "# See the License for the specific language governing permissions and\n", + "# limitations under the License." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Install deps\n", + "!pip install -q -U tensor2tensor tensorflow" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "autoexec": { + "startup": false, + "wait_interval": 0 + } + }, + "colab_type": "code", + "collapsed": true, + "id": "oILRLCWN_16u" + }, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import os\n", + "import collections\n", + "import sys\n", + "import tempfile\n", + "\n", + "from tensor2tensor import models\n", + "from tensor2tensor import problems\n", + "from tensor2tensor.rl import rl_trainer_lib\n", + "from tensor2tensor.utils import trainer_lib\n", + "from tensor2tensor.utils import t2t_model\n", + "from tensor2tensor.utils import registry\n", + "\n", + "# Other setup\n", + "Modes = tf.estimator.ModeKeys\n", + "\n", + "prefix = \"~/t2t_rl_data\"\n", + "# Setup data directories\n", + "data_dir = os.path.expanduser(prefix + \"/data\")\n", + "tmp_dir = os.path.expanduser(prefix + \"/tmp\")\n", + "tf.gfile.MakeDirs(data_dir)\n", + "tf.gfile.MakeDirs(tmp_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Train policy\n", + "\n", + "The training of the policy will take around 1h on GPU." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Overriding hparams in atari_base with epochs_num=1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2018-03-07 00:06:25,614] Overriding hparams in atari_base with epochs_num=1\n", + "[2018-03-07 00:06:25,620] Making new env: PongNoFrameskip-v4\n", + "[2018-03-07 00:06:25,860] Making new env: PongNoFrameskip-v4\n", + "[2018-03-07 00:06:25,865] Making new env: PongNoFrameskip-v4\n", + "[2018-03-07 00:06:25,872] Making new env: PongNoFrameskip-v4\n", + "[2018-03-07 00:06:25,883] Making new env: PongNoFrameskip-v4\n", + "[2018-03-07 00:06:25,892] Making new env: PongNoFrameskip-v4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:tensorflow:From /home/blazej.osinski/t2t/t2t_jupyter_kernel/local/lib/python2.7/site-packages/tensorflow/python/ops/distributions/categorical.py:310: calling argmax (from tensorflow.python.ops.math_ops) with dimension is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use the `axis` argument instead\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2018-03-07 00:06:26,589] From /home/blazej.osinski/t2t/t2t_jupyter_kernel/local/lib/python2.7/site-packages/tensorflow/python/ops/distributions/categorical.py:310: calling argmax (from tensorflow.python.ops.math_ops) with dimension is deprecated and will be removed in a future version.\n", + "Instructions for updating:\n", + "Use the `axis` argument instead\n", + "[2018-03-07 00:06:27,589] Making new env: PongNoFrameskip-v4\n", + "[2018-03-07 00:06:27,772] Making new env: PongNoFrameskip-v4\n", + "[2018-03-07 00:06:47,971] Starting new video recorder writing to /home/blazej.osinski/t2t_rl_data/data/ppo_Yr5Rjt/openaigym.video.0.144364.video000000.mp4\n", + "[2018-03-07 00:09:36,335] Finished writing results. You can upload them to the scoreboard via gym.upload('/home/blazej.osinski/t2t_rl_data/data/ppo_Yr5Rjt')\n" + ] + } + ], + "source": [ + "iteration_num=300\n", + "hparams = trainer_lib.create_hparams(\"atari_base\", \"epochs_num={}\".format(iteration_num+1))\n", + "ppo_dir = tempfile.mkdtemp(dir=data_dir, prefix=\"ppo_\")\n", + "rl_trainer_lib.train(hparams, \"stacked_pong\", ppo_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model_path = os.path.join(ppo_dir, \"model{}.ckpt.index\".format(iteration_num))[:-6]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Generate and review frames from policy" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "sys.argv = [sys.argv[0], \"--model_path\", model_path]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "tf.reset_default_graph()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2018-03-07 00:13:20,983] Making new env: PongNoFrameskip-v4\n", + "[2018-03-07 00:13:21,221] Making new env: PongNoFrameskip-v4\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Restoring parameters from /home/blazej.osinski/t2t_rl_data/data/ppo_Yr5Rjt/model0.ckpt\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2018-03-07 00:13:21,586] Restoring parameters from /home/blazej.osinski/t2t_rl_data/data/ppo_Yr5Rjt/model0.ckpt\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Generated 4998 Examples\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2018-03-07 00:31:57,314] Generated 4998 Examples\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Shuffling data...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2018-03-07 00:31:57,319] Shuffling data...\n" + ] + } + ], + "source": [ + "# This step is also time consuming - takes around 30 minutes.\n", + "gym_problem = problems.problem(\"gym_pong_trajectories_from_policy\")\n", + "gym_problem.generate_data(data_dir, tmp_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:Reading data files from /home/blazej.osinski/t2t_rl_data/data/gym_pong_trajectories_from_policy-train*\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2018-03-07 00:32:00,394] Reading data files from /home/blazej.osinski/t2t_rl_data/data/gym_pong_trajectories_from_policy-train*\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO:tensorflow:partition: 0 num_data_files: 10\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[2018-03-07 00:32:00,399] partition: 0 num_data_files: 10\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dataset = gym_problem.dataset(Modes.TRAIN, data_dir)\n", + "iterator = dataset.make_one_shot_iterator()\n", + "next_element = iterator.get_next()\n", + "\n", + "\n", + "fig=plt.figure(figsize=(20, 80))\n", + "columns = 10\n", + "rows = 40\n", + "\n", + "with tf.Session() as sess:\n", + " for inx in range(100):\n", + " value = sess.run(next_element)\n", + " for i in range(10): # skipping surplus frames.\n", + " value = sess.run(next_element)\n", + " fig.add_subplot(rows, columns, inx+1) \n", + " image = value[\"inputs\"].reshape([210,160,3])\n", + " plt.imshow(image[:, :, 0].astype(np.float32), cmap=plt.get_cmap('gray'))\n", + "plt.show()" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "default_view": {}, + "name": "T2T with TF Eager", + "provenance": [ + { + "file_id": "1-VScmaLkMqWiSbqgUCFWefzisSREd8l1", + "timestamp": 1512175750497 + } + ], + "version": "0.3.2", + "views": {} + }, + "kernelspec": { + "display_name": "t2t_kernel", + "language": "python", + "name": "t2t_kernel" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/tensor2tensor/rl/README.md b/tensor2tensor/rl/README.md index 46e40403f..ffd595911 100644 --- a/tensor2tensor/rl/README.md +++ b/tensor2tensor/rl/README.md @@ -7,16 +7,47 @@ for now and under heavy development. Currently the only supported algorithm is Proximy Policy Optimization - PPO. -## Sample usage - training in the Pendulum-v0 environment. - -```python rl/t2t_rl_trainer.py --problems=Pendulum-v0 --hparams_set continuous_action_base [--output_dir dir_location]``` - -## Sample usage - training in the PongNoFrameskip-v0 environment. - -```python tensor2tensor/rl/t2t_rl_trainer.py --problem stacked_pong --hparams_set atari_base --hparams num_agents=5 --output_dir /tmp/pong`date +%Y%m%d_%H%M%S```` - -## Sample usage - generation of a model - -```python tensor2tensor/bin/t2t-trainer --generate_data --data_dir=~/t2t_data --problems=gym_pong_trajectories_from_policy --hparams_set=base_atari --model_path [model]``` - -```python tensor2tensor/bin/t2t-datagen --data_dir=~/t2t_data --tmp_dir=~/t2t_data/tmp --problem=gym_pong_trajectories_from_policy --model_path [model]``` +# Sample usages + +## Training agent in the Pendulum-v0 environment. + +``` +python rl/t2t_rl_trainer.py \ + --problems=Pendulum-v0 \ + --hparams_set continuous_action_base \ + [--output_dir dir_location] +``` + +## Training agent in the PongNoFrameskip-v0 environment. + +``` +python tensor2tensor/rl/t2t_rl_trainer.py \ + --problem stacked_pong \ + --hparams_set atari_base \ + --hparams num_agents=5 \ + [--output_dir dir_location] +``` + +## Generation of trajectories data + +``` +python tensor2tensor/bin/t2t-datagen \ + --data_dir=~/t2t_data \ + --tmp_dir=~/t2t_data/tmp \ + --problem=gym_pong_trajectories_from_policy \ + --model_path [model] +``` + +## Training model for frames generation based on randomly played games + +``` +python tensor2tensor/bin/t2t-trainer \ + --generate_data \ + --data_dir=~/t2t_data \ + --output_dir=~/t2t_data/output \ + --problems=gym_pong_random5k \ + --model=basic_conv_gen \ + --hparams_set=basic_conv_small \ + --train_steps=1000 \ + --eval_steps=10 +``` diff --git a/tensor2tensor/rl/rl_trainer_lib_test.py b/tensor2tensor/rl/rl_trainer_lib_test.py index 0f3aa2025..461e7a0da 100644 --- a/tensor2tensor/rl/rl_trainer_lib_test.py +++ b/tensor2tensor/rl/rl_trainer_lib_test.py @@ -25,14 +25,19 @@ class TrainTest(tf.test.TestCase): + test_config = ("epochs_num=4,eval_every_epochs=3,video_during_eval=False," + "num_agents=5,optimization_epochs=5,epoch_length=50") + def test_no_crash_pendulum(self): hparams = trainer_lib.create_hparams( - "continuous_action_base", "epochs_num=11,video_during_eval=False") + "continuous_action_base", + TrainTest.test_config) rl_trainer_lib.train(hparams, "Pendulum-v0") def test_no_crash_cartpole(self): hparams = trainer_lib.create_hparams( - "discrete_action_base", "epochs_num=11,video_during_eval=False") + "discrete_action_base", + TrainTest.test_config) rl_trainer_lib.train(hparams, "CartPole-v0")