code: def workflow(als_max_iter, keras_hidden_units, max_row_limit):
      # Note: The entrypoint names are defined in MLproject. The artifact directories
      # are documented by each step's .py file.
      with mlflow.start_run() as active_run:
          os.environ["SPARK_CONF_DIR"] = os.path.abspath(".")
          git_commit = active_run.data.tags.get(
              mlflow_tags.MLFLOW_GIT_COMMIT
          )
          load_raw_data_run = _get_or_run(
              "load_raw_data", {}, git_commit
          )
          ratings_csv_uri = os.path.join(
              load_raw_data_run.info.artifact_uri, "ratings-csv-dir"
          )
          etl_data_run = _get_or_run(
              "etl_data",
              {
                  "ratings_csv": ratings_csv_uri,
                  "max_row_limit": max_row_limit,
              },
              git_commit,
          )
          ratings_parquet_uri = os.path.join(
              etl_data_run.info.artifact_uri, "ratings-parquet-dir"
          )
  
          # We specify a spark-defaults.conf to override the default driver memory. ALS requires
          # significant memory. The driver memory property cannot be set by the application itself.
          als_run = _get_or_run(
              "als",
              {
                  "ratings_data": ratings_parquet_uri,
                  "max_iter": str(als_max_iter),
              },
              git_commit,
          )
          als_model_uri = os.path.join(
              als_run.info.artifact_uri, "als-model"
          )
  
          keras_params = {
              "ratings_data": ratings_parquet_uri,
              "als_model_uri": als_model_uri,
              "hidden_units": keras_hidden_units,
          }
          _get_or_run(
              "train_keras", keras_params, git_commit, use_cache=False
          )
  
file_path: mlflow/examples/multistep_workflow/main.py
imports: import os
  import click
  import mlflow
  from mlflow.entities import RunStatus
  from mlflow.tracking import MlflowClient
  from mlflow.tracking.fluent import _get_experiment_id
  from mlflow.utils import mlflow_tags
  from mlflow.utils.logging_utils import eprint
label_desc: Use image node_id 3 for calling a global function with example usage: workflow(als_max_iter, keras_hidden_units, max_row_limit) without return types