コード例 #1
0
  def test_raises_value_error_with_unrecognized_computation_selection(self):
    executor = create_test_executor()
    source, _ = executor_test_utils.create_whimsy_computation_tuple()
    type_signature = computation_types.StructType([])
    # A `ValueError` will be raised because `create_value` can not handle the
    # following `pb.Selection`, because does not set either a name or an index
    # field.
    value = pb.Computation(
        type=type_serialization.serialize_type(type_signature),
        selection=pb.Selection(source=source))

    with self.assertRaises(ValueError):
      self.run_sync(executor.create_value(value, type_signature))
コード例 #2
0
class FederatingExecutorCreateValueTest(executor_test_utils.AsyncTestCase,
                                        parameterized.TestCase):

  # pyformat: disable
  @parameterized.named_parameters([
      ('placement_literal',
       *executor_test_utils.create_whimsy_placement_literal()),
      ('computation_intrinsic',
       *executor_test_utils.create_whimsy_computation_intrinsic()),
      ('computation_lambda',
       *executor_test_utils.create_whimsy_computation_lambda_empty()),
      ('computation_tensorflow',
       *executor_test_utils.create_whimsy_computation_tensorflow_empty()),
      ('federated_type_at_clients',
       *executor_test_utils.create_whimsy_value_at_clients()),
      ('federated_type_at_clients_all_equal',
       *executor_test_utils.create_whimsy_value_at_clients_all_equal()),
      ('federated_type_at_server',
       *executor_test_utils.create_whimsy_value_at_server()),
      ('unplaced_type',
       *executor_test_utils.create_whimsy_value_unplaced()),
  ] + get_named_parameters_for_supported_intrinsics())
  # pyformat: enable
  def test_returns_value_with_value_and_type(self, value, type_signature):
    executor = create_test_executor()

    result = self.run_sync(executor.create_value(value, type_signature))

    self.assertIsInstance(result, executor_value_base.ExecutorValue)
    self.assertEqual(result.type_signature.compact_representation(),
                     type_signature.compact_representation())

  # pyformat: disable
  @parameterized.named_parameters([
      ('placement_literal',
       *executor_test_utils.create_whimsy_placement_literal()),
      ('computation_intrinsic',
       *executor_test_utils.create_whimsy_computation_intrinsic()),
      ('computation_lambda',
       *executor_test_utils.create_whimsy_computation_lambda_empty()),
      ('computation_tensorflow',
       *executor_test_utils.create_whimsy_computation_tensorflow_empty()),
  ])
  # pyformat: enable
  def test_returns_value_with_value_only(self, value, type_signature):
    executor = create_test_executor()

    result = self.run_sync(executor.create_value(value))

    self.assertIsInstance(result, executor_value_base.ExecutorValue)
    self.assertEqual(result.type_signature.compact_representation(),
                     type_signature.compact_representation())

  # pyformat: disable
  @parameterized.named_parameters([
      ('computation_intrinsic',
       *executor_test_utils.create_whimsy_computation_intrinsic()),
      ('computation_lambda',
       *executor_test_utils.create_whimsy_computation_lambda_empty()),
      ('computation_tensorflow',
       *executor_test_utils.create_whimsy_computation_tensorflow_empty()),
  ])
  # pyformat: enable
  def test_returns_value_with_computation_impl(self, proto, type_signature):
    executor = create_test_executor()
    value = computation_impl.ConcreteComputation(
        proto, context_stack_impl.context_stack)

    result = self.run_sync(executor.create_value(value, type_signature))

    self.assertIsInstance(result, executor_value_base.ExecutorValue)
    self.assertEqual(result.type_signature.compact_representation(),
                     type_signature.compact_representation())

  # pyformat: disable
  @parameterized.named_parameters([
      ('federated_type_at_clients',
       *executor_test_utils.create_whimsy_value_at_clients()),
      ('federated_type_at_clients_all_equal',
       *executor_test_utils.create_whimsy_value_at_clients_all_equal()),
      ('federated_type_at_server',
       *executor_test_utils.create_whimsy_value_at_server()),
      ('unplaced_type',
       *executor_test_utils.create_whimsy_value_unplaced()),
  ] + get_named_parameters_for_supported_intrinsics())
  # pyformat: enable
  def test_raises_type_error_with_value_only(self, value, type_signature):
    del type_signature  # Unused.
    executor = create_test_executor()

    with self.assertRaises(TypeError):
      self.run_sync(executor.create_value(value))

  # pyformat: disable
  @parameterized.named_parameters([
      ('placement_literal',
       *executor_test_utils.create_whimsy_placement_literal()),
      ('computation_call',
       *executor_test_utils.create_whimsy_computation_call()),
      ('computation_intrinsic',
       *executor_test_utils.create_whimsy_computation_intrinsic()),
      ('computation_lambda',
       *executor_test_utils.create_whimsy_computation_lambda_empty()),
      ('computation_selection',
       *executor_test_utils.create_whimsy_computation_selection()),
      ('computation_tensorflow',
       *executor_test_utils.create_whimsy_computation_tensorflow_empty()),
      ('computation_tuple',
       *executor_test_utils.create_whimsy_computation_tuple()),
      ('federated_type_at_clients',
       *executor_test_utils.create_whimsy_value_at_clients()),
      ('federated_type_at_clients_all_equal',
       *executor_test_utils.create_whimsy_value_at_clients_all_equal()),
      ('federated_type_at_server',
       *executor_test_utils.create_whimsy_value_at_server()),
      ('unplaced_type',
       *executor_test_utils.create_whimsy_value_unplaced()),
  ] + get_named_parameters_for_supported_intrinsics())
  # pyformat: enable
  def test_raises_type_error_with_value_and_bad_type(self, value,
                                                     type_signature):
    del type_signature  # Unused.
    executor = create_test_executor()
    bad_type_signature = computation_types.TensorType(tf.string)

    with self.assertRaises(TypeError):
      self.run_sync(executor.create_value(value, bad_type_signature))

  # pyformat: disable
  @parameterized.named_parameters([
      ('computation_call',
       *executor_test_utils.create_whimsy_computation_call()),
      ('computation_placement',
       *executor_test_utils.create_whimsy_computation_placement()),
      ('computation_reference',
       *executor_test_utils.create_whimsy_computation_reference()),
      ('computation_selection',
       *executor_test_utils.create_whimsy_computation_selection()),
      ('computation_tuple',
       *executor_test_utils.create_whimsy_computation_tuple()),
  ])
  # pyformat: enable
  def test_raises_value_error_with_value(self, value, type_signature):
    executor = create_test_executor()

    with self.assertRaises(ValueError):
      self.run_sync(executor.create_value(value, type_signature))

  def test_raises_value_error_with_unrecognized_computation_intrinsic(self):
    executor = create_test_executor()
    type_signature = computation_types.TensorType(tf.int32)
    # A `ValueError` will be raised because `create_value` can not recognize the
    # following intrinsic, because it has not been added to the intrinsic
    # registry.
    type_signature = computation_types.TensorType(tf.int32)
    value = pb.Computation(
        type=type_serialization.serialize_type(type_signature),
        intrinsic=pb.Intrinsic(uri='unregistered_intrinsic'))

    with self.assertRaises(ValueError):
      self.run_sync(executor.create_value(value, type_signature))

  def test_raises_value_error_with_unrecognized_computation_selection(self):
    executor = create_test_executor()
    source, _ = executor_test_utils.create_whimsy_computation_tuple()
    type_signature = computation_types.StructType([])
    # A `ValueError` will be raised because `create_value` can not handle the
    # following `pb.Selection`, because does not set either a name or an index
    # field.
    value = pb.Computation(
        type=type_serialization.serialize_type(type_signature),
        selection=pb.Selection(source=source))

    with self.assertRaises(ValueError):
      self.run_sync(executor.create_value(value, type_signature))

  # pyformat: disable
  @parameterized.named_parameters([
      ('intrinsic_def_federated_aggregate',
       *executor_test_utils.create_whimsy_intrinsic_def_federated_aggregate()),
      ('intrinsic_def_federated_apply',
       *executor_test_utils.create_whimsy_intrinsic_def_federated_apply()),
      ('intrinsic_def_federated_eval_at_server',
       *executor_test_utils.create_whimsy_intrinsic_def_federated_eval_at_server()),
      ('intrinsic_def_federated_mean',
       *executor_test_utils.create_whimsy_intrinsic_def_federated_mean()),
      ('intrinsic_def_federated_sum',
       *executor_test_utils.create_whimsy_intrinsic_def_federated_sum()),
      ('intrinsic_def_federated_value_at_server',
       *executor_test_utils.create_whimsy_intrinsic_def_federated_value_at_server()),
      ('intrinsic_def_federated_weighted_mean',
       *executor_test_utils.create_whimsy_intrinsic_def_federated_weighted_mean()),
      ('intrinsic_def_federated_zip_at_server',
       *executor_test_utils.create_whimsy_intrinsic_def_federated_zip_at_server()),
      ('federated_type_at_server',
       *executor_test_utils.create_whimsy_value_at_server()),
  ])
  # pyformat: enable
  def test_raises_value_error_with_no_target_executor_server(
      self, value, type_signature):
    factory = federated_resolving_strategy.FederatedResolvingStrategy.factory({
        placements.CLIENTS: eager_tf_executor.EagerTFExecutor(),
    })
    executor = federating_executor.FederatingExecutor(
        factory, eager_tf_executor.EagerTFExecutor())
    value, type_signature = executor_test_utils.create_whimsy_value_at_server()

    with self.assertRaises(ValueError):
      self.run_sync(executor.create_value(value, type_signature))

  def test_raises_value_error_with_unexpected_federated_type_at_clients(self):
    executor = create_test_executor()
    value = [10, 20]
    type_signature = computation_types.at_clients(tf.int32)

    with self.assertRaises(executors_errors.CardinalityError):
      self.run_sync(executor.create_value(value, type_signature))

  def test_raises_type_error_with_unexpected_federated_type_at_clients_all_equal(
      self):
    executor = create_test_executor()
    value = [10] * 3
    type_signature = computation_types.at_clients(tf.int32, all_equal=True)

    with self.assertRaises(TypeError):
      self.run_sync(executor.create_value(value, type_signature))