Coverage for / home / jenkins / .local / lib / python3.10 / site-packages / hyper_parallel / core / optimizer / __init__.py: 0%
33 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-07-06 05:41 +0800
« prev ^ index » next coverage.py v7.13.1, created at 2026-07-06 05:41 +0800
1# Copyright 2026 Huawei Technologies Co., Ltd
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14# ============================================================================
16"""HyperParallel optimizer module."""
18import inspect
19import logging
20from typing import Any, Dict, List, Optional
22from torch import nn
24from hyper_parallel.core.optimizer.adamw import AdamW
25from hyper_parallel.core.optimizer.lr_scheduler import get_hyper_lr_scheduler
26from hyper_parallel.core.optimizer.muon import Muon
27from hyper_parallel.core.optimizer.optimizer import ChainedOptimizer
29logging.basicConfig(level=logging.INFO)
30logger = logging.getLogger(__name__)
32__all__ = ['get_hyper_optimizer', 'get_hyper_lr_scheduler']
35def get_hyper_optimizer(
36 model: nn.Module,
37 muon_params: List[Dict[str, Any]],
38 adamw_params: List[Dict[str, Any]],
39 muon_kwargs: Optional[Dict[str, Any]] = None,
40 adamw_kwargs: Optional[Dict[str, Any]] = None,
41) -> ChainedOptimizer:
42 """Create a chained Muon + AdamW optimizer.
44 Args:
45 model: The neural network model.
46 muon_params: Param groups for Muon. Empty list disables Muon.
47 adamw_params: Param groups for AdamW. Empty list disables AdamW.
48 muon_kwargs: Dedicated configurations dict for Muon.
49 adamw_kwargs: Dedicated configurations dict for AdamW.
51 Example:
52 _adamw_legacy = {
53 'adamw_lr': 1e-3,
54 'adamw_weight_decay': 1e-2,
55 'adamw_betas': (0.9, 0.95),
56 'adamw_eps': 1e-8,
57 'fused': True
58 }
59 _muon_legacy = {
60 'muon_lr': 2e-2,
61 'muon_weight_decay': 0.1,
62 'muon_momentum': 0.95,
63 'muon_ns_steps': 5,
64 'muon_nesterov': True,
65 'muon_hsdp_replica_count': 2
66 }
68 optimizer = get_hyper_optimizer(
69 model=model,
70 muon_params=muon_groups,
71 adamw_params=adamw_groups,
72 adamw_kwargs=_adamw_legacy,
73 muon_kwargs=_muon_legacy,
74 )
75 """
76 # 1. Arguments Preparation
77 # 1.1 adamw
78 adamw_raw = adamw_kwargs or {}
79 adamw_config = {
80 k[6:] if k.startswith("adamw_") else k: v
81 for k, v in adamw_raw.items()
82 }
83 allowed_keys_adamw = inspect.signature(AdamW.__init__).parameters.keys() - {'self', 'params'}
84 filtered_adamw_config = {k: v for k, v in adamw_config.items() if k in allowed_keys_adamw}
85 if excluded_adamw_keys := adamw_config.keys() - allowed_keys_adamw:
86 logger.info_rank0("Excluded adamw config: %s", list(excluded_adamw_keys))
88 # 1.2 muon
89 muon_raw = muon_kwargs or {}
90 muon_config = {
91 k[5:] if k.startswith("muon_") else k: v
92 for k, v in muon_raw.items()
93 }
94 allowed_keys_muon = inspect.signature(Muon.__init__).parameters.keys() - {'self', 'params'}
95 filtered_muon_config = {k: v for k, v in muon_config.items() if k in allowed_keys_muon}
96 if excluded_muon_keys := muon_config.keys() - allowed_keys_muon:
97 logger.info_rank0("Excluded muon config: %s", list(excluded_muon_keys))
99 # 2. Optimizer Creation
100 optimizers = {}
102 if adamw_params:
103 optimizers["adamw"] = AdamW(adamw_params, **filtered_adamw_config)
104 logger.info_rank0("Using adamw config: %s", filtered_adamw_config)
106 if muon_params:
107 optimizers["muon"] = Muon(muon_params, **filtered_muon_config)
108 logger.info_rank0("Using muon config: %s", filtered_muon_config)
110 flatten = bool(adamw_params and muon_params)
112 return ChainedOptimizer(model, optimizers=optimizers, flatten=flatten)