NVIDIA-Docker2深度-人工智能-tensorflow環境搭建
這篇文章是作爲我在ubuntu18.04LTS上搭建我的深度環境並且運行的最悲催的血淚史,主要是記錄我的環境搭建的問題,以便將來有一天電腦再over的時候作爲一種快速回血的方式,同時以此紀念我的耗費三天時間的無力感。
我想我需要把我覺得最重要的一件事情寫在前面,請務必學會利用VPS搭建自己的科學上網服務器,第二件事請學會在ubuntu上將利用ss+polipo實現電腦的科學上網(必須是全局模式的!,本文沒有使用ss+polipo…)
nvidia-docker2的搭建
正如TensorFlow官方文檔所說:https://tensorflow.google.cn/install/docker
使用TensorFlow最方便的事情就是利用docker去實現了,因爲自從nvidia-docker2開始不再需要自己安裝CUDA,這一個是非常重要的事情。至於功能方便的增加修改,daemon的各種優化,不再使用等問題對我等只使用的人而言並沒有什麼太大的理解價值。
最常用的框架是TensorFlow,利用NVIDIA-docker2再pull的鏡像去運行我們所需要的腳本或者是py程序可能是最合適的方式。
nvidia-docker2的前提條件
-
在本地主機上安裝
Docker
。 -
安裝NVIDIA的顯卡驅動。
-
安裝cuDNN(可以不用安裝,但是我認爲安裝也是可以的!
-
其他環境問題:https://blog.csdn.net/CS_GaoMing/article/details/88561764
Docker
安裝步驟
友情提示:其實與官方的描述大同小異,只不過該文章將具體的實現步驟簡化了。
官方Ubuntu存儲庫中提供的Docker安裝包可能不是最新版本。爲了確保我們獲得最新版本,我們將從官方Docker存儲庫安裝Docker。爲此,我們將添加一個新的包源,從Docker添加GPG密鑰以確保下載有效,然後安裝該包。
-
step1 首先,更新現有的包列表:
sudo apt update # 或者是這樣亦可... sudo apt-get update
-
step2 接下來,安裝一些允許apt通過HTTPS使用包的必備軟件包:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
-
step3 然後將官方Docker存儲庫的GPG密鑰添加到您的系統:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
-
step4 將Docker存儲庫添加到APT源:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
-
step5 接下來,使用新添加的repo中的Docker包更新包數據庫:
sudo apt update
-
step6 確保您要從Docker repo而不是默認的Ubuntu repo安裝:
apt-cache policy docker-ce
雖然Docker的版本號可能不同,但您可能會看到這樣的輸出:
apt-cache policydocker-ce output docker-ce: Installed: (none) Candidate: 18.03.1~ce~3-0~ubuntu Version table: 18.03.1~ce~3-0~ubuntu 500 500 https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
請注意,docker-ce未安裝,但安裝的候選者來自Ubuntu 18.04(bionic)的Docker存儲庫。
-
step7 最後,安裝Docker:
sudo apt install docker-ce
-
step8 現在應該安裝好了Docker,守護進程啓動,並啓用進程啓動進程。檢查它是否正在運行:
sudo systemctl status docker
輸出應類似於以下內容,表明該服務處於活動狀態並正在運行:
Output ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-07-05 15:08:39 UTC; 2min 55s ago Docs: https://docs.docker.com Main PID: 10096 (dockerd) Tasks: 16 CGroup: /system.slice/docker.service ├─10096 /usr/bin/dockerd -H fd:// └─10113 docker-containerd --config /var/run/docker/containerd/containerd.toml
在沒有Sudo的情況下執行Docker命令----(可選)
默認情況下,該docker命令只能由root用戶或docker組中的用戶運行,該用戶在Docker的安裝過程中自動創建。如果您嘗試運行該docker命令而不使用sudo或不在docker組中作爲前綴,您將獲得如下輸出:
Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
如果要sudo在運行docker命令時避免鍵入,請將用戶名添加到docker組中:
sudo usermod -aG docker ${USER}
要應用新的組成員身份,請註銷服務器並重新登錄,或鍵入以下內容:
su - ${USER}
系統將提示您輸入用戶密碼以繼續。
通過鍵入以下內容確認您的用戶現已添加到docker組:
id -nG
Output
sammy sudo docker
如果您需要將用戶添加到docker您未登錄的組中,請明確聲明該用戶名:
sudo usermod -aG docker username
如果您選擇不這樣做,請在前面添加命令sudo或者切換到su。
Nvidia的安裝方式.
至於nvidia顯卡驅動的安裝方式一般上而言就是隻有這三種。
嗯,這裏也甩一個參看網址:https://linuxconfig.org/how-to-install-the-nvidia-drivers-on-ubuntu-18-04-bionic-beaver-linux
雖然也英文的,但是在牆內還是可以看的,看不懂的請試用有道2.0網頁插件,或者是chrome瀏覽器直接右鍵翻譯成簡體中文即可。
-
method1
ubuntu-drivers devices
會顯示類似這樣的界面.
pc-gmxy@pc-pc-gmxy:~$ ubuntu-drivers devices == /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0 == modalias : pci:v000010DEd00001380sv00001462sd00003102bc03sc00i00 vendor : NVIDIA Corporation model : GM107 [GeForce GTX 750 Ti] driver : nvidia-driver-415 - third-party free driver : nvidia-driver-410 - third-party free driver : nvidia-driver-418 - third-party free recommended driver : nvidia-340 - distro non-free driver : nvidia-driver-390 - distro non-free driver : nvidia-driver-396 - third-party free driver : xserver-xorg-video-nouveau - distro free builtin
然後自動安裝或者是手動.
# 自動安裝方式. sudo ubuntu-drivers autoinstall # 手動安裝方式. sudo apt install nvidia-driver-415
請重啓電腦,重啓電腦最重要,有什麼事情請重啓再說!
-
method2
sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update
然後跳到method1,over!
-
method3
# 查看顯卡.
lshw -numeric -C display
# or這樣...
$ lspci -vnn | grep VGA
# 瀏覽器取官方網站下載顯卡驅動的bin文件。
#切換到下載文件夾
cd Down+Tab
#or在下載文件夾下,右鍵打開終端,或者Ctrl+Alt+T打開終端,類似於這樣的文件。
NVIDIA-Linux-x86_64-410.73.bin
# 編譯bin文件,前提條件!
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install build-essential libc6:i386
#再然後我都不想看了,麻煩,而且編譯源碼時間花費很感人,於是....告辭!
請重啓電腦,請重啓電腦,請重啓電腦,有什麼事情請重啓再說!
nvidia-docker2的安裝
重點來了,基本上前面的安裝若是無誤基本上這一步就是可以正常安裝的,可是這一步巨坑,比天坑還坑。
目前存在的我遇到的問題有三大類:
第一種就是:某些文件下載失敗,被忽略或者過時,解決辦法,在github的issue上給出了n多種方法,我試過了許多種給解決了,就是多添加幾種鏡像源。
第二種就是:版本的依賴性問題,解決方式有n多中,什麼保證最新版安裝啊,嗯哼,告辭!根本解決不了問題,方法只有一個就是按照前面的步驟,務必保證步驟中不出錯至於給出的用老版本的問題,你看一下TensorFlow+cuda+驅動的版本對應問題吧,若是你掉進這個坑一天之內別想起來你了。
第三種就是:**.d/list文件第一行錯誤,無法讀取,這個github的issue也有,目前已關閉,解決方式是刪除了,重新sudo apt-get update
這個也是天坑—根本解決不了這個問題的。
核心:請試用ss+polipo實現全局 科學上網 ,同時更改源地址,網易的,阿里的都可以,最重要的是將索引的ip都添加進去,界面方式實現的話只有一個ip。
# 正常情況.
sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd
正常的情況下實現很簡單的,但是重點是基本這一步的問題都是找不到與nvidia-docker2文件子類的。
解決方法,不能科學上網的話,嗯,到此基本上就死了。問題就是源庫-鏡像源庫找不到對應的文件,所以失敗…
多次嘗試還不成功,請務必使用:‘sudo apt-get update --fix-missing’,保證中間的環節不出問題亦可安裝!
nvidia-docker2的鏡像拉取
- 實現測試nvidia-docker2時候安裝成功.
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
# 其實我認爲完全沒有必要,要相信自己!
nvidia-smi
docker run --runtime=nvidia --rm hello-world
因爲沒有鏡像文件,所以會下載,cuda鏡像,這個大概會下載1h+…
顯示的是顯卡狀況,只要彈出unable/unlocal,然後會下載一串文件就是正常安裝的。
# 只是檢查驅動可以這樣...
nvidia-smi
# 每秒刷新10次,可以這樣!
watch -n 0.1 -d nvidia-smi
- 拉取鏡像
#拉取之前可以查看有哪些鏡像,或者搜索一下有哪些鏡像。
# 拉取TensorFlow-gpu鏡像
sudo docker run -it tensorflow/tensorflow:latest-gpu
- 搜索鏡像
sudo docker search tensorflow-gpu
nvidia-docker2的鏡像/TensorFlow環境的運行.
- 比如,我寫好了一個py程序,我需要 該程序 在我的tensorflow-gpu-py3的鏡像中運行.
# 首先我需要加載鏡像.
docker run tensorflow-gpu-py3 #顯然使用這種格式運行是不可行的,因爲沒有制定好nvidia-docker2的運行環境,除非已經設置好配置文件.
# 使用交互方式方式:-it;後臺方式:-d,-p指定端口.
docker run --runtime=nvidia -it -p 8888:8888 tensorflow/tensorflow:tensorflow-gpu-py3
# 若不小心關閉了,如何進入容器.
sudo docker ps -a
# 找到容器的一串id,如:62fflkee1e1,鍵入如下,即可進入.
sudo docker exec -it 62fflkee1e1 /bin/bash
# 複製文件到容器之中:docker cp 源路徑 目標路徑
docker cp ~/MyTest.py mycontainerID:/opt/MyWorK/
# 調換源路徑/目標路徑,效果可逆.
# 容器id=d9b10f2f636,運行/停止/刪除容器.
docker start/stop/rm d9b10f2f636
- 進入容器之後,顯示如下:
root@d9b10f2f636:
# 運行我們的Mytest 文件.
python3 /opt/MyWorK/MyTest.py
# 其他直接在加載鏡像時候即可運行不列舉.