code: def _build_module_tree():
      """Build a tree of DALI submodules, starting with empty string as a root one, like:
      {
          "" : {
              "decoders" : {},
              "experimental": {
                  "readers": {}
              }
              "readers" : {},
          }
      }
      """
      module_tree = {}
      processed = set()
      for schema_name in _registry._all_registered_ops():
          schema = _b.TryGetSchema(schema_name)
          if schema is None:
              continue
          if schema.IsDocHidden() or schema.IsInternal():
              continue
          (
              dotted_name,
              module_nesting,
              op_name,
          ) = _names._process_op_name(schema_name)
          if dotted_name not in processed:
              module_nesting.insert(0, "")  # add the top-level module
              curr_dict = module_tree
              # add all submodules on the path
              for curr_module in module_nesting:
                  if curr_module not in curr_dict:
                      curr_dict[curr_module] = dict()
                  curr_dict = curr_dict[curr_module]
      return module_tree
  
imports: from inspect import Parameter, Signature
  import ast
  import os
  from pathlib import Path
  from contextlib import closing
  from typing import Union, Optional
  from typing import Sequence, List, Any
  from nvidia.dali import backend
  from nvidia.dali import types
  from nvidia.dali.ops import _registry, _names, _docs
  from nvidia.dali import types
  from nvidia.dali import ops, fn
label_desc: Use image node_id 20 for calling a global function with example usage: _build_module_tree() and returns: module_tree