def _ConstructDebuggerPluginWithGrpcPort(context): try: # pylint: disable=line-too-long,g-import-not-at-top from tensorboard.plugins.debugger import debugger_plugin as debugger_plugin_lib from tensorboard.plugins.debugger import interactive_debugger_plugin as interactive_debugger_plugin_lib # pylint: enable=line-too-long,g-import-not-at-top except ImportError as err: (unused_type, unused_value, traceback) = sys.exc_info() six.reraise( ImportError, ImportError(err.message + '\n\nTo use the debugger plugin, you need to have ' 'gRPC installed:\n pip install grpcio'), traceback) if FLAGS.debugger_port > 0: interactive_plugin = ( interactive_debugger_plugin_lib.InteractiveDebuggerPlugin(context)) tf.logging.info('Starting Interactive Debugger Plugin at gRPC port %d', FLAGS.debugger_data_server_grpc_port) interactive_plugin.listen(FLAGS.debugger_port) return interactive_plugin elif FLAGS.debugger_data_server_grpc_port > 0: noninteractive_plugin = debugger_plugin_lib.DebuggerPlugin(context) tf.logging.info( 'Starting Non-interactive Debugger Plugin at gRPC port %d', FLAGS.debugger_data_server_grpc_port) noninteractive_plugin.listen(FLAGS.debugger_data_server_grpc_port) return noninteractive_plugin return None
def _ConstructDebuggerPluginWithGrpcPort(context): try: # pylint: disable=line-too-long,g-import-not-at-top from tensorboard.plugins.debugger import debugger_plugin as debugger_plugin_lib from tensorboard.plugins.debugger import interactive_debugger_plugin as interactive_debugger_plugin_lib # pylint: enable=line-too-long,g-import-not-at-top except ImportError as e: e_type, e_value, e_traceback = sys.exc_info() message = e.msg if hasattr(e, 'msg') else e.message # Handle py2 vs py3 if 'grpc' in message: e_value = ImportError( message + '\n\nTo use the debugger plugin, you need to have ' 'gRPC installed:\n pip install grpcio') six.reraise(e_type, e_value, e_traceback) if FLAGS.debugger_port > 0: interactive_plugin = ( interactive_debugger_plugin_lib.InteractiveDebuggerPlugin(context)) tf.logging.info('Starting Interactive Debugger Plugin at gRPC port %d', FLAGS.debugger_data_server_grpc_port) interactive_plugin.listen(FLAGS.debugger_port) return interactive_plugin elif FLAGS.debugger_data_server_grpc_port > 0: noninteractive_plugin = debugger_plugin_lib.DebuggerPlugin(context) tf.logging.info( 'Starting Non-interactive Debugger Plugin at gRPC port %d', FLAGS.debugger_data_server_grpc_port) noninteractive_plugin.listen(FLAGS.debugger_data_server_grpc_port) return noninteractive_plugin return None
def testHealthPillsPluginIsInactive(self): plugin = debugger_plugin.DebuggerPlugin( base_plugin.TBContext( logdir=self.log_dir, multiplexer=event_multiplexer.EventMultiplexer({}))) plugin.listen(self.debugger_data_server_grpc_port) # The multiplexer lacks sampled health pills. self.assertFalse(plugin.is_active())
def load(self, context): """Returns the debugger plugin, if possible. Args: context: The TBContext flags including `add_arguments`. Returns: A DebuggerPlugin instance or None if it couldn't be loaded. """ flags = context.flags if flags.debugger_data_server_grpc_port > 0 or flags.debugger_port > 0: # Verify that the required Python packages are installed. try: # pylint: disable=unused-import import tensorflow # noqa: F401 except ImportError: raise ImportError( "To use the debugger plugin, you need to have TensorFlow installed:\n" " pip install tensorflow" ) if flags.debugger_data_server_grpc_port > 0: from tensorboard.plugins.debugger import ( debugger_plugin as debugger_plugin_lib, ) # debugger_data_server_grpc opens the non-interactive Debugger Plugin, # which appears as health pills in the Graph Plugin. noninteractive_plugin = debugger_plugin_lib.DebuggerPlugin(context) logger.info( "Starting Non-interactive Debugger Plugin at gRPC port %d", flags.debugger_data_server_grpc_port, ) noninteractive_plugin.listen(flags.debugger_data_server_grpc_port) return noninteractive_plugin elif flags.debugger_port > 0: from tensorboard.plugins.debugger import ( interactive_debugger_plugin as interactive_debugger_plugin_lib, ) interactive_plugin = interactive_debugger_plugin_lib.InteractiveDebuggerPlugin( context ) logger.info( "Starting Interactive Debugger Plugin at gRPC port %d", flags.debugger_data_server_grpc_port, ) interactive_plugin.listen(flags.debugger_port) return interactive_plugin else: # If neither the debugger_data_server_grpc_port flag or the grpc_port # flag is specified, we instantiate a dummy plugin as a placeholder for # the frontend. The dummy plugin will display a message indicating that # the plugin is not active. It'll also display a command snippet to # illustrate how to activate the interactive Debugger Plugin. return InactiveDebuggerPlugin()
def testDebuggerDataServerNotStartedWhenPortIsNone(self): """Tests that the plugin starts no debugger data server if port is None.""" self.mock_debugger_data_server_class.reset_mock() # Initialize a debugger plugin with no GRPC port provided. debugger_plugin.DebuggerPlugin(self.context).get_plugin_apps() # No debugger data server should have been started. # assert_not_called is not available in Python 3.4. self.assertFalse(self.mock_debugger_data_server_class.called)
def load(self, context): """Returns the debugger plugin, if possible. Args: context: The TBContext flags including `add_arguments`. Returns: A DebuggerPlugin instance or None if it couldn't be loaded. """ if not (context.flags.debugger_data_server_grpc_port > 0 or context.flags.debugger_port > 0): return None flags = context.flags try: # pylint: disable=g-import-not-at-top,unused-import import tensorflow except ImportError: raise ImportError( 'To use the debugger plugin, you need to have TensorFlow installed:\n' ' pip install tensorflow') try: # pylint: disable=line-too-long,g-import-not-at-top from tensorboard.plugins.debugger import debugger_plugin as debugger_plugin_lib from tensorboard.plugins.debugger import interactive_debugger_plugin as interactive_debugger_plugin_lib # pylint: enable=line-too-long,g-import-not-at-top except ImportError as e: e_type, e_value, e_traceback = sys.exc_info() message = e.msg if hasattr( e, 'msg') else e.message # Handle py2 vs py3 if 'grpc' in message: e_value = ImportError( message + '\n\nTo use the debugger plugin, you need to have ' 'gRPC installed:\n pip install grpcio') six.reraise(e_type, e_value, e_traceback) if flags.debugger_port > 0: interactive_plugin = (interactive_debugger_plugin_lib. InteractiveDebuggerPlugin(context)) logger.info('Starting Interactive Debugger Plugin at gRPC port %d', flags.debugger_data_server_grpc_port) interactive_plugin.listen(flags.debugger_port) return interactive_plugin elif flags.debugger_data_server_grpc_port > 0: noninteractive_plugin = debugger_plugin_lib.DebuggerPlugin(context) logger.info( 'Starting Non-interactive Debugger Plugin at gRPC port %d', flags.debugger_data_server_grpc_port) noninteractive_plugin.listen(flags.debugger_data_server_grpc_port) return noninteractive_plugin raise AssertionError()
def _ConstructDebuggerPluginWithGrpcPort(context): try: # pylint: disable=line-too-long,g-import-not-at-top from tensorboard.plugins.debugger import debugger_plugin as debugger_plugin_lib # pylint: enable=line-too-long,g-import-not-at-top except ImportError as err: (unused_type, unused_value, traceback) = sys.exc_info() six.reraise( ImportError, ImportError(err.message + "\n\nTo use the debugger plugin, you need to have " "gRPC installed:\n pip install grpcio"), traceback) tf.logging.info("Starting Debugger Plugin at gRPC port %d", FLAGS.debugger_data_server_grpc_port) debugger_plugin = debugger_plugin_lib.DebuggerPlugin(context) debugger_plugin.listen(FLAGS.debugger_data_server_grpc_port) return debugger_plugin
def setUp(self): super(DebuggerPluginTestBase, self).setUp() # Importing the debugger_plugin can sometimes unfortunately produce errors. try: # pylint: disable=g-import-not-at-top from tensorboard.plugins.debugger import debugger_plugin from tensorboard.plugins.debugger import debugger_server_lib # pylint: enable=g-import-not-at-top except Exception as e: # pylint: disable=broad-except raise self.skipTest( 'Skipping test because importing some modules failed: %r' % e) self.debugger_plugin_module = debugger_plugin # Populate the log directory with debugger event for run '.'. self.log_dir = self.get_temp_dir() file_prefix = tf.compat.as_bytes( os.path.join(self.log_dir, 'events.debugger')) writer = tf.pywrap_tensorflow.EventsWriter(file_prefix) device_name = '/job:localhost/replica:0/task:0/cpu:0' writer.WriteEvent( self._CreateEventWithDebugNumericSummary( device_name=device_name, op_name='layers/Matmul', output_slot=0, wall_time=42, step=2, list_of_values=(list(range(12)) + [float(tf.float32.as_datatype_enum), 1.0, 3.0]))) writer.WriteEvent( self._CreateEventWithDebugNumericSummary( device_name=device_name, op_name='layers/Matmul', output_slot=1, wall_time=43, step=7, list_of_values=( list(range(12)) + [float(tf.float64.as_datatype_enum), 2.0, 3.0, 3.0]))) writer.WriteEvent( self._CreateEventWithDebugNumericSummary( device_name=device_name, op_name='logits/Add', output_slot=0, wall_time=1337, step=7, list_of_values=(list(range(12)) + [float(tf.int32.as_datatype_enum), 2.0, 3.0, 3.0]))) writer.WriteEvent( self._CreateEventWithDebugNumericSummary( device_name=device_name, op_name='logits/Add', output_slot=0, wall_time=1338, step=8, list_of_values=(list(range(12)) + [float(tf.int16.as_datatype_enum), 0.0]))) writer.Close() # Populate the log directory with debugger event for run 'run_foo'. run_foo_directory = os.path.join(self.log_dir, 'run_foo') os.mkdir(run_foo_directory) file_prefix = tf.compat.as_bytes( os.path.join(run_foo_directory, 'events.debugger')) writer = tf.pywrap_tensorflow.EventsWriter(file_prefix) writer.WriteEvent( self._CreateEventWithDebugNumericSummary( device_name=device_name, op_name='layers/Variable', output_slot=0, wall_time=4242, step=42, list_of_values=(list(range(12)) + [float(tf.int16.as_datatype_enum), 1.0, 8.0]))) writer.Close() # Start a server that will receive requests and respond with health pills. self.multiplexer = event_multiplexer.EventMultiplexer({ '.': self.log_dir, 'run_foo': run_foo_directory, }) self.debugger_data_server_grpc_port = portpicker.pick_unused_port() # Fake threading behavior so that threads are synchronous. tf.test.mock.patch('threading.Thread.start', threading.Thread.run).start() self.mock_debugger_data_server = tf.test.mock.Mock( debugger_server_lib.DebuggerDataServer) self.mock_debugger_data_server_class = tf.test.mock.Mock( debugger_server_lib.DebuggerDataServer, return_value=self.mock_debugger_data_server) tf.test.mock.patch.object( debugger_server_lib, 'DebuggerDataServer', self.mock_debugger_data_server_class).start() self.context = base_plugin.TBContext( logdir=self.log_dir, multiplexer=self.multiplexer) self.plugin = debugger_plugin.DebuggerPlugin(self.context) self.plugin.listen(self.debugger_data_server_grpc_port) wsgi_app = application.TensorBoardWSGIApp( self.log_dir, [self.plugin], self.multiplexer, reload_interval=0, path_prefix='') self.server = werkzeug_test.Client(wsgi_app, wrappers.BaseResponse) # The debugger data server should be started at the correct port. self.mock_debugger_data_server_class.assert_called_once_with( self.debugger_data_server_grpc_port, self.log_dir) mock_debugger_data_server = self.mock_debugger_data_server start = mock_debugger_data_server.start_the_debugger_data_receiving_server self.assertEqual(1, start.call_count)
def ConstructDebuggerPluginWithGrpcPort(context): debugger_plugin = debugger_plugin_lib.DebuggerPlugin(context) if FLAGS.debugger_data_server_grpc_port is not None: debugger_plugin.listen(FLAGS.debugger_data_server_grpc_port) return debugger_plugin