參考與前言
-
carla官方對於docker 運行的描述:
-
Docker的使用:[暫時沒貼]
-
相關已知issue,歡迎補充
使用的初衷是:因為收集數據的時候,想開多個carla,但是一個carla 3-4G顯存,奈何我的電腦就僅僅6G顯存 1660Ti,所以就萌生了這個想法。但是呢 途中發現:
- Carla 0.9.10.1 的版本 docker可以運行 但是必須有DISPLAY的設備 不然如果DISPLAY給空的話 就會沒有 → 但是呢 你在本地運行的時候 可以DISPLAY為空 也可以正常運行
- Carla 0.9.12 的版本 就可以運行做到offscreen (后面會解釋這個詞)
回到開始,所以呢 主要就是介紹怎樣在docker中運行carla,以及這些的作用,好處等,前面介紹了較多關於渲染的東西,要是覺得煩,直接目錄跳轉docker處
1. 渲染 Rendering
off-screen & no-rendering
官方文檔:
首先我們要知道 off-screen 和 no-rendering各自的意義是什么,從字面上,一個是離屏但是渲染繼續,一個是直接不做圖形渲染
-
No-rendering mode: 虛幻引擎不會做任何渲染,圖形學方面的計算都是沒有的,所以基於GPU的所有傳感器返回的是空數據
它有助於在非常高的頻率下進行大量的交通模擬和道路行為。
-
Off-screen mode: 虛幻引擎還是正常工作,渲染都在計算中,傳感器也會返回值,只是沒有display 顯示選項了而已
那什么時候用什么呢?正常其實如果還在debug 調試階段,其實一般都是需要display 做上帝俯視視角掌控一下全局的
- 對於你不需要傳感器數據,只是用來做交通流的仿真的時候,no-rendering mode是一個不錯的選擇,例如:我只是看看我基於ground truth (不基於傳感器感知) 的agent的整體運行路徑的表現效果,比如撞車等,可以使用這種模式,十分迅速
- 對於off-screen呢 主要是覺得顯示界面有的煩,就可以配合 tmux 進行搭配,這樣主機只要不關機/ 服務器不關機 這都在繼續運行 終端退出了也不礙事,也不會出現誤觸關掉
所以,了解了原理后,如何開啟各個所需模式呢?
off screen
0.9.12及之后的版本 只有有renderoffscreen,也就是離屏模式:
./CarlaUE4.sh -RenderOffScreen
0.9.11及之前的 就可以使用opengl,把DISPLAY 給空就行(但這步在docker並不適用)
# Linux
DISPLAY= ./CarlaUE4.sh -opengl
vulkan的步驟請見官方文檔,需要安裝驅動等其他sudo所需權限apt install等
no rendering
可以在py代碼里讀取到world后設置:
settings = world.get_settings()
settings.no_rendering_mode = True
world.apply_settings(settings)
...
settings.no_rendering_mode = False
world.apply_settings(settings)
也可以單獨開一個終端窗口 通過官方提供的 config.py 進行設置
cd PythonAPI/util && python3 config.py --no-rendering
cd PythonAPI/util && python3 config.py --rendering
cd PythonAPI/examples && python3 no_rendering_mode.py
前兩種應該知道在說什么,如圖所示(1是帶渲染的,2是不帶渲染的 注意這種模式下界面也會變黑,傳感器也都沒有數據):
后一種是一種鳥瞰圖形式,也是無渲染 節約型的,如下圖所示:
渲染質量
首先 如果你不追求收集的圖片傳感器的質量的話,為了提高效率 使用低質量渲染也是一種不錯的選擇,注意 這點會影響天空的渲染,更多可以自己嘗試一下
左邊是低質量,右邊是正常epic質量
./CarlaUE4.sh -quality-level=Low
./CarlaUE4.sh -quality-level=Epic
另外在Carla 0.9.12之前的版本,還有opengl和vulkan的選擇,我記得我在哪個issue里讀到過 opengl的渲染沒有vulkan的好,有時候屏幕/傳感器收到的數據會出現黑點
而0.9.12之后就只留下了vulkan的渲染模式
2. Docker 中運行
首先 docker 安裝,基本指令等等等 就不講了 前面的部分放了參考鏈接,很多教程也可熟悉
大概是這樣一幅圖,感覺還是看圖一目了然在干什么事:
摘自 carla github 官方的老0.8版本的repo
https://github.com/carla-simulator/data-collector
pull/build
此處先以官方為准,講簡潔型pull方案,build等后面補充吧
因為可以兩個docker net對上了 就能連上,所以carla完全作為多個容器開着,對好自己的另一個運行的環境的端口就行
docker pull,其實和 git clone 異曲同工之處
# Pull the latest image
docker pull carlasim/carla:latest
# Pull a specific version
docker pull carlasim/carla:0.9.12
- carlasim 用戶名
- carla 用戶名下有的repo名
- 0.9.12 打上了tag的版本,latest 直接拉取最新的(現在是0.9.13)
版本與渲染
根據前面介紹過了,我們知道各個版本支持的渲染模式,在docker中 主要影響可以運行的條件
- 0.9.12 supports only Vulkan
- 0.9.7+ supports both Vulkan and OpenGL.
帶顯示 0.9.10.1
僅老版本 如0.9.10.1,我測試了一下carla 0.9.12不太行... 同0.9.10.1無法做offscreen一致,也沒啥報錯就是不運行而已
比如,注意--net
一定要連回來,不然rpc port對不上號,可自定義
# 源於官網指令
docker run -e DISPLAY=$DISPLAY --net=host --gpus all --runtime=nvidia carlasim/carla:<version> /bin/bash
docker run -e DISPLAY=$DISPLAY -it --net=host --gpus all carlasim/carla:0.9.10.1 /bin/bash
。、CarlaUE4.sh -opengl -world-port=2000
這一條就是 用現在所運行docker的機子的屏幕,比如你電腦運行的docker,那顯示就在你電腦上,如圖:
關於端口映射更多可見docker 官網文檔:
關於gpu對容器可視選擇等,也可見官網文檔:
Runtime options with Memory, CPUs, and GPUs
不帶顯示 0.9.12
僅新版本 如0.9.12,我測試了一下carla 0.9.10.1 不太行... 同0.9.12無法做offscreen一致,也沒啥報錯就是不運行而已
docker run --privileged --gpus all \
--net=host -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
carlasim/carla:0.9.12 /bin/bash \
./CarlaUE4.sh -RenderOffScreen
docker run --privileged -it --gpus all --net=host -v /tmp/.X11-unix:/tmp/.X11-unix:rw carlasim/carla:0.9.12 /bin/bash
./CarlaUE4.sh -world-port=2000 -RenderOffScreen
運行實時圖:可以看到docker里開的carla並沒有顯示,但是一般通過顯存可以開出來正在運行中,然后我們在本機上通過port連過去,注意兩邊的carla庫版本要一致... 我是刪了我的0.9.10.1的,又pip3 install了一下才能同上Python API的庫的
對於0.9.11及之前的版本:
sudo docker run --privileged --gpus all --net=host -e DISPLAY=$DISPLAY -e SDL_VIDEODRIVER=x11 -v /tmp/.X11-unix:/tmp/.X11-unix:rw carlasim/carla:0.9.11 /bin/bash ./CarlaUE4.sh -vulkan <-additonal-carla-flags>
docker run -e DISPLAY=$DISPLAY --net=host --gpus all --runtime=nvidia carlasim/carla:<version> /bin/bash CarlaUE4.sh -opengl <-additonal-carla-flags>
事實證明 有display確實,但是offscreen不能像在本機運行的那樣... 在docker 容器里直接如下指令會不啟動carla 雖然也沒啥錯誤
# Linux
DISPLAY= ./CarlaUE4.sh -opengl
對了xdg-user-dir: not found 可以就當沒看見說的是你沒有Documents這些文件上啥的 不要緊
3. 服務器運行
這個主要針對各自服務器,此處記錄一下遇到的問題:
failed to establish dbus connection
NVIDIA討論區link 如下圖所示
然后看了一下5上的 2080Ti emmm,Driver版本:NVIDIA-SMI 495.44 Driver Version: 495.44 CUDA Version: 11.5
解決辦法:換一個其他GPU和driver版本的服務器,我換了一個就沒這個問題了
channel 3: open failed: connect failed: Connection refused
這個得找服務器主管 給你開端口權限了... emmm
container內的2001, 2000口一定要開放
!!!! emmm 由阿偉同學發現的,參考資料 【 官方鏈接 Two TCP ports and good internet connection. 2000 and 2001 by default. Make sure that these ports are not blocked by firewalls or any other applications.】
實時運行效果如下:
整體步驟如下
# 首先打開一個終端 要連到服務器上
# A.0 連接服務器
ssh -L 127.0.0.1:2000:127.0.0.1:2000 -L 127.0.0.1:2001:127.0.0.1:2001 kinzhang@xxx.xxx.xx.xx
# A.1 pull carla image
docker pull carlasim/carla:0.9.12
# A.2 建立一個容器
docker run --privileged -it --gpus all --net=host -v /tmp/.X11-unix:/tmp/.X11-unix:rw carlasim/carla:0.9.12 /bin/bash
# A.3 在容器的bash下運行 打開CARLA
./CarlaUE4.sh -world-port=2000 -RenderOffScreen
# 這是第二個終端要干的事 在自己電腦上
# B.0 添加PYTHON路徑
export PYTHONPATH=$PYTHONPATH:~/CARLA_0.9.12/PythonAPI/carla/dist/carla-0.9.12-py3.7-linux-x86_64.egg
cd ~/CARLA_0.9.12/PythonAPI
# B.1 運行手動腳本
python examples/manual_control.py -p 2000
當然容器外可以使用其他口進行映射並連接,但是容器內只能是2000和2001,所以一定要注意好!比如就可以在外面使用2020 2021來映射容器內的口
docker run --name kin_carla_13 --privileged -it --gpus all -p 2020:2000 -p 2021:2001 -v /tmp/.X11-unix:/tmp/.X11-unix:rw carlasim/carla:0.9.13 /bin/bash
總結
所以這么看來,如果自己機子足夠強,也不用docker,直接不同的rpc port運行起來,然后各個連過去,就是一邊干活一邊運行的時候,一個不小心 就超內存和顯存了,然后就炸了,所以記得設好checkpoint → 別問我咋知道... 都是abort的后文了
另外 版本越新,bug越少... 對於carla PP口頭禪:確實
贈人點贊 手有余香 😆;正向回饋 才能更好開放記錄 hhh