“谷歌”+“深度學習”,兩個標簽讓2015年12月才由谷歌開源的深度學習工具TensorFlow在其發布之后就迅速地成為了全球最為炙手可熱的開源項目,2016年4月,開源的TensorFlow又支持了分布式特性,向着生產環境下的應用更進一步。
TensorFlow API支持Python 2.7和Python 3.3+,共支持4種安裝方式。
- Pip install
- Virtualenv install
- Anaconda install
- Docker install
其中大部分支持Linux和Mac OS,由於主要開發環境是Windows,我選擇了最為靈活的docker方式安裝TensorFlow。TensorFlow還有GPU支持版本,本文僅探索CPU-Only版本。
我計划完成一系列3篇博文,第一步安裝docker,第二步單機版TensorFlow的Demo,第三步分布式TensorFlow的Demo,爭取在1個月內完成。
1 Docker是什么?
借用Docker官網最大的一行字。
Docker allows you to package an application with all of its dependencies into a standardized unit for software development.
從功能上講,Docker也可以理解為一種虛擬化的方案,可以通過構建包含不同軟件的鏡像,來達到快速部署開發環境的目的。
再借用官網的一張圖,左邊藍色的部分從kernel開始一層層加了debian, emacs, apache形成了一個Image,每一層都是只讀的,我們運行這個Image的時候,上面蓋上了一層可讀寫的Container,讓我們做一些編輯和修改,一個簡單的服務器就可以用了;又如右邊橘紅色的部分,Kernel的上面加上了BusyBox就形成了Image,運行起來之后就可以以非常輕量級的方式運行起busybox中支持的命令。再有我們接下來要學習的TensorFlow鏡像,就包含了運行它所需要的全部依賴,簡單操作就可以完成TensorFlow開發環境的搭建。
更多的Docker理解推薦閱讀10張圖帶你深入理解Docker容器和鏡像
2 安裝Docker
要在Windows上運行Docker,首先需要下載和安裝Docker Toolbox。順便奉上Docker Windows文檔,更喜歡官方文檔的話可以看這里,也可以按照本文的步驟繼續。
2.1 確認系統版本
首先確認自己的系統是WIN 7或更新的64位系統,且需要支持硬件虛擬化技術。
Win 8及以上查看方法:
Win 7查看方法
Win 7 運行Microsoft® Hardware-Assisted Virtualization Detection Tool這一工具執行檢查。
完成之后就可以繼續下一步了。
2.2 安裝Docker Toolbox
點擊Docker Toolbox下載,在本文寫作時的最新版本為1.11.1,。
安裝過程會安裝Docker的各個組件和Oracle VirtualBox,因為Docker需要依賴Linux內核的一些特性,因此Mac和Windows都需要在機器上運行一個小型的Linux系統作為Host系統。如果已經安裝過VirtualBox的最新版本,則無需重新安裝。
自行選擇安裝路徑,如果已經安裝過Git也可以去掉該工具的勾選,VirtualBox也是一樣,其它可一路Next。
2.3 配置Docker
安裝完成后,建議先配置一個環境變量MACHINE_STORAGE_PATH,來自定義虛擬機保存的位置,因為之后下載的鏡像越來越多,都是放在虛擬機的虛擬磁盤文件中,虛擬磁盤文件會越來越大,放在默認的C盤用戶目錄下可能會在以后造成一些麻煩,參考下圖,設置為任意你喜歡的位置。
設置完成之后,WIN+R鍵輸入cmd,打開一個windows命令行窗口。
輸入下面的命令新建一個虛擬機ron-docker,使用virtualbox作為driver,這個虛擬機會自動創建在你的MACHINE_STORAGE_PATH配置的目錄中,安裝過程會從github上拉取boot2docker.iso,可能會比較慢,可以手動下載,也可以直接將toolbox安裝目錄下的boot2docker.iso復制到%MACHINE_STORAGE_PATH%/cache中。
docker-machine create ron-docker -d virtualbox
還要注意過程中可能會出現一些要求Windows執行權限的窗口,有些會最小化在任務欄上,請一一賦予權限。
建立完成之后鍵入docker-machine ls
查看剛剛新建的虛擬機,下面的命令都會以ron-docker為例,讀者請按照自己的配置修改。
C:\Users\ron>docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS ron-docker - virtualbox Running tcp://192.168.99.100:2376 v1.11.1
這時候我們使用的CMD還不能與Docker Engine建立連接,可以通過docker-machine env mydocker
查看如何設置。
C:\Users\ron>docker-machine env ron-docker SET DOCKER_TLS_VERIFY=1 SET DOCKER_HOST=tcp://192.168.99.100:2376 SET DOCKER_CERT_PATH=E:\VirtualBox VM\machines\ron-docker SET DOCKER_MACHINE_NAME=ron-docker REM Run this command to configure your shell: REM @FOR /f "tokens=*" %i IN ('docker-machine env ron-docker') DO @%i
鍵入下面的命令完成環境變量配置
FOR /F "tokens=*" %i IN ('docker-machine env ron-docker') DO %i
3 運行鏡像
下面我們下載最新的TensorFlow鏡像來體驗一下在docker下運行鏡像。
3.1 下載鏡像
docker pull gcr.io/tensorflow/tensorflow docker images REPOSITORY TAG IMAGE ID CREATED SIZE gcr.io/tensorflow/tensorflow latest aeff5a9860a3 2 weeks ago 714.2 MB
- 1
- 2
- 3
- 4
- 5
- 6
當然有可能有網絡問題,請根據自己的具體狀況自行解決,掛代理,VPN,手動下載都可以。
3.2 啟動鏡像和探索
使用下面的命令啟動鏡像。
docker run -it gcr.io/tensorflow/tensorflow bash
- 1
選項-i用於保持STDIN在當前的窗口上,-t用於分配一個pesudo-tty,兩個選項使得當前的窗口可以像一個linux的bash一樣運行,絲毫沒有違和感。第一個參數指定了使用的鏡像,第二個參數指定了啟動這個鏡像后啟用的命令,用bash啟動方便我們開始第一次的探索。
- uname -a,查看信息
- cd到/目錄下,查看目錄結構
- 運行tensorflow的hello world
root@ec9bfd276082:/# uname -a Linux ec9bfd276082 4.4.8-boot2docker #1 SMP Mon Apr 25 21:57:27 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux root@ec9bfd276082:/# ls / bin dev home lib64 mnt opt root run_jupyter.sh srv tmp var boot etc lib media notebooks proc run sbin sys usr root@ec9bfd276082:/# python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow as tf >>> hello = tf.constant('Hello, TensorFlow!') >>> sess =tf.Session() >>> sess.run(hello) 'Hello, TensorFlow!' >>> a = tf.constant(10) >>> b = tf.constant(32) >>> sess.run(a+b) 42 >>>
注意到/目錄下的run_jupyter.sh,這事實上是當前版本tensorflow啟動的默認命令,也就是說,如果我們在啟動鏡像時沒有指定bash,就會默認運行這個腳本,這與一些稍早一些版本的tensorflow不同,許多教程中也還沒有提到,可能會造成困惑,讀者可以嘗試一下docker run -it gcr.io/tensorflow/tensorflow
,它會啟動一個notebook的服務,運行在本地的8888端口上,但這樣就想從windows的瀏覽器上打開notebook是不行的,這與docker本身的機制和運行在虛擬上兩個原因有關,如果讀者現在就想看到notebook,點擊這里立即帶你去到完成更多必要配置的端口轉發部分。
4 配置自己的快速啟動窗口
回顧一下上面的過程,要將一個Windows的CMD窗口變為一個運行特定容器的窗口,需要3步。
- 啟動虛擬機
- 配置虛擬機對應的環境變量
- 運行鏡像
下面我自己用的一個啟動腳本,需要的話僅需修改相應的machine-name,然后將腳本保存為my-start.bat,放在toolbox安裝目錄下。之后右鍵my-start.bat->發送到桌面快捷方式,按代碼下的圖配置該快捷方式,/K參數可以使bat運行完之后不自動關閉。這樣,需要時雙擊運行就可以獲得一個新的可運行鏡像的CMD窗口。
@ECHO off SET machine-name=ron-docker ECHO Init... FOR /F %%i IN ('docker-machine status %machine-name%') DO SET status=%%i IF %status%==Running ( ECHO %machine-name% is running. ) ELSE ( ECHO %machine-name% is shutdown. docker-machine start %machine-name% ) ECHO Configuring Environment... FOR /F "tokens=*" %%i IN ('docker-machine env %machine-name%') DO %%i ECHO Init Finished.
5 完成更多必要配置
上面我們完成了鏡像從下載到啟動的過程,但在將docker用作開發環境之前,還有一些很有必要的配置工作要做,讓我們一起來完成下面3步。
5.1 端口轉發
我們的容器運行在一個小的linux虛擬機上,而虛擬機又運行在Windows系統的VirtualBox上,自然的,運行在容器上的服務不能再Windows上打開瀏覽器直接訪問。端口轉發就是要解決這個問題,共有兩步:
建立Windows和虛擬機之間的端口轉發
可以通過VirtualBox的管理界面完成,如圖,然后重啟虛擬機。
配置虛擬機和容器之間的端口轉發
使用-p選項
docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
鍵入上面這條命令之后打開瀏覽器,訪問localhost:8888,看到運行在容器中的notebook服務了吧
5.2 磁盤映射
磁盤映射是非常有用的一步配置,可以將Windows上的磁盤直接映射到容器中,這樣在Windows上開發代碼,直接在容器中運行,避免了寫完復制的大麻煩。磁盤映射的處理方法與端口轉發類似,磁盤的映射關系需要完成Windwos到虛擬機,虛擬機到容器的兩步配置,請跟隨下面3個步驟:
建立Windows和虛擬機之間的磁盤映射
打開虛擬機的設置頁面后,在共享文件夾中設置你想要共享的文件夾和它的名稱,如圖,重啟虛擬機。
在虛擬機中掛載磁盤
這一步要用到剛才設置的名稱,我這里就是docker。
mkdir -p /home/docker/data
mount -t vboxsf -o uid=1000,gid=50 docker /home/docker/data
到這里,我們在Windows中所做的修改就可以實時地反映到虛擬機中了。
建立虛擬機和容器之間的磁盤映射
使用-v選項,建立兩個目錄的映射關系
docker run -it -v /home/docker/data:/data gcr.io/tensorflow/tensorflow bash
好了,試試在Windows的共享文件夾中添加一個python的hello world,然后在docker中python /data/hello.py
試試吧
5.3 配置啟動腳本
我們上面用docker-machine創建的虛擬機,它的大部分目錄在重啟之后都會復原,除了/mnt/sda1,這個目錄也就是虛擬機的虛擬磁盤文件disk.vmdk所掛載的位置,我們可以修改里面的/mnt/sda1/var/lib/boot2docker/profile文件,在文件最后添加我們自定義的啟動命令,比如說添加前面的磁盤映射,就是在profile文件最后加上下面這兩句。
mkdir -p /home/docker/data
mount -t vboxsf -o uid=1000,gid=50 docker /home/docker/data
這樣每次虛擬機啟動就會完成磁盤的掛載了。
6 結語
到這里,使用tensorflow之前安裝docker的工作我盡己所能最詳細地描述了,讀者您如果能看到這里,我真的感到非常榮幸,第一次寫這么長的教程,希望能帶來一些幫助,最后,感謝下面參考資料的貢獻者們,請期待tensorflow三部曲第二篇吧~
7 參考資料
- 利用Docker構建開發環境:http://tech.uc.cn/?p=2726
- 10張圖帶你深入理解Docker容器和鏡像:http://dockone.io/article/783
- How to install and run TensorFlow on a Windows PC: http://www.netinstructions.com/how-to-install-and-run-tensorflow-on-a-windows-pc/
- Install Docker for Windows: https://docs.docker.com/windows/
- 5 Useful Docker Tips and Tricks on Windows:http://blog.pavelsklenar.com/5-useful-docker-tip-and-tricks-on-windows/