code: def _test_helper(self, loss_type, test_type):
      if self.expected is None:
          raise FileNotFoundError("Expected data is none")
      expected = self.expected[loss_type]
      expected_list = expected["values"]
      print(expected_list)
      actual_list = self._get_actual(loss_type)
      assert (
          actual_list is not None
      ), f"No TensorBoard events file was found in the logs for {loss_type}."
      actual_list_sliced = actual_list[
          expected["start_step"] : expected["end_step"] : expected[
              "step_interval"
          ]
      ]
      for i, (expected_val, actual_val) in enumerate(
          zip(expected_list, actual_list_sliced)
      ):
          step = i * expected["step_interval"]
          print(f"Checking step {step} against expected {i}")
          if test_type == TypeOfTest.APPROX:
              assert actual_val == pytest.approx(
                  expected=expected_val, rel=self.margin_loss
              ), f"The loss at step {step} should be approximately {expected_val} but it is {actual_val}."
          else:
              assert (
                  actual_val == expected_val
              ), f"The value at step {step} should be {expected_val} but it is {actual_val}."
  
file_path: megatron-lm/tests/functional_tests/python_test_utils/test_ci_pipeline.py
imports: import os
  import json
  import pytest
  import sys
  import glob
  from .common import read_tb_logs_as_list, TypeOfTest
label_desc: Use image node_id 3 for calling the TestCIPipeline obj's underlying member method code with example usage: obj._test_helper(loss_type, test_type) without return types