muellerzr/github-pr-history huggingface dataset:
diff --git a/src/accelerate/utils/modeling.py b/src/accelerate/utils/modeling.py
index c58cfeb50..679e57ff2 100644
--- a/src/accelerate/utils/modeling.py
+++ b/src/accelerate/utils/modeling.py
@@ -666,7 +666,7 @@ def load_checkpoint_in_model(
         elif len(potential_index) == 1:
             index_filename = os.path.join(checkpoint, potential_index[0])
         else:
-            raise ValueError(f"{checkpoint} containing mote than one `.index.json` file, delete the irrelevant ones.")
+            raise ValueError(f"{checkpoint} containing more than one `.index.json` file, delete the irrelevant ones.")
     else:
         raise ValueError(
             "`checkpoint` should be the path to a file containing a whole state dict, or the index of a sharded "



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/tests/deepspeed/test_deepspeed.py b/tests/deepspeed/test_deepspeed.py
index fceb0bd23..03a4e346c 100644
--- a/tests/deepspeed/test_deepspeed.py
+++ b/tests/deepspeed/test_deepspeed.py
@@ -243,10 +243,7 @@ def test_deepspeed_plugin(self, stage):
 
     @parameterized.expand([FP16, BF16], name_func=parameterized_custom_name_func)
     def test_accelerate_state_deepspeed(self, dtype):
-        state = AcceleratorState(_from_accelerator=True)
-        if state.initialized:
-            state.initialized = False
-
+        AcceleratorState._reset_state()
         deepspeed_plugin = DeepSpeedPlugin(
             gradient_accumulation_steps=1,
             gradient_clipping=1.0,
@@ -259,7 +256,6 @@ def test_accelerate_state_deepspeed(self, dtype):
         with mockenv_context(**self.dist_env):
             state = Accelerator(mixed_precision=dtype, deepspeed_plugin=deepspeed_plugin).state
             self.assertTrue(state.deepspeed_plugin.deepspeed_config[dtype]["enabled"])
-            state.initialized = False
 
     def test_init_zero3(self):
         deepspeed_plugin = DeepSpeedPlugin(



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/utils/offload.py b/src/accelerate/utils/offload.py
index 22f51cce1..84c115fd3 100644
--- a/src/accelerate/utils/offload.py
+++ b/src/accelerate/utils/offload.py
@@ -34,7 +34,7 @@ def offload_weight(weight, weight_name, offload_folder, index=None):
         # Need to reinterpret the underlined data as int16 since NumPy does not handle bfloat16s.
         weight = weight.view(torch.int16)
         dtype = "bfloat16"
-    array = weight.numpy()
+    array = weight.cpu().numpy()
     tensor_file = os.path.join(offload_folder, f"{weight_name}.dat")
     if index is not None:
         if dtype is None:



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index ec5041bfa..7c07e9105 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -363,7 +363,7 @@ def __init__(
         if (
             self.state.mixed_precision == "fp16"
             and self.device.type != "cpu"
-            and self.distributed_type != DistributedType.MEGATRON_LM
+            and self.distributed_type not in (DistributedType.DEEPSPEED, DistributedType.MEGATRON_LM)
         ):
             self.native_amp = True
             if not torch.cuda.is_available() and not parse_flag_from_env("ACCELERATE_USE_MPS_DEVICE"):
@@ -375,10 +375,10 @@ def __init__(
                 self.scaler = ShardedGradScaler(**kwargs)
             else:
                 self.scaler = torch.cuda.amp.GradScaler(**kwargs)
-        elif (
-            self.state.mixed_precision == "bf16"
-            and self.distributed_type != DistributedType.FSDP
-            and self.distributed_type != DistributedType.MEGATRON_LM
+        elif self.state.mixed_precision == "bf16" and self.distributed_type not in (
+            DistributedType.DEEPSPEED,
+            DistributedType.FSDP,
+            DistributedType.MEGATRON_LM,
         ):
             if self.device.type == "cpu":
                 self.native_amp = is_torch_version(">=", "1.10")



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/tracking.py b/src/accelerate/tracking.py
index 7afebea48..379d6454e 100644
--- a/src/accelerate/tracking.py
+++ b/src/accelerate/tracking.py
@@ -37,7 +37,10 @@
 _available_trackers = []
 
 if is_tensorboard_available():
-    from torch.utils import tensorboard
+    try:
+        from torch.utils import tensorboard
+    except ModuleNotFoundError:
+        import tensorboardX as tensorboard
 
     _available_trackers.append(LoggerType.TENSORBOARD)
 



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/docs/source/quicktour.mdx b/docs/source/quicktour.mdx
index 6ea99f9bd..13a8d7afa 100644
--- a/docs/source/quicktour.mdx
+++ b/docs/source/quicktour.mdx
@@ -206,7 +206,7 @@ Now that this is done, you can run your script with the following command:
 accelerate launch path_to_script.py --args_for_the_script
 ```
 
-If you stored the config file in a non-default location, you can indicate it to the launcher like his:
+If you stored the config file in a non-default location, you can indicate it to the launcher like this:
 
 ```bash
 accelerate launch --config_file path_to_config.yaml path_to_script.py --args_for_the_script



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
body: Thanks for the fix!
diff --git a/src/accelerate/data_loader.py b/src/accelerate/data_loader.py
index 8a45856cd..7dafed0e5 100644
--- a/src/accelerate/data_loader.py
+++ b/src/accelerate/data_loader.py
@@ -711,7 +711,9 @@ def prepare_data_loader(
     # Need to provide batch_size as batch_sampler is None for Iterable dataset
     if new_batch_sampler is None:
         kwargs["drop_last"] = dataloader.drop_last
-        kwargs["batch_size"] = dataloader.batch_size // num_processes if split_batches else dataloader.batch_size
+        kwargs["batch_size"] = (
+            dataloader.batch_size // num_processes if split_batches and not dispatch_batches else dataloader.batch_size
+        )
 
     if dispatch_batches:
         kwargs.pop("generator")



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
body: Looks like the right fix to me, thanks!
diff --git a/docs/source/_toctree.yml b/docs/source/_toctree.yml
index 6b9825523..ccaafbc8e 100644
--- a/docs/source/_toctree.yml
+++ b/docs/source/_toctree.yml
@@ -28,7 +28,7 @@
   - local: usage_guides/tracking
     title: Using experiment trackers
   - local: usage_guides/big_modeling
-    title: How to use large models with small resources
+    title: How perform inference on large models with small resources
   - local: usage_guides/memory
     title: How to avoid CUDA Out-of-Memory
   - local: usage_guides/sagemaker
diff --git a/docs/source/usage_guides/big_modeling.mdx b/docs/source/usage_guides/big_modeling.mdx
index 1e13849c6..d7523a03b 100644
--- a/docs/source/usage_guides/big_modeling.mdx
+++ b/docs/source/usage_guides/big_modeling.mdx
@@ -10,7 +10,7 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express o
 specific language governing permissions and limitations under the License.
 -->
 
-# Handling big models
+# Handling big models for inference
 
 When loading a pretrained model in PyTorch, the usual workflow looks like this:
 



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/docs/source/usage_guides/checkpoint.mdx b/docs/source/usage_guides/checkpoint.mdx
index 7d6bbbf99..f2684971b 100644
--- a/docs/source/usage_guides/checkpoint.mdx
+++ b/docs/source/usage_guides/checkpoint.mdx
@@ -31,13 +31,13 @@ import torch
 accelerator = Accelerator()
 
 my_scheduler = torch.optim.lr_scheduler.StepLR(my_optimizer, step_size=1, gamma=0.99)
-my_model, my_optimizer, my_training_dataloader = accelerate.prepare(my_model, my_optimizer, my_training_dataloader)
+my_model, my_optimizer, my_training_dataloader = accelerator.prepare(my_model, my_optimizer, my_training_dataloader)
 
 # Register the LR scheduler
-accelerate.register_for_checkpointing(my_scheduler)
+accelerator.register_for_checkpointing(my_scheduler)
 
 # Save the starting state
-accelerate.save_state("my/save/path")
+accelerator.save_state("my/save/path")
 
 device = accelerator.device
 my_model.to(device)
@@ -56,5 +56,5 @@ for epoch in range(num_epochs):
     my_scheduler.step()
 
 # Restore previous state
-accelerate.load_state("my/save/path")
+accelerator.load_state("my/save/path")
 ```



Discussion: body: The docs for this PR live [here](https://moon-ci-docs.huggingface.co/docs/accelerate/pr_915). All of your documentation changes will be reflected on that endpoint.
body: Thanks for the fixes! 🤗
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index 85fc1b4d2..1c3782067 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -939,9 +939,9 @@ def prepare_model(self, model: torch.nn.Module, device_placement=None):
                     backward_prefetch=fsdp_plugin.backward_prefetch,
                     mixed_precision=fsdp_plugin.mixed_precision_policy,
                     ignored_modules=fsdp_plugin.ignored_modules,
+                    device_id=self.device,
+                    limit_all_gathers=fsdp_plugin.limit_all_gathers,
                 )
-                if not fsdp_plugin.cpu_offload.offload_params:
-                    model.to(self.device)
             self._models[-1] = model
         elif self.distributed_type == DistributedType.MULTI_CPU:
             kwargs = self.ddp_handler.to_kwargs() if self.ddp_handler is not None else {}
diff --git a/src/accelerate/utils/dataclasses.py b/src/accelerate/utils/dataclasses.py
index 2e286b657..eafad8a09 100644
--- a/src/accelerate/utils/dataclasses.py
+++ b/src/accelerate/utils/dataclasses.py
@@ -554,6 +554,16 @@ class FullyShardedDataParallelPlugin:
         },
     )
 
+    limit_all_gathers: bool = field(
+        default=False,
+        metadata={
+            "help": "If False, then FSDP allows the CPU thread to schedule all-gathers "
+            "without any extra synchronization. If True, then FSDP explicitly synchronizes the CPU thread to prevent "
+            "too many in-flight all-gathers. This bool only affects the sharded strategies that schedule all-gathers. "
+            "Enabling this can help lower the number of CUDA malloc retries."
+        },
+    )
+
     def __post_init__(self):
         from torch.distributed.fsdp.fully_sharded_data_parallel import (
             BackwardPrefetch,



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index 85fc1b4d2..0808ca462 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -349,7 +349,11 @@ def __init__(
         self.scaler = None
         self.native_amp = False
         err = "{mode} mixed precision requires {requirement}"
-        if self.state.mixed_precision == "fp16" and self.distributed_type != DistributedType.MEGATRON_LM:
+        if (
+            self.state.mixed_precision == "fp16"
+            and self.device.type != "cpu"
+            and self.distributed_type != DistributedType.MEGATRON_LM
+        ):
             self.native_amp = True
             if not torch.cuda.is_available() and not parse_flag_from_env("ACCELERATE_USE_MPS_DEVICE"):
                 raise ValueError(err.format(mode="fp16", requirement="a GPU"))
@@ -1847,7 +1851,7 @@ def autocast(self):
         if self.native_amp:
             if self.mixed_precision == "fp16" and is_torch_version(">=", "1.10"):
                 autocast_context = torch.cuda.amp.autocast(dtype=torch.float16)
-            elif self.mixed_precision == "bf16" and is_bf16_available():
+            elif self.mixed_precision == "bf16":
                 if self.distributed_type in [DistributedType.NO, DistributedType.MULTI_CPU, DistributedType.MULTI_GPU]:
                     autocast_context = torch.autocast(dtype=torch.bfloat16, device_type=self.device.type)
             else:



Discussion: body: @muellerzr @sgugger @yao-matrix @jiqing-feng.
body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/commands/launch.py b/src/accelerate/commands/launch.py
index 12f67088a..97bd75833 100644
--- a/src/accelerate/commands/launch.py
+++ b/src/accelerate/commands/launch.py
@@ -1006,7 +1006,7 @@ def launch_command(args):
         raise ValueError(
             "You can only use one of `--cpu`, `--multi_gpu`, `--mps`, `--tpu`, `--use_deepspeed`, `--use_fsdp` at a time."
         )
-    if args.multi_gpu and args.num_processes < 2:
+    if args.multi_gpu and (args.num_processes is not None) and (args.num_processes < 2):
         raise ValueError("You need to use at least 2 processes to use `--multi_gpu`.")
 
     defaults = None


Review comments: body: Can all be grouped in the same if ;-)
diff_hunk: @@ -1006,8 +1006,9 @@ def launch_command(args):
         raise ValueError(
             "You can only use one of `--cpu`, `--multi_gpu`, `--mps`, `--tpu`, `--use_deepspeed`, `--use_fsdp` at a time."
         )
-    if args.multi_gpu and args.num_processes < 2:
-        raise ValueError("You need to use at least 2 processes to use `--multi_gpu`.")
+    if args.num_processes is not None:
+        if args.multi_gpu and args.num_processes < 2:
+            raise ValueError("You need to use at least 2 processes to use `--multi_gpu`.")

Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/commands/launch.py b/src/accelerate/commands/launch.py
index 081380331..12f67088a 100644
--- a/src/accelerate/commands/launch.py
+++ b/src/accelerate/commands/launch.py
@@ -1002,8 +1002,12 @@ def sagemaker_launcher(sagemaker_config: SageMakerConfig, args):
 
 def launch_command(args):
     # Sanity checks
-    if sum([args.multi_gpu, args.tpu, args.use_deepspeed, args.use_fsdp]) > 1:
-        raise ValueError("You can only pick one between `--multi_gpu`, `--use_deepspeed`, `--tpu`, `--use_fsdp`.")
+    if sum([args.multi_gpu, args.cpu, args.tpu, args.mps, args.use_deepspeed, args.use_fsdp]) > 1:
+        raise ValueError(
+            "You can only use one of `--cpu`, `--multi_gpu`, `--mps`, `--tpu`, `--use_deepspeed`, `--use_fsdp` at a time."
+        )
+    if args.multi_gpu and args.num_processes < 2:
+        raise ValueError("You need to use at least 2 processes to use `--multi_gpu`.")
 
     defaults = None
     warned = []



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/utils/dataclasses.py b/src/accelerate/utils/dataclasses.py
index 490ea3f4f..2e286b657 100644
--- a/src/accelerate/utils/dataclasses.py
+++ b/src/accelerate/utils/dataclasses.py
@@ -65,7 +65,18 @@ class DistributedDataParallelKwargs(KwargsHandler):
 
     `static_graph` is only available in PyTorch 1.11.0 and later versions.
 
-    </Tip>"""
+    </Tip>
+
+    Example:
+
+    ```python
+    from accelerate import Accelerator
+    from accelerate.utils import DistributedDataParallelKwargs
+
+    kwargs = DistributedDataParallelKwargs(find_unused_parameters=True)
+    accelerator = Accelerator(kwargs_handlers=[kwargs])
+    ```
+    """
 
     dim: int = 0
     broadcast_buffers: bool = True
@@ -87,7 +98,18 @@ class GradScalerKwargs(KwargsHandler):
 
     `GradScaler` is only available in PyTorch 1.5.0 and later versions.
 
-    </Tip>"""
+    </Tip>
+
+    Example:
+
+    ```python
+    from accelerate import Accelerator
+    from accelerate.utils import GradScalerKwargs
+
+    kwargs = GradScalerKwargs(backoff_filter=0.25)
+    accelerator = Accelerator(kwargs_handlers=[kwargs])
+    ```
+    """
 
     init_scale: float = 65536.0
     growth_factor: float = 2.0
@@ -103,6 +125,15 @@ class InitProcessGroupKwargs(KwargsHandler):
     to the documentation of this
     [method](https://pytorch.org/docs/stable/distributed.html#torch.distributed.init_process_group) for more
     information on each argument.
+
+    ```python
+    from datetime import timedelta
+    from accelerate import Accelerator
+    from accelerate.utils import InitProcessGroupKwargs
+
+    kwargs = InitProcessGroupKwargs(timeout=timedelta(seconds=800))
+    accelerator = Accelerator(kwargs_handlers=[kwargs])
+    ```
     """
 
     init_method: Optional[str] = None



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index 4e23c18af..1d6f7ee10 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -237,7 +237,7 @@ def __init__(
         else:
             assert isinstance(
                 deepspeed_plugin, DeepSpeedPlugin
-            ), "`deepspeed_plugin` must be a DeepSpeedPlugin object."
+            ), "`deepspeed_plugin` must be an `accelerate.utils.DeepSpeedPlugin` object."
             os.environ["ACCELERATE_USE_DEEPSPEED"] = "true"  # use DeepSpeed if plugin is provided
         if deepspeed_plugin:
             if not is_deepspeed_available():
@@ -285,7 +285,9 @@ def __init__(
         self.init_handler = None
         if kwargs_handlers is not None:
             for handler in kwargs_handlers:
-                assert isinstance(handler, KwargsHandler), f"Unsupported kwargs handler passed: {handler}."
+                assert isinstance(
+                    handler, KwargsHandler
+                ), f"Unsupported kwargs handler passed: {handler}, must be one that inherits `accelerate.utils.KwargsHandler`."
                 if isinstance(handler, DistributedDataParallelKwargs):
                     if self.ddp_handler is not None:
                         raise ValueError("You can only pass one `DistributedDataParallelKwargs` in `kwargs_handler`.")



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/utils/modeling.py b/src/accelerate/utils/modeling.py
index e471731a4..ff3e95ead 100644
--- a/src/accelerate/utils/modeling.py
+++ b/src/accelerate/utils/modeling.py
@@ -21,11 +21,10 @@
 from collections import defaultdict
 from typing import Dict, List, Optional, Tuple, Union
 
-import numpy as np
 import torch
 import torch.nn as nn
 
-from .offload import offload_weight, save_offload_index
+from .offload import load_offloaded_weight, offload_weight, save_offload_index
 
 
 WEIGHTS_INDEX_NAME = "pytorch_model.bin.index.json"
@@ -324,9 +323,8 @@ def load_offloaded_weights(model, index, offload_folder):
 
     for param_name, metadata in index.items():
         tensor_file = os.path.join(offload_folder, f"{param_name}.dat")
-        shape = tuple(metadata["shape"])
-        weight = np.memmap(tensor_file, dtype=metadata["dtype"], mode="r", shape=shape)
-        set_module_tensor_to_device(model, param_name, "cpu", value=torch.tensor(weight))
+        weight = load_offloaded_weight(tensor_file, metadata)
+        set_module_tensor_to_device(model, param_name, "cpu", value=weight)
 
 
 def get_balanced_memory(



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/tests/deepspeed/test_deepspeed.py b/tests/deepspeed/test_deepspeed.py
index 86c9766a1..eca75c1ed 100644
--- a/tests/deepspeed/test_deepspeed.py
+++ b/tests/deepspeed/test_deepspeed.py
@@ -119,7 +119,7 @@ def setUp(self):
         self.ds_config_dict = dict(zero2=config_zero2, zero3=config_zero3)
 
         self.dist_env = dict(
-            USE_DEEPSPEED="true",
+            ACCELERATE_USE_DEEPSPEED="true",
             MASTER_ADDR="localhost",
             MASTER_PORT="10999",
             RANK="0",
diff --git a/tests/fsdp/test_fsdp.py b/tests/fsdp/test_fsdp.py
index e90106c17..19917c671 100644
--- a/tests/fsdp/test_fsdp.py
+++ b/tests/fsdp/test_fsdp.py
@@ -58,7 +58,7 @@ def setUp(self):
         super().setUp()
 
         self.dist_env = dict(
-            USE_FSDP="true",
+            ACCELERATE_USE_FSDP="true",
             MASTER_ADDR="localhost",
             MASTER_PORT="10999",
             RANK="0",
@@ -147,7 +147,7 @@ def test_mixed_precision(self):
 
         for mp_dtype in dtypes:
             env = self.dist_env.copy()
-            env["MIXED_PRECISION"] = mp_dtype
+            env["ACCELERATE_MIXED_PRECISION"] = mp_dtype
             with mockenv_context(**env):
                 accelerator = Accelerator()
                 if mp_dtype == "fp16":



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/examples/by_feature/deepspeed_with_config_support.py b/examples/by_feature/deepspeed_with_config_support.py
index 0fdff58ae..6cfee9dda 100755
--- a/examples/by_feature/deepspeed_with_config_support.py
+++ b/examples/by_feature/deepspeed_with_config_support.py
@@ -642,7 +642,7 @@ def group_texts(examples):
                 total_loss += loss.detach().float()
             loss = loss / args.gradient_accumulation_steps
             accelerator.backward(loss)
-            if step % args.gradient_accumulation_steps == 0 or step == len(train_dataloader) - 1:
+            if (step + 1) % args.gradient_accumulation_steps == 0 or step == len(train_dataloader) - 1:
                 optimizer.step()
                 lr_scheduler.step()
                 optimizer.zero_grad()



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
body: Thanks! 🤗
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index 0d0fe0aa6..0541ce506 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -795,7 +795,7 @@ def prepare(self, *args, device_placement=None):
                 - `torch.utils.data.DataLoader`: PyTorch Dataloader
                 - `torch.nn.Module`: PyTorch Module
                 - `torch.optim.Optimizer`: PyTorch Optimizer
-                - `torch.optim.lr_scheduler._LRScheduler`: PyTorch LR Scheduler
+                - `torch.optim.lr_scheduler.LRScheduler`: PyTorch LR Scheduler
 
             device_placement (`List[bool]`, *optional*):
                 Used to customize whether automatic device placement should be performed for each object passed. Needs
@@ -998,7 +998,7 @@ def _prepare_deepspeed(self, *args):
                 model = obj
             elif isinstance(obj, (torch.optim.Optimizer, DummyOptim)):
                 optimizer = obj
-            elif (isinstance(obj, (torch.optim.lr_scheduler._LRScheduler, DummyScheduler))) or (
+            elif (isinstance(obj, (LRScheduler, DummyScheduler))) or (
                 type(obj).__name__ in deepspeed.runtime.lr_schedules.VALID_LR_SCHEDULES
             ):
                 scheduler = obj
@@ -1097,7 +1097,7 @@ def _prepare_deepspeed(self, *args):
                     result[i] = engine
                 elif isinstance(result[i], (torch.optim.Optimizer, DummyOptim)):
                     result[i] = optimizer
-                elif (isinstance(result[i], (torch.optim.lr_scheduler._LRScheduler, DummyScheduler))) or (
+                elif (isinstance(result[i], (LRScheduler, DummyScheduler))) or (
                     type(result[i]).__name__ in deepspeed.runtime.lr_schedules.VALID_LR_SCHEDULES
                 ):
                     result[i] = scheduler
@@ -1150,7 +1150,7 @@ def _prepare_megatron_lm(self, *args):
                 model = obj
             elif isinstance(obj, (torch.optim.Optimizer)):
                 optimizer = obj
-            elif isinstance(obj, (torch.optim.lr_scheduler._LRScheduler, MegatronLMDummyScheduler)):
+            elif isinstance(obj, (LRScheduler, MegatronLMDummyScheduler)):
                 scheduler = obj
 
         if model is not None:
@@ -1260,13 +1260,13 @@ def prepare_optimizer(self, optimizer: torch.optim.Optimizer, device_placement=N
         self._optimizers.append(optimizer)
         return optimizer
 
-    def prepare_scheduler(self, scheduler: torch.optim.lr_scheduler._LRScheduler):
+    def prepare_scheduler(self, scheduler: LRScheduler):
         """
         Prepares a PyTorch Scheduler for training in any distributed setup. It is recommended to use
         [`Accelerator.prepare`] instead.
 
         Args:
-            scheduler (`torch.optim.lr_scheduler._LRScheduler`):
+            scheduler (`torch.optim.lr_scheduler.LRScheduler`):
                 A vanilla PyTorch scheduler to prepare
         """
         # We try to find the optimizer associated with `scheduler`, the default is the full list.



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index a29794fc4..0d0fe0aa6 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -751,7 +751,7 @@ def _prepare_fsdp(self, *args):
         for obj in args:
             if isinstance(obj, torch.optim.Optimizer):
                 if len(obj.param_groups) > 1:
-                    logger.warn(
+                    logger.warning(
                         "FSDP Warning: When using FSDP, several parameter groups will be conflated into "
                         "a single one due to nested module wrapping and parameter flattening."
                     )
@@ -831,7 +831,7 @@ def prepare(self, *args, device_placement=None):
                     "Then pass the optimizers to the prepare call in the same order as corresponding models."
                 )
             elif model_count == 1 and optimizer_present:
-                logger.warn(
+                logger.warning(
                     "FSDP Warning: When using FSDP, "
                     "it is efficient and recommended to call prepare for the model before creating the optimizer"
                 )
@@ -1713,7 +1713,7 @@ def load_state(self, input_dir: str):
             err = "Warning! Number of found checkpoints does not match the number of registered objects:"
             err += f"\n\tFound checkpoints: {len(custom_checkpoints)}"
             err += f"\n\tRegistered objects: {len(self._custom_objects)}\nSkipping."
-            logger.warn(err)
+            logger.warning(err)
         else:
             logger.info(f"Loading in {len(custom_checkpoints)} custom states")
             for index, obj in enumerate(self._custom_objects):
diff --git a/src/accelerate/commands/launch.py b/src/accelerate/commands/launch.py
index b2d95bad8..9e37bf0db 100644
--- a/src/accelerate/commands/launch.py
+++ b/src/accelerate/commands/launch.py
@@ -1085,7 +1085,7 @@ def launch_command(args):
         message += (
             "\nTo avoid this warning pass in values for each of the problematic parameters or run `accelerate config`."
         )
-        logger.warn(message)
+        logger.warning(message)
 
     # Use the proper launcher
     if args.use_deepspeed and not args.cpu:



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index d6a323559..be366c6e3 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -95,6 +95,12 @@
 if is_tpu_available(check_device=False):
     import torch_xla.distributed.xla_multiprocessing as xmp
 
+
+if is_torch_version("<=", "1.13.5"):
+    from torch.optim.lr_scheduler import _LRScheduler as LRScheduler
+else:
+    from torch.optim.lr_scheduler import LRScheduler as LRScheduler
+
 logger = get_logger(__name__)
 
 
@@ -725,7 +731,7 @@ def _prepare_one(self, obj, first_pass=False, device_placement=None):
                 optimizer = self.prepare_optimizer(obj, device_placement=device_placement)
                 return optimizer
         # Second pass of preparation: LR scheduler (which need the full list of optimizers)
-        elif isinstance(obj, torch.optim.lr_scheduler._LRScheduler):
+        elif isinstance(obj, LRScheduler):
             scheduler = self.prepare_scheduler(obj)
             return scheduler
         # Return the unprocessed object if previous criteria was not met



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/logging.py b/src/accelerate/logging.py
index 2eceb223e..679f2da5c 100644
--- a/src/accelerate/logging.py
+++ b/src/accelerate/logging.py
@@ -78,7 +78,8 @@ def get_logger(name: str, log_level: str = None):
     ```
     """
     if log_level is None:
-        log_level = os.environ.get("ACCELERATE_LOG_LEVEL", "WARNING")
+        log_level = os.environ.get("ACCELERATE_LOG_LEVEL", None)
     logger = logging.getLogger(name)
-    logging.basicConfig(level=log_level.upper())
+    if log_level is not None:
+        logger.setLevel(log_level.upper())
     return MultiProcessAdapter(logger, {})



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index 6ac8d8d3a..d6a323559 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -953,7 +953,9 @@ def _prepare_deepspeed(self, *args):
                 batch_sizes = [batch_size // self.num_processes for batch_size in batch_sizes]
             if len(batch_sizes) == 0:
                 raise ValueError(
-                    "You must specify a training or evaluation dataloader in `accelerate.prepare()` when using DeepSpeed."
+                    "When using DeepSpeed `accelerate.prepare()` requires you to pass at least one of training or evaluation dataloaders "
+                    "or alternatively set an integer value in `train_micro_batch_size_per_gpu` in the deepspeed config file"
+                    "or assign integer value to `AcceleratorState().deepspeed_plugin.deepspeed_config['train_micro_batch_size_per_gpu']`."
                 )
 
             batch_size_per_device = min(batch_sizes) if deepspeed_plugin.is_train_batch_min else max(batch_sizes)
diff --git a/tests/deepspeed/test_deepspeed.py b/tests/deepspeed/test_deepspeed.py
index 1be794421..86c9766a1 100644
--- a/tests/deepspeed/test_deepspeed.py
+++ b/tests/deepspeed/test_deepspeed.py
@@ -350,7 +350,9 @@ def test_prepare_deepspeed(self, optim_type, scheduler_type):
                 with self.assertRaises(ValueError) as cm:
                     model, optimizer, lr_scheduler = accelerator.prepare(model, optimizer, lr_scheduler)
                 self.assertTrue(
-                    "You must specify a training or evaluation dataloader in `accelerate.prepare()` when using DeepSpeed."
+                    "When using DeepSpeed `accelerate.prepare()` requires you to pass at least one of training or evaluation dataloaders "
+                    "or alternatively set an integer value in `train_micro_batch_size_per_gpu` in the deepspeed config file"
+                    "or assign integer value to `AcceleratorState().deepspeed_plugin.deepspeed_config['train_micro_batch_size_per_gpu']`."
                     in str(cm.exception)
                 )
 



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/accelerator.py b/src/accelerate/accelerator.py
index 6ac8d8d3a..d6a323559 100644
--- a/src/accelerate/accelerator.py
+++ b/src/accelerate/accelerator.py
@@ -953,7 +953,9 @@ def _prepare_deepspeed(self, *args):
                 batch_sizes = [batch_size // self.num_processes for batch_size in batch_sizes]
             if len(batch_sizes) == 0:
                 raise ValueError(
-                    "You must specify a training or evaluation dataloader in `accelerate.prepare()` when using DeepSpeed."
+                    "When using DeepSpeed `accelerate.prepare()` requires you to pass at least one of training or evaluation dataloaders "
+                    "or alternatively set an integer value in `train_micro_batch_size_per_gpu` in the deepspeed config file"
+                    "or assign integer value to `AcceleratorState().deepspeed_plugin.deepspeed_config['train_micro_batch_size_per_gpu']`."
                 )
 
             batch_size_per_device = min(batch_sizes) if deepspeed_plugin.is_train_batch_min else max(batch_sizes)



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/logging.py b/src/accelerate/logging.py
index 46118f7c6..2eceb223e 100644
--- a/src/accelerate/logging.py
+++ b/src/accelerate/logging.py
@@ -78,7 +78,7 @@ def get_logger(name: str, log_level: str = None):
     ```
     """
     if log_level is None:
-        log_level = os.environ.get("ACCELERATE_LOG_LEVEL", "INFO")
+        log_level = os.environ.get("ACCELERATE_LOG_LEVEL", "WARNING")
     logger = logging.getLogger(name)
     logging.basicConfig(level=log_level.upper())
     return MultiProcessAdapter(logger, {})



Discussion: body: The docs for this PR live [here](https://moon-ci-docs.huggingface.co/docs/accelerate/pr_859). All of your documentation changes will be reflected on that endpoint.
diff --git a/.github/workflows/build_pr_documentation.yml b/.github/workflows/build_pr_documentation.yml
index 12c600cb7..dc56751c6 100644
--- a/.github/workflows/build_pr_documentation.yml
+++ b/.github/workflows/build_pr_documentation.yml
@@ -9,11 +9,8 @@ concurrency:
 
 jobs:
   build:
-    uses: huggingface/doc-builder/.github/workflows/build_pr_documentation.yml@use_hf_hub
+    uses: huggingface/doc-builder/.github/workflows/build_pr_documentation.yml@main
     with:
       commit_sha: ${{ github.event.pull_request.head.sha }}
       pr_number: ${{ github.event.number }}
       package: accelerate
-    secrets:
-      token: ${{ secrets.HF_DOC_PUSH }}
-      comment_bot_token: ${{ secrets.HUGGINGFACE_PUSH }}
diff --git a/.github/workflows/delete_doc_comment.yml b/.github/workflows/delete_doc_comment.yml
index 973c2a8b3..da61d21df 100644
--- a/.github/workflows/delete_doc_comment.yml
+++ b/.github/workflows/delete_doc_comment.yml
@@ -7,10 +7,7 @@ on:
 
 jobs:
   delete:
-    uses: huggingface/doc-builder/.github/workflows/delete_doc_comment.yml@use_hf_hub
+    uses: huggingface/doc-builder/.github/workflows/delete_doc_comment.yml@main
     with:
       pr_number: ${{ github.event.number }}
       package: accelerate
-    secrets:
-      token: ${{ secrets.HF_DOC_PUSH }}
-      comment_bot_token: ${{ secrets.HUGGINGFACE_PUSH }}



Discussion: body: The docs for this PR live [here](https://moon-ci-docs.huggingface.co/docs/accelerate/pr_857). All of your documentation changes will be reflected on that endpoint.
diff --git a/src/accelerate/scheduler.py b/src/accelerate/scheduler.py
index 835d4e0d9..2652a2105 100644
--- a/src/accelerate/scheduler.py
+++ b/src/accelerate/scheduler.py
@@ -69,8 +69,9 @@ def step(self, *args, **kwargs):
             num_processes = AcceleratorState().num_processes
             for _ in range(num_processes):
                 # Special case when using OneCycle and `drop_last` was not used
-                if hasattr(self.scheduler, "total_steps") and self.scheduler._step_count <= self.scheduler.total_steps:
-                    self.scheduler.step(*args, **kwargs)
+                if hasattr(self.scheduler, "total_steps"):
+                    if self.scheduler._step_count <= self.scheduler.total_steps:
+                        self.scheduler.step(*args, **kwargs)
                 else:
                     self.scheduler.step(*args, **kwargs)
 



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/examples/complete_cv_example.py b/examples/complete_cv_example.py
index 880981594..bca55aa87 100644
--- a/examples/complete_cv_example.py
+++ b/examples/complete_cv_example.py
@@ -230,6 +230,7 @@ def training_function(config, args):
                     accelerator.save_state(output_dir)
         model.eval()
         accurate = 0
+        num_elems = 0
         for step, batch in enumerate(eval_dataloader):
             # We could avoid this line since we set the accelerator with `device_placement=True`.
             batch = {k: v.to(accelerator.device) for k, v in batch.items()}
@@ -239,9 +240,10 @@ def training_function(config, args):
             predictions = outputs.argmax(dim=-1)
             predictions, references = accelerator.gather_for_metrics((predictions, batch["label"]))
             accurate_preds = predictions == references
+            num_elems += accurate_preds.shape[0]
             accurate += accurate_preds.long().sum()
 
-        eval_metric = accurate.item() / accelerator.gradient_state.samples_seen
+        eval_metric = accurate.item() / num_elems
         # Use accelerator.print to print only on the main process.
         accelerator.print(f"epoch {epoch}: {100 * eval_metric:.2f}")
         if args.with_tracking:
diff --git a/src/accelerate/commands/menu/helpers.py b/src/accelerate/commands/menu/helpers.py
index 2cc2ece3f..687f05c50 100644
--- a/src/accelerate/commands/menu/helpers.py
+++ b/src/accelerate/commands/menu/helpers.py
@@ -37,6 +37,10 @@ def forceWrite(content, end=""):
     sys.stdout.flush()
 
 
+def writeColor(content, color, end=""):
+    forceWrite(f"\u001b[{color}m{content}\u001b[0m", end)
+
+
 def reset_cursor():
     forceWrite("\r")
 
diff --git a/src/accelerate/commands/menu/selection_menu.py b/src/accelerate/commands/menu/selection_menu.py
index d4af34c8f..751f6818a 100644
--- a/src/accelerate/commands/menu/selection_menu.py
+++ b/src/accelerate/commands/menu/selection_menu.py
@@ -16,7 +16,7 @@
 Main driver for the selection menu, based on https://github.com/bchao1/bullet
 """
 from . import cursor, input
-from .helpers import Direction, clear_line, forceWrite, linebreak, move_cursor, reset_cursor
+from .helpers import Direction, clear_line, forceWrite, linebreak, move_cursor, reset_cursor, writeColor
 from .keymap import KEYMAP
 
 
@@ -34,7 +34,8 @@ def __init__(self, prompt: str = None, choices: list = []):
     def print_choice(self, index: int):
         "Prints the choice at the given index"
         if index == self.position:
-            forceWrite(f" ➔  {self.choices[index]}")
+            forceWrite(" ➔  ")
+            writeColor(self.choices[index], 32)
         else:
             forceWrite(f"    {self.choices[index]}")
         reset_cursor()
@@ -108,5 +109,6 @@ def run(self, default_choice: int = 0):
                     for _ in range(len(self.choices) + 1):
                         move_cursor(1, "UP")
                         clear_line()
-                    forceWrite(f" * {self.choices[choice]}", "\n")
+                    forceWrite(" ➔  ")
+                    writeColor(self.choices[choice], 32, "\n")
                     return choice



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/src/accelerate/commands/config/cluster.py b/src/accelerate/commands/config/cluster.py
index 15996bfd0..a653b9d6a 100644
--- a/src/accelerate/commands/config/cluster.py
+++ b/src/accelerate/commands/config/cluster.py
@@ -164,14 +164,13 @@ def get_cluster_input():
                     default=2,
                 )
 
+                deepspeed_devices = ["none", "cpu", "nvme"]
                 if deepspeed_config["zero_stage"] >= 2:
                     deepspeed_config["offload_optimizer_device"] = _ask_options(
-                        "Where to offload optimizer states?",
-                        ["none", "cpu", "nvme"],
+                        "Where to offload optimizer states?", deepspeed_devices, lambda x: deepspeed_devices[int(x)]
                     )
                     deepspeed_config["offload_param_device"] = _ask_options(
-                        "Where to offload parameters?",
-                        ["none", "cpu", "nvme"],
+                        "Where to offload parameters?", deepspeed_devices, lambda x: deepspeed_devices[int(x)]
                     )
                 deepspeed_config["gradient_accumulation_steps"] = _ask_field(
                     "How many gradient accumulation steps you're passing in your script? [1]: ",
@@ -294,7 +293,6 @@ def get_cluster_input():
                     default=1e8,
                 )
             fsdp_backward_prefetch_query = "What should be your FSDP's backward prefetch policy?"
-            fsdp_backward_prefetch_query = fsdp_backward_prefetch_query[:-2] + ")? [0]: "
             fsdp_config["fsdp_backward_prefetch_policy"] = _ask_options(
                 fsdp_backward_prefetch_query,
                 FSDP_BACKWARD_PREFETCH,



Discussion: body: The docs for this PR live [here](https://moon-ci-docs.huggingface.co/docs/accelerate/pr_836). All of your documentation changes will be reflected on that endpoint.
diff --git a/src/accelerate/commands/launch.py b/src/accelerate/commands/launch.py
index 46d95c713..9238fbca9 100644
--- a/src/accelerate/commands/launch.py
+++ b/src/accelerate/commands/launch.py
@@ -56,9 +56,6 @@
     logging.basicConfig(format=FORMAT, datefmt="[%X]", handlers=[RichHandler()])
 
 
-if is_torch_version(">=", "1.9.0"):
-    import torch.distributed.run as distrib_run
-
 logger = logging.getLogger(__name__)
 
 options_to_group = {
@@ -555,6 +552,8 @@ def simple_launcher(args):
 
 
 def multi_gpu_launcher(args):
+    if is_torch_version(">=", "1.9.0"):
+        import torch.distributed.run as distrib_run
     num_processes = getattr(args, "num_processes")
     num_machines = getattr(args, "num_machines")
     main_process_ip = getattr(args, "main_process_ip")
@@ -644,6 +643,8 @@ def multi_gpu_launcher(args):
 
 
 def deepspeed_launcher(args):
+    if is_torch_version(">=", "1.9.0"):
+        import torch.distributed.run as distrib_run
     if not is_deepspeed_available():
         raise ImportError("DeepSpeed is not installed => run `pip3 install deepspeed` or build it from source.")
     num_processes = getattr(args, "num_processes")
diff --git a/src/accelerate/utils/launch.py b/src/accelerate/utils/launch.py
index 8642a441a..c65df08dc 100644
--- a/src/accelerate/utils/launch.py
+++ b/src/accelerate/utils/launch.py
@@ -21,10 +21,6 @@
 from .dataclasses import DistributedType
 
 
-if is_torch_version(">=", "1.9.0"):
-    import torch.distributed.run as distrib_run
-
-
 def get_launch_prefix():
     """
     Grabs the correct launcher for starting a distributed command, such as either `torchrun`, `python -m
@@ -43,6 +39,8 @@ def _filter_args(args):
     """
     Filters out all `accelerate` specific args
     """
+    if is_torch_version(">=", "1.9.0"):
+        import torch.distributed.run as distrib_run
     distrib_args = distrib_run.get_args_parser()
     new_args, _ = distrib_args.parse_known_args()
 



Discussion: body: The docs for this PR live [here](https://moon-ci-docs.huggingface.co/docs/accelerate/pr_828). All of your documentation changes will be reflected on that endpoint.
diff --git a/.github/workflows/build_pr_documentation.yml b/.github/workflows/build_pr_documentation.yml
index dc56751c6..12c600cb7 100644
--- a/.github/workflows/build_pr_documentation.yml
+++ b/.github/workflows/build_pr_documentation.yml
@@ -9,8 +9,11 @@ concurrency:
 
 jobs:
   build:
-    uses: huggingface/doc-builder/.github/workflows/build_pr_documentation.yml@main
+    uses: huggingface/doc-builder/.github/workflows/build_pr_documentation.yml@use_hf_hub
     with:
       commit_sha: ${{ github.event.pull_request.head.sha }}
       pr_number: ${{ github.event.number }}
       package: accelerate
+    secrets:
+      token: ${{ secrets.HF_DOC_PUSH }}
+      comment_bot_token: ${{ secrets.HUGGINGFACE_PUSH }}
diff --git a/.github/workflows/delete_doc_comment.yml b/.github/workflows/delete_doc_comment.yml
index da61d21df..973c2a8b3 100644
--- a/.github/workflows/delete_doc_comment.yml
+++ b/.github/workflows/delete_doc_comment.yml
@@ -7,7 +7,10 @@ on:
 
 jobs:
   delete:
-    uses: huggingface/doc-builder/.github/workflows/delete_doc_comment.yml@main
+    uses: huggingface/doc-builder/.github/workflows/delete_doc_comment.yml@use_hf_hub
     with:
       pr_number: ${{ github.event.number }}
       package: accelerate
+    secrets:
+      token: ${{ secrets.HF_DOC_PUSH }}
+      comment_bot_token: ${{ secrets.HUGGINGFACE_PUSH }}



Discussion: body: The docs for this PR live [here](https://moon-ci-docs.huggingface.co/docs/accelerate/pr_827). All of your documentation changes will be reflected on that endpoint.
diff --git a/setup.py b/setup.py
index 22d7cfb8d..b4708353c 100644
--- a/setup.py
+++ b/setup.py
@@ -19,7 +19,7 @@
 extras["quality"] = ["black ~= 22.0", "isort >= 5.5.4", "flake8 >= 3.8.3", "hf-doc-builder >= 0.3.0"]
 extras["docs"] = []
 extras["test_prod"] = ["pytest", "pytest-xdist", "pytest-subtests", "parameterized"]
-extras["test_dev"] = ["datasets", "evaluate", "transformers", "scipy", "sklearn", "deepspeed<0.7.0", "tqdm"]
+extras["test_dev"] = ["datasets", "evaluate", "transformers", "scipy", "scikit-learn", "deepspeed<0.7.0", "tqdm"]
 extras["testing"] = extras["test_prod"] + extras["test_dev"]
 extras["rich"] = ["rich"]
 



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._
diff --git a/docs/source/usage_guides/tracking.mdx b/docs/source/usage_guides/tracking.mdx
index cc5c17418..b22a4dd14 100644
--- a/docs/source/usage_guides/tracking.mdx
+++ b/docs/source/usage_guides/tracking.mdx
@@ -17,11 +17,12 @@ There are a large number of experiment tracking API's available, however getting
 
 ## Integrated Trackers
 
-Currently `Accelerate` supports three trackers out-of-the-box:
+Currently `Accelerate` supports four trackers out-of-the-box:
 
 - TensorBoard
 - WandB
 - CometML
+- MLFlow
 
 To use any of them, pass in the selected type(s) to the `log_with` parameter in [`Accelerate`]:
 ```python
diff --git a/docs/source/usage_guides/training_zoo.mdx b/docs/source/usage_guides/training_zoo.mdx
index 444784b49..176d97d2b 100644
--- a/docs/source/usage_guides/training_zoo.mdx
+++ b/docs/source/usage_guides/training_zoo.mdx
@@ -21,7 +21,10 @@ Below contains a non-exhuastive list of tutorials and scripts showcasing Acceler
 These examples showcase the base features of Accelerate and are a great starting point
 
 - [Barebones NLP example](https://github.com/huggingface/accelerate/blob/main/examples/nlp_example.py)
+- [Barebones distributed NLP example in a Jupyter Notebook](https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_nlp_example.ipynb)
 - [Barebones computer vision example](https://github.com/huggingface/accelerate/blob/main/examples/cv_example.py)
+- [Barebones distributed computer vision example in a Jupyter Notebook](https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_cv_example.ipynb)
+- [Using Accelerate in Kaggle](https://www.kaggle.com/code/muellerzr/multi-gpu-and-accelerate)
 
 ### Feature Specific Examples
 
@@ -101,6 +104,10 @@ These are tutorials from libraries that integrate with 🤗 Accelerate:
 
 - [Perform Deep Learning with 3D data](https://pytorch3d.org/tutorials/)
 
+### Stable-Dreamfusion
+
+- [Training with Stable-Dreamfusion to convert text to a 3D model](https://colab.research.google.com/drive/1MXT3yfOFvO0ooKEfiUUvTKwUkrrlCHpF?usp=sharing)
+
 ### Tez 
 
 - [Leaf disease detection with Tez and Accelerate](https://www.kaggle.com/code/abhishek/tez-faster-and-easier-training-for-leaf-detection/notebook)



Discussion: body: _The documentation is not available anymore as the PR was closed or merged._