code: def visualize_speed_up(
      file_path: Optional[str] = None,
      output_path: Optional[str] = None,
      devices: Union[List[str], str] = "all",
      backends: Union[List[str], str] = "all",
      labels: Optional[Union[List[str], str]] = None,
  ):
      """Visualize the speed up results stored in the csv.
  
      Parameters
      ----------
      file_path
          The path of the csv file where the results are stored.
      output_path
          The path to the png file to store the graphs in.
      devices
          A filter for the devices for which graphs should be generated.
      backends
          A filter for the backends for which graphs should be generated.
      labels
          A filter for the labels for which graphs should be generated.
  
      Examples
      --------
      Visualize for given set of devices and backends:
  
      >>> from benchmark import visualize_speed_up
      >>> visualize_speed_up(
      ...     file_path="./ivy/report.csv",
      ...     output_path="./ivy/save_fig.png",
      ...     backends=["torch", "jax"],
      ...     devices=["cpu", "gpu:0"],
      ... )
  
      Visualize for a specific experiment label:
  
      >>> from benchmark import visualize_speed_up
      >>> visualize_speed_up(
      ...     file_path="./ivy/report.csv",
      ...     output_path="./ivy/save_fig.png",
      ...     backends=["jax"],
      ...     devices=["gpu:0"],
      ...     labels=["GELU"],
      ... )
      """
      file_path = ivy.default(file_path, "./report.csv")
      output_path = ivy.default(output_path, "./saved_fig.png")
      df = pd.read_csv(file_path)
      df = df.query("label in @labels") if labels is not None else df
      backends = (
          list(df["backend"].unique())
          if backends == "all"
          else backends
      )
      devices = (
          list(df["device"].unique()) if devices == "all" else devices
      )
      fig, axes = plt.subplots(len(devices), len(backends))
      fig.set_figwidth(30)
      fig.set_figheight(12)
      fig.tight_layout(pad=10.0)
      axes = (
          axes if isinstance(axes, np.ndarray) else np.asarray([axes])
      )
      while len(axes.shape) < 2:
          if len(devices) > len(backends):
              axes = np.expand_dims(axes, len(axes.shape))
          else:
              axes = np.expand_dims(axes, 0)
      for device, axis in zip(devices, axes):
          for backend, ax in zip(backends, axis):
              ax.set_title(f"{backend} : {device}", {"fontsize": 18})
              ax.set_ylabel(
                  "Percent Speed up on compiling", {"fontsize": 18}
              )
              ax.tick_params(axis="both", labelsize=15)
              query = df.query(
                  "backend == @backend and device == @device"
              )
              if not query.empty:
                  ax.violinplot(query["percent_speed_up"])
              else:
                  warnings.warn(
                      f"No records matching the filters passedbackend={backend} and"
                      f" device={device}"
                  )
      plt.savefig(output_path)
      print(f"plot saved to {output_path} ...")
  
imports: from typing import Any, Callable, Dict, List, Optional, Tuple, Union
  import functools
  import time
  import os
  import copy
  import importlib
  import warnings
  import numpy
  import pandas
  import matplotlib.pyplot
  import seaborn
  import ivy
label_desc: Use image node_id 6 for calling a global function with example usage: visualize_speed_up(file_path, output_path, devices, backends, labels) without return types