

'''simple docstring'''
import os
import sys
import tempfile

import torch

from .state import AcceleratorState
from .utils import PrecisionType, PrepareForLaunch, is_mps_available, patch_environment


def 	_lowerCAmelCase (						_UpperCamelCase						:					str							,			_UpperCamelCase						:					Tuple=()							,			_UpperCamelCase						:					List[Any]=None							,			_UpperCamelCase						:					List[Any]="no"							,			_UpperCamelCase						:					Optional[int]="29500"    )				->      List[str]:
     """simple docstring"""




     _SCREAMING_SNAKE_CASE							   =False
     _SCREAMING_SNAKE_CASE							   =False
     if any(key.startswith('KAGGLE'    ) for key in os.environ.keys()    ):
          _SCREAMING_SNAKE_CASE							   =True
     elif "IPython" in sys.modules:
          _SCREAMING_SNAKE_CASE							   ='google.colab' in str(sys.modules['IPython'].get_ipython()    )

     try:
          _SCREAMING_SNAKE_CASE							   =PrecisionType(mixed_precision.lower()    )
     except ValueError:
          raise ValueError(
              f"Unknown mixed_precision mode: {args.mixed_precision.lower()}. Choose between {PrecisionType.list()}."    )

     if (in_colab or in_kaggle) and (os.environ.get('TPU_NAME'							,			_UpperCamelCase    ) is not None):
          # TPU launch
          import torch_xla.distributed.xla_multiprocessing as xmp

          if len(AcceleratorState._shared_state    ) > 0:
               raise ValueError(
                   'To train on TPU in Colab or Kaggle Kernel, the `Accelerator` should only be initialized inside '
                   'your training function. Restart your notebook and make sure no cells initializes an '
                   '`Accelerator`.'    )
          if num_processes is None:
               _SCREAMING_SNAKE_CASE							   =8

          _SCREAMING_SNAKE_CASE							   =PrepareForLaunch(_UpperCamelCase							,			distributed_type='TPU'    )
          print(f"Launching a training on {num_processes} TPU cores."    )
          xmp.spawn(_UpperCamelCase							,			args=_UpperCamelCase							,			nprocs=_UpperCamelCase							,			start_method='fork'    )
     elif in_colab:
          # No need for a distributed launch otherwise as it's either CPU or one GPU.
          if torch.cuda.is_available():
               print('Launching training on one GPU.'    )
          else:
               print('Launching training on one CPU.'    )
          function(*_UpperCamelCase    )
     else:
          if num_processes is None:
               raise ValueError(
                   'You have to specify the number of GPUs you would like to use, add `num_processes=...` to your call.'    )

          if num_processes > 1:
               # Multi-GPU launch
               from torch.multiprocessing import start_processes
               from torch.multiprocessing.spawn import ProcessRaisedException

               if len(AcceleratorState._shared_state    ) > 0:
                    raise ValueError(
                        'To launch a multi-GPU training from your notebook, the `Accelerator` should only be initialized '
                        'inside your training function. Restart your notebook and make sure no cells initializes an '
                        '`Accelerator`.'    )

               if torch.cuda.is_initialized():
                    raise ValueError(
                        'To launch a multi-GPU training from your notebook, you need to avoid running any instruction '
                        'using `torch.cuda` in any cell. Restart your notebook and make sure no cells use any CUDA '
                        'function.'    )

               # torch.distributed will expect a few environment variable to be here. We set the ones common to each
               # process here (the other ones will be set be the launcher).
               with patch_environment(
                   world_size=_UpperCamelCase							,			master_addr='127.0.01'							,			master_port=_UpperCamelCase							,			mixed_precision=_UpperCamelCase    ):
                    _SCREAMING_SNAKE_CASE							   =PrepareForLaunch(_UpperCamelCase							,			distributed_type='MULTI_GPU'    )
                    print(f"Launching training on {num_processes} GPUs."    )
                    try:
                         start_processes(_UpperCamelCase							,			args=_UpperCamelCase							,			nprocs=_UpperCamelCase							,			start_method='fork'    )
                    except ProcessRaisedException as e:
                         if "Cannot re-initialize CUDA in forked subprocess" in e.args[0]:
                              raise RuntimeError(
                                  'CUDA has been initialized before the `notebook_launcher` could create a forked subprocess. '
                                  'This likely stems from an outside import causing issues once the `notebook_launcher()` is called. '
                                  'Please review your imports and test them when running the `notebook_launcher()` to identify '
                                  'which one is problematic.'    ) from e

          else:
               # No need for a distributed launch otherwise as it's either CPU, GPU or MPS.
               if is_mps_available():
                    _SCREAMING_SNAKE_CASE							   ='1'
                    print('Launching training on MPS.'    )
               elif torch.cuda.is_available():
                    print('Launching training on one GPU.'    )
               else:
                    print('Launching training on CPU.'    )
               function(*_UpperCamelCase    )







