For training the complete Active Neural SLAM model on the Exploration task:
python main.py
The code runs multiple parallel threads for training. Each thread loads a scene on a GPU. The code automatically decides the total number of threads and number of threads on each GPU based on the available GPUs.
If you would like to not use the auto gpu config, you need to specify the following:
-n, --num_processes NUM_PROCESSES
--num_processes_per_gpu NUM_PROCESSES_PER_GPU
NUM_PROCESSES_PER_GPU
will depend on your GPU memory, 11 works well of 16GB GPUs.
NUM_PROCESSES
depends on the number of GPUs used for training and NUM_PROCESSES_PER_GPU
such that
NUM_PROCESSES <= min(NUM_PROCESSES_PER_GPU * number of GPUs, 72)
The Gibson training set consists of 72 scenes.
For example, on a 8 GPU system, with 16GB memory per GPU:
python main.py --auto_gpu_config 0 -n 72 --num_processes_per_gpu 11 --sim_gpu_id 1
Here, sim_gpu_id = 1
specifies simulator threads to run from GPUs 1 onwards, and using GPU 0 only for pytorch model.
Each GPU from 1 to 6 will run 11 threads each, and GPU 7 will run 6 threads.
python main.py -d saved/ --exp_name exp1 --save_periodic 100000
The above will save the best model files and training log at saved/models/exp1/
and save all models periodically every 100000 steps at saved/dump/exp1/
. Each module will be saved in a separate file.
The Active Neural SLAM model consists of three independent modules: a Global Policy, a Local Policy and a Neural SLAM Module. The model and code is modular, which means any subset of modules can be trained. Specifying which modules need to trained using
--train_global TRAIN_GLOBAL
0: Do not train the Global Policy
1: Train the Global Policy (default: 1)
--train_local TRAIN_LOCAL
0: Do not train the Local Policy
1: Train the Local Policy (default: 1)
--train_slam TRAIN_SLAM
0: Do not train the Neural SLAM Module
1: Train the Neural SLAM Module (default: 1)
Each module can also be loaded independently using --load_global
, --load_local
and --load_slam
arguments.
Instead of training the local policy, a deterministic local policy can be used which results in much
faster training and slightly lower final performance. Add --use_deterministic_local 1
argument to
use the deterministic local policy.
Most of the default hyper-parameters should work fine. Some hyperparameters are set for training with 72 threads, which might need to be tuned when using fewer threads. Fewer threads lead to smaller batch size for Local and Global Policy. Consequently, their learning rates might need to be tuned:
--local_optimizer, (default='adam,lr=0.0001')
--global_lr, (default=2.5e-5)
The code uses actuation and sensor noise based on models trained on real-world data. To turn off the
actuation and sensor noise use --noisy_actions 0
and --noisy_odometry 0
, respectively.
mkdir pretrained_models
wget -O pretrained_models/model_best.global http://www.cs.cmu.edu/~dchaplot/projects/active_neural_slam/model_best.global
wget -O pretrained_models/model_best.local http://www.cs.cmu.edu/~dchaplot/projects/active_neural_slam/model_best.local
wget -O pretrained_models/model_best.slam http://www.cs.cmu.edu/~dchaplot/projects/active_neural_slam/model_best.slam
The following are instructions to evaluate on the Gibson val set.
To parallelize evaluation for speed, we provide a script to convert the Gibson val set into multi-threading format:
python scripts/convert_datasets.py
The above will create a multi-thread version of the val set at data/datasets/pointnav/gibson/v1//val_mt/
.
Specify number of threads for evaluation using --num_processes
and number of evaluation episodes per thread using --num_episodes
.
The Gibson val set consists of 14 scenes and 71 episodes per scene. Thus, we recommend using 14 threads for evaluation, and 71 episodes per thread.
For example, if you have 2 GPUs:
python main.py --split val_mt --eval 1 \
--auto_gpu_config 0 -n 14 --num_episodes 71 --num_processes_per_gpu 7 \
--load_global pretrained_models/model_best.global --train_global 0 \
--load_local pretrained_models/model_best.local --train_local 0 \
--load_slam pretrained_models/model_best.slam --train_slam 0
The full and local map sizes are specified using the following arguments:
--map_size_cm (default: 2400)
--global_downscaling (default:2)
The default arguments lead to full map size of M = 480 (=24m)
and local map size of G = 240 (=12m)
.
Although the pre-trained models are trained with default map size for better training speed, they can be evaluated with larger full map size to improve performance.
The full map size can be increased to M = 960 (=48m)
using --map_size_cm 4800 --global_downscaling 4
:
python main.py --split val_mt --eval 1 \
--auto_gpu_config 0 -n 14 --num_episodes 71 --num_processes_per_gpu 7 \
--map_size_cm 4800 --global_downscaling 4 \
--load_global pretrained_models/model_best.global --train_global 0 \
--load_local pretrained_models/model_best.local --train_local 0 \
--load_slam pretrained_models/model_best.slam --train_slam 0
To evaluate on small and large scenes on the gibson set separately, create small and large splits using:
python scripts/convert_datasets.py --split_by_size 1
This will create two datasets at data/datasets/pointnav/gibson/v1//val_mt_small/
(10 scenes) and data/datasets/pointnav/gibson/v1//val_mt_large/
(4 scenes).
You can evaluate models on these datasets by changing --split
and -n
arguments in the above command to val_mt_small
and 10
or val_mt_large
and 4
.
For visualizing the agent observations and predicted map and pose, add -v 1
as an argument to the above command. This will require a display to be attached to the system.
To visualize on headless systems (without display), use --print_images 1 -d results/ --exp_name exp1
. This will save the visualization images in results/dump/exp1/episodes/
.
Both -v 1
and --print_images 1
can be used together to visualize and print images at the same time.
ImportError: cannot import name 'PILLOW_VERSION' from 'PIL'
. New Pillow version breaks torchvision, see the issue here. Downgrading the pillow version seems to work:
pip install "pillow<7"
To silence habitat sim log add the following to your ~/.bashrc
(Linux) or ~/.bash_profile
(Mac)
export GLOG_minloglevel=2
export MAGNUM_LOG="quiet"