From a9c0d5b97f51670e176e6ebd159764a028e1e1a8 Mon Sep 17 00:00:00 2001 From: Ethan Weber Date: Wed, 6 Apr 2022 16:46:47 +0000 Subject: [PATCH] hydra config and starting trainer class --- .gitignore | 4 +++ .vscode/launch.json | 16 +++++++++++ .vscode/settings.json | 5 ++++ README.md | 10 +++++++ configs/config.yaml | 6 +++++ configs/dataset/blender.yaml | 0 configs/dataset/dtu.yaml | 0 configs/dataset/shapenet.yaml | 0 configs/experiment/lego_bulldozer.yaml | 2 ++ configs/optimizer/adam.yaml | 0 configs/optimizer/sgd.yaml | 0 environment/requirements.txt | 3 +++ mattport/nerf/optimizer.py | 13 +++++++++ mattport/nerf/trainer.py | 37 ++++++++++++++++++++++++++ mattport/viewer/README.md | 1 + scripts/run_train_nerf.py | 25 +++++++++++++++-- tests/nerf/test_encodings.py | 6 ++++- 17 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 configs/config.yaml create mode 100644 configs/dataset/blender.yaml create mode 100644 configs/dataset/dtu.yaml create mode 100644 configs/dataset/shapenet.yaml create mode 100644 configs/experiment/lego_bulldozer.yaml create mode 100644 configs/optimizer/adam.yaml create mode 100644 configs/optimizer/sgd.yaml create mode 100644 mattport/nerf/optimizer.py diff --git a/.gitignore b/.gitignore index 68bc17f9f..efc8ee8f3 100644 --- a/.gitignore +++ b/.gitignore @@ -158,3 +158,7 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +# Experiments and outputs +runs/ +outputs/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..13aa61c4c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: run_train_nerf", + "type": "python", + "request": "launch", + "program": "scripts/run_train_nerf.py", + "console": "integratedTerminal", + "args": [] + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 8c50b4b35..3f6d1df2c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,4 +13,9 @@ "python.linting.pylintEnabled": true, "python.linting.flake8Enabled": false, "python.linting.enabled": true, + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, } \ No newline at end of file diff --git a/README.md b/README.md index f0be6b824..092eea60a 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,20 @@ pip install -r environment/requirements.txt # Install helper library cd external/goat python setup.py develop +# then go back, i.e., `cd /path/to/mattport` # For using with Jupyter python -m ipykernel install --user --name mattport --display-name "mattport" # Install mattport as a library python setup.py develop + +# Running the test cases +pytest tests +``` + +# Training a model + +``` +python scripts/run_train_nerf.py ``` \ No newline at end of file diff --git a/configs/config.yaml b/configs/config.yaml new file mode 100644 index 000000000..864783428 --- /dev/null +++ b/configs/config.yaml @@ -0,0 +1,6 @@ +defaults: + - experiment: lego_bulldozer + - dataset: blender +batch_size: 10 +optimizer: + - lr: 1e-4 diff --git a/configs/dataset/blender.yaml b/configs/dataset/blender.yaml new file mode 100644 index 000000000..e69de29bb diff --git a/configs/dataset/dtu.yaml b/configs/dataset/dtu.yaml new file mode 100644 index 000000000..e69de29bb diff --git a/configs/dataset/shapenet.yaml b/configs/dataset/shapenet.yaml new file mode 100644 index 000000000..e69de29bb diff --git a/configs/experiment/lego_bulldozer.yaml b/configs/experiment/lego_bulldozer.yaml new file mode 100644 index 000000000..02e9326c7 --- /dev/null +++ b/configs/experiment/lego_bulldozer.yaml @@ -0,0 +1,2 @@ +name: lego_bulldozer +feature_size: 5 \ No newline at end of file diff --git a/configs/optimizer/adam.yaml b/configs/optimizer/adam.yaml new file mode 100644 index 000000000..e69de29bb diff --git a/configs/optimizer/sgd.yaml b/configs/optimizer/sgd.yaml new file mode 100644 index 000000000..e69de29bb diff --git a/environment/requirements.txt b/environment/requirements.txt index c1b62abdf..ef64b7b0c 100644 --- a/environment/requirements.txt +++ b/environment/requirements.txt @@ -1,5 +1,8 @@ +hydra-core pylint==2.13.4 +pytest torch==1.11.0 +torchtyping torchvision==0.12.0 torchaudio==0.11.0 black diff --git a/mattport/nerf/optimizer.py b/mattport/nerf/optimizer.py new file mode 100644 index 000000000..f2bd07230 --- /dev/null +++ b/mattport/nerf/optimizer.py @@ -0,0 +1,13 @@ +import torch.optim as optim + + +class Optimizer: + """_summary_""" + + def __init__(self, params: dict) -> None: + self.optimizer = optim.Adam(params) + + def test(self): + raise NotImplementedError + + \ No newline at end of file diff --git a/mattport/nerf/trainer.py b/mattport/nerf/trainer.py index e69de29bb..3de4b3918 100644 --- a/mattport/nerf/trainer.py +++ b/mattport/nerf/trainer.py @@ -0,0 +1,37 @@ +import logging +import torch + + +class Trainer(object): + def __init__(self, config: None): + self.config = config + self.optimizer = None + + def load_checkpoint(self): + """_summary_ + + Raises: + NotImplementedError: _description_ + """ + raise NotImplementedError() + + def save_checkpoint(self): + """_summary_ + + Raises: + NotImplementedError: _description_ + """ + raise NotImplementedError() + + def load_dataset(self): + """_summary_ + + Raises: + NotImplementedError: _description_ + """ + raise NotImplementedError() + + def train(self): + """_summary_""" + # TODO(ethan): replace print statements with something more proper + logging.info("train function") diff --git a/mattport/viewer/README.md b/mattport/viewer/README.md index aca76ca0b..3ba37fcd0 100644 --- a/mattport/viewer/README.md +++ b/mattport/viewer/README.md @@ -6,4 +6,5 @@ The backend viewer code (python, websockets, ...). ``` https://github.com/lp-research/openvslam/tree/main/viewer +https://github.com/rdeits/meshcat ``` \ No newline at end of file diff --git a/scripts/run_train_nerf.py b/scripts/run_train_nerf.py index aaa3ffc7b..1bd96d3c0 100644 --- a/scripts/run_train_nerf.py +++ b/scripts/run_train_nerf.py @@ -1,5 +1,26 @@ import os -import mattport.nerf as nerf +from typing import Dict +from mattport.nerf.trainer import Trainer +import logging +import hydra +from omegaconf import DictConfig + +logging.basicConfig(format="[%(filename)s:%(lineno)d] %(message)s", level=logging.DEBUG) + + +@hydra.main(config_path="../configs", config_name="config.yaml") +def main(cfg: DictConfig): + print(cfg) + + print("hello mattport") + + # TODO(ethan): add some sort of config script + + config = {} + trainer = Trainer(config) + print("trainer!") + trainer.train() + if __name__ == "__main__": - print("hello mattport") + main() diff --git a/tests/nerf/test_encodings.py b/tests/nerf/test_encodings.py index 49ad82215..99f26096c 100644 --- a/tests/nerf/test_encodings.py +++ b/tests/nerf/test_encodings.py @@ -2,4 +2,8 @@ import pytest def test_positional_encoding(): - raise NotImplementedError() + assert True + + +def test_lower_case(): + assert "MATTPORT".lower() == "mattport"