code: def test_training_determinism_ray_backend(
      csv_filename, tmpdir, ray_cluster_4cpu
  ):
      experiment_output_1, experiment_output_2 = train_twice(
          "ray", csv_filename, tmpdir
      )
  
      eval_stats_1, train_stats_1, _, _ = experiment_output_1
      eval_stats_2, train_stats_2, _, _ = experiment_output_2
  
      assert_all_finite(eval_stats_1)
      assert_all_finite(eval_stats_2)
      assert_all_finite(train_stats_1)
      assert_all_finite(train_stats_2)
  
      np.testing.assert_equal(eval_stats_1, eval_stats_2)
      np.testing.assert_equal(train_stats_1, train_stats_2)
  
file_path: ludwig/tests/ludwig/models/test_training_determinism.py
imports: import logging
  import os
  import numpy
  import pytest
  from ludwig.api import LudwigModel
  from ludwig.constants import BATCH_SIZE, EVAL_BATCH_SIZE, TRAINER
  from ludwig.utils.numerical_test_utils import assert_all_finite
  from tests.integration_tests.utils import audio_feature, bag_feature, binary_feature, category_feature, date_feature, generate_data, h3_feature, image_feature, number_feature, sequence_feature, set_feature, text_feature, timeseries_feature, vector_feature
label_desc: Use image node_id 1 for calling a global function with example usage: test_training_determinism_ray_backend(csv_filename, tmpdir, ray_cluster_4cpu) without return types