code: def test_ppo_no_preprocessors_gpu(self):
      # Same test as test_ppo, but also test if we are able to move models and tensors
      # on the same device when not using preprocessors.
      # (Artur) This covers a superposition of these edge cases that can lead to
      # obscure errors.
      config = (
          PPOConfig()
          .rollouts(num_rollout_workers=2, rollout_fragment_length=50)
          .training(
              train_batch_size=100,
              num_sgd_iter=1,
              sgd_minibatch_size=50,
              model={
                  "fcnet_hiddens": [10],
              },
          )
          .experimental(_disable_preprocessor_api=True)
          .resources(num_gpus=1)
      )
  
      # (Artur): This test only works under the old ModelV2 API because we
      # don't offer arbitrarily complex Models under the RLModules API without
      # preprocessors. Such input spaces require custom implementations of the
      # input space.
  
      check_supported_spaces(
          "PPO",
          config,
          check_bounds=True,
          frameworks=["torch", "tf"],
          use_gpu=True,
      )
  
imports: import logging
  import unittest
  import ray
  from ray.rllib.algorithms.appo import APPOConfig
  from ray.rllib.algorithms.dqn import DQNConfig
  from ray.rllib.algorithms.impala import ImpalaConfig
  from ray.rllib.algorithms.ppo import PPOConfig
  from ray.rllib.algorithms.sac import SACConfig
  from ray.rllib.utils.test_utils import check_supported_spaces
label_desc: Use image node_id 3 for calling the TestSupportedSpacesPPONoPreprocessorGPU obj's underlying member method code with example usage: obj.test_ppo_no_preprocessors_gpu() without return types