From ea59a99426c050cf301783f411c41a732af8c752 Mon Sep 17 00:00:00 2001 From: Jirka Borovec Date: Mon, 20 Jan 2020 19:50:31 +0000 Subject: [PATCH] update org paths & convert logos (#685) * fix typos * update org paths * update links from READMe to docs * add svg logo * add svg logo-text * update logos * testing temp paths * prune links from readme * optimize imports * update logo * update paths in README * missing imports --- .github/BECOMING_A_CORE_CONTRIBUTOR.md | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 4 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .gitignore | 31 +++--- .readthedocs.yml | 2 +- MANIFEST.in | 1 - README.md | 103 ++++-------------- docs/source/_static/images/lightning_icon.svg | 62 +++++++++++ .../_static/images/lightning_logo-large.svg | 61 +++++++++++ .../_static/images/lightning_logo-name.svg | 12 ++ docs/source/_static/images/lightning_logo.png | Bin 11681 -> 8543 bytes docs/source/_static/images/lightning_logo.svg | 62 +++++++++++ .../_static/images/lightning_logo_medium.png | Bin 8543 -> 0 bytes .../_static/images/lightning_logo_small.png | Bin 2643 -> 0 bytes docs/source/_templates/theme_variables.jinja | 18 +-- docs/source/conf.py | 4 +- pl_examples/__init__.py | 4 +- .../lightning_module_template.py | 2 +- .../imagenet/imagenet_example.py | 8 +- pytorch_lightning/__init__.py | 4 +- pytorch_lightning/callbacks/pt_callbacks.py | 10 +- pytorch_lightning/core/lightning.py | 12 +- pytorch_lightning/core/memory.py | 2 +- pytorch_lightning/core/root_module.py | 2 - pytorch_lightning/testing/model_base.py | 1 + pytorch_lightning/trainer/data_loading.py | 1 + .../trainer/distrib_data_parallel.py | 2 +- pytorch_lightning/trainer/distrib_parts.py | 2 +- pytorch_lightning/trainer/evaluation_loop.py | 2 +- pytorch_lightning/trainer/trainer.py | 4 +- pytorch_lightning/trainer/training_io.py | 7 +- pytorch_lightning/trainer/training_loop.py | 4 +- pytorch_lightning/trainer/training_tricks.py | 3 +- setup.py | 2 +- tests/README.md | 2 +- 35 files changed, 290 insertions(+), 148 deletions(-) create mode 100644 docs/source/_static/images/lightning_icon.svg create mode 100644 docs/source/_static/images/lightning_logo-large.svg create mode 100755 docs/source/_static/images/lightning_logo-name.svg create mode 100644 docs/source/_static/images/lightning_logo.svg delete mode 100644 docs/source/_static/images/lightning_logo_medium.png delete mode 100644 docs/source/_static/images/lightning_logo_small.png diff --git a/.github/BECOMING_A_CORE_CONTRIBUTOR.md b/.github/BECOMING_A_CORE_CONTRIBUTOR.md index 80efc228c2..46db2111b0 100644 --- a/.github/BECOMING_A_CORE_CONTRIBUTOR.md +++ b/.github/BECOMING_A_CORE_CONTRIBUTOR.md @@ -6,7 +6,7 @@ We're currently recruiting for a team of 5 core maintainers. As a core maintainer you will have a strong say in the direction of the project. Big changes will require a majority of maintainers to agree. ### Code of conduct -First and foremost, you'll be evaluated against [these core values](https://github.com/williamFalcon/pytorch-lightning/blob/master/.github/CONTRIBUTING.md). Any code we commit or feature we add needs to align with those core values. +First and foremost, you'll be evaluated against [these core values](https://github.com/PyTorchLightning/pytorch-lightning/blob/master/.github/CONTRIBUTING.md). Any code we commit or feature we add needs to align with those core values. ### The bar for joining the team Lightning is being used to solve really hard problems at the top AI labs in the world. As such, the bar for adding team members is extremely high. Candidates must have solid engineering skills, have a good eye for user experience, and must be a power user of Lightning and PyTorch. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6ae828ac8f..a796730747 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -8,8 +8,8 @@ assignees: '' --- ### Common bugs: -1. Tensorboard not showing in Jupyter-notebook see [issue 79](https://github.com/williamFalcon/pytorch-lightning/issues/79). -2. PyTorch 1.1.0 vs 1.2.0 support [see FAQ](https://github.com/williamFalcon/pytorch-lightning#faq) +1. Tensorboard not showing in Jupyter-notebook see [issue 79](https://github.com/PyTorchLightning/pytorch-lightning/issues/79). +2. PyTorch 1.1.0 vs 1.2.0 support [see FAQ](https://github.com/PyTorchLightning/pytorch-lightning#faq) ## 🐛 Bug diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c488b97df2..258aac9253 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,7 +1,7 @@ # Before submitting - [ ] Was this discussed/approved via a Github issue? (no need for typos, doc improvements) -- [ ] Did you read the [contributor guideline](https://github.com/williamFalcon/pytorch-lightning/blob/master/.github/CONTRIBUTING.md)? +- [ ] Did you read the [contributor guideline](https://github.com/PyTorchLightning/pytorch-lightning/blob/master/.github/CONTRIBUTING.md)? - [ ] Did you make sure to update the docs? - [ ] Did you write any new necessary tests? diff --git a/.gitignore b/.gitignore index 43541c9dcb..d10d5aba3c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,26 @@ # project .DS_Store -.data/ run_configs/ -test_tube_logs/ -test_tube_data/ -datasets/ model_weights/ app/models/ pip-wheel-metadata/ -test_tube_exp/ -tests/tests_tt_dir/ -tests/save_dir -default/ lightning_logs/ -tests/tests/ -*.rst + +# Test-tube +test_tube_logs/ +test_tube_data/ +test_tube_exp/ + +# Documentations +docs/source/pl_examples*.rst +docs/source/pytorch_lightning*.rst /docs/source/*.md # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class -example.py timit_data/ -LJSpeech-1.1/ # C extensions *.so @@ -32,7 +29,6 @@ LJSpeech-1.1/ # Distribution / packaging .Python -env/ ide_layouts/ build/ develop-eggs/ @@ -44,7 +40,6 @@ lib/ lib64/ parts/ sdist/ -var/ wheels/ *.egg-info/ .installed.cfg @@ -70,6 +65,9 @@ nosetests.xml coverage.xml *.cover .hypothesis/ +tests/tests_tt_dir/ +tests/save_dir +tests/tests/ # Translations *.mo @@ -87,7 +85,7 @@ instance/ .scrapy # Sphinx documentation -docs/_build/ +docs/build/ # PyBuilder target/ @@ -109,6 +107,7 @@ celerybeat-schedule # virtualenv .venv +env/ venv/ ENV/ @@ -126,4 +125,6 @@ ENV/ .mypy_cache/ # data +.data/ +datasets/ mnist/ diff --git a/.readthedocs.yml b/.readthedocs.yml index 51fe628f34..312b50e606 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -20,5 +20,5 @@ formats: all python: version: 3.7 install: - #- requirements: requirements.txt - requirements: docs/requirements.txt + #- requirements: requirements.txt diff --git a/MANIFEST.in b/MANIFEST.in index 9b4eae6a6a..b15ebfd8c2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,7 +1,6 @@ # Manifest syntax https://docs.python.org/2/distutils/sourcedist.html graft wheelhouse -recursive-include birl *.py recursive-exclude __pycache__ *.py[cod] *.orig # Include the README diff --git a/README.md b/README.md index 7574529140..30a576cf8e 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ pip install pytorch-lightning ``` ## Docs -**[View the docs here](https://pytorch-lightning.readthedocs.io/en/latest)** +**[View the docs here](https://pytorch-lightning.rtfd.io/en/latest)** ** DOCS TEMPORARILY have broken links because we recently switched orgs from williamfalcon/pytorch-lightning to pytorchlightning/pytorch-lightning [jan 15, 2020]. As a temporary hack, when you get the 404, replace williamfalcon.github.io with pytorchlightning.github.io. @@ -84,12 +84,12 @@ Lightning sets up all the boilerplate state-of-the-art training for you so you c --- ## How do I do use it? -Think about Lightning as refactoring your research code instead of using a new framework. The research code goes into a [LightningModule](https://williamfalcon.github.io/pytorch-lightning/LightningModule/RequiredTrainerInterface/) which you fit using a Trainer. +Think about Lightning as refactoring your research code instead of using a new framework. The research code goes into a [LightningModule](https://pytorch-lightning.rtfd.io/en/latest/LightningModule/RequiredTrainerInterface/) which you fit using a Trainer. The LightningModule defines a *system* such as seq-2-seq, GAN, etc... It can ALSO define a simple classifier such as the example below. To use lightning do 2 things: -1. [Define a LightningModule](https://williamfalcon.github.io/pytorch-lightning/LightningModule/RequiredTrainerInterface/) +1. [Define a LightningModule](https://pytorch-lightning.rtfd.io/en/latest/LightningModule/RequiredTrainerInterface/) **WARNING:** This syntax is for version 0.5.0+ where abbreviations were removed. ```python import os @@ -165,7 +165,7 @@ To use lightning do 2 things: # OPTIONAL return DataLoader(MNIST(os.getcwd(), train=False, download=True, transform=transforms.ToTensor()), batch_size=32) ``` -2. Fit with a [trainer](https://williamfalcon.github.io/pytorch-lightning/Trainer/) +2. Fit with a [trainer](https://pytorch-lightning.rtfd.io/en/latest/Trainer/) ```python from pytorch_lightning import Trainer @@ -277,77 +277,20 @@ Lightning also adds a text column with all the hyperparameters for this experime ![tensorboard-support](docs/source/_static/images/tf_tags.png) -## Lightning automates all of the following ([each is also configurable](https://williamfalcon.github.io/pytorch-lightning/Trainer/)): - -#### Checkpointing - -- [Checkpoint callback](https://williamfalcon.github.io/pytorch-lightning/Trainer/Checkpointing/#model-saving) -- [Model saving](https://williamfalcon.github.io/pytorch-lightning/Trainer/Checkpointing/#model-saving) -- [Model loading](https://williamfalcon.github.io/pytorch-lightning/LightningModule/methods/#load-from-metrics) -- [Restoring training session](https://williamfalcon.github.io/pytorch-lightning/Trainer/Checkpointing/#restoring-training-session) - -#### Computing cluster (SLURM) - -- [Running grid search on a cluster](https://williamfalcon.github.io/pytorch-lightning/Trainer/SLURM%20Managed%20Cluster#running-grid-search-on-a-cluster) -- [Walltime auto-resubmit](https://williamfalcon.github.io/pytorch-lightning/Trainer/SLURM%20Managed%20Cluster#walltime-auto-resubmit) - -#### Debugging - -- [Fast dev run](https://williamfalcon.github.io/pytorch-lightning/Trainer/debugging/#fast-dev-run) -- [Inspect gradient norms](https://williamfalcon.github.io/pytorch-lightning/Trainer/debugging/#inspect-gradient-norms) -- [Log GPU usage](https://williamfalcon.github.io/pytorch-lightning/Trainer/debugging/#Log-gpu-usage) -- [Make model overfit on subset of data](https://williamfalcon.github.io/pytorch-lightning/Trainer/debugging/#make-model-overfit-on-subset-of-data) -- [Print the parameter count by layer](https://williamfalcon.github.io/pytorch-lightning/Trainer/debugging/#print-the-parameter-count-by-layer) -- [Print which gradients are nan](https://williamfalcon.github.io/pytorch-lightning/Trainer/debugging/#print-which-gradients-are-nan) -- [Print input and output size of every module in system](https://williamfalcon.github.io/pytorch-lightning/LightningModule/properties/#example_input_array) +## Lightning automates all of the following ([each is also configurable](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.trainer.html)): -#### Distributed training - -- [Implement Your Own Distributed (DDP) training](https://williamfalcon.github.io/pytorch-lightning/Trainer/hooks/#init_ddp_connection) -- [16-bit mixed precision](https://williamfalcon.github.io/pytorch-lightning/Trainer/Distributed%20training/#16-bit-mixed-precision) -- [Multi-GPU](https://williamfalcon.github.io/pytorch-lightning/Trainer/Distributed%20training/#Multi-GPU) -- [Multi-node](https://williamfalcon.github.io/pytorch-lightning/Trainer/Distributed%20training/#Multi-node) -- [Single GPU](https://williamfalcon.github.io/pytorch-lightning/Trainer/Distributed%20training/#single-gpu) -- [Self-balancing architecture](https://williamfalcon.github.io/pytorch-lightning/Trainer/Distributed%20training/#self-balancing-architecture) - - -#### Experiment Logging - -- [Display metrics in progress bar](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#display-metrics-in-progress-bar) -- [Log metric row every k batches](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#log-metric-row-every-k-batches) -- [Process position](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#process-position) -- [Tensorboard support](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#tensorboard-support) -- [Save a snapshot of all hyperparameters](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#save-a-snapshot-of-all-hyperparameters) -- [Snapshot code for a training run](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#snapshot-code-for-a-training-run) -- [Write logs file to csv every k batches](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#write-logs-file-to-csv-every-k-batches) -- [Logging on W&B](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#w&b) -- [Logging experiment data to Neptune](https://williamfalcon.github.io/pytorch-lightning/Trainer/Logging/#neptune-support) - -#### Training loop - -- [Accumulate gradients](https://williamfalcon.github.io/pytorch-lightning/Trainer/Training%20Loop/#accumulated-gradients) -- [Force training for min or max epochs](https://williamfalcon.github.io/pytorch-lightning/Trainer/Training%20Loop/#force-training-for-min-or-max-epochs) -- [Early stopping callback](https://williamfalcon.github.io/pytorch-lightning/Trainer/Training%20Loop/#early-stopping) -- [Force disable early stop](https://williamfalcon.github.io/pytorch-lightning/Trainer/Training%20Loop/#force-disable-early-stop) -- [Gradient Clipping](https://williamfalcon.github.io/pytorch-lightning/Trainer/Training%20Loop/#gradient-clipping) -- [Hooks](https://williamfalcon.github.io/pytorch-lightning/Trainer/hooks/) -- [Learning rate scheduling](https://williamfalcon.github.io/pytorch-lightning/LightningModule/RequiredTrainerInterface/#configure_optimizers) -- [Use multiple optimizers (like GANs)](https://williamfalcon.github.io/pytorch-lightning/LightningModule/RequiredTrainerInterface/#configure_optimizers) -- [Set how much of the training set to check (1-100%)](https://williamfalcon.github.io/pytorch-lightning/Trainer/Training%20Loop/#set-how-much-of-the-training-set-to-check) -- [Step optimizers at arbitrary intervals](https://williamfalcon.github.io/pytorch-lightning/Trainer/hooks/#optimizer_step) - -#### Validation loop - -- [Check validation every n epochs](https://williamfalcon.github.io/pytorch-lightning/Trainer/Validation%20loop/#check-validation-every-n-epochs) -- [Hooks](https://williamfalcon.github.io/pytorch-lightning/Trainer/hooks/) -- [Set how much of the validation set to check](https://williamfalcon.github.io/pytorch-lightning/Trainer/Validation%20loop/#set-how-much-of-the-validation-set-to-check) -- [Set how much of the test set to check](https://williamfalcon.github.io/pytorch-lightning/Trainer/Validation%20loop/#set-how-much-of-the-test-set-to-check) -- [Set validation check frequency within 1 training epoch](https://williamfalcon.github.io/pytorch-lightning/Trainer/Validation%20loop/#set-validation-check-frequency-within-1-training-epoch) -- [Set the number of validation sanity steps](https://williamfalcon.github.io/pytorch-lightning/Trainer/Validation%20loop/#set-the-number-of-validation-sanity-steps) - -#### Testing loop -- [Run test set](https://williamfalcon.github.io/pytorch-lightning/Trainer/Testing%20loop/) +- [Running grid search on a cluster](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.trainer.distrib_data_parallel.html) +- [Fast dev run](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.utilities.debugging.html) +- [Logging](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.logging.html) +- [Implement Your Own Distributed (DDP) training](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.core.lightning.html#pytorch_lightning.core.lightning.LightningModule.configure_ddp) +- [Multi-GPU & Multi-node](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.trainer.distrib_parts.html) +- [Training loop](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.trainer.training_loop.html) +- [Hooks](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.core.hooks.html) +- [Configure optimizers](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.core.lightning.html#pytorch_lightning.core.lightning.LightningModule.configure_optimizers) +- [Validations](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.trainer.evaluation_loop.html) +- [Model saving & Restoring training session](https://pytorch-lightning.rtfd.io/en/latest/pytorch_lightning.trainer.training_io.html) + ## Examples - [GAN](https://github.com/PytorchLightning/pytorch-lightning/tree/master/pl_examples/domain_templates/gan.py) @@ -366,16 +309,18 @@ Lightning also adds a text column with all the hyperparameters for this experime Welcome to the Lightning community! If you have any questions, feel free to: -1. [read the docs](https://williamfalcon.github.io/pytorch-lightning/). +1. [read the docs](https://pytorch-lightning.rtfd.io/en/latest/). 2. [Search through the issues](https://github.com/PytorchLightning/pytorch-lightning/issues?utf8=%E2%9C%93&q=my++question). 3. [Ask on stackoverflow](https://stackoverflow.com/questions/ask?guided=false) with the tag pytorch-lightning. -If no one replies to you quickly enough, feel free to post the stackoverflow link to our [Slack channel](https://join.slack.com/t/pytorch-lightning/shared_invite/enQtODU5ODIyNTUzODQwLTFkMDg5Mzc1MDBmNjEzMDgxOTVmYTdhYjA1MDdmODUyOTg2OGQ1ZWZkYTQzODhhNzdhZDA3YmNhMDhlMDY4YzQ)! +If no one replies to you quickly enough, feel free to post the stackoverflow link to our Gitter chat! + +To chat with the rest of us visit our [gitter channel](https://gitter.im/PyTorch-Lightning/community)! --- ## FAQ **How do I use Lightning for rapid research?** -[Here's a walk-through](https://williamfalcon.github.io/pytorch-lightning/) +[Here's a walk-through](https://pytorch-lightning.rtfd.io/en/latest/) **Why was Lightning created?** Lightning has 3 goals in mind: @@ -425,16 +370,16 @@ If you can't wait for the next release, install the most up to date code with: ### Any release installation -You can also install any past release from this repository: +You can also install any past release `0.X.Y` from this repository: ```bash -pip install https://github.com/PytorchLightning/pytorch-lightning/archive/0.4.4.zip --upgrade +pip install https://github.com/PytorchLightning/pytorch-lightning/archive/0.X.Y.zip --upgrade ``` ## Bibtex If you want to cite the framework feel free to use this (but only if you loved it 😊): ``` @misc{Falcon2019, - author = {Falcon, W.A.}, + author = {Falcon, W.A. et al.}, title = {PyTorch Lightning}, year = {2019}, publisher = {GitHub}, diff --git a/docs/source/_static/images/lightning_icon.svg b/docs/source/_static/images/lightning_icon.svg new file mode 100644 index 0000000000..5ab3512c04 --- /dev/null +++ b/docs/source/_static/images/lightning_icon.svg @@ -0,0 +1,62 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/docs/source/_static/images/lightning_logo-large.svg b/docs/source/_static/images/lightning_logo-large.svg new file mode 100644 index 0000000000..4a6cd73fa4 --- /dev/null +++ b/docs/source/_static/images/lightning_logo-large.svg @@ -0,0 +1,61 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/docs/source/_static/images/lightning_logo-name.svg b/docs/source/_static/images/lightning_logo-name.svg new file mode 100755 index 0000000000..37cdba22a3 --- /dev/null +++ b/docs/source/_static/images/lightning_logo-name.svg @@ -0,0 +1,12 @@ + + + + long + Created with Sketch. + + + + PyTorch Lightning + + + \ No newline at end of file diff --git a/docs/source/_static/images/lightning_logo.png b/docs/source/_static/images/lightning_logo.png index bd5117dcaef69d6e917befbd58edc936ea304168..a28606b541632d4dbc96213d9e731d3c4636778c 100644 GIT binary patch literal 8543 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 aFaRP+5wK*-7wE%LfU2U_t6BxCu>S!pn_y`G literal 11681 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 + + + + + image/svg+xml + + + + + + + + + + diff --git a/docs/source/_static/images/lightning_logo_medium.png b/docs/source/_static/images/lightning_logo_medium.png deleted file mode 100644 index a28606b541632d4dbc96213d9e731d3c4636778c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8543 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 aFaRP+5wK*-7wE%LfU2U_t6BxCu>S!pn_y`G diff --git a/docs/source/_static/images/lightning_logo_small.png b/docs/source/_static/images/lightning_logo_small.png deleted file mode 100644 index 17d0aa92bce2bc4668dd455642253cfd1a2bf363..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2643 zcmV-Z3as^sP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+MQNek|ZY#{pS=u0@@H9M`DTa4Sak*vZ_2i9pedy z$nJSXFn%2v>`#;JHtM~)B7CKROPMmxyobpb;K-3oBSBlOTRxqyB7BUzsi3-c+R{K(Jg3s z(GS1)(!!8ZL0)0PF@0!#!O2fTQ2q6|2(yS+*ZgN-MsH` zf=N&ZgV~5hxsZ~hG(^d`iBqTe_!o~)@=n-a52%J>y7Wu!uOITDSEhXYl5d{XFM;cI zsoI@{j2acE+ByoAgfwW7U3>r*aw-YAO{Kdq;o5zRtRczRoVF;A;2a;`D@C_QBH+TMEr!rpM|*w_sv;tff; zcW4NE^nQRZLG9|fr_G$LuUI3NYXjIpi^N($x6FAsPLA8uS~ov|HZ}(#>#d&!6phaU zJtlI5d};6=gNMPReT)!PqfFllWTrdC%puTu1kO_H>?a#T4KEzD5$S6z-WIcJu9aRu zm*<#cFI1%pr|PnC;Oy*e+w`NdmH|;8)Ma*{48!Ew$G+}5ZA2GEa>tTPpy{keavIG6 zUNy(s@PF+Vwt!>w+gvxG_iRhT5O1Bdfy1O(8hAdqnshzL)D2q-+AhP{aiV9FjO}zXgZCtN4@Ow(U=R22V71cuvx*{szFE(=vTBnG!5#z)#Jd+ zIZtZM;`JDtfv;RnKn=%E9vSL+Gp6ghVOk7q<821V6^R&q7&4M*Z{6snTpCp12YYAR zP%Soi^@VrIQKTARZumOb?x!wg&E~OAknE^|bn9TLS>L23EM(7Z4IIQ^cRMg1E)BVr zy9cH@^6a5=8R!|O`OdH@2)L2LcUX*aCS2i)EaU{TEL)h7!YCq>jVv^s&LFF=bJO7- zZ&LxWNZ;xk&{1Ej@a}NmV$Za71}&ebogG^Ry?Ti4)LTY*;23JGqRe7(+Zq)_rQvPv z3Xc-aaw-7Hc6ij4Q)qgk9BRM~!5Npw2o-bXoq9NOQ3hNprjmHpb_ynKtnDZJgh zK5L2@5acBSKH9?fQBV@2)EX=`ydNgg%Lh8`V(<7iL5+d^+6`S?@ZUn^MK?naYx5F@ zFNYjuqXb8lc2L+j#>CbLd7G$gQ3vVUyP;W z000DYLP=Bz2nYy#2xN!=00iqvL_t(&-qo7TZCALy z-g{l#*Jh@jQJA^Y!YpSp@BRJGdG5LAo*BumJ@=Q0+GNlM5FU@05tJCC$5bqy$4ESY z7&IbklZqq1Ld!Z%1KOySio7VnXoHC3$F4}!1s3vUJl~^I)=o{Rc8ga^xIa@Qd!m~U zZ@$TfEg8zi2vKfa_-)fJ7Mt1W0!L5xk{#%wybysgPN7xpio6w{=jfR}4!^e-qYXcP zG0fdxrwCI4#!>B1?ZReuy1=nB{Tv?Xp;EHQ+_;#-7`GeQZx=Sl&h(KT=pm|TyuhO{ zS7PwX5fbST9hpZDA*sS%74A3%{cyjq5(5d4#G<&IX+DpP@XV%3BpA9Lek4(+}R zZO(uwp;V~w%+{xP{r$ZdV^E$f6Ss)Z{Sr4X=SVti9a=L0R7#rloon$!4-9qdx(FC; z2$Mdq9Dk8QzGOGOtg-=PAWZq(8Jc8vvVbUQSl2}f$`cNq=;nVuhdLn_4rihO--4RMuqHr}^gd zUpRNkl71SuIvDid9 zAlVVvyThX}mCzaj&!b$bfHX#1S2Uu8pRe9wV&ooS!e3p4mYx&+N4jFA%SG8qg<^Pc zf{%}1!4JKr3z1U;B0_ng!iLTaJ9?kB?|EvucwaFxIKk=t=b8OGPmu7M?pECzP(m?Z zX6L>wJh3hrPa*1yKehi;W+w|II$FEvJ4Z+ab{%-$!fzUjpPS5+>Il&l-O_r#Q+$dR zpPl_%Y`u^1sTF^oxyb^_j*zHD@opz`N+=ep@v+y)M%cIz-Z&U#O~#lTiHRp1cfnr>>oL|y6K|ho5uhE002ovPDHLkV1i6- B5zYVr diff --git a/docs/source/_templates/theme_variables.jinja b/docs/source/_templates/theme_variables.jinja index 3a67ad64d3..b61b79d698 100644 --- a/docs/source/_templates/theme_variables.jinja +++ b/docs/source/_templates/theme_variables.jinja @@ -2,16 +2,16 @@ 'github': 'https://github.com/PytorchLightning/pytorch-lightning', 'github_issues': 'https://github.com/PytorchLightning/pytorch-lightning/issues', 'contributing': 'https://github.com/PytorchLightning/pytorch-lightning/blob/master/CONTRIBUTING.md', - 'docs': 'https://pytorchlightning.github.io/pytorch-lightning', + 'docs': 'https://pytorch-lightning.rtfd.io/en/latest', 'twitter': 'https://twitter.com/PyTorchLightnin', 'discuss': 'https://discuss.pytorch.org', - 'tutorials': 'https://pytorchlightning.github.io/pytorch-lightning/', - 'previous_pytorch_versions': 'https://pytorchlightning.github.io/pytorch-lightning/', - 'home': 'https://pytorchlightning.github.io/pytorch-lightning/', - 'get_started': 'https://pytorchlightning.github.io/pytorch-lightning/', - 'features': 'https://pytorchlightning.github.io/pytorch-lightning/', - 'blog': 'https://pytorchlightning.github.io/pytorch-lightning/', - 'resources': 'https://pytorchlightning.github.io/pytorch-lightning/', - 'support': 'https://pytorchlightning.github.io/pytorch-lightning/', + 'tutorials': 'https://pytorch-lightning.rtfd.io/en/latest/', + 'previous_pytorch_versions': 'https://pytorch-lightning.rtfd.io/en/latest/', + 'home': 'https://pytorch-lightning.rtfd.io/en/latest/', + 'get_started': 'https://pytorch-lightning.rtfd.io/en/latest/', + 'features': 'https://pytorch-lightning.rtfd.io/en/latest/', + 'blog': 'https://pytorch-lightning.rtfd.io/en/latest/', + 'resources': 'https://pytorch-lightning.rtfd.io/en/latest/', + 'support': 'https://pytorch-lightning.rtfd.io/en/latest/', } -%} diff --git a/docs/source/conf.py b/docs/source/conf.py index fa3558ab79..5183ef6b93 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -150,7 +150,7 @@ html_theme_options = { 'logo_only': False, } -html_logo = '_static/images/lightning_logo_small.png' +html_logo = '_static/images/lightning_logo-name.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, @@ -303,7 +303,7 @@ autodoc_mock_imports = MOCK_REQUIRE_PACKAGES + MOCK_MANUAL_PACKAGES # Options for the linkcode extension # ---------------------------------- -github_user = 'williamFalcon' +github_user = 'PyTorchLightning' github_repo = project diff --git a/pl_examples/__init__.py b/pl_examples/__init__.py index 7cffc0ee3a..92abda69d1 100644 --- a/pl_examples/__init__.py +++ b/pl_examples/__init__.py @@ -3,13 +3,13 @@ Template model definition ------------------------- In 99% of cases you want to just copy `one of the examples - `_ + `_ to start a new lightningModule and change the core of what your model is actually trying to do. .. code-block:: bash # get a copy of the module template - wget https://raw.githubusercontent.com/williamFalcon/pytorch-lightning/master/pl_examples/new_project_templates/lightning_module_template.py # noqa: E501 + wget https://raw.githubusercontent.com/PyTorchLightning/pytorch-lightning/master/pl_examples/new_project_templates/lightning_module_template.py # noqa: E501 Trainer Example diff --git a/pl_examples/basic_examples/lightning_module_template.py b/pl_examples/basic_examples/lightning_module_template.py index eb1fe9f149..07ca119651 100644 --- a/pl_examples/basic_examples/lightning_module_template.py +++ b/pl_examples/basic_examples/lightning_module_template.py @@ -1,8 +1,8 @@ """ Example template for defining a system """ -import os import logging +import os from argparse import ArgumentParser from collections import OrderedDict diff --git a/pl_examples/full_examples/imagenet/imagenet_example.py b/pl_examples/full_examples/imagenet/imagenet_example.py index a277705c32..c2175da807 100644 --- a/pl_examples/full_examples/imagenet/imagenet_example.py +++ b/pl_examples/full_examples/imagenet/imagenet_example.py @@ -8,20 +8,18 @@ from collections import OrderedDict import torch import torch.backends.cudnn as cudnn -import torch.nn.parallel import torch.nn.functional as F +import torch.nn.parallel import torch.optim as optim import torch.optim.lr_scheduler as lr_scheduler import torch.utils.data import torch.utils.data.distributed - -import torchvision.transforms as transforms -import torchvision.models as models import torchvision.datasets as datasets +import torchvision.models as models +import torchvision.transforms as transforms import pytorch_lightning as pl - # pull out resnet names from torchvision models MODEL_NAMES = sorted( name for name in models.__dict__ diff --git a/pytorch_lightning/__init__.py b/pytorch_lightning/__init__.py index 3ef4f4a1b7..49dd9591f0 100644 --- a/pytorch_lightning/__init__.py +++ b/pytorch_lightning/__init__.py @@ -5,7 +5,7 @@ __author__ = 'William Falcon et al.' __author_email__ = 'waf2107@columbia.edu' __license__ = 'Apache-2.0' __copyright__ = 'Copyright (c) 2018-2019, %s.' % __author__ -__homepage__ = 'https://github.com/williamFalcon/pytorch-lightning' +__homepage__ = 'https://github.com/PyTorchLightning/pytorch-lightning' # this has to be simple string, see: https://github.com/pypa/twine/issues/522 __docs__ = "PyTorch Lightning is the lightweight PyTorch wrapper for ML researchers." \ " Scale your models. Write less boilerplate." @@ -21,7 +21,7 @@ except NameError: if __LIGHTNING_SETUP__: import sys - sys.stderr.write('Partial import of skimage during the build process.\n') + sys.stderr.write('Partial import of torchlightning during the build process.\n') # We are not importing the rest of the scikit during the build # process, as it may not be compiled yet else: diff --git a/pytorch_lightning/callbacks/pt_callbacks.py b/pytorch_lightning/callbacks/pt_callbacks.py index 4c7d877a85..42a8336fa7 100644 --- a/pytorch_lightning/callbacks/pt_callbacks.py +++ b/pytorch_lightning/callbacks/pt_callbacks.py @@ -1,13 +1,15 @@ """ Callbacks -==================================== +========= + Callbacks supported by Lightning """ +import logging import os import shutil -import logging import warnings + import numpy as np from pytorch_lightning.overrides.data_parallel import LightningDistributedDataParallel @@ -163,9 +165,7 @@ class EarlyStopping(Callback): class ModelCheckpoint(Callback): - r""" - - Save the model after every epoch. + r"""Save the model after every epoch. Args: filepath (str): path to save the model file. diff --git a/pytorch_lightning/core/lightning.py b/pytorch_lightning/core/lightning.py index e1a328e48c..2e8b634d8c 100644 --- a/pytorch_lightning/core/lightning.py +++ b/pytorch_lightning/core/lightning.py @@ -1,21 +1,19 @@ - - -import os -import warnings import collections import logging -import pandas as pd +import os +import warnings from abc import ABC, abstractmethod from argparse import Namespace +import pandas as pd import torch import torch.distributed as dist -# + from pytorch_lightning.core.decorators import data_loader from pytorch_lightning.core.grads import GradInformation from pytorch_lightning.core.hooks import ModelHooks -from pytorch_lightning.core.saving import ModelIO from pytorch_lightning.core.memory import ModelSummary +from pytorch_lightning.core.saving import ModelIO from pytorch_lightning.overrides.data_parallel import LightningDistributedDataParallel diff --git a/pytorch_lightning/core/memory.py b/pytorch_lightning/core/memory.py index 1abc349e1e..826329c803 100644 --- a/pytorch_lightning/core/memory.py +++ b/pytorch_lightning/core/memory.py @@ -3,13 +3,13 @@ Generates a summary of a model's layers and dimensionality ''' import gc +import logging import os import subprocess import numpy as np import pandas as pd import torch -import logging class ModelSummary(object): diff --git a/pytorch_lightning/core/root_module.py b/pytorch_lightning/core/root_module.py index 9f8612bd95..abc97f3c30 100644 --- a/pytorch_lightning/core/root_module.py +++ b/pytorch_lightning/core/root_module.py @@ -6,5 +6,3 @@ import warnings warnings.warn("`root_module` module has been renamed to `lightning` since v0.6.0" " and will be removed in v0.8.0", DeprecationWarning) - -from pytorch_lightning.core.lightning import LightningModule # noqa: E402 diff --git a/pytorch_lightning/testing/model_base.py b/pytorch_lightning/testing/model_base.py index df9a3320ab..9baaf17640 100644 --- a/pytorch_lightning/testing/model_base.py +++ b/pytorch_lightning/testing/model_base.py @@ -9,6 +9,7 @@ from torch.utils.data import DataLoader from torch.utils.data.distributed import DistributedSampler from torchvision import transforms from torchvision.datasets import MNIST + try: from test_tube import HyperOptArgumentParser except ImportError: diff --git a/pytorch_lightning/trainer/data_loading.py b/pytorch_lightning/trainer/data_loading.py index 33bd99fcab..ee6c341ca1 100644 --- a/pytorch_lightning/trainer/data_loading.py +++ b/pytorch_lightning/trainer/data_loading.py @@ -2,6 +2,7 @@ import warnings from abc import ABC import torch.distributed as dist + try: # loading for pyTorch 1.3 from torch.utils.data import IterableDataset diff --git a/pytorch_lightning/trainer/distrib_data_parallel.py b/pytorch_lightning/trainer/distrib_data_parallel.py index 665ec80010..0561a6d40e 100644 --- a/pytorch_lightning/trainer/distrib_data_parallel.py +++ b/pytorch_lightning/trainer/distrib_data_parallel.py @@ -113,9 +113,9 @@ When the script starts again, Lightning will: """ +import logging import os import re -import logging import warnings from abc import ABC, abstractmethod diff --git a/pytorch_lightning/trainer/distrib_parts.py b/pytorch_lightning/trainer/distrib_parts.py index 4681d11b77..db21e4d036 100644 --- a/pytorch_lightning/trainer/distrib_parts.py +++ b/pytorch_lightning/trainer/distrib_parts.py @@ -276,7 +276,7 @@ Instead of manually building SLURM scripts, you can use the Here is an example where you run a grid search of 9 combinations of hyperparams. The full examples are `here - `_. + `_. .. code-block:: python diff --git a/pytorch_lightning/trainer/evaluation_loop.py b/pytorch_lightning/trainer/evaluation_loop.py index cb7cc219c6..e0148d60e6 100644 --- a/pytorch_lightning/trainer/evaluation_loop.py +++ b/pytorch_lightning/trainer/evaluation_loop.py @@ -123,10 +123,10 @@ In this second case, the options you pass to trainer will be used when running """ +import sys from abc import ABC, abstractmethod import torch -import sys import tqdm from pytorch_lightning.utilities.debugging import MisconfigurationException diff --git a/pytorch_lightning/trainer/trainer.py b/pytorch_lightning/trainer/trainer.py index dd68293a1c..cc9f9394f3 100644 --- a/pytorch_lightning/trainer/trainer.py +++ b/pytorch_lightning/trainer/trainer.py @@ -1,9 +1,9 @@ +import logging import os import sys import warnings -import logging import torch import torch.distributed as dist @@ -23,8 +23,8 @@ from pytorch_lightning.trainer.distrib_parts import ( from pytorch_lightning.trainer.evaluation_loop import TrainerEvaluationLoopMixin from pytorch_lightning.trainer.logging import TrainerLoggingMixin from pytorch_lightning.trainer.model_hooks import TrainerModelHooksMixin -from pytorch_lightning.trainer.training_loop import TrainerTrainLoopMixin from pytorch_lightning.trainer.training_io import TrainerIOMixin +from pytorch_lightning.trainer.training_loop import TrainerTrainLoopMixin from pytorch_lightning.trainer.training_tricks import TrainerTrainingTricksMixin from pytorch_lightning.utilities.debugging import MisconfigurationException diff --git a/pytorch_lightning/trainer/training_io.py b/pytorch_lightning/trainer/training_io.py index 168e983585..b569a6c149 100644 --- a/pytorch_lightning/trainer/training_io.py +++ b/pytorch_lightning/trainer/training_io.py @@ -89,14 +89,16 @@ At a rough level, here's what happens inside Trainer :py:mod:`pytorch_lightning. """ +import logging import os import re import signal import warnings -from subprocess import call -import logging from abc import ABC +from subprocess import call +from argparse import Namespace +import pandas as pd import torch import torch.distributed as dist @@ -268,6 +270,7 @@ class TrainerIOMixin(ABC): torch.save(checkpoint, filepath) def restore(self, checkpoint_path, on_gpu): + # if on_gpu: # checkpoint = torch.load(checkpoint_path) # else: diff --git a/pytorch_lightning/trainer/training_loop.py b/pytorch_lightning/trainer/training_loop.py index 7c8d0143b8..48a10e199a 100644 --- a/pytorch_lightning/trainer/training_loop.py +++ b/pytorch_lightning/trainer/training_loop.py @@ -151,10 +151,10 @@ When this flag is enabled each batch is split into sequences of size truncated_b """ + import copy -import inspect -from abc import ABC, abstractmethod import warnings +from abc import ABC, abstractmethod import numpy as np diff --git a/pytorch_lightning/trainer/training_tricks.py b/pytorch_lightning/trainer/training_tricks.py index c9c31bb87c..227ef245de 100644 --- a/pytorch_lightning/trainer/training_tricks.py +++ b/pytorch_lightning/trainer/training_tricks.py @@ -1,7 +1,8 @@ +import logging from abc import ABC, abstractmethod import torch -import logging + from pytorch_lightning.callbacks import GradientAccumulationScheduler diff --git a/setup.py b/setup.py index 23e1149319..44d0d199a3 100755 --- a/setup.py +++ b/setup.py @@ -44,7 +44,7 @@ setup( author=pytorch_lightning.__author__, author_email=pytorch_lightning.__author_email__, url=pytorch_lightning.__homepage__, - download_url='https://github.com/williamFalcon/pytorch-lightning', + download_url='https://github.com/PyTorchLightning/pytorch-lightning', license=pytorch_lightning.__license__, packages=find_packages(exclude=['tests']), diff --git a/tests/README.md b/tests/README.md index 045347f23b..183e9c25e9 100644 --- a/tests/README.md +++ b/tests/README.md @@ -10,7 +10,7 @@ run on a 2-GPU machine to validate the full test-suite. To run all tests do the following: ```bash -git clone https://github.com/williamFalcon/pytorch-lightning +git clone https://github.com/PyTorchLightning/pytorch-lightning cd pytorch-lightning # install module locally