| 由於最近用到Temporal_Segment_Networks(TSN)光流提取,涉及Docker操作,故本節將簡單講解docker的一些使用命令,基於docker,利用宿主機上的dataset,提取對應的光流信息。 注意:Docker大佬請繞行,本章適合像本人一樣的超級小白【手動狗頭】。 如果用完docker,退出容器之后,之前容器內保存下來的數據將會消失,退出前請先將所需文件,拷貝至宿主機!!!!!當然有方法解決這一問題,大家可以自行探索一下。 |
1.安裝docker以及nvida-docker
對於本小白,於我個人而言,docker類似電腦端安卓模擬器,也有點像虛擬機,只不過docker內的一些東西,貌似是完全隔離開的,具體介紹移步Docker教程。
總而言之,就是一個很牛叉的一個東西,大佬把自己的程序以及依賴包環境都上傳上去,你下載下來就可以用了,甚至都不用配置環境(應該應該,因為我把TSN的docker鏡像下載下來之后,可以直接運行scripts/extract_optical_flow.sh,不用bash build_all.sh,發現的過程是一部血淚史。。。)。


(1)先安裝docker
在終端直接輸入docker ps -a,ubuntu會提示你相關安裝命令,兩種方式,如下:
sudo apt install docker.io # 我用的是這個
sudo snap install docker # 不要用,因為可能會導致nvida-docker安裝的失敗,目錄問題
(2)然后安裝nvida-docker
這里參考ubuntu18.04 nvidia docker環境搭建
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) #該句執行后,可能需要等待稍許才生效,如果不生效,后續會報錯;如果后續報錯,可重新執行該命令后再嘗試
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker # 如果失敗,建議重新安裝docker
(3)最后安裝cuda鏡像
由於docker安裝后,權限僅歸sudo所有,故而每次調用docker必須使用sudo docker命令,想免去sudo的同學,請移步:免sudo使用docker命令。
sudo docker pull nvidia/cuda:10.1-cudnn7-devel # 這里版本最好針對自己電腦的實際情況,本人直接與宿主機一樣
(4)測試是否安裝成功(nvida-docker、cuda鏡像)
sudo docker run --gpus all nvidia/cuda:10.1-cudnn7-devel nvidia-smi

2.采用TSN鏡像獲取視頻光流
(1)從docker上獲取TSN鏡像
sudo docker pull bitxiong/tsn # 進入dockerhub上對應的鏡像界面,會有對應的命令
# 上面直接默認latest版本,可根據docker pull bitxiong/tsn:版本,下載想要下的版本(or tag)

(2)查看獲取的鏡像
sudo docker images
(3)以GPU方式,進入容器
sudo docker run --gpus all -it bitxiong/tsn bash
# 這里采用全部GPU,當然也可以指定GPU
# --gpus '"device=1,2"'
此時成功在該容器內,打開一個類似宿主機的終端,我們可以在該終端下,運行相關程序,與宿主機一樣的操作,注意:可能會有一些命令不存在,例如gedit。

# 補充,退出容器:
exit
(4)對宿主機上的數據集,利用容器內程序提取光流
本人采用最低端的方法,將宿主機上的數據集,拷貝至容器內,當提取光流完成后,再將容器內的文件夾拷貝回宿主機上。

當然好像有方法,將docker內的文件掛載至宿主機,覺得拷貝比較浪費時間的同學,可以考慮掛載的方法。
sudo docker cp 宿主機文件夾地址 容器ID:容器目錄地址
# 將宿主機文件/文件夾拷貝至容器指定目錄下
sudo docker cp 容器ID:容器文件夾地址 宿主機目錄地址
# 將容器內文件/文件夾拷貝至宿主機指定目錄下
那么容器的ID該如何查看呢?注意是容器的ID,不是鏡像的ID,二者有區別。這里我當時忘截圖了,盜用網上的圖,做一個簡單對比:
- 容器ID(由於拷貝需要,不要退出容器,直接宿主機另打開一個終端窗口)
sudo docker ps -a # -a顯示所有的容器

- 鏡像ID
sudo docker images

3.根目錄爆滿,出現開機后黑屏現象
由於一開始對docker的一竅不通,所以沒注意到docker默認數據安裝在/var/lib/docker下,導致很快根目錄空間不足,小伙伴們要注意,此時ubuntu會彈出提示,告訴你根目錄空間不足!!!!
當本人發現,pycharm提示運行緩慢、google瀏覽器甚至都沒法打開,此時懷疑空間不足導致,當然本人還認為是N多天沒關機的緣故,於是選擇重啟,緊接着出現以下現象:
開機選擇內核版本后,電腦黑屏,無法進入登陸界面!!!!WTF*!

這時候別慌(慌得不行,還要着急跑代碼呢親),去網上搜,有很多人推薦在一開始的ubuntu advance界面,選擇內核recovery mode,然后卸載驅動,但是大都是是因為之前他們更新了驅動等操作,大家切忌直接跟風。
啥也不思考,可能驅動卸載了,也照樣進不去,問題還會更嚴重,故本人特地寫下本文章,供后來者參考!!!!!
當然本人電腦之前自動更新了內核,高版本內核與當前驅動程序不一致,曾經出現過nvidia-smi失敗,所以每次選擇之前的版本內核,請移步Ubuntu問題匯總ing...,那么對於當前情況,也會出現以下情況:

對於圖6情況,可以參照【問題解決】/dev/sda6:clean / files, /blocks。或者選擇系統之前的低版本內核,再試試。(在以前的電腦上,我利用后面的方法,“解決”了圖6情況)
當我選擇低版本內核后,不會出現圖6的情況,但是會黑屏,無法進入登陸界面。回想之前ubuntu的提示,懷疑很可能是docker安裝導致的根目錄爆滿問題,當時沒有截圖,大家自行腦補操作畫面,sorry~:

-
首先進入ubuntu advance界面,選擇內核recovery mode,選擇root進入命令行模式,如圖7所示;
-
輸入 df -h 查看磁盤空間,會發現,以本人圖6為例,/dev/nvme0n1p2爆滿,掛載點為root /;
-
cd / ;進入根目錄,繼續查看各文件占用率;
-
du -h --max-depth=0(或者--max-depth=1) ;0代表當前目錄使用的總空間大小,1代表當前目錄使用總空間的大小以及當前目錄下一級文件及文件夾各自使用的總空間大小
此時我們可以發現/var/lib/docker 占據了超大部分容量,故而進一步確定是docker的問題,由於本人已經利用docker完成了光流提取任務,后面基本用不到,所以直接選擇了卸載 apt remove docker.io。如果卸載后,還是不行,很可能還需要手動刪除 rm -rf /var/lib/docker。
此時即可安全啟動電腦,順利進入登陸界面。大家也可以參考解決docker占用系統根目錄磁盤100%的問題, 將文件移植到其他地方。
