From 61af1b666bf082000280e407870fd42aa73da6a9 Mon Sep 17 00:00:00 2001
From: Oleksandr <maksymets.o@gmail.com>
Date: Wed, 5 Jun 2019 18:13:19 -0700
Subject: [PATCH] CI setup that runs tests e2e testing using GPU machines (#97)

* Builds and installs habitat-sim with python setup.py install
* Added pytorch installation and running habitat baseline test in prediction mode. That maybe too much of testing, but decided to keep it for now.
* Have ideas how to speed up and parallelize jobs. Will follow up in next PRs.
* Run isort and black on whole code to make it happy.
* Includes parallelization of installation steps and use files as flags that step is finished. CircleCI has no good way to parallelize steps and have dependencies one the same machine.
* Cache is used to save conda dependencies installed and build simulator based on commit SHA.
---
 .circleci/config.yml                          | 174 ++++++++++++++++++
 examples/shortest_path_follower_example.py    |   3 +-
 habitat/core/dataset.py                       |   8 +-
 habitat/core/embodied_task.py                 |   4 +-
 habitat/core/env.py                           |   5 +-
 habitat/core/simulator.py                     |   3 +-
 habitat/core/vector_env.py                    |   7 +-
 habitat/datasets/pointnav/pointnav_dataset.py |   2 +-
 .../datasets/pointnav/pointnav_generator.py   |   2 +-
 habitat/sims/habitat_simulator.py             |  19 +-
 habitat/tasks/eqa/eqa_task.py                 |   6 +-
 habitat/tasks/nav/nav_task.py                 |  10 +-
 habitat/tasks/nav/shortest_path_follower.py   |   6 +-
 habitat/utils/geometry_utils.py               |   1 -
 habitat/utils/visualizations/maps.py          |   3 +-
 habitat/utils/visualizations/utils.py         |   4 +-
 habitat_baselines/agents/ppo_agents.py        |   6 +-
 habitat_baselines/agents/slam_agents.py       |  45 ++---
 habitat_baselines/config/default.py           |   4 +-
 habitat_baselines/evaluate_ppo.py             |   5 +-
 habitat_baselines/rl/ppo/policy.py            |   5 +-
 habitat_baselines/rl/ppo/ppo.py               |   1 -
 habitat_baselines/slambased/mappers.py        |   1 +
 habitat_baselines/slambased/monodepth.py      |  20 +-
 habitat_baselines/slambased/path_planners.py  |   5 +-
 habitat_baselines/slambased/reprojection.py   |   3 +-
 habitat_baselines/slambased/utils.py          |   3 +-
 habitat_baselines/train_ppo.py                |  13 +-
 setup.py                                      |   4 +-
 test/test_baseline_agents.py                  |   4 +-
 test/test_habitat_example.py                  |   3 +-
 test/test_pointnav_dataset.py                 |   2 +-
 test/test_sensors.py                          |   9 +-
 test/test_trajectory_sim.py                   |   1 +
 34 files changed, 288 insertions(+), 103 deletions(-)
 create mode 100644 .circleci/config.yml

diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 000000000..d99760119
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,174 @@
+version: 2
+gpu: &gpu
+  machine:
+    image: ubuntu-1604:201903-01
+  resource_class: gpu.small
+  environment:
+    FPS_THRESHOLD: 900
+
+jobs:
+  python_lint:
+    docker:
+      - image: circleci/python:3.6
+    steps:
+      - checkout
+      - run:
+          name: setup
+          command: |
+              sudo pip install black isort
+      - run:
+          name: run black
+          command: |
+              black . --line-length 79 --check  --diff
+      - run:
+          name: run isort
+          command: |
+              isort . -rc --multi-line 3 --trailing-comma --force-grid-wrap 0 --line-width 79 --combine-as
+
+  install_and_test_ubuntu:
+    <<: *gpu
+    steps:
+      - checkout:
+          path: ./habitat-api
+      - run:
+          name: Install cmake
+          no_output_timeout: 5m
+          command: |
+              echo $(git ls-remote https://github.com/facebookresearch/habitat-sim.git HEAD | awk '{ print $1}') > ./hsim_sha
+              wget https://github.com/Kitware/CMake/releases/download/v3.13.4/cmake-3.13.4-Linux-x86_64.sh
+              sudo mkdir /opt/cmake
+              sudo sh ./cmake-3.13.4-Linux-x86_64.sh --prefix=/opt/cmake --skip-license
+              sudo ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake
+      - run:
+          name: Install dependencies
+          no_output_timeout: 20m
+          command: |
+              sudo apt-get update || true
+              sudo apt-get install -y --no-install-recommends \
+                  build-essential \
+                  git \
+                  curl \
+                  vim \
+                  ca-certificates \
+                  libjpeg-dev \
+                  libglm-dev \
+                  libegl1-mesa-dev \
+                  xorg-dev \
+                  freeglut3-dev \
+                  pkg-config \
+                  wget \
+                  zip \
+                  unzip || true
+      - run:
+          name: Install cuda
+          no_output_timeout: 20m
+          background: true
+          command: |
+              wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
+              sudo dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
+              sudo apt-get update || true
+              sudo apt-get --yes --force-yes install cuda
+              touch ./cuda_installed
+              nvidia-smi
+      - restore_cache:
+          keys:
+            - conda-{{ checksum "habitat-api/.circleci/config.yml" }}
+      - run:
+          name: Install conda and dependencies
+          no_output_timeout: 20m
+          command: |
+              if [ ! -d ~/miniconda ]
+              then
+                curl -o ~/miniconda.sh -O  https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
+                chmod +x ~/miniconda.sh
+                ~/miniconda.sh -b -p $HOME/miniconda
+                rm ~/miniconda.sh
+                export PATH=$HOME/miniconda/bin:$PATH
+                conda create -y -n habitat python=3.6
+                . activate habitat
+                conda install -q -y -c conda-forge ninja numpy pytest
+              fi
+      - run:
+          name: Install pytorch
+          no_output_timeout: 20m
+          background: true
+          command: |
+              if [ ! -f ~/miniconda/pytorch_installed ]
+              then
+                export PATH=$HOME/miniconda/bin:$PATH
+                . activate habitat;
+                conda install -c  conda-forge opencv -y
+                conda install -y pytorch torchvision cudatoolkit=10.0 -c pytorch
+              fi
+              touch ~/miniconda/pytorch_installed
+      - restore_cache:
+          keys:
+            - habitat-sim-{{ checksum "./hsim_sha" }}
+      - run:
+          name: Build, install habitat-sim and run benchmark
+          no_output_timeout: 20m
+          command: |
+              export PATH=$HOME/miniconda/bin:$PATH
+              . activate habitat;
+              if [ ! -d ./habitat-sim ]
+              then
+                git clone https://github.com/facebookresearch/habitat-sim.git
+                cd habitat-sim
+                python setup.py install --headless
+              else
+                if [ ! -f ~/miniconda/pip_deps_installed ]
+                then
+                  cd habitat-sim
+                  python setup.py install --headless
+                fi
+              fi
+      - save_cache:
+          key: conda-{{ checksum "habitat-api/.circleci/config.yml" }}
+          background: true
+          paths:
+            - ~/miniconda
+      - run:
+          name: Download test data
+          command: |
+
+              if [ ! -d ./habitat-sim/data ]
+              then
+                cd habitat-sim
+                wget http://dl.fbaipublicfiles.com/habitat/habitat-test-scenes.zip
+                unzip habitat-test-scenes.zip
+                rm habitat-test-scenes.zip
+              fi
+      - run:
+          name: Run sim benchmark
+          command: |
+              while [ ! -f ./cuda_installed ]; do sleep 2; done # wait for CUDA
+              export PATH=$HOME/miniconda/bin:$PATH
+              . activate habitat; cd habitat-sim
+              python examples/example.py --scene data/scene_datasets/habitat-test-scenes/van-gogh-room.glb --silent --test_fps_regression $FPS_THRESHOLD
+      - save_cache:
+          key: habitat-sim-{{ checksum "./hsim_sha" }}
+          paths:
+            - ./habitat-sim
+      - run:
+          name: Run api tests
+          command: |
+              export PATH=$HOME/miniconda/bin:$PATH
+              . activate habitat; cd habitat-api
+              while [ ! -f ~/miniconda/pytorch_installed ]; do sleep 2; done # wait for Pytorch
+              ln -s ../habitat-sim/data data
+              pip install -r requirements.txt --progress-bar off
+              touch ~/miniconda/pip_deps_installed
+              python setup.py test
+              python setup.py develop --all
+              python -u habitat_baselines/train_ppo.py --log-file "train.log" --checkpoint-folder "data/checkpoints" --sim-gpu-id 0 --pth-gpu-id 0 --num-processes 1 --num-mini-batch 1 --num-updates 10
+      - save_cache:
+          key: conda-{{ checksum "habitat-api/.circleci/config.yml" }}
+          paths:
+            - ~/miniconda
+
+workflows:
+  version: 2
+  install_and_test:
+    jobs:
+      - python_lint
+      - install_and_test_ubuntu
\ No newline at end of file
diff --git a/examples/shortest_path_follower_example.py b/examples/shortest_path_follower_example.py
index 2cd170f36..e78cdd363 100644
--- a/examples/shortest_path_follower_example.py
+++ b/examples/shortest_path_follower_example.py
@@ -8,8 +8,9 @@ import os
 import shutil
 
 import cv2
-import habitat
 import numpy as np
+
+import habitat
 from habitat.tasks.nav.shortest_path_follower import ShortestPathFollower
 from habitat.utils.visualizations import maps
 from habitat.utils.visualizations.utils import images_to_video
diff --git a/habitat/core/dataset.py b/habitat/core/dataset.py
index 200c98afc..e0219bfd7 100644
--- a/habitat/core/dataset.py
+++ b/habitat/core/dataset.py
@@ -4,15 +4,15 @@
 # This source code is licensed under the MIT license found in the
 # LICENSE file in the root directory of this source tree.
 
-import attr
 import copy
 import json
-from typing import Dict, List, Type, TypeVar, Generic, Optional, Callable
-
-from habitat.core.utils import not_none_validator
+from typing import Callable, Dict, Generic, List, Optional, Type, TypeVar
 
+import attr
 import numpy as np
 
+from habitat.core.utils import not_none_validator
+
 
 @attr.s(auto_attribs=True, kw_only=True)
 class Episode:
diff --git a/habitat/core/embodied_task.py b/habitat/core/embodied_task.py
index aa38576a1..775c1c09b 100644
--- a/habitat/core/embodied_task.py
+++ b/habitat/core/embodied_task.py
@@ -4,11 +4,11 @@
 # This source code is licensed under the MIT license found in the
 # LICENSE file in the root directory of this source tree.
 
-from typing import Any, List, Type, Optional, Dict
 from collections import OrderedDict
+from typing import Any, Dict, List, Optional, Type
 
 from habitat.config import Config
-from habitat.core.dataset import Episode, Dataset
+from habitat.core.dataset import Dataset, Episode
 from habitat.core.simulator import SensorSuite, Simulator
 
 
diff --git a/habitat/core/env.py b/habitat/core/env.py
index cfa3438c2..874e69c25 100644
--- a/habitat/core/env.py
+++ b/habitat/core/env.py
@@ -5,18 +5,19 @@
 # LICENSE file in the root directory of this source tree.
 
 import time
-from typing import Dict, Type, List, Any, Optional, Tuple
+from typing import Any, Dict, List, Optional, Tuple, Type
 
 import gym
 import numpy as np
 from gym.spaces.dict_space import Dict as SpaceDict
+
 from habitat.config import Config
 from habitat.core.dataset import Dataset, Episode
 from habitat.core.embodied_task import EmbodiedTask, Metrics
 from habitat.core.simulator import Observations, Simulator
+from habitat.datasets import make_dataset
 from habitat.sims import make_sim
 from habitat.tasks import make_task
-from habitat.datasets import make_dataset
 
 
 class Env:
diff --git a/habitat/core/simulator.py b/habitat/core/simulator.py
index fddd6bfdd..69320bcc3 100644
--- a/habitat/core/simulator.py
+++ b/habitat/core/simulator.py
@@ -5,11 +5,12 @@
 # LICENSE file in the root directory of this source tree.
 
 from collections import OrderedDict
-from typing import Any, Dict, List, Optional
 from enum import Enum
+from typing import Any, Dict, List, Optional
 
 from gym import Space
 from gym.spaces.dict_space import Dict as SpaceDict
+
 from habitat.config import Config
 
 
diff --git a/habitat/core/vector_env.py b/habitat/core/vector_env.py
index 7cccd8cdc..d5fc6d387 100644
--- a/habitat/core/vector_env.py
+++ b/habitat/core/vector_env.py
@@ -8,16 +8,17 @@ import multiprocessing as mp
 from multiprocessing.connection import Connection
 from queue import Queue
 from threading import Thread
-from typing import Iterable, List, Tuple, Callable, Union, Any, Set, Optional
+from typing import Any, Callable, Iterable, List, Optional, Set, Tuple, Union
 
-import habitat
+import gym
 import numpy as np
 from gym.spaces.dict_space import Dict as SpaceDict
+
+import habitat
 from habitat.config import Config
 from habitat.core.env import Env, Observations
 from habitat.core.logging import logger
 from habitat.core.utils import tile_images
-import gym
 
 STEP_COMMAND = "step"
 RESET_COMMAND = "reset"
diff --git a/habitat/datasets/pointnav/pointnav_dataset.py b/habitat/datasets/pointnav/pointnav_dataset.py
index 2795b2ebf..c2ce3cbe2 100644
--- a/habitat/datasets/pointnav/pointnav_dataset.py
+++ b/habitat/datasets/pointnav/pointnav_dataset.py
@@ -12,9 +12,9 @@ from typing import List, Optional
 from habitat.config import Config
 from habitat.core.dataset import Dataset
 from habitat.tasks.nav.nav_task import (
+    NavigationEpisode,
     NavigationGoal,
     ShortestPathPoint,
-    NavigationEpisode,
 )
 
 ALL_SCENES_MASK = "*"
diff --git a/habitat/datasets/pointnav/pointnav_generator.py b/habitat/datasets/pointnav/pointnav_generator.py
index 99cb542a2..2fbd79108 100644
--- a/habitat/datasets/pointnav/pointnav_generator.py
+++ b/habitat/datasets/pointnav/pointnav_generator.py
@@ -4,7 +4,7 @@ import numpy as np
 
 from habitat.core.simulator import Simulator
 from habitat.datasets.utils import get_action_shortest_path
-from habitat.tasks.nav.nav_task import NavigationGoal, NavigationEpisode
+from habitat.tasks.nav.nav_task import NavigationEpisode, NavigationGoal
 
 """
     A minimum radius of a plane that a point should be part of to be
diff --git a/habitat/sims/habitat_simulator.py b/habitat/sims/habitat_simulator.py
index e60ca5518..8050ca023 100644
--- a/habitat/sims/habitat_simulator.py
+++ b/habitat/sims/habitat_simulator.py
@@ -4,18 +4,23 @@
 # This source code is licensed under the MIT license found in the
 # LICENSE file in the root directory of this source tree.
 
-from typing import List, Any, Optional
 from enum import Enum
+from typing import Any, List, Optional
+
+import numpy as np
+from gym import Space, spaces
 
 import habitat
 import habitat_sim
-import numpy as np
-from gym import spaces, Space
-from habitat import SensorSuite, Config
+from habitat import Config, SensorSuite
 from habitat.core.logging import logger
-from habitat.core.simulator import AgentState, ShortestPathPoint
-from habitat.core.simulator import RGBSensor, DepthSensor, SemanticSensor
-
+from habitat.core.simulator import (
+    AgentState,
+    DepthSensor,
+    RGBSensor,
+    SemanticSensor,
+    ShortestPathPoint,
+)
 
 RGBSENSOR_DIMENSION = 3
 
diff --git a/habitat/tasks/eqa/eqa_task.py b/habitat/tasks/eqa/eqa_task.py
index 66d67e47e..6898db2a2 100644
--- a/habitat/tasks/eqa/eqa_task.py
+++ b/habitat/tasks/eqa/eqa_task.py
@@ -7,14 +7,14 @@
 from typing import Dict, Optional
 
 import attr
-
 import numpy as np
 from gym import spaces
+
 from habitat.core.simulator import (
+    Observations,
     Sensor,
-    SensorTypes,
     SensorSuite,
-    Observations,
+    SensorTypes,
 )
 from habitat.core.utils import not_none_validator
 from habitat.tasks.nav.nav_task import NavigationEpisode, NavigationTask
diff --git a/habitat/tasks/nav/nav_task.py b/habitat/tasks/nav/nav_task.py
index c0c03b8d1..c46cf2e8b 100644
--- a/habitat/tasks/nav/nav_task.py
+++ b/habitat/tasks/nav/nav_task.py
@@ -6,20 +6,20 @@
 
 from typing import Any, List, Optional, Type
 
-import cv2
 import attr
+import cv2
 import numpy as np
 from gym import spaces
 
 import habitat
 from habitat.config import Config
-from habitat.core.dataset import Episode, Dataset
+from habitat.core.dataset import Dataset, Episode
 from habitat.core.embodied_task import Measurements
 from habitat.core.simulator import (
-    Simulator,
-    ShortestPathPoint,
-    SensorTypes,
     SensorSuite,
+    SensorTypes,
+    ShortestPathPoint,
+    Simulator,
 )
 from habitat.core.utils import not_none_validator
 from habitat.tasks.utils import cartesian_to_polar, quaternion_rotate_vector
diff --git a/habitat/tasks/nav/shortest_path_follower.py b/habitat/tasks/nav/shortest_path_follower.py
index 12fdb3b1d..7d6da161b 100644
--- a/habitat/tasks/nav/shortest_path_follower.py
+++ b/habitat/tasks/nav/shortest_path_follower.py
@@ -6,17 +6,15 @@
 
 from typing import Union
 
-import habitat_sim
 import numpy as np
 
-from habitat.sims.habitat_simulator import HabitatSim
-from habitat.sims.habitat_simulator import SimulatorActions
+import habitat_sim
+from habitat.sims.habitat_simulator import HabitatSim, SimulatorActions
 from habitat.utils.geometry_utils import (
     angle_between_quaternions,
     quaternion_from_two_vectors,
 )
 
-
 EPSILON = 1e-6
 
 
diff --git a/habitat/utils/geometry_utils.py b/habitat/utils/geometry_utils.py
index 7249333bb..ac454f4d9 100644
--- a/habitat/utils/geometry_utils.py
+++ b/habitat/utils/geometry_utils.py
@@ -7,7 +7,6 @@
 import numpy as np
 import quaternion
 
-
 EPSILON = 1e-8
 
 
diff --git a/habitat/utils/visualizations/maps.py b/habitat/utils/visualizations/maps.py
index c44302acd..fbd7eb6fe 100644
--- a/habitat/utils/visualizations/maps.py
+++ b/habitat/utils/visualizations/maps.py
@@ -5,12 +5,13 @@
 # LICENSE file in the root directory of this source tree.
 
 import os
-from typing import List, Tuple, Optional
+from typing import List, Optional, Tuple
 
 import cv2
 import imageio
 import numpy as np
 import scipy.ndimage
+
 from habitat.core.simulator import Simulator
 from habitat.utils.visualizations import utils
 
diff --git a/habitat/utils/visualizations/utils.py b/habitat/utils/visualizations/utils.py
index 474b980a5..47a21a84c 100644
--- a/habitat/utils/visualizations/utils.py
+++ b/habitat/utils/visualizations/utils.py
@@ -5,10 +5,10 @@
 # LICENSE file in the root directory of this source tree.
 
 import os
-from typing import Tuple, Optional, List
+from typing import List, Optional, Tuple
 
-import numpy as np
 import imageio
+import numpy as np
 import tqdm
 
 
diff --git a/habitat_baselines/agents/ppo_agents.py b/habitat_baselines/agents/ppo_agents.py
index ea0b53773..26f59a944 100644
--- a/habitat_baselines/agents/ppo_agents.py
+++ b/habitat_baselines/agents/ppo_agents.py
@@ -10,13 +10,13 @@ import random
 
 import numpy as np
 import torch
-from gym.spaces import Discrete, Dict, Box
+from gym.spaces import Box, Dict, Discrete
 
 import habitat
-from habitat_baselines.rl.ppo import Policy
-from habitat_baselines.rl.ppo.utils import batch_obs
 from habitat import Config
 from habitat.core.agent import Agent
+from habitat_baselines.rl.ppo import Policy
+from habitat_baselines.rl.ppo.utils import batch_obs
 
 
 def get_defaut_config():
diff --git a/habitat_baselines/agents/slam_agents.py b/habitat_baselines/agents/slam_agents.py
index c90ecb5f2..b7694e826 100644
--- a/habitat_baselines/agents/slam_agents.py
+++ b/habitat_baselines/agents/slam_agents.py
@@ -1,39 +1,34 @@
 import argparse
-import numpy as np
-import torch
+import os
 import random
+import sys
 import time
-import os
-import PIL
 from math import pi
+
+import numpy as np
+import PIL
+import requests
+import torch
 import torch.nn.functional as F
-import orbslam2
+
 import habitat
-from habitat_baselines.slambased.utils import generate_2dgrid
+import orbslam2
+from habitat.config.default import get_config
+from habitat.sims.habitat_simulator import SimulatorActions
+from habitat_baselines.config.default import get_config as cfg_baseline
+from habitat_baselines.slambased.mappers import DirectDepthMapper
+from habitat_baselines.slambased.monodepth import MonoDepthEstimator
+from habitat_baselines.slambased.path_planners import DifferentiableStarPlanner
 from habitat_baselines.slambased.reprojection import (
-    homogenize_p,
-    get_distance,
-    project_tps_into_worldmap,
+    angle_to_pi_2_minus_pi_2 as norm_ang,
     get_direction,
+    get_distance,
     habitat_goalpos_to_mapgoal_pos,
+    homogenize_p,
     planned_path2tps,
-    angle_to_pi_2_minus_pi_2,
-)
-from habitat_baselines.slambased.reprojection import (
-    angle_to_pi_2_minus_pi_2 as norm_ang,
+    project_tps_into_worldmap,
 )
-from habitat.sims.habitat_simulator import SimulatorActions
-from habitat_baselines.slambased.mappers import DirectDepthMapper
-from habitat_baselines.slambased.path_planners import DifferentiableStarPlanner
-
-from habitat_baselines.config.default import get_config as cfg_baseline
-from habitat.config.default import get_config
-
-from habitat_baselines.slambased.monodepth import MonoDepthEstimator
-
-# https://sumit-ghosh.com/articles/python-download-progress-bar/
-import sys
-import requests
+from habitat_baselines.slambased.utils import generate_2dgrid
 
 
 def download(url, filename):
diff --git a/habitat_baselines/config/default.py b/habitat_baselines/config/default.py
index 39a9cc377..ee9c62d7d 100644
--- a/habitat_baselines/config/default.py
+++ b/habitat_baselines/config/default.py
@@ -4,8 +4,10 @@
 # This source code is licensed under the MIT license found in the
 # LICENSE file in the root directory of this source tree.
 
-import numpy as np
 from typing import List, Optional, Union
+
+import numpy as np
+
 from habitat import get_config
 from habitat.config import Config as CN
 
diff --git a/habitat_baselines/evaluate_ppo.py b/habitat_baselines/evaluate_ppo.py
index 43f340797..ef496589b 100644
--- a/habitat_baselines/evaluate_ppo.py
+++ b/habitat_baselines/evaluate_ppo.py
@@ -9,12 +9,11 @@ import argparse
 import torch
 
 import habitat
-from habitat.config.default import get_config
 from config.default import get_config as cfg_baseline
-
-from train_ppo import make_env_fn
+from habitat.config.default import get_config
 from rl.ppo import PPO, Policy
 from rl.ppo.utils import batch_obs
+from train_ppo import make_env_fn
 
 
 def main():
diff --git a/habitat_baselines/rl/ppo/policy.py b/habitat_baselines/rl/ppo/policy.py
index 0fa2adca6..5c9e72563 100644
--- a/habitat_baselines/rl/ppo/policy.py
+++ b/habitat_baselines/rl/ppo/policy.py
@@ -4,12 +4,11 @@
 # This source code is licensed under the MIT license found in the
 # LICENSE file in the root directory of this source tree.
 
+import numpy as np
 import torch
 import torch.nn as nn
 
-from habitat_baselines.rl.ppo.utils import Flatten, CategoricalNet
-
-import numpy as np
+from habitat_baselines.rl.ppo.utils import CategoricalNet, Flatten
 
 
 class Policy(nn.Module):
diff --git a/habitat_baselines/rl/ppo/ppo.py b/habitat_baselines/rl/ppo/ppo.py
index 6f46ab225..78f113f89 100644
--- a/habitat_baselines/rl/ppo/ppo.py
+++ b/habitat_baselines/rl/ppo/ppo.py
@@ -8,7 +8,6 @@ import torch
 import torch.nn as nn
 import torch.optim as optim
 
-
 EPS_PPO = 1e-5
 
 
diff --git a/habitat_baselines/slambased/mappers.py b/habitat_baselines/slambased/mappers.py
index 527b37cd9..90b16cd3b 100644
--- a/habitat_baselines/slambased/mappers.py
+++ b/habitat_baselines/slambased/mappers.py
@@ -1,6 +1,7 @@
 import numpy as np
 import torch
 import torch.nn as nn
+
 from habitat_baselines.slambased.reprojection import (
     get_map_size_in_cells,
     project2d_pcl_into_worldmap,
diff --git a/habitat_baselines/slambased/monodepth.py b/habitat_baselines/slambased/monodepth.py
index 38c7269c5..a1f87b793 100644
--- a/habitat_baselines/slambased/monodepth.py
+++ b/habitat_baselines/slambased/monodepth.py
@@ -6,26 +6,26 @@ WACV 2019
 """
 
 
+import math
+import os
+import pdb
+
+import numpy as np
 import torch
+import torch.nn as nn
+import torch.nn.functional as F
 import torch.nn.parallel
+import torch.utils.model_zoo as model_zoo
+from PIL import Image
+from torchvision import transforms, utils
 
 """
 ResNet code gently borrowed from
 https://github.com/pytorch/vision/blob/master/torchvision/models/py
 """
 
-import torch.nn as nn
-import math
-import torch.utils.model_zoo as model_zoo
-import torch.nn.functional as F
-import torch
-import numpy as np
-import pdb
-import os
-from PIL import Image
 
 accimage = None
-from torchvision import transforms, utils
 
 
 __all__ = [
diff --git a/habitat_baselines/slambased/path_planners.py b/habitat_baselines/slambased/path_planners.py
index eebaebfad..9e15e1574 100644
--- a/habitat_baselines/slambased/path_planners.py
+++ b/habitat_baselines/slambased/path_planners.py
@@ -1,8 +1,9 @@
+import matplotlib.pyplot as plt
 import numpy as np
 import torch
-import torch.nn.functional as F
 import torch.nn as nn
-import matplotlib.pyplot as plt
+import torch.nn.functional as F
+
 from habitat_baselines.slambased.utils import generate_2dgrid
 
 
diff --git a/habitat_baselines/slambased/reprojection.py b/habitat_baselines/slambased/reprojection.py
index e71074b55..7d79f6d74 100644
--- a/habitat_baselines/slambased/reprojection.py
+++ b/habitat_baselines/slambased/reprojection.py
@@ -1,6 +1,7 @@
+from math import ceil, floor
+
 import numpy as np
 import torch
-from math import ceil, floor
 
 
 def p_zx(p):
diff --git a/habitat_baselines/slambased/utils.py b/habitat_baselines/slambased/utils.py
index 8b39671c7..73acc862d 100644
--- a/habitat_baselines/slambased/utils.py
+++ b/habitat_baselines/slambased/utils.py
@@ -1,6 +1,7 @@
+import time
+
 import numpy as np
 import torch
-import time
 from PIL import Image
 
 
diff --git a/habitat_baselines/train_ppo.py b/habitat_baselines/train_ppo.py
index b71238263..90ecc0d82 100644
--- a/habitat_baselines/train_ppo.py
+++ b/habitat_baselines/train_ppo.py
@@ -5,20 +5,21 @@
 # LICENSE file in the root directory of this source tree.
 
 import os
-from time import time
-from collections import deque
 import random
-import numpy as np
+from collections import deque
+from time import time
 
+import numpy as np
 import torch
+
 import habitat
+from config.default import get_config as cfg_baseline
 from habitat import logger
-from habitat.sims.habitat_simulator import SimulatorActions
 from habitat.config.default import get_config as cfg_env
-from config.default import get_config as cfg_baseline
 from habitat.datasets.pointnav.pointnav_dataset import PointNavDatasetV1
+from habitat.sims.habitat_simulator import SimulatorActions
 from rl.ppo import PPO, Policy, RolloutStorage
-from rl.ppo.utils import update_linear_schedule, ppo_args, batch_obs
+from rl.ppo.utils import batch_obs, ppo_args, update_linear_schedule
 
 
 class NavRLEnv(habitat.RLEnv):
diff --git a/setup.py b/setup.py
index bec05a1f7..a95bae9b4 100644
--- a/setup.py
+++ b/setup.py
@@ -7,12 +7,14 @@
 import glob
 import os.path
 import sys
+
 import setuptools
 from setuptools.command.develop import develop as DefaultDevelopCommand
 from setuptools.command.install import install as DefaultInstallCommand
 
 sys.path.insert(0, os.path.join(os.path.dirname(__file__), "habitat"))
-from version import VERSION  # noqa
+from version import VERSION  # isort:skip noqa
+
 
 with open("README.md", encoding="utf8") as f:
     readme = f.read()
diff --git a/test/test_baseline_agents.py b/test/test_baseline_agents.py
index fcb6283f0..b69bc8220 100644
--- a/test/test_baseline_agents.py
+++ b/test/test_baseline_agents.py
@@ -4,9 +4,11 @@
 # This source code is licensed under the MIT license found in the
 # LICENSE file in the root directory of this source tree.
 
-import habitat
 import os
+
 import pytest
+
+import habitat
 from habitat_baselines.agents import simple_agents
 
 try:
diff --git a/test/test_habitat_example.py b/test/test_habitat_example.py
index 39131be24..1f95c35f4 100644
--- a/test/test_habitat_example.py
+++ b/test/test_habitat_example.py
@@ -7,10 +7,9 @@
 import pytest
 
 import habitat
+from examples import shortest_path_follower_example, visualization_examples
 from examples.example import example
 from habitat.datasets.pointnav.pointnav_dataset import PointNavDatasetV1
-from examples import visualization_examples
-from examples import shortest_path_follower_example
 
 
 def test_readme_example():
diff --git a/test/test_pointnav_dataset.py b/test/test_pointnav_dataset.py
index dbc4b9053..1701b981f 100644
--- a/test/test_pointnav_dataset.py
+++ b/test/test_pointnav_dataset.py
@@ -18,8 +18,8 @@ from habitat.core.embodied_task import Episode
 from habitat.core.logging import logger
 from habitat.datasets import make_dataset
 from habitat.datasets.pointnav.pointnav_dataset import (
-    PointNavDatasetV1,
     DEFAULT_SCENE_PATH_PREFIX,
+    PointNavDatasetV1,
 )
 from habitat.utils.geometry_utils import quaternion_xyzw_to_wxyz
 
diff --git a/test/test_sensors.py b/test/test_sensors.py
index 6b6cc3868..771704089 100644
--- a/test/test_sensors.py
+++ b/test/test_sensors.py
@@ -4,19 +4,20 @@
 # This source code is licensed under the MIT license found in the
 # LICENSE file in the root directory of this source tree.
 
-import numpy as np
 import os
-import pytest
 import random
 
+import numpy as np
+import pytest
+
 import habitat
 from habitat.config.default import get_config
+from habitat.sims.habitat_simulator import SimulatorActions
 from habitat.tasks.nav.nav_task import (
-    NavigationEpisode,
     COLLISION_PROXIMITY_TOLERANCE,
+    NavigationEpisode,
     NavigationGoal,
 )
-from habitat.sims.habitat_simulator import SimulatorActions
 
 NON_STOP_ACTIONS = [
     v for v in range(len(SimulatorActions)) if v != SimulatorActions.STOP.value
diff --git a/test/test_trajectory_sim.py b/test/test_trajectory_sim.py
index f3e02f1be..8d2302cba 100644
--- a/test/test_trajectory_sim.py
+++ b/test/test_trajectory_sim.py
@@ -9,6 +9,7 @@ import os
 
 import numpy as np
 import pytest
+
 from habitat.config.default import get_config
 from habitat.sims import make_sim
 from habitat.sims.habitat_simulator import SimulatorActions
-- 
GitLab