Source code for torch_lattice.nn.functional.conv.conv_config
from typing import Any, Dict, Tuple, Union
from enum import Enum
from .utils import AttributeDict
from .conv_mode import ConvMode, get_kmap_mode, get_downsample_mode
[docs]
class Dataflow(Enum):
ImplicitGEMM = 0
GatherScatter = 1
FetchOnDemand = 2
CodedCSR = 3
_global_conv_config = None
_default_conv_config = AttributeDict(
[
("dataflow", Dataflow.ImplicitGEMM),
("ifsort", False),
("kmap_mode", "hashmap_on_the_fly"),
("downsample_mode", "spconv"),
("split_mask_num", 1),
("split_mask_num_bwd", 3),
("wgrad_split_k", "auto"),
("IGEMM_center_only", False),
("epsilon", 0.0),
("mm_thresh", 0),
("FOD_fusion", False),
]
)
[docs]
def keys_check(conv_config):
flag = False
if "dataflow" not in conv_config:
flag = True
conv_config["dataflow"] = _default_conv_config["dataflow"]
if "ifsort" not in conv_config:
flag = True
conv_config["ifsort"] = _default_conv_config["ifsort"]
if "kmap_mode" not in conv_config:
flag = True
conv_config["kmap_mode"] = _default_conv_config["kmap_mode"]
if "downsample_mode" not in conv_config:
flag = True
conv_config["downsample_mode"] = _default_conv_config["downsample_mode"]
if "split_mask_num" not in conv_config:
flag = True
conv_config["split_mask_num"] = _default_conv_config["split_mask_num"]
if "split_mask_num_bwd" not in conv_config:
flag = True
conv_config["split_mask_num_bwd"] = _default_conv_config["split_mask_num_bwd"]
if "wgrad_split_k" not in conv_config:
flag = True
conv_config["wgrad_split_k"] = _default_conv_config["wgrad_split_k"]
if "IGEMM_center_only" not in conv_config:
flag = True
conv_config["IGEMM_center_only"] = _default_conv_config[
"IGEMM_center_only"
]
if "epsilon" not in conv_config:
flag = True
conv_config["epsilon"] = _default_conv_config["epsilon"]
if "mm_thresh" not in conv_config:
flag = True
conv_config["mm_thresh"] = _default_conv_config["mm_thresh"]
if "FOD_fusion" not in conv_config:
flag = True
conv_config["FOD_fusion"] = _default_conv_config["FOD_fusion"]
if flag == True:
print(
"Warning: Missing fields for ConvConfig. Use default configs for these fields."
)
[docs]
def get_global_conv_config():
global _global_conv_config
return _global_conv_config
[docs]
def set_global_conv_config(conv_config):
global _global_conv_config
keys_check(conv_config)
_global_conv_config = conv_config
[docs]
def clear_global_conv_config():
global _global_conv_config
_global_conv_config = None
[docs]
def get_default_conv_config(
conv_mode: ConvMode = ConvMode.mode0, training: bool = False
):
config = _default_conv_config.copy()
# if training:
# config.ifsort = True
if conv_mode == ConvMode.mode0:
pass
elif conv_mode == ConvMode.mode1:
config.ifsort = True
elif conv_mode == ConvMode.mode2:
config.ifsort = True
config.split_mask_num = 3
return config