def 	_lowerCAmelCase (						_UpperCamelCase						:					int							,			_UpperCamelCase						:					Union[str, Any]=()							,			_UpperCamelCase						:					Union[str, Any]=2    )				->      List[Any]:
     """simple docstring"""




     from torch.multiprocessing import start_processes

     with tempfile.NamedTemporaryFile() as tmp_file:
          # torch.distributed will expect a few environment variable to be here. We set the ones common to each
          # process here (the other ones will be set be the launcher).
          with patch_environment(
              world_size=_UpperCamelCase							,			master_addr='127.0.01'							,			master_port='29500'							,			accelerate_mixed_precision='no'							,			accelerate_debug_rdv_file=tmp_file.name							,			accelerate_use_cpu='yes'							,			):
               _SCREAMING_SNAKE_CASE							   =PrepareForLaunch(_UpperCamelCase							,			debug=_UpperCamelCase    )
               start_processes(_UpperCamelCase							,			args=_UpperCamelCase							,			nprocs=_UpperCamelCase							,			start_method='fork'    )



'''simple docstring'''
# Copyright 2023 The HuggingFace Team. 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 typing import TYPE_CHECKING

# rely on isort to merge the imports
from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available, is_vision_available


lowerCamelCase			:				Optional[int] 			=					{
    "configuration_efficientnet": [
        "EFFICIENTNET_PRETRAINED_CONFIG_ARCHIVE_MAP",
        "EfficientNetConfig",
        "EfficientNetOnnxConfig",
    ]
}

try:
     if not is_vision_available():
          raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
     pass
else:
     lowerCamelCase			:				str 			=					["EfficientNetImageProcessor"]

try:
     if not is_torch_available():
          raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
     pass
else:
     lowerCamelCase			:				Tuple 			=					[
         "EFFICIENTNET_PRETRAINED_MODEL_ARCHIVE_LIST",
         "EfficientNetForImageClassification",
         "EfficientNetModel",
         "EfficientNetPreTrainedModel",
     ]

if TYPE_CHECKING:
     from .configuration_efficientnet import (
         EFFICIENTNET_PRETRAINED_CONFIG_ARCHIVE_MAP,
         EfficientNetConfig,
         EfficientNetOnnxConfig,
     )

     try:
          if not is_vision_available():
               raise OptionalDependencyNotAvailable()
     except OptionalDependencyNotAvailable:
          pass
     else:
          from .image_processing_efficientnet import EfficientNetImageProcessor

     try:
          if not is_torch_available():
               raise OptionalDependencyNotAvailable()
     except OptionalDependencyNotAvailable:
          pass
     else:
          from .modeling_efficientnet import (
              EFFICIENTNET_PRETRAINED_MODEL_ARCHIVE_LIST,
              EfficientNetForImageClassification,
              EfficientNetModel,
              EfficientNetPreTrainedModel,
          )

else:
     import sys

     lowerCamelCase			:				int 			=					_LazyModule(__name__, globals()["__file__"], _import_structure)
