code: def test_lightning_hetero_node_data(get_dataset):
      import pytorch_lightning as pl
  
      data = get_dataset(name="hetero")[0]
  
      model = LinearHeteroNodeModule(
          data["paper"].num_features, int(data["paper"].y.max()) + 1
      )
  
      devices = torch.cuda.device_count()
      strategy = pl.strategies.DDPStrategy(accelerator="gpu")
  
      trainer = pl.Trainer(
          strategy=strategy,
          devices=devices,
          max_epochs=5,
          log_every_n_steps=1,
      )
      datamodule = LightningNodeData(
          data,
          loader="neighbor",
          num_neighbors=[5],
          batch_size=32,
          num_workers=3,
      )
      assert isinstance(datamodule.graph_sampler, NeighborSampler)
      original_x = data["paper"].x.clone()
      trainer.fit(model, datamodule)
      trainer.test(model, datamodule)
      assert torch.all(
          data["paper"].x > original_x
      )  # Ensure shared data.
      assert trainer.validate_loop._data_source.is_defined()
      assert trainer.test_loop._data_source.is_defined()
  
imports: import math
  import pytest
  import torch
  import torch.nn.functional
  from torch import Tensor
  from torch_geometric.data import Data, HeteroData
  from torch_geometric.data.lightning import LightningDataset, LightningLinkData, LightningNodeData
  from torch_geometric.nn import global_mean_pool
  from torch_geometric.sampler import BaseSampler, NeighborSampler
  from torch_geometric.testing import MyFeatureStore, MyGraphStore, get_random_edge_index, onlyCUDA, onlyFullTest, onlyNeighborSampler, onlyOnline, withPackage
label_desc: Use image node_id 3 for calling a global function with example usage: test_lightning_hetero_node_data(get_dataset) without return types