code: def test_default_resource_request(self):
      config = (
          PPOConfig()
          .rollouts(
              num_rollout_workers=2,
          )
          .training(
              model={"fcnet_hiddens": [10]},
              lr=tune.grid_search([0.1, 0.01, 0.001]),
          )
          .environment("CartPole-v1")
          .framework("torch")
          .resources(placement_strategy="SPREAD", num_cpus_per_worker=2)
      )
      # 3 Trials: Can only run 1 at a time (num_cpus=6; needed: 5).
  
      tune.Tuner(
          PPO,
          param_space=config,
          run_config=air.RunConfig(
              stop={"training_iteration": 2},
              verbose=2,
              callbacks=[_TestCallback()],
          ),
          tune_config=tune.TuneConfig(reuse_actors=False),
      ).fit()
  
file_path: ray/python/ray/rllib/tests/test_placement_groups.py
imports: import os
  import unittest
  import ray
  from ray import air
  from ray import tune
  from ray.tune import Callback
  from ray.rllib.algorithms.ppo import PPO, PPOConfig
  from ray.tune.experiment import Trial
  from ray.tune.execution.placement_groups import PlacementGroupFactory
label_desc: Use image node_id 4 for calling the TestPlacementGroups obj's underlying member method code with example usage: obj.test_default_resource_request() without return types