diff --git a/docs/source/index.rst b/docs/source/index.rst
index ceef4fc91..fb58d1e04 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -155,5 +155,6 @@ Supported integrations
     :caption: API reference
 
     accelerator
+    launcher
     kwargs
     internal
diff --git a/docs/source/launcher.rst b/docs/source/launcher.rst
new file mode 100644
index 000000000..1b0520d1b
--- /dev/null
+++ b/docs/source/launcher.rst
@@ -0,0 +1,27 @@
+.. 
+    Copyright 2021 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.
+
+
+Notebook Launcher
+=======================================================================================================================
+
+Launch your training function inside a notebook. Currently supports launching a training with TPUs on [Google
+Colab](https://colab.research.google.com/) and [Kaggle kernels](https://www.kaggle.com/code), or training on one GPU,
+but support for training on several GPUs (if the machine on which you are running your notebook has them) is planned
+for a future release.
+
+.. warning::
+
+    If you are training on Colab or a Kaggle kernel with TPUs, your :obj:`Accelerator` object should only be defined
+    inside the training function. This is because the initialization should be done inside the launcher only.
+
+.. autofunction:: accelerate.notebook_launcher
diff --git a/docs/source/quicktour.rst b/docs/source/quicktour.rst
index 5e3d9ac17..d9846b777 100644
--- a/docs/source/quicktour.rst
+++ b/docs/source/quicktour.rst
@@ -195,6 +195,29 @@ If you stored the config file in a non-default location, you can indicate it to
 You can also override any of the arguments determined by your config file, see TODO: insert ref here.
 
 
+Launching training from a notebook
+-----------------------------------------------------------------------------------------------------------------------
+
+In Accelerate 0.3.0, a new :class:`~accelerate.notebook_launcher` has been introduced to help you launch your training
+function from a notebook. Currently supports launching a training with TPUs on Colab, or training on one GPU, but
+support for training on several GPUs (if the machine on which you are running your notebook has them) is planned for a
+future release.
+
+Just define a function responsible for your whole training and/or evaluation in a cell of the notebook, then execute a
+cell with the following code:
+
+.. code-block::
+
+    from accelerate import notebook_launcher
+
+    notebook_launcher(training_function)
+
+.. warning::
+
+    If you are training on Colab with TPUs, your :obj:`Accelerator` object should only be defined inside the training
+    function. This is because the initialization should be done inside the launcher only.
+
+
 Training on TPU
 -----------------------------------------------------------------------------------------------------------------------
 
diff --git a/src/accelerate/__init__.py b/src/accelerate/__init__.py
index d005e1235..8edc050c3 100644
--- a/src/accelerate/__init__.py
+++ b/src/accelerate/__init__.py
@@ -6,5 +6,6 @@
 
 from .accelerator import Accelerator
 from .kwargs_handlers import DistributedDataParallelKwargs, GradScalerKwargs
+from .notebook_launcher import notebook_launcher
 from .state import DistributedType
 from .utils import synchronize_rng_states
diff --git a/src/accelerate/commands/launch.py b/src/accelerate/commands/launch.py
index 9e3e7a566..f1242d3fd 100644
--- a/src/accelerate/commands/launch.py
+++ b/src/accelerate/commands/launch.py
@@ -16,7 +16,6 @@
 
 import argparse
 import importlib
-import inspect
 import os
 import subprocess
 import sys
@@ -27,15 +26,7 @@
 from accelerate.commands.config import default_config_file, load_config_from_file
 from accelerate.commands.config.config_args import SageMakerConfig
 from accelerate.state import ComputeEnvironment, DistributedType
-from accelerate.utils import is_sagemaker_available
-
-
-class _AddOneArg:
-    def __init__(self, launcher):
-        self.launcher = launcher
-
-    def __call__(self, index):
-        self.launcher()
+from accelerate.utils import PrepareForLaunch, is_sagemaker_available
 
 
 def launch_command_parser(subparsers=None):
@@ -176,12 +167,7 @@ def tpu_launcher(args):
     # Patch sys.argv
     sys.argv = [args.training_script] + args.training_script_args
 
-    # If the function does not take one argument, launch will fail
-    launcher_sig = inspect.signature(main_function)
-    if len(launcher_sig.parameters) == 0:
-        xmp.spawn(_AddOneArg(main_function), args=(), nprocs=args.num_processes)
-    else:
-        xmp.spawn(main_function, args=(), nprocs=args.num_processes)
+    xmp.spawn(PrepareForLaunch(main_function), args=(), nprocs=args.num_processes)
 
 
 def _convert_nargs_to_dict(nargs: List[str]) -> Dict[str, str]:
diff --git a/src/accelerate/notebook_launcher.py b/src/accelerate/notebook_launcher.py
new file mode 100644
index 000000000..e9dce7677
--- /dev/null
+++ b/src/accelerate/notebook_launcher.py
@@ -0,0 +1,79 @@
+# Copyright 2021 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.
+
+import os
+import sys
+import warnings
+
+import torch
+
+from .state import AcceleratorState
+from .utils import PrepareForLaunch
+
+
+def notebook_launcher(function, args=(), num_processes=None, start_method="fork", **kwargs):
+    """
+    Launches a training function, using several processes if it's possible in the current environment (TPU with
+    multiple cores for instance).
+
+    Args:
+        function (:obj:`Callable`):
+            The training function to execute. If it accepts arguments, the first argument should be the index of the
+            process run.
+        args (:obj:`Tuple`):
+            Tuple of arguments to pass to the function (it will receive :obj:`(index, *args)`).
+        num_processes (:obj:`int`, `optional`):
+            The number of processes to use for training. Will default to 8 in Colab/Kaggle if a TPU is available, to
+            the number of GPUs available otherwise.
+
+    .. warning::
+
+        Multiple GPUs is not yet supported.
+    """
+    launcher = PrepareForLaunch(function)
+
+    # Are we in a google colab or a Kaggle Kernel?
+    if "IPython" in sys.modules:
+        in_colab_or_kaggle = "google.colab" in str(sys.modules["IPython"].get_ipython())
+    elif any(key.startswith("KAGGLE") for key in os.environ.keys()):
+        in_colab_or_kaggle = True
+    else:
+        in_colab_or_kaggle = False
+
+    if in_colab_or_kaggle:
+        if os.environ.get("TPU_NAME", None) 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:
+                num_processes = 8
+
+            xmp.spawn(launcher, args=args, nprocs=num_processes, start_method="fork")
+        else:
+            # No need for a distributed launch otherwise as it's either CPU or one GPU.
+            launcher(0, *args)
+
+    else:
+        if num_processes is None:
+            num_processes = torch.cuda.device_count() if torch.cuda.is_available() else 1
+
+        if num_processes > 1:
+            warnings.warn("`notebook_launcher` does not support multiple GPUs yet, launching the training on one GPU.")
+        launcher(0, *args)
diff --git a/src/accelerate/utils.py b/src/accelerate/utils.py
index 0ac7d04e5..0c2282b2c 100644
--- a/src/accelerate/utils.py
+++ b/src/accelerate/utils.py
@@ -13,6 +13,7 @@
 # limitations under the License.
 
 import importlib
+import inspect
 import random
 from enum import Enum
 from typing import List, Optional, Union
@@ -247,3 +248,19 @@ def save(obj, f):
         xm.save(obj, f)
     elif AcceleratorState().local_process_index == 0:
         torch.save(obj, f)
+
+
+class PrepareForLaunch:
+    """
+    Prepare a function that launches a script.
+    """
+
+    def __init__(self, launcher):
+        self.launcher = launcher
+
+    def __call__(self, index):
+        launcher_sig = inspect.signature(self.launcher)
+        if len(launcher_sig.parameters) == 0:
+            self.launcher()
+        else:
+            self.launcher(index)


Review comments: body: ```suggestion
Launch your training function inside a notebook. Currently supports launching a training with TPUs on [Google Colab](https://colab.research.google.com/), or training
```
```suggestion
Launch your training function from a notebook. Currently supports launching a training with TPUs on Colab, or training
```
diff_hunk: @@ -0,0 +1,26 @@
+.. 
+    Copyright 2021 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.
+
+
+Notebook Launcher
+=======================================================================================================================
+
+Launch your training function from a notebook. Currently supports launching a training with TPUs on Colab, or training
body: We could add a check for Kaggle here too. I guess users expect the same behavior there. I checked a Kaggle TPU notebook, sadly `sys.modules["IPython"].get_ipython()` is not hinting that the notebook is run on Kaggle. But we could add a check like `if any(key.startswith('KAGGLE') for key in os.environ.keys())`. Additionally here is a dump of the env vars on kaggle

```python
environ{'LC_ALL': 'C.UTF-8',
        'LD_LIBRARY_PATH': '/opt/conda/lib',
        'KAGGLE_DATA_PROXY_TOKEN': 'eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.B5s-CblnZQjaC_KXAizqBneeEiZmD-pS7Asgb2h-jS6uEkmkIIHLYg.ddiwW2QpGlaxa5Q584WQOg.E8mrT0sr5vZsIb5v4zdJf6uvrzk2wuZCaM6g-xLBTkZo_Nx-lLLqcZqUrZixTOznQqeidkc5tJibiyYBeBGcRnwSuFXx0w4V0EJPfKVqp_B5TMbOROvjnLIpX3eoINPjQd7I38nmCeyrlGUnC-aTHLFqDAxaaYmcESykEixt_Hlc7Q_DfiD_uPkEzJs8buJBvcYGFq8FWbJB7n89rkDY-P9xvZnSsFjbiQYtAbfwcKGdxGKYKAoVdqRhsRHjVjj6HDVQU38Ldnuhzjg2kdt8Xhu__YxSXq0Gh-RFLZxP90M.ZPazCS7UZW9RyI3-jniqPA',
        'LANG': 'C.UTF-8',
        'HOSTNAME': '6497510c329c',
        'TESSERACT_PATH': '/usr/bin/tesseract',
        'XRT_TPU_CONFIG': 'tpu_worker;0;10.0.0.2:8470',
        'KAGGLE_KERNEL_INTEGRATIONS': '',
        'PROJ_LIB': '/opt/conda/share/proj',
        'KAGGLE_KERNEL_RUN_TYPE': 'Interactive',
        'MKL_THREADING_LAYER': 'GNU',
        'NO_GCE_CHECK': 'True',
        'PWD': '/kaggle/working',
        'HOME': '/root',
        'DL_ANACONDA_HOME': '/opt/conda',
        'ANACONDA_PYTHON_VERSION': '3.7',
        'KAGGLE_URL_BASE': 'https://www.kaggle.com',
        'KAGGLE_USER_SECRETS_TOKEN': 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..kvSYrK_dnCLGYSW8GDnQdg.xlHt52wzWG2SlyvAN6zUq9M2S3m6maqeK_nGH6zCEL-VDZE-CYAC19Ecal8oy7zJQCFYcTDdFGi-Qq6c3tdXinuUy-kG1UQ8MnTSDJJT1AvIWAeQf2MNacS8TMWa7IYG.DLWrZFE6rlAGB7rKowpPKQ',
        'KAGGLE_DOCKER_IMAGE': 'gcr.io/kaggle-images/python:tpu',
        'CONTAINER_NAME': 'base-cpu',
        'KAGGLE_DATA_PROXY_PROJECT': 'kaggle-161607',
        'SHELL': '/bin/bash',
        'MPLBACKEND': 'agg',
        'SHLVL': '1',
        'PYTHONPATH': '/kaggle/lib/kagglegym:/kaggle/lib',
        'CONTAINER_URL': 'gcr.io/deeplearning-platform-release/base-cpu:nightly-2021-03-28',
        'KAGGLE_CONTAINER_NAME': 'kaggle_gq54lOn7oztYNC879IY4P2ItqdI6zTyAKVlolN6KbYE-60764729-webtier',
        'PYTHONUSERBASE': '/root/.local',
        'PATH': '/opt/conda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
        'KAGGLE_DATA_PROXY_URL': 'https://dp.kaggle.net',
        'TPU_NAME': 'grpc://10.0.0.2:8470',
        '_': '/opt/conda/bin/jupyter',
        'GIT_PYTHON_REFRESH': 'quiet',
        'JPY_PARENT_PID': '9',
        'TERM': 'xterm-color',
        'CLICOLOR': '1',
        'PAGER': 'cat',
        'GIT_PAGER': 'cat'}
``` 

Additionally, if we add Kaggle we should rename `in_colab` to maybe `in_colab_or_kaggle`.
diff_hunk: @@ -0,0 +1,80 @@
+# Copyright 2021 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.
+
+import os
+import sys
+import warnings
+
+import torch
+
+from .state import AcceleratorState
+from .utils import PrepareForLaunch
+
+
+def notebook_launcher(function, args=(), num_processes=None, start_method="fork", **kwargs):
+    """
+    Launches a training function, using several processes if it's possible in the current environment (TPU with
+    multiple cores for instance).
+
+    Args:
+        function (:obj:`Callable`):
+            The training function to execute. If it accepts arguments, the first argument should be the index of the
+            process run.
+        args (:obj:`Tuple`):
+            Tuple of arguments to pass to the function (it will receive :obj:`(index, *args)`).
+        num_processes (:obj:`int`, `optional`):
+            The number of processes to use for training. Will default to 8 in Colab if a TPU is available, to the
+            number of GPUs available otherwise.
+        start_method (:obj:`str`, `optional`, defaults to :obj:`"fork"`):
+            The method to use to start the various processes
+        kwargs:
+            Additional keyword arguments passed along to the multiprocess :obj:`spawn` method.
+
+    .. warning::
+
+        Multiple GPUs is not yet supported.
+    """
+    launcher = PrepareForLaunch(function)
+
+    # Are we in a google colab?
+    if "IPython" in sys.modules:
+        in_colab = "google.colab" in str(sys.modules["IPython"].get_ipython())
+    else:

Discussion: body: Yes, notebook examples will follow! Working on it this afternoon and hoping to have most NLP tasks by the end of the week!