CarlaSim on Ibex

CarlaSim runs as a client server application. Since CarlaSim supports limited Operating systems, and requires root access to install, it is unviable to install it on bare metal on a HPC system like Ibex which is shared. Besides, only the server side requires an installation such as that.

Moreover, vulkan drivers are not available on Ibex GPU node and we will rely on opengl to run our server as headless i.e. with no rendering support.

Building Server environment

For server side we use Docker image published by CarlaSim on DockerHub. Since Docker container platform is not available on Ibex. Instead we will use Singularity container platform to run a CarlaSim container using the same Docker image from DockerHub.

Here is how you fetch the relevant image on Ibex:

module load singularity mkdir -p $HOME/tmpdir export SINGULARITY_TMPDIR=$HOME/tmpdir singularity pull docker://carlasim/carla:0.9.5

Once completed, the above commands result in a Singularity Image File or a carla_0.9.5.sif which Singularity container runtime understand.

Running the server

The following jobscript should start a Carla server:

#!/bin/bash #SBATCH --job-name=carla_server #SBATCH --gpus=1 #SBATCH --gpus-per-node=1 #SBATCH --constraint=gtx1080ti #SBATCH --mem=50G #SBATCH --cpus-per-task=4 #SBATCH --time=01:00:00 module load singularity export DISPLAY= # set image path to where your image is located export IMAGE=/ibex/scratch/shaima0d/tickets/37094/carla_0.9.5.sif #Setting the port is optional. Set it if another user process is using the default 2000 and 2001 ports. export HOST=$(/bin/hostname) export PORT=11011 echo "Starting Carla server on $HOST:$PORT" > server_info.${SLURM_JOBID}.txt SINGULARITYENV_SDL_VIDEODRIVER=offscreen SINGULARITYENV_CUDA_VISIBLE_DEIVCE=$CUDA_VISIBLE_DEVICES singularity exec --nv carla_0.9.5.sif /home/carla/ -opengl -carla-rpc-port=11011
  • At times, you may notice that the server doesn’t start and crashes with Segmentation Fault. In such situation try allocating the whole node and resubmit the server job. We are investigating the issue why the CUDA_VISIBLE_DEVICES are not honored.

  • In case you see that the requested port is busy, try to change the port, its an arbitrary number. Try port number > 10000 to keep away from the commonly used ones.

Build Client environment

You can create a conda environment:

conda env create -f environment.yml

where the environment.yml looks as follows:

name: carla_py3 channels: - conda-forge - intel - defaults dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=1_gnu - ca-certificates=2021.5.30=ha878542_0 - certifi=2021.5.30=py36h5fab9bb_0 - ld_impl_linux-64=2.36.1=hea4e1c9_2 - libblas=3.9.0=11_linux64_openblas - libcblas=3.9.0=11_linux64_openblas - libffi=3.3=h58526e2_2 - libgcc-ng=11.1.0=hc902ee8_8 - libgfortran-ng=11.1.0=h69a702a_8 - libgfortran5=11.1.0=h6c583b3_8 - libgomp=11.1.0=hc902ee8_8 - libjpeg-turbo=2.1.0=h7f98852_0 - liblapack=3.9.0=11_linux64_openblas - libopenblas=0.3.17=pthreads_h8fe5266_1 - libstdcxx-ng=11.1.0=h56837e0_8 - ncurses=6.2=h58526e2_4 - numpy=1.19.5=py36hfc0c790_2 - openssl=1.1.1k=h7f98852_0 - pip=21.2.4=pyhd8ed1ab_0 - python=3.6.13=hffdb5ce_0_cpython - python_abi=3.6=2_cp36m - readline=8.1=h46c0cb4_0 - setuptools=49.6.0=py36h5fab9bb_3 - sqlite=3.36.0=h9cd32fc_0 - tk=8.6.10=h21135ba_1 - wheel=0.37.0=pyhd8ed1ab_0 - xz=5.2.5=h516909a_1 - zlib=1.2.11=h516909a_1010 - pip: - carla==0.9.5 - gputil==1.4.0 - psutil==5.8.0 - py-cpuinfo==8.0.0 - pygame==2.0.1 - python-tr==0.1.2

Running the client

To connect to the server, you can either start an interactive job or submit a python script in a SLURM job script. The following is a jobscript running a performance benchmark packaged in CarlaSim’s Github repository:

#!/bin/bash #SBATCH --gpus=1 #SBATCH --time=01:00:00 #SBATCH --mem=100G source ~/miniconda3/bin/activate carla_py3 HOST=$(cat server_info.txt | cut -d ":" -f 1) PORT=$(cat server_info.txt | cut -d ":" -f 2) echo "python ${PWD}/carla/PythonAPI/util/ --host=$HOST --port=${PORT} " srun -u python ${PWD}/carla/PythonAPI/util/ --host=$HOST --port=${PORT}