(self, client_optimizer, model_parameters)
| 1972 | |
| 1973 | # Configure optimizer |
| 1974 | def _configure_optimizer(self, client_optimizer, model_parameters): |
| 1975 | if client_optimizer is None: |
| 1976 | if self.has_moe_layers: |
| 1977 | model_parameters = configure_moe_param_groups(model_parameters) |
| 1978 | basic_optimizer = self._configure_basic_optimizer(model_parameters) |
| 1979 | log_dist(f"Using DeepSpeed Optimizer param name {self.optimizer_name()} as basic optimizer", ranks=[0]) |
| 1980 | else: |
| 1981 | if isinstance(client_optimizer, tuple(self._supported_optims())): |
| 1982 | basic_optimizer = client_optimizer |
| 1983 | log_dist('Using client Optimizer as basic optimizer', ranks=[0]) |
| 1984 | else: |
| 1985 | basic_optimizer = client_optimizer(model_parameters) |
| 1986 | log_dist('Using client callable to create basic optimizer', ranks=[0]) |
| 1987 | |
| 1988 | if (self.zero_use_cpu_optimizer() and not isinstance(basic_optimizer, deepspeed.ops.adam.DeepSpeedCPUAdam) |
| 1989 | and not isinstance(basic_optimizer, deepspeed.ops.lion.DeepSpeedCPULion)): |
| 1990 | if self.zero_force_ds_cpu_optimizer(): |
| 1991 | msg = f'You are using ZeRO-Offload with a client provided optimizer ({type(basic_optimizer)}) which in most cases will yield poor performance. Please either use deepspeed.ops.adam.DeepSpeedCPUAdam or set an optimizer in your ds-config (https://www.deepspeed.ai/docs/config-json/#optimizer-parameters). If you really want to use a custom optimizer w. ZeRO-Offload and understand the performance impacts you can also set <"zero_force_ds_cpu_optimizer": false> in your configuration file.' |
| 1992 | raise ZeRORuntimeException(msg) |
| 1993 | |
| 1994 | basic_optimizer.param_groups[:] = [pg for pg in basic_optimizer.param_groups if len(pg["params"]) != 0] |
| 1995 | log_dist("Removing param_group that has no 'params' in the basic Optimizer", ranks=[0]) |
| 1996 | |
| 1997 | self._check_for_duplicates(basic_optimizer) |
| 1998 | |
| 1999 | self.basic_optimizer = basic_optimizer |
| 2000 | log_dist(f"DeepSpeed Basic Optimizer = {basic_optimizer.__class__.__name__}", ranks=[0]) |
| 2001 | |
| 2002 | optimizer_wrapper = self._do_optimizer_sanity_check(basic_optimizer) |
| 2003 | |
| 2004 | if optimizer_wrapper == ZERO_OPTIMIZATION: |
| 2005 | self.optimizer = self._configure_zero_optimizer(basic_optimizer) |
| 2006 | elif optimizer_wrapper == AMP: |
| 2007 | amp_params = self.amp_params() |
| 2008 | log_dist(f"Initializing AMP with these params: {amp_params}", ranks=[0]) |
| 2009 | model, self.optimizer = amp.initialize(self.module, basic_optimizer, **amp_params) |
| 2010 | self._set_client_model(model) |
| 2011 | self._broadcast_model() |
| 2012 | # TODO: maybe need to broadcast experts differently? |
| 2013 | elif optimizer_wrapper in [FP16, DDP_BFLOAT16]: |
| 2014 | lp_dtype = torch.float16 if optimizer_wrapper == FP16 else torch.bfloat16 |
| 2015 | self.optimizer = self._configure_fp16_optimizer(basic_optimizer, lp_dtype) |
| 2016 | elif optimizer_wrapper == BFLOAT16: |
| 2017 | self.optimizer = self._configure_bf16_optimizer(basic_optimizer) |
| 2018 | else: |
| 2019 | self.optimizer = basic_optimizer |
| 2020 | |
| 2021 | self._configure_autoep_folding_optimizer_gradient_reduction() |
| 2022 | log_dist("DeepSpeed Final Optimizer = {}".format(self.optimizer.__class__.__name__), ranks=[0]) |
| 2023 | |
| 2024 | self.compression_scheduler = self._configure_compression_scheduler() |
| 2025 | self.quantizer = self._configure_quantization() |
| 2026 | |
| 2027 | def _configure_autoep_folding_optimizer_gradient_reduction(self): |
| 2028 | configure = getattr(self.optimizer, "configure_autoep_folding_tp_gradient_reduction", None) |
no test coverage detected