|
|
|
from typing import Any, Callable, Dict, Optional, Union
|
|
|
|
|
|
|
|
import torch
|
|
|
|
|
|
|
|
from colossalai.fx import ColoGraphModule
|
|
|
|
from colossalai.fx._compatibility import compatibility
|
|
|
|
|
|
|
|
from .tracer import ColoTracer
|
|
|
|
|
|
|
|
|
|
|
|
@compatibility(is_backward_compatible=True)
|
|
|
|
def symbolic_trace(
|
|
|
|
root: Union[torch.nn.Module, Callable[..., Any]],
|
|
|
|
concrete_args: Optional[Dict[str, Any]] = None,
|
|
|
|
meta_args: Optional[Dict[str, Any]] = None,
|
|
|
|
trace_act_ckpt=False,
|
|
|
|
) -> ColoGraphModule:
|
|
|
|
"""
|
|
|
|
Symbolic tracing API
|
|
|
|
|
|
|
|
Given an ``nn.Module`` or function instance ``root``, this function will return a ``ColoGraphModule``
|
|
|
|
constructed by recording operations seen while tracing through ``root``.
|
|
|
|
|
|
|
|
With ``meta_args``, we can trace the model that are untraceable subject to control flow. If specified using
|
|
|
|
``meta_args`` only, the tracing can be done ahead of time.
|
|
|
|
|
|
|
|
Note that ``meta_args`` are kwargs, which contains the key of the argument's names and the value of the
|
|
|
|
argument's values.
|
|
|
|
|
|
|
|
Uses:
|
|
|
|
>>> model = ...
|
|
|
|
|
|
|
|
# if this works
|
|
|
|
>>> gm = symbolic_trace(model, concrete_args=concrete_args)
|
|
|
|
|
|
|
|
# else try this
|
|
|
|
>>> gm = symbolic_trace(model, concrete_args=concrete_args, meta_args={'x': torch.rand(1, 3, 224, 224, device='meta')})
|
|
|
|
|
|
|
|
Args:
|
|
|
|
root (Union[torch.nn.Module, Callable[..., Any]]): Module or function to be traced and converted
|
|
|
|
into a Graph representation.
|
|
|
|
concrete_args (Optional[Dict[str, Any]], optional): Concrete arguments to be used for tracing.
|
|
|
|
meta_args (Optional[Dict[str, Any]], optional): Inputs to be partially specialized, special for ``ColoTracer``.
|
|
|
|
Defaults to None.
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
ColoGraphModule: A ``ColoGraphModule`` created from the recorded operations from ``root``.
|
|
|
|
|
|
|
|
Warnings:
|
|
|
|
This API is still under development and can incur some bugs. Feel free to report any bugs to the Colossal-AI team.
|
|
|
|
|
|
|
|
"""
|
|
|
|
graph = ColoTracer(trace_act_ckpt=trace_act_ckpt).trace(root, concrete_args=concrete_args, meta_args=meta_args)
|
|
|
|
name = root.__class__.__name__ if isinstance(root, torch.nn.Module) else root.__name__
|
|
|
|
return ColoGraphModule(root, graph, name)
|