371 lines
12 KiB
Python
371 lines
12 KiB
Python
# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections import defaultdict
|
|
from typing import TYPE_CHECKING, TypedDict
|
|
|
|
if TYPE_CHECKING:
|
|
from paddle import Tensor
|
|
from paddle._typing.dtype_like import _DTypeLiteral
|
|
|
|
# _g_default_config[category][field] = default_value
|
|
_g_default_config = defaultdict(dict)
|
|
|
|
|
|
def get_category_default_config(category):
|
|
return _g_default_config[category]
|
|
|
|
|
|
def set_category_default_config(category, default_value):
|
|
_g_default_config[category] = default_value
|
|
|
|
|
|
def get_field_default_config(category, field):
|
|
return _g_default_config[category][field]
|
|
|
|
|
|
def set_field_default_config(category, field, default_value):
|
|
_g_default_config[category][field] = default_value
|
|
|
|
|
|
NOT_FOUND = "not_found"
|
|
|
|
#########################################
|
|
# base configuration
|
|
#########################################
|
|
BASE = "base"
|
|
set_field_default_config(BASE, "auto_mode", "semi")
|
|
set_field_default_config(BASE, "gradient_scale", True)
|
|
set_field_default_config(BASE, "gradient_scale_using_allreduce_avg", False)
|
|
set_field_default_config(BASE, "use_cache", True)
|
|
set_field_default_config(BASE, "return_numpy", True)
|
|
set_field_default_config(BASE, "all_ranks", False)
|
|
set_field_default_config(BASE, "split_data", True)
|
|
set_field_default_config(BASE, "seed", None)
|
|
set_field_default_config(BASE, "reinit", False) # Only for debug
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _BaseConfig(TypedDict, total=False): # noqa: PYI049
|
|
auto_mode: str
|
|
gradient_scale: bool
|
|
gradient_scale_using_allreduce_avg: bool
|
|
use_cache: bool
|
|
return_numpy: bool
|
|
all_ranks: bool
|
|
split_data: bool
|
|
seed: int | None
|
|
reinit: bool
|
|
|
|
|
|
#########################################
|
|
# recompute configuration
|
|
#########################################
|
|
RECOMPUTE = "recompute"
|
|
set_field_default_config(RECOMPUTE, "enable", False)
|
|
set_field_default_config(RECOMPUTE, "checkpoints", [])
|
|
set_field_default_config(RECOMPUTE, "no_recompute_segments", [])
|
|
set_field_default_config(RECOMPUTE, "sr", 0)
|
|
set_field_default_config(RECOMPUTE, "refined_ops_patterns", []) # List[Dict]
|
|
set_field_default_config(RECOMPUTE, "enable_tuning", False)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _RefinedOpsPatterns(TypedDict, total=False):
|
|
main_ops: list[str]
|
|
num: int
|
|
pre_ops: list[str]
|
|
suf_ops: list[str]
|
|
|
|
class _RecomputeConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
checkpoints: list[Tensor]
|
|
no_recompute_segments: list[int]
|
|
sr: int
|
|
refined_ops_patterns: list[_RefinedOpsPatterns]
|
|
enable_tuning: bool
|
|
|
|
|
|
#########################################
|
|
# AMP configuration
|
|
#########################################
|
|
AMP = "amp"
|
|
set_field_default_config(AMP, "enable", False)
|
|
set_field_default_config(AMP, "dtype", "float16")
|
|
set_field_default_config(AMP, "level", "o1")
|
|
set_field_default_config(AMP, "init_loss_scaling", 32768.0)
|
|
set_field_default_config(AMP, "incr_every_n_steps", 1000)
|
|
set_field_default_config(AMP, "decr_every_n_nan_or_inf", 2)
|
|
set_field_default_config(AMP, "incr_ratio", 2.0)
|
|
set_field_default_config(AMP, "decr_ratio", 0.8)
|
|
set_field_default_config(AMP, "use_dynamic_loss_scaling", True)
|
|
set_field_default_config(AMP, "custom_white_list", [])
|
|
set_field_default_config(AMP, "custom_black_list", [])
|
|
set_field_default_config(AMP, "custom_black_varnames", [])
|
|
set_field_default_config(AMP, "use_fp16_guard", False)
|
|
set_field_default_config(AMP, "use_bf16_guard", False)
|
|
set_field_default_config(AMP, "use_master_grad", False)
|
|
set_field_default_config(AMP, "use_promote", True)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _AMPConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
dtype: _DTypeLiteral
|
|
level: str
|
|
init_loss_scaling: float
|
|
incr_every_n_steps: int
|
|
decr_every_n_nan_or_inf: int
|
|
incr_ratio: float
|
|
decr_ratio: float
|
|
use_dynamic_loss_scaling: bool
|
|
custom_white_list: list[str]
|
|
custom_black_list: list[str]
|
|
custom_black_varnames: list[str]
|
|
use_fp16_guard: bool
|
|
use_bf16_guard: bool
|
|
use_master_grad: bool
|
|
use_promote: bool
|
|
|
|
|
|
#########################################
|
|
# sharding configuration
|
|
#########################################
|
|
SHARDING = "sharding"
|
|
set_field_default_config(SHARDING, "enable", False)
|
|
set_field_default_config(SHARDING, "stage", 1)
|
|
set_field_default_config(SHARDING, "degree", 8)
|
|
set_field_default_config(SHARDING, "enable_overlap", False)
|
|
set_field_default_config(SHARDING, "param_comm_stream_num", 1)
|
|
set_field_default_config(SHARDING, "grad_comm_stream_num", 1)
|
|
set_field_default_config(SHARDING, "param_bucket_size_numel", 1)
|
|
set_field_default_config(SHARDING, "grad_bucket_size_numel", 1)
|
|
set_field_default_config(SHARDING, "enable_hierarchical_comm", False)
|
|
set_field_default_config(SHARDING, "partition_algor", "greedy_even")
|
|
set_field_default_config(SHARDING, "enable_tuning", False)
|
|
set_field_default_config(SHARDING, "tuning_range", [])
|
|
set_field_default_config(SHARDING, "release_gradients", False)
|
|
set_field_default_config(SHARDING, "comm_buffer_size_MB", 256)
|
|
set_field_default_config(SHARDING, "enable_tensor_fusion", False)
|
|
set_field_default_config(SHARDING, "save_unbalanced_param", True)
|
|
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _ShardingConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
stage: int
|
|
degree: int
|
|
enable_overlap: bool
|
|
param_comm_stream_num: int
|
|
grad_comm_stream_num: int
|
|
param_bucket_size_numel: int
|
|
grad_bucket_size_numel: int
|
|
enable_hierarchical_comm: bool
|
|
partition_algor: str
|
|
enable_tuning: bool
|
|
tuning_range: list[int] | tuple[int, int]
|
|
|
|
|
|
#########################################
|
|
# gradient merge configuration
|
|
#########################################
|
|
GRADIENT_MERGE = "gradient_merge"
|
|
set_field_default_config(GRADIENT_MERGE, "enable", False)
|
|
set_field_default_config(GRADIENT_MERGE, "k_steps", 1)
|
|
set_field_default_config(GRADIENT_MERGE, "avg", True)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _GradientMergeConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
k_steps: int
|
|
avg: bool
|
|
|
|
|
|
#########################################
|
|
# pipeline configuration
|
|
#########################################
|
|
PIPELINE = "pipeline"
|
|
set_field_default_config(PIPELINE, "enable", False)
|
|
set_field_default_config(PIPELINE, "schedule_mode", "1F1B")
|
|
set_field_default_config(PIPELINE, "pp_degree", 1)
|
|
set_field_default_config(PIPELINE, "vpp_degree", 1)
|
|
set_field_default_config(PIPELINE, "vpp_seg_method", "")
|
|
set_field_default_config(PIPELINE, "micro_batch_size", 1)
|
|
set_field_default_config(PIPELINE, "accumulate_steps", 1)
|
|
set_field_default_config(PIPELINE, "generation_batch_size", 1)
|
|
set_field_default_config(PIPELINE, "enable_send_recv_overlap", False)
|
|
set_field_default_config(PIPELINE, "job_schedule_profiler_start", -1)
|
|
set_field_default_config(PIPELINE, "job_schedule_profiler_stop", -1)
|
|
set_field_default_config(PIPELINE, "program_runtimes", [61, 72, 71, 34, 3])
|
|
set_field_default_config(PIPELINE, "memory_limit_times", -1)
|
|
set_field_default_config(PIPELINE, "split_backward", False)
|
|
set_field_default_config(PIPELINE, "auto_parallel_sync_shared_params", False)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _PipelineConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
schedule_mode: str
|
|
pp_degree: int
|
|
vpp_degree: int
|
|
vpp_seg_method: str
|
|
micro_batch_size: int
|
|
accumulate_steps: int
|
|
generation_batch_size: int
|
|
enable_send_recv_overlap: bool
|
|
job_schedule_profiler_start: int
|
|
job_schedule_profiler_stop: int
|
|
split_backward: bool
|
|
auto_parallel_sync_shared_params: bool
|
|
|
|
|
|
#########################################
|
|
# quantization configuration
|
|
#########################################
|
|
QAT = "qat"
|
|
set_field_default_config(QAT, "enable", False)
|
|
set_field_default_config(QAT, "channel_wise_abs_max", True)
|
|
set_field_default_config(QAT, "weight_bits", 8)
|
|
set_field_default_config(QAT, "activation_bits", 8)
|
|
set_field_default_config(QAT, "not_quant_pattern", ['skip_quant'])
|
|
set_field_default_config(QAT, "algo", None)
|
|
set_field_default_config(QAT, "onnx_format", True)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _QATConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
channel_wise_abs_max: bool
|
|
weight_bits: int
|
|
activation_bits: int
|
|
not_quant_pattern: list[str]
|
|
algo: str | None
|
|
onnx_format: bool
|
|
|
|
|
|
#########################################
|
|
# auto tuning configuration
|
|
#########################################
|
|
TUNING = "tuning"
|
|
set_field_default_config(TUNING, "enable", False)
|
|
set_field_default_config(TUNING, "profile_start_step", 1)
|
|
set_field_default_config(TUNING, "profile_end_step", 1)
|
|
set_field_default_config(TUNING, "run_after_tuning", True)
|
|
set_field_default_config(TUNING, "debug", False)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _TuningConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
profile_start_step: int
|
|
profile_end_step: int
|
|
run_after_tuning: bool
|
|
debug: bool
|
|
|
|
|
|
#########################################
|
|
# dataset configuration
|
|
#########################################
|
|
DATASET = "dataset"
|
|
set_field_default_config(DATASET, "enable", False)
|
|
set_field_default_config(DATASET, "num_shards", 1)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _DatasetConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
num_shards: int
|
|
|
|
|
|
# #########################################
|
|
# # offload configuration
|
|
# #########################################
|
|
FUSEDLINEARPROMOTION = "fused_linear_promotion"
|
|
set_field_default_config(FUSEDLINEARPROMOTION, "enable", False)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _FusedLinearPromotionConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
|
|
|
|
#########################################
|
|
# fused passes configuration
|
|
#########################################
|
|
FUSED_PASSES = "fused_passes"
|
|
set_field_default_config(FUSED_PASSES, "enable", False)
|
|
set_field_default_config(FUSED_PASSES, "fused_passes_list", [])
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _FusedPassesConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
fused_passes_list: list[str]
|
|
|
|
|
|
#########################################
|
|
# data parallel configuration
|
|
#########################################
|
|
DP_OPTIMIZATION = "dp_optimization"
|
|
set_field_default_config(DP_OPTIMIZATION, "enable", False)
|
|
set_field_default_config(DP_OPTIMIZATION, "fuse_all_reduce_ops", True)
|
|
set_field_default_config(DP_OPTIMIZATION, "fuse_grad_size_in_MB", 32)
|
|
set_field_default_config(DP_OPTIMIZATION, "overlap_comm_cacl", True)
|
|
set_field_default_config(
|
|
DP_OPTIMIZATION, "gradient_sync_after_accumulate", False
|
|
)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _DPOptimizationConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|
|
fuse_all_reduce_ops: bool
|
|
fuse_grad_size_in_MB: int
|
|
overlap_comm_cacl: bool
|
|
gradient_sync_after_accumulate: bool
|
|
|
|
|
|
#########################################
|
|
# model parallel configuration
|
|
#########################################
|
|
MP_OPTIMIZATION = "mp_optimization"
|
|
set_field_default_config(
|
|
MP_OPTIMIZATION, "allreduce_matmul_grad_overlapping", False
|
|
)
|
|
set_field_default_config(MP_OPTIMIZATION, "replace_with_c_embedding", False)
|
|
|
|
set_field_default_config(
|
|
MP_OPTIMIZATION, "replace_with_parallel_cross_entropy", False
|
|
)
|
|
if TYPE_CHECKING:
|
|
|
|
class _MPOptimizationConfig(TypedDict, total=False): # noqa: PYI049
|
|
allreduce_matmul_grad_overlapping: bool
|
|
|
|
|
|
#########################################
|
|
# sequence parallel configuration
|
|
#########################################
|
|
SP_OPTIMIZATION = "sp_optimization"
|
|
set_field_default_config(SP_OPTIMIZATION, "enable", True)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _SPOptimizationConfig(TypedDict, total=False): # noqa: PYI049
|
|
enable: bool
|