From 0e8ac7e1c94dee4a28e102d772b6ada2a763e399 Mon Sep 17 00:00:00 2001 From: Jirka Borovec <6035284+Borda@users.noreply.github.com> Date: Wed, 1 Mar 2023 12:36:14 +0100 Subject: [PATCH] docs: move fabric on its own (#16742) * docs: move fabric to Lai * update imports * links * drop link to Trainer * own docs * ci * trigger * prune cross-links * cleaning * cleaning * template * imports * template * path * links * tensorboardX * plugins * label * drop fixme * drop copy nb + examples * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Apply suggestions from code review * try again * rev --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .github/checkgroup.yml | 16 + .github/workflows/docs-checks.yml | 8 +- docs/source-app/conf.py | 10 +- docs/source-fabric/Makefile | 19 + docs/source-fabric/_static/copybutton.js | 64 +++ docs/source-fabric/_static/images/icon.svg | 9 + .../_static/images/logo-large.svg | 9 + .../_static/images/logo-small.svg | 9 + docs/source-fabric/_static/images/logo.png | Bin 0 -> 28893 bytes docs/source-fabric/_static/images/logo.svg | 12 + docs/source-fabric/_static/main.css | 3 + .../_templates/autosummary/module.rst | 41 ++ .../_templates/classtemplate.rst | 14 + .../_templates/classtemplate_no_index.rst | 12 + docs/source-fabric/_templates/layout.html | 10 + .../_templates/theme_variables.jinja | 18 + .../advanced/distributed_communication.rst | 0 .../advanced/gradient_accumulation.rst | 0 .../api/fabric_args.rst | 2 +- .../api/fabric_methods.rst | 0 .../api/utilities.rst | 0 .../api => source-fabric}/api_reference.rst | 22 +- docs/source-fabric/conf.py | 392 ++++++++++++++++++ .../fundamentals/accelerators.rst | 0 .../fundamentals/code_structure.rst | 0 .../fundamentals/convert.rst | 2 +- .../fundamentals/launch.rst | 0 .../fundamentals/notebooks.rst | 0 .../fundamentals/precision.rst | 0 .../guide/callbacks.rst | 0 .../guide/checkpoint.rst | 0 .../guide/lightning_module.rst | 4 +- .../guide/logging.rst | 0 .../guide/multi_node/barebones.rst | 0 .../guide/multi_node/cloud.rst | 0 .../guide/multi_node/other.rst | 0 .../guide/multi_node/slurm.rst | 0 .../guide/trainer_template.rst | 0 .../fabric.rst => source-fabric/index.rst} | 8 +- docs/source-fabric/links.rst | 2 + docs/source-fabric/make.bat | 35 ++ .../_templates/classtemplate.rst | 2 +- docs/source-pytorch/conf.py | 8 +- docs/source-pytorch/index.rst | 2 - .../levels/advanced_level_17.rst | 8 - docs/source-pytorch/model/own_your_loop.rst | 8 - docs/source-pytorch/starter/introduction.rst | 17 - requirements/app/docs.txt | 3 - requirements/fabric/docs.txt | 4 + 49 files changed, 703 insertions(+), 70 deletions(-) create mode 100644 docs/source-fabric/Makefile create mode 100644 docs/source-fabric/_static/copybutton.js create mode 100644 docs/source-fabric/_static/images/icon.svg create mode 100644 docs/source-fabric/_static/images/logo-large.svg create mode 100644 docs/source-fabric/_static/images/logo-small.svg create mode 100644 docs/source-fabric/_static/images/logo.png create mode 100644 docs/source-fabric/_static/images/logo.svg create mode 100644 docs/source-fabric/_static/main.css create mode 100644 docs/source-fabric/_templates/autosummary/module.rst create mode 100644 docs/source-fabric/_templates/classtemplate.rst create mode 100644 docs/source-fabric/_templates/classtemplate_no_index.rst create mode 100644 docs/source-fabric/_templates/layout.html create mode 100644 docs/source-fabric/_templates/theme_variables.jinja rename docs/{source-pytorch/fabric => source-fabric}/advanced/distributed_communication.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/advanced/gradient_accumulation.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/api/fabric_args.rst (98%) rename docs/{source-pytorch/fabric => source-fabric}/api/fabric_methods.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/api/utilities.rst (100%) rename docs/{source-pytorch/fabric/api => source-fabric}/api_reference.rst (89%) create mode 100644 docs/source-fabric/conf.py rename docs/{source-pytorch/fabric => source-fabric}/fundamentals/accelerators.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/fundamentals/code_structure.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/fundamentals/convert.rst (98%) rename docs/{source-pytorch/fabric => source-fabric}/fundamentals/launch.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/fundamentals/notebooks.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/fundamentals/precision.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/guide/callbacks.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/guide/checkpoint.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/guide/lightning_module.rst (92%) rename docs/{source-pytorch/fabric => source-fabric}/guide/logging.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/guide/multi_node/barebones.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/guide/multi_node/cloud.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/guide/multi_node/other.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/guide/multi_node/slurm.rst (100%) rename docs/{source-pytorch/fabric => source-fabric}/guide/trainer_template.rst (100%) rename docs/{source-pytorch/fabric/fabric.rst => source-fabric/index.rst} (96%) create mode 100644 docs/source-fabric/links.rst create mode 100644 docs/source-fabric/make.bat create mode 100644 requirements/fabric/docs.txt diff --git a/.github/checkgroup.yml b/.github/checkgroup.yml index 2a1a2cdd8c..0be13a9fe0 100644 --- a/.github/checkgroup.yml +++ b/.github/checkgroup.yml @@ -132,6 +132,22 @@ subprojects: # checks: # - "test-on-tpus" + - id: "fabric: Docs" + paths: + - "src/lightning/fabric/**" + - "src/lightning_fabric/*" + - "docs/source-fabric/**" + - ".github/workflows/docs-checks.yml" + - "requirements/docs.txt" + - "requirements/fabric/**" + - "setup.py" + - "pyproject.toml" # includes metadata used in the package creation + - "!*.md" + - "!**/*.md" + checks: + - "make-doctest (fabric)" + - "make-html (fabric)" + - id: "pytorch_lightning: Docs" paths: - "src/lightning/pytorch/**" diff --git a/.github/workflows/docs-checks.yml b/.github/workflows/docs-checks.yml index 4b7acf4377..ecaf1a7623 100644 --- a/.github/workflows/docs-checks.yml +++ b/.github/workflows/docs-checks.yml @@ -39,7 +39,7 @@ jobs: strategy: fail-fast: false matrix: - pkg-name: ["app", "pytorch"] + pkg-name: ["app", "fabric", "pytorch"] steps: - uses: actions/checkout@v3 with: @@ -47,14 +47,14 @@ jobs: ref: ${{ github.event.pull_request.head.sha }} - uses: aws-actions/configure-aws-credentials@v1 - if: ${{ matrix.pkg-name == 'app' }} + if: ${{ matrix.pkg-name != 'pytorch' }} with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY_ID }} aws-region: us-east-1 - run: aws s3 sync s3://sphinx-packages/ pypi/ - if: ${{ matrix.pkg-name == 'app' }} + if: ${{ matrix.pkg-name != 'pytorch' }} # Note: This uses an internal pip API and may not always work # https://github.com/actions/cache/blob/master/examples.md#multiple-oss-in-a-workflow @@ -85,7 +85,7 @@ jobs: strategy: fail-fast: false matrix: - pkg-name: ["app", "pytorch"] + pkg-name: ["app", "fabric", "pytorch"] steps: - uses: actions/checkout@v3 with: diff --git a/docs/source-app/conf.py b/docs/source-app/conf.py index f507160f8d..0ef7cc9141 100644 --- a/docs/source-app/conf.py +++ b/docs/source-app/conf.py @@ -134,7 +134,7 @@ master_doc = "index" # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'en' # List of patterns, relative to source-app directory, that match files and # directories to ignore when looking for source-app files. @@ -396,5 +396,13 @@ doctest_global_setup = """ import importlib import os import lightning as L + +from lightning.fabric.loggers.tensorboard import _TENSORBOARD_AVAILABLE, _TENSORBOARDX_AVAILABLE """ coverage_skip_undoc_in_source = True + +# skip false positive linkcheck errors from anchors +linkcheck_anchors = False + +# ignore all links in any CHANGELOG file +linkcheck_exclude_documents = [r"^(.*\/)*CHANGELOG.*$"] diff --git a/docs/source-fabric/Makefile b/docs/source-fabric/Makefile new file mode 100644 index 0000000000..268e09561b --- /dev/null +++ b/docs/source-fabric/Makefile @@ -0,0 +1,19 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = -T -W +SPHINXBUILD = sphinx-build +SOURCEDIR = . +BUILDDIR = ../build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/source-fabric/_static/copybutton.js b/docs/source-fabric/_static/copybutton.js new file mode 100644 index 0000000000..453363ce9e --- /dev/null +++ b/docs/source-fabric/_static/copybutton.js @@ -0,0 +1,64 @@ +/* Copied from the official Python docs: https://docs.python.org/3/_static/copybutton.js */ +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight,' + + '.highlight-pycon .highlight,' + + '.highlight-default .highlight'); + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and output'; + var show_text = 'Show the prompts and output'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'color': border_color, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em', + 'border-radius': '0 3px 0 0' + } + + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('>>>'); + button.css(button_styles) + button.attr('title', hide_text); + button.data('hidden', 'false'); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').click(function(e){ + e.preventDefault(); + var button = $(this); + if (button.data('hidden') === 'false') { + // hide the code output + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + button.data('hidden', 'true'); + } else { + // show the code output + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + button.data('hidden', 'false'); + } + }); +}); diff --git a/docs/source-fabric/_static/images/icon.svg b/docs/source-fabric/_static/images/icon.svg new file mode 100644 index 0000000000..e88fc19036 --- /dev/null +++ b/docs/source-fabric/_static/images/icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/source-fabric/_static/images/logo-large.svg b/docs/source-fabric/_static/images/logo-large.svg new file mode 100644 index 0000000000..39531f95e9 --- /dev/null +++ b/docs/source-fabric/_static/images/logo-large.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/source-fabric/_static/images/logo-small.svg b/docs/source-fabric/_static/images/logo-small.svg new file mode 100644 index 0000000000..1f523a57c4 --- /dev/null +++ b/docs/source-fabric/_static/images/logo-small.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/source-fabric/_static/images/logo.png b/docs/source-fabric/_static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..392c965b243b8d58d064ba536d8c209f2355f53a GIT binary patch literal 28893 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 literal 0 HcmV?d00001 diff --git a/docs/source-fabric/_static/images/logo.svg b/docs/source-fabric/_static/images/logo.svg new file mode 100644 index 0000000000..60efaa29b8 --- /dev/null +++ b/docs/source-fabric/_static/images/logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/source-fabric/_static/main.css b/docs/source-fabric/_static/main.css new file mode 100644 index 0000000000..82aa8b338a --- /dev/null +++ b/docs/source-fabric/_static/main.css @@ -0,0 +1,3 @@ +col { + width: 50% !important; +} diff --git a/docs/source-fabric/_templates/autosummary/module.rst b/docs/source-fabric/_templates/autosummary/module.rst new file mode 100644 index 0000000000..704ac61bf7 --- /dev/null +++ b/docs/source-fabric/_templates/autosummary/module.rst @@ -0,0 +1,41 @@ +{{ name | escape | underline }} + +.. currentmodule:: {{ fullname }} + +{% block functions %} +{% if functions %} +.. rubric:: Functions + +.. autosummary:: + :nosignatures: +{% for item in functions %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} + +{% block classes %} +{% if classes %} +.. rubric:: Classes + +.. autosummary:: + :nosignatures: +{% for item in classes %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} + +{% block exceptions %} +{% if exceptions %} +.. rubric:: Exceptions + +.. autosummary:: + :nosignatures: +{% for item in exceptions %} + {{ item }} +{%- endfor %} +{% endif %} +{% endblock %} + +.. automodule:: {{ fullname }} diff --git a/docs/source-fabric/_templates/classtemplate.rst b/docs/source-fabric/_templates/classtemplate.rst new file mode 100644 index 0000000000..482db1324d --- /dev/null +++ b/docs/source-fabric/_templates/classtemplate.rst @@ -0,0 +1,14 @@ +.. role:: hidden + :class: hidden-section +.. currentmodule:: {{ module }} + + +{{ name | underline }} + +.. autoclass:: {{ name }} + :members: + + +.. + autogenerated from source-fabric/_templates/classtemplate.rst + note it does not have :inherited-members: diff --git a/docs/source-fabric/_templates/classtemplate_no_index.rst b/docs/source-fabric/_templates/classtemplate_no_index.rst new file mode 100644 index 0000000000..858c37b515 --- /dev/null +++ b/docs/source-fabric/_templates/classtemplate_no_index.rst @@ -0,0 +1,12 @@ +:orphan: + +.. role:: hidden + :class: hidden-section +.. currentmodule:: {{ module }} + + +{{ name | underline }} + +.. autoclass:: {{ name }} + :members: + :noindex: diff --git a/docs/source-fabric/_templates/layout.html b/docs/source-fabric/_templates/layout.html new file mode 100644 index 0000000000..48de111416 --- /dev/null +++ b/docs/source-fabric/_templates/layout.html @@ -0,0 +1,10 @@ +{% extends "!layout.html" %} + + +{% block footer %} +{{ super() }} + + +{% endblock %} diff --git a/docs/source-fabric/_templates/theme_variables.jinja b/docs/source-fabric/_templates/theme_variables.jinja new file mode 100644 index 0000000000..447390ecc9 --- /dev/null +++ b/docs/source-fabric/_templates/theme_variables.jinja @@ -0,0 +1,18 @@ +{%- set external_urls = { + 'github': 'https://github.com/Lightning-AI/lightning', + 'github_issues': 'https://github.com/Lightning-AI/lightning/issues', + 'contributing': 'https://github.com/Lightning-AI/lightning/blob/master/.github/CONTRIBUTING.md', + 'governance': 'https://github.com/Lightning-AI/lightning/blob/master/docs/source-pytorch/governance.rst', + 'docs': 'https://lightning.rtfd.io/en/latest', + 'twitter': 'https://twitter.com/PyTorchLightnin', + 'discuss': 'https://pytorch-lightning.slack.com', + 'tutorials': 'https://pt-lightning.readthedocs.io/en/latest/#tutorials', + 'previous_pytorch_versions': 'https://pt-lightning.rtfd.io/en/latest/', + 'home': 'https://lightning.ai/', + 'get_started': 'https://pt-lightning.readthedocs.io/en/latest/introduction_guide.html', + 'features': 'https://pt-lightning.rtfd.io/en/latest/', + 'blog': 'https://www.pytorchlightning.ai/blog', + 'resources': 'https://pt-lightning.readthedocs.io/en/latest/#community-examples', + 'support': 'https://pt-lightning.rtfd.io/en/latest/', +} +-%} diff --git a/docs/source-pytorch/fabric/advanced/distributed_communication.rst b/docs/source-fabric/advanced/distributed_communication.rst similarity index 100% rename from docs/source-pytorch/fabric/advanced/distributed_communication.rst rename to docs/source-fabric/advanced/distributed_communication.rst diff --git a/docs/source-pytorch/fabric/advanced/gradient_accumulation.rst b/docs/source-fabric/advanced/gradient_accumulation.rst similarity index 100% rename from docs/source-pytorch/fabric/advanced/gradient_accumulation.rst rename to docs/source-fabric/advanced/gradient_accumulation.rst diff --git a/docs/source-pytorch/fabric/api/fabric_args.rst b/docs/source-fabric/api/fabric_args.rst similarity index 98% rename from docs/source-pytorch/fabric/api/fabric_args.rst rename to docs/source-fabric/api/fabric_args.rst index 3ee1fe9e95..eb7a7916c1 100644 --- a/docs/source-pytorch/fabric/api/fabric_args.rst +++ b/docs/source-fabric/api/fabric_args.rst @@ -140,7 +140,7 @@ See also: :doc:`../fundamentals/precision` plugins ======= -:ref:`Plugins` allow you to connect arbitrary backends, precision libraries, clusters, etc. For example: +Plugins allow you to connect arbitrary backends, precision libraries, clusters, etc. For example: To define your own behavior, subclass the relevant class and pass it in. Here's an example linking up your own :class:`~lightning.fabric.plugins.environments.ClusterEnvironment`. diff --git a/docs/source-pytorch/fabric/api/fabric_methods.rst b/docs/source-fabric/api/fabric_methods.rst similarity index 100% rename from docs/source-pytorch/fabric/api/fabric_methods.rst rename to docs/source-fabric/api/fabric_methods.rst diff --git a/docs/source-pytorch/fabric/api/utilities.rst b/docs/source-fabric/api/utilities.rst similarity index 100% rename from docs/source-pytorch/fabric/api/utilities.rst rename to docs/source-fabric/api/utilities.rst diff --git a/docs/source-pytorch/fabric/api/api_reference.rst b/docs/source-fabric/api_reference.rst similarity index 89% rename from docs/source-pytorch/fabric/api/api_reference.rst rename to docs/source-fabric/api_reference.rst index 59cd6441c6..13cc0207d1 100644 --- a/docs/source-pytorch/fabric/api/api_reference.rst +++ b/docs/source-fabric/api_reference.rst @@ -1,6 +1,6 @@ :orphan: -.. include:: ../../links.rst +.. include:: links.rst ############# API Reference @@ -13,7 +13,7 @@ Fabric .. currentmodule:: lightning.fabric.fabric .. autosummary:: - :toctree: ../../api + :toctree: api :nosignatures: :template: classtemplate.rst @@ -26,7 +26,7 @@ Accelerators .. currentmodule:: lightning.fabric.accelerators .. autosummary:: - :toctree: ../../api + :toctree: api :nosignatures: :template: classtemplate.rst @@ -43,7 +43,7 @@ Loggers .. currentmodule:: lightning.fabric.loggers .. autosummary:: - :toctree: ../../api + :toctree: api :nosignatures: :template: classtemplate.rst @@ -51,10 +51,6 @@ Loggers CSVLogger TensorBoardLogger - -Plugins -^^^^^^^ - Precision """"""""" @@ -63,7 +59,7 @@ Precision .. currentmodule:: lightning.fabric.plugins.precision .. autosummary:: - :toctree: ../../api + :toctree: api :nosignatures: :template: classtemplate.rst @@ -81,7 +77,7 @@ Environments .. currentmodule:: lightning.fabric.plugins.environments .. autosummary:: - :toctree: ../../api + :toctree: api :nosignatures: :template: classtemplate_noindex.rst @@ -101,7 +97,7 @@ IO .. currentmodule:: lightning.fabric.plugins.io .. autosummary:: - :toctree: ../../api + :toctree: api :nosignatures: :template: classtemplate.rst @@ -116,7 +112,7 @@ Collectives .. currentmodule:: lightning.fabric.plugins.collectives .. autosummary:: - :toctree: ../../api + :toctree: api :nosignatures: :template: classtemplate.rst @@ -133,7 +129,7 @@ Strategies .. currentmodule:: lightning.fabric.strategies .. autosummary:: - :toctree: ../../api + :toctree: api :nosignatures: :template: classtemplate.rst diff --git a/docs/source-fabric/conf.py b/docs/source-fabric/conf.py new file mode 100644 index 0000000000..96c8c34346 --- /dev/null +++ b/docs/source-fabric/conf.py @@ -0,0 +1,392 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. + +import glob +import inspect +import os +import shutil +import sys + +import lai_sphinx_theme + +import lightning + +_PATH_HERE = os.path.abspath(os.path.dirname(__file__)) +_PATH_ROOT = os.path.realpath(os.path.join(_PATH_HERE, "..", "..")) +sys.path.insert(0, os.path.abspath(_PATH_ROOT)) + +SPHINX_MOCK_REQUIREMENTS = int(os.environ.get("SPHINX_MOCK_REQUIREMENTS", True)) + +# -- Project information ----------------------------------------------------- + +# this name shall match the project name in Github as it is used for linking to code +project = "lightning" +copyright = lightning.__copyright__ +author = lightning.__author__ + +# The short X.Y version +version = lightning.__version__ +# The full version, including alpha/beta/rc tags +release = lightning.__version__ + +# Options for the linkcode extension +# ---------------------------------- +github_user = "Lightning-AI" +github_repo = project + +# -- Project documents ------------------------------------------------------- + + +# def _transform_changelog(path_in: str, path_out: str) -> None: +# with open(path_in) as fp: +# chlog_lines = fp.readlines() +# # enrich short subsub-titles to be unique +# chlog_ver = "" +# for i, ln in enumerate(chlog_lines): +# if ln.startswith("## "): +# chlog_ver = ln[2:].split("-")[0].strip() +# elif ln.startswith("### "): +# ln = ln.replace("###", f"### {chlog_ver} -") +# chlog_lines[i] = ln +# with open(path_out, "w") as fp: +# fp.writelines(chlog_lines) + + +# export the READme +# _convert_markdown(os.path.join(_PATH_ROOT, "README.md"), "readme.md") + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. + +needs_sphinx = "4.5" + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", + # 'sphinxcontrib.mockautodoc', # raises error: directive 'automodule' is already registered ... + # 'sphinxcontrib.fulltoc', # breaks pytorch-theme with unexpected kw argument 'titles_only' + "sphinx.ext.doctest", + "sphinx.ext.intersphinx", + "sphinx_toolbox.collapse", + "sphinx.ext.todo", + "sphinx.ext.coverage", + "sphinx.ext.viewcode", + "sphinx.ext.autosummary", + "sphinx.ext.napoleon", + "sphinx.ext.imgmath", + "sphinx.ext.autosectionlabel", + "myst_parser", + "sphinx_autodoc_typehints", + "sphinx_copybutton", + "sphinx_paramlinks", + "sphinx_togglebutton", + "lai_sphinx_theme.extensions.lightning", +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# myst-parser, forcing to parse all html pages with mathjax +# https://github.com/executablebooks/MyST-Parser/issues/394 +myst_update_mathjax = False +# https://myst-parser.readthedocs.io/en/latest/syntax/optional.html?highlight=anchor#auto-generated-header-anchors +myst_heading_anchors = 3 + +# https://berkeley-stat159-f17.github.io/stat159-f17/lectures/14-sphinx..html#conf.py-(cont.) +# https://stackoverflow.com/questions/38526888/embed-ipython-notebook-in-sphinx-document +# I execute the notebooks manually in advance. If notebooks test the code, +# they should be run at build time. +nbsphinx_execute = "never" +nbsphinx_allow_errors = True +nbsphinx_requirejs_path = "" + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +# source_suffix = ['.rst', '.md', '.ipynb'] +source_suffix = { + ".rst": "restructuredtext", + ".txt": "markdown", + ".md": "markdown", + ".ipynb": "nbsphinx", +} + +# The master toctree document. +master_doc = "index" + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = "en" + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [ + "PULL_REQUEST_TEMPLATE.md", + "**/README.md/*", + "readme.md", + "_templates", + "code_samples/convert_pl_to_app/requirements.txt", + "**/_static/*", +] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "lai_sphinx_theme" +html_theme_path = [os.environ.get("LIT_SPHINX_PATH", lai_sphinx_theme.get_html_theme_path())] + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. + +html_theme_options = { + "pytorch_project": lightning.__homepage__, + "analytics_id": "G-D3Q2ESCTZR", + "canonical_url": lightning.__homepage__, + "collapse_navigation": False, + "display_version": True, + "logo_only": False, +} + +html_favicon = "_static/images/icon.svg" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_templates", "_static"] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = project + "-doc" + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # 'preamble': '', + # Latex figure (float) alignment + "figure_align": "htbp", +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, project + ".tex", project + " Documentation", author, "manual"), +] + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [(master_doc, project, project + " Documentation", [author], 1)] + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ( + master_doc, + project, + project + " Documentation", + author, + project, + lightning.__docs__, + "Miscellaneous", + ), +] + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ["search.html"] + +# -- Extension configuration ------------------------------------------------- + +# -- Options for intersphinx extension --------------------------------------- + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = { + "python": ("https://docs.python.org/3", None), + "torch": ("https://pytorch.org/docs/stable/", None), + "pytorch_lightning": ("https://pytorch-lightning.readthedocs.io/en/stable/", None), +} + +# -- Options for todo extension ---------------------------------------------- + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + + +def setup(app): + # this is for hiding doctest decoration, + # see: http://z4r.github.io/python/2011/12/02/hides-the-prompts-and-output/ + app.add_js_file("copybutton.js") + app.add_css_file("main.css") + + +# Ignoring Third-party packages +# https://stackoverflow.com/questions/15889621/sphinx-how-to-exclude-imports-in-automodule +def _package_list_from_file(file): + list_pkgs = [] + with open(file) as fp: + lines = fp.readlines() + for ln in lines: + found = [ln.index(ch) for ch in list(",=<>#") if ch in ln] + pkg = ln[: min(found)] if found else ln + if pkg.rstrip(): + list_pkgs.append(pkg.rstrip()) + return list_pkgs + + +# define mapping from PyPI names to python imports +PACKAGE_MAPPING = { + "PyYAML": "yaml", +} +MOCK_PACKAGES = [] +if SPHINX_MOCK_REQUIREMENTS: + # mock also base packages when we are on RTD since we don't install them there + MOCK_PACKAGES += _package_list_from_file(os.path.join(_PATH_ROOT, "requirements.txt")) +MOCK_PACKAGES = [PACKAGE_MAPPING.get(pkg, pkg) for pkg in MOCK_PACKAGES] + +autodoc_mock_imports = MOCK_PACKAGES + + +# Resolve function +# This function is used to populate the (source) links in the API +def linkcode_resolve(domain, info): + def find_source(): + # try to find the file and line number, based on code from numpy: + # https://github.com/numpy/numpy/blob/master/doc/source/conf.py#L286 + obj = sys.modules[info["module"]] + for part in info["fullname"].split("."): + obj = getattr(obj, part) + fname = inspect.getsourcefile(obj) + # https://github.com/rtfd/readthedocs.org/issues/5735 + if any(s in fname for s in ("readthedocs", "rtfd", "checkouts")): + # /home/docs/checkouts/readthedocs.org/user_builds/pytorch_lightning/checkouts/ + # devel/pytorch_lightning/utilities/cls_experiment.py#L26-L176 + path_top = os.path.abspath(os.path.join("..", "..", "..")) + fname = os.path.relpath(fname, start=path_top) + else: + # Local build, imitate master + fname = "master/" + os.path.relpath(fname, start=os.path.abspath("..")) + source, lineno = inspect.getsourcelines(obj) + return fname, lineno, lineno + len(source) - 1 + + if domain != "py" or not info["module"]: + return None + try: + filename = "%s#L%d-L%d" % find_source() + except Exception: + filename = info["module"].replace(".", "/") + ".py" + # import subprocess + # tag = subprocess.Popen(['git', 'rev-parse', 'HEAD'], stdout=subprocess.PIPE, + # universal_newlines=True).communicate()[0][:-1] + branch = filename.split("/")[0] + # do mapping from latest tags to master + branch = {"latest": "master", "stable": "master"}.get(branch, branch) + filename = "/".join([branch] + filename.split("/")[1:]) + return f"https://github.com/{github_user}/{github_repo}/blob/{filename}" + + +autosummary_generate = True + +autodoc_member_order = "groupwise" +autoclass_content = "both" +# the options are fixed and will be soon in release, +# see https://github.com/sphinx-doc/sphinx/issues/5459 +autodoc_default_options = { + "members": None, + "methods": None, + # 'attributes': None, + "special-members": "__call__", + "exclude-members": "_abc_impl", + "show-inheritance": True, + "private-members": True, + "noindex": True, +} + +# Sphinx will add “permalinks” for each heading and description environment as paragraph signs that +# become visible when the mouse hovers over them. +# This value determines the text for the permalink; it defaults to "¶". Set it to None or the empty +# string to disable permalinks. +# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_permalinks +# html_add_permalinks = "¶" +# True to prefix each section label with the name of the document it is in, followed by a colon. +# For example, index:Introduction for a section called Introduction that appears in document index.rst. +# Useful for avoiding ambiguity when the same section heading appears in different documents. +# http://www.sphinx-doc.org/en/master/usage/extensions/autosectionlabel.html +autosectionlabel_prefix_document = True + +# only run doctests marked with a ".. doctest::" directive +doctest_test_doctest_blocks = "" +doctest_global_setup = """ +import importlib +import os +import lightning as L + +from lightning_utilities.core.imports import package_available +from lightning import LightningModule, Trainer +from lightning.fabric.loggers.tensorboard import _TENSORBOARD_AVAILABLE, _TENSORBOARDX_AVAILABLE + +_TORCHVISION_AVAILABLE = package_available("torchvision") +""" +coverage_skip_undoc_in_source = True + +# skip false positive linkcheck errors from anchors +linkcheck_anchors = False + +# ignore all links in any CHANGELOG file +linkcheck_exclude_documents = [r"^(.*\/)*CHANGELOG.*$"] diff --git a/docs/source-pytorch/fabric/fundamentals/accelerators.rst b/docs/source-fabric/fundamentals/accelerators.rst similarity index 100% rename from docs/source-pytorch/fabric/fundamentals/accelerators.rst rename to docs/source-fabric/fundamentals/accelerators.rst diff --git a/docs/source-pytorch/fabric/fundamentals/code_structure.rst b/docs/source-fabric/fundamentals/code_structure.rst similarity index 100% rename from docs/source-pytorch/fabric/fundamentals/code_structure.rst rename to docs/source-fabric/fundamentals/code_structure.rst diff --git a/docs/source-pytorch/fabric/fundamentals/convert.rst b/docs/source-fabric/fundamentals/convert.rst similarity index 98% rename from docs/source-pytorch/fabric/fundamentals/convert.rst rename to docs/source-fabric/fundamentals/convert.rst index 7e14df4ad3..55cbd82263 100644 --- a/docs/source-pytorch/fabric/fundamentals/convert.rst +++ b/docs/source-fabric/fundamentals/convert.rst @@ -20,7 +20,7 @@ Here are five easy steps to let :class:`~lightning.fabric.fabric.Fabric` scale y fabric.launch() -**Step 3:** Call :meth:`~lightning_fabric.fabric.Fabric.setup` on each model and optimizer pair and :meth:`~lightning_fabric.fabric.Fabric.setup_dataloaders` on all your data loaders. +**Step 3:** Call :meth:`~lightning.fabric.fabric.Fabric.setup` on each model and optimizer pair and :meth:`~lightning_fabric.fabric.Fabric.setup_dataloaders` on all your data loaders. .. code-block:: python diff --git a/docs/source-pytorch/fabric/fundamentals/launch.rst b/docs/source-fabric/fundamentals/launch.rst similarity index 100% rename from docs/source-pytorch/fabric/fundamentals/launch.rst rename to docs/source-fabric/fundamentals/launch.rst diff --git a/docs/source-pytorch/fabric/fundamentals/notebooks.rst b/docs/source-fabric/fundamentals/notebooks.rst similarity index 100% rename from docs/source-pytorch/fabric/fundamentals/notebooks.rst rename to docs/source-fabric/fundamentals/notebooks.rst diff --git a/docs/source-pytorch/fabric/fundamentals/precision.rst b/docs/source-fabric/fundamentals/precision.rst similarity index 100% rename from docs/source-pytorch/fabric/fundamentals/precision.rst rename to docs/source-fabric/fundamentals/precision.rst diff --git a/docs/source-pytorch/fabric/guide/callbacks.rst b/docs/source-fabric/guide/callbacks.rst similarity index 100% rename from docs/source-pytorch/fabric/guide/callbacks.rst rename to docs/source-fabric/guide/callbacks.rst diff --git a/docs/source-pytorch/fabric/guide/checkpoint.rst b/docs/source-fabric/guide/checkpoint.rst similarity index 100% rename from docs/source-pytorch/fabric/guide/checkpoint.rst rename to docs/source-fabric/guide/checkpoint.rst diff --git a/docs/source-pytorch/fabric/guide/lightning_module.rst b/docs/source-fabric/guide/lightning_module.rst similarity index 92% rename from docs/source-pytorch/fabric/guide/lightning_module.rst rename to docs/source-fabric/guide/lightning_module.rst index 2b2f659b7e..fec49b1427 100644 --- a/docs/source-pytorch/fabric/guide/lightning_module.rst +++ b/docs/source-fabric/guide/lightning_module.rst @@ -7,7 +7,7 @@ Organize Your Code Any raw PyTorch can be converted to Fabric with zero refactoring required, giving maximum flexibility in how you want to organize your projects. However, when developing a project in a team or sharing the code publicly, it can be beneficial to conform to a standard format of how core pieces of the code are organized. -This is what the :doc:`LightningModule <../../common/lightning_module>` was made for! +This is what the :class:`pytorch_lightning.core.module.LightningModule` was made for! Here is how you can neatly separate the research code (model, loss, optimization, etc.) from the "trainer" code (training loop, checkpointing, logging, etc.). @@ -62,7 +62,7 @@ Take these main ingredients and put them in a LightningModule: ... -This is a minimal LightningModule, but there are :doc:`many other useful hooks <../../common/lightning_module>` you can use. +This is a minimal :class:`pytorch_lightning.LightningModule`, but there are `many other useful hooks `_ you can use. ---- diff --git a/docs/source-pytorch/fabric/guide/logging.rst b/docs/source-fabric/guide/logging.rst similarity index 100% rename from docs/source-pytorch/fabric/guide/logging.rst rename to docs/source-fabric/guide/logging.rst diff --git a/docs/source-pytorch/fabric/guide/multi_node/barebones.rst b/docs/source-fabric/guide/multi_node/barebones.rst similarity index 100% rename from docs/source-pytorch/fabric/guide/multi_node/barebones.rst rename to docs/source-fabric/guide/multi_node/barebones.rst diff --git a/docs/source-pytorch/fabric/guide/multi_node/cloud.rst b/docs/source-fabric/guide/multi_node/cloud.rst similarity index 100% rename from docs/source-pytorch/fabric/guide/multi_node/cloud.rst rename to docs/source-fabric/guide/multi_node/cloud.rst diff --git a/docs/source-pytorch/fabric/guide/multi_node/other.rst b/docs/source-fabric/guide/multi_node/other.rst similarity index 100% rename from docs/source-pytorch/fabric/guide/multi_node/other.rst rename to docs/source-fabric/guide/multi_node/other.rst diff --git a/docs/source-pytorch/fabric/guide/multi_node/slurm.rst b/docs/source-fabric/guide/multi_node/slurm.rst similarity index 100% rename from docs/source-pytorch/fabric/guide/multi_node/slurm.rst rename to docs/source-fabric/guide/multi_node/slurm.rst diff --git a/docs/source-pytorch/fabric/guide/trainer_template.rst b/docs/source-fabric/guide/trainer_template.rst similarity index 100% rename from docs/source-pytorch/fabric/guide/trainer_template.rst rename to docs/source-fabric/guide/trainer_template.rst diff --git a/docs/source-pytorch/fabric/fabric.rst b/docs/source-fabric/index.rst similarity index 96% rename from docs/source-pytorch/fabric/fabric.rst rename to docs/source-fabric/index.rst index f19a1628c8..40cd97c0bf 100644 --- a/docs/source-pytorch/fabric/fabric.rst +++ b/docs/source-fabric/index.rst @@ -60,20 +60,20 @@ Fabric is the fast and lightweight way to scale PyTorch models without boilerpla Why Fabric? *********** -Fabric differentiates itself from a fully-fledged trainer like :doc:`Lightning Trainer <../common/trainer>` in these key aspects: +Fabric differentiates itself from a fully-fledged trainer like Lightning :class:`pytorch_lightning.Trainer` in these key aspects: **Fast to implement** There is no need to restructure your code: Just change a few lines in the PyTorch script and you'll be able to leverage Fabric features. **Maximum Flexibility** Write your own training and/or inference logic down to the individual optimizer calls. -You aren't forced to conform to a standardized epoch-based training loop like the one in :doc:`Lightning Trainer <../common/trainer>`. +You aren't forced to conform to a standardized epoch-based training loop like the one in Lightning :class:`pytorch_lightning.Trainer`. You can do flexible iteration based training, meta-learning, cross-validation and other types of optimization algorithms without digging into framework internals. This also makes it super easy to adopt Fabric in existing PyTorch projects to speed-up and scale your models without the compromise on large refactors. Just remember: With great power comes a great responsibility. **Maximum Control** -The :doc:`Lightning Trainer <../common/trainer>` has many built in features to make research simpler with less boilerplate, but debugging it requires some familiarity with the framework internals. +The Lightning :class:`pytorch_lightning.Trainer` has many built-in features to make research simpler with less boilerplate, but debugging it requires some familiarity with the framework internals. In Fabric, everything is opt-in. Think of it as a toolbox: You take out the tools (Fabric functions) you need and leave the other ones behind. This makes it easier to develop and debug your PyTorch code as you gradually add more features to it. Fabric provides important tools to remove undesired boilerplate code (distributed, hardware, checkpoints, logging, ...), but leaves the design and orchestration fully up to you. @@ -344,7 +344,7 @@ API .. displayitem:: :header: Full API Reference :description: Reference of all public classes, methods and functions. Useful for developers. - :button_link: api/api_reference.html + :button_link: api_reference.html :col_css: col-md-4 :height: 150 :tag: intermediate diff --git a/docs/source-fabric/links.rst b/docs/source-fabric/links.rst new file mode 100644 index 0000000000..64ec918bf8 --- /dev/null +++ b/docs/source-fabric/links.rst @@ -0,0 +1,2 @@ +.. _PyTorchJob: https://www.kubeflow.org/docs/components/training/pytorch/ +.. _Kubeflow: https://www.kubeflow.org diff --git a/docs/source-fabric/make.bat b/docs/source-fabric/make.bat new file mode 100644 index 0000000000..9b565142ae --- /dev/null +++ b/docs/source-fabric/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=../build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd diff --git a/docs/source-pytorch/_templates/classtemplate.rst b/docs/source-pytorch/_templates/classtemplate.rst index 398a0ec07c..dc11b74d14 100644 --- a/docs/source-pytorch/_templates/classtemplate.rst +++ b/docs/source-pytorch/_templates/classtemplate.rst @@ -10,5 +10,5 @@ .. - autogenerated from source/_templates/classtemplate.rst + autogenerated from source-pytorch/_templates/classtemplate.rst note it does not have :inherited-members: diff --git a/docs/source-pytorch/conf.py b/docs/source-pytorch/conf.py index d1909c005f..054043745d 100644 --- a/docs/source-pytorch/conf.py +++ b/docs/source-pytorch/conf.py @@ -74,7 +74,7 @@ for md in glob.glob(os.path.join(PATH_ROOT, ".github", "*.md")): shutil.copy(md, os.path.join(PATH_HERE, FOLDER_GENERATED, os.path.basename(md))) # copy also the changelog _transform_changelog( - os.path.join(PATH_ROOT, "src", "lightning", "pytorch", "CHANGELOG.md"), + os.path.join(PATH_ROOT, "src", "lightning", "fabric", "CHANGELOG.md"), os.path.join(PATH_HERE, FOLDER_GENERATED, "CHANGELOG.md"), ) @@ -162,7 +162,7 @@ master_doc = "index" # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -396,9 +396,7 @@ from torch.utils.data import IterableDataset, DataLoader, Dataset from lightning.pytorch import LightningDataModule, LightningModule, Trainer, seed_everything from lightning.pytorch.callbacks import Callback from lightning.pytorch.cli import _JSONARGPARSE_SIGNATURES_AVAILABLE as _JSONARGPARSE_AVAILABLE -from lightning.pytorch.utilities import ( - _TORCHVISION_AVAILABLE, -) +from lightning.pytorch.utilities import _TORCHVISION_AVAILABLE from lightning.fabric.loggers.tensorboard import _TENSORBOARD_AVAILABLE, _TENSORBOARDX_AVAILABLE from lightning.pytorch.loggers.neptune import _NEPTUNE_AVAILABLE from lightning.pytorch.loggers.comet import _COMET_AVAILABLE diff --git a/docs/source-pytorch/index.rst b/docs/source-pytorch/index.rst index 3130ee5ca4..c00dec356a 100644 --- a/docs/source-pytorch/index.rst +++ b/docs/source-pytorch/index.rst @@ -174,7 +174,6 @@ Current Lightning Users common/lightning_module common/trainer - fabric/fabric .. toctree:: :maxdepth: 2 @@ -232,7 +231,6 @@ Current Lightning Users Inference IPU Lightning CLI - Lightning Fabric LightningDataModule LightningModule Lightning Transformers diff --git a/docs/source-pytorch/levels/advanced_level_17.rst b/docs/source-pytorch/levels/advanced_level_17.rst index 4b6b5f0337..f18b5ad101 100644 --- a/docs/source-pytorch/levels/advanced_level_17.rst +++ b/docs/source-pytorch/levels/advanced_level_17.rst @@ -23,14 +23,6 @@ Learn all the ways of owning your raw PyTorch loops with Lighting. :height: 150 :tag: advanced -.. displayitem:: - :header: Use a Raw PyTorch Loop - :description: Migrate complex PyTorch projects to Lightning and push bleeding-edge research with the raw PyTorch loop. - :col_css: col-md-4 - :button_link: ../fabric/fabric.html - :height: 150 - :tag: advanced - .. raw:: html diff --git a/docs/source-pytorch/model/own_your_loop.rst b/docs/source-pytorch/model/own_your_loop.rst index 54839b0120..ad0c88912c 100644 --- a/docs/source-pytorch/model/own_your_loop.rst +++ b/docs/source-pytorch/model/own_your_loop.rst @@ -19,14 +19,6 @@ Use a pure PyTorch training loop :height: 150 :tag: advanced -.. displayitem:: - :header: Use a Raw PyTorch Loop - :description: Migrate complex PyTorch projects to Lightning and push bleeding-edge research with the raw PyTorch loop. - :col_css: col-md-4 - :button_link: ../fabric/fabric.html - :height: 150 - :tag: advanced - .. raw:: html diff --git a/docs/source-pytorch/starter/introduction.rst b/docs/source-pytorch/starter/introduction.rst index aad3b907a3..c126e30f35 100644 --- a/docs/source-pytorch/starter/introduction.rst +++ b/docs/source-pytorch/starter/introduction.rst @@ -325,15 +325,6 @@ For certain types of work at the bleeding-edge of research, Lightning offers exp :image_height: 220px :height: 320 -.. displayitem:: - :header: Lightning Fabric - :description: Full control over loop for migrating complex PyTorch projects. - :col_css: col-md-4 - :image_center: https://pl-bolts-doc-images.s3.us-east-2.amazonaws.com/lite.png - :button_link: ../fabric/fabric.html - :image_height: 220px - :height: 320 - .. raw:: html @@ -371,14 +362,6 @@ Depending on your use case, you might want to check one of these out next. :height: 180 :tag: basic -.. displayitem:: - :header: I need my raw PyTorch Loop - :description: Expert-level control for researchers working on the bleeding-edge - :col_css: col-md-3 - :button_link: ../fabric/fabric.html - :height: 180 - :tag: expert - .. displayitem:: :header: Deploy your model :description: Learn how to predict or put your model into production diff --git a/requirements/app/docs.txt b/requirements/app/docs.txt index a677d283ec..e931fcfe66 100644 --- a/requirements/app/docs.txt +++ b/requirements/app/docs.txt @@ -1,6 +1,3 @@ -r ../docs.txt -ipython[notebook] -ipython_genutils - lai-sphinx-theme diff --git a/requirements/fabric/docs.txt b/requirements/fabric/docs.txt new file mode 100644 index 0000000000..506eb31a3c --- /dev/null +++ b/requirements/fabric/docs.txt @@ -0,0 +1,4 @@ +-r ../docs.txt + +lai-sphinx-theme +tensorboard