TensorFlow+Docker我的DL開發環境,你的呢?
選自Upflow.co
作者:Killian
參與:Nurhachu Null、李亞洲
在這篇文章中,研究員 Killian 介紹了自己的深度學習開發環境:TensorFlow + Docker + PyCharm + OSX Fuse + Tensorboard。但根據自己的預算、語言習慣、開發需求,每個人都會配置不同的開發環境,也遇到過各種各樣的難題。因此,我們在文後附上了一份調查問卷,希望能了解眾多不同開發者的深度學習環境,最終彙集成一篇文章為大家提供不同的洞見。
在嘗試用不同的東西來配置深度學習環境這個過程中,我花費了相當多的時間。因此我想著把自己目前的工作流程整理成文檔,希望可以幫助到嘗試著做同樣事情的人。
目標
在開始創建我的模型之前,我腦海中會有幾個清晰的目標,即理想中會使用的開發環境。下面是我會在這篇博文中詳細介紹的幾個高層次目標:
在本地機器 (一個標準的 MacBookPro 筆記本電腦) 上用 Pycharm 編輯我的代碼
用一個強大的遠程機器來訓練我的模型
和我的同事們沒有任何衝突地使用這台遠程機器
在本地和遠程機器上的 docker 容器中以開發/產品的模式來運行/調試我的 TensorFlow 代碼
當我的模型在遠程機器上訓練的時候,把模型的性能圖形化地實時顯示在本地機器上
致謝
我想感謝我的實驗室同伴 Chris Saam,因為他給我指明了幾個我會在本文中提到的有趣的工具。
一次安裝
遠程機器上
因此,在做其他任何事情之前,你可能需要做這幾件事情。順便說一下,在這篇文章中我會提及在你的遠程機器上 (帶有所有的 GPU 的附屬項目)使用 super duper,在這台遠程機器上你計劃訓練你的深度學習機器模型。
安裝 Nvidia-docker:你需要做的第一件事情就是安裝 Nvidia-docker。Docker 確實是一個很酷的工具,但是它目前並不能讓你最有效地使用任何一個 NVIDIA 的 GPU 硬體或者 CUDA 驅動程序,所以你不可能拿 docker 來訓練你的深度模型。Nvidia-docker 為你解決了這個問題,並且看上去更像一個普通的 docker。在常規的 Docker 命令之上,它還提供了一些選項,可以讓你更有效地管理你的 NVIDIA GPU 硬體。
圖 1: NVIDIA-Docker (由 NVIDIA-Docker 提供)
安裝 Slurm:如果你計劃和你的同事共享那個深度學習機器,你也許會想著安裝像 SLURM 一樣的工具。通過限制默認情況下可以使用的命令集,SLURM 讓您對團隊同事在機器上的許可權擁有更好的控制,並且強制每個成員使用特定的專用 GPU/CPU 資源在「作業」環境中運行他們的代碼。如果您希望避免任何因團隊同事同時訪問這台機器而產生的資源爭奪,這確實是有用的。
把文件夾設置標準化:如果您計劃和同事共享機器,就可以讓成員之間的文件夾結構標準化,這也是一個好主意。我的深度學習機器的設置方式如下:
/home/myusername 文件夾包含你自己的私有項目代碼。
/data 文件夾包含團隊在項目過程中共享的數據集。
/work 文件夾包含當前實驗需要的特定數據集。這個文件夾比 /data 文件夾更低一級,但是它在訓練過程中提供了更快的內存訪問。
本地機器上
安裝 OS X Fuse: 如果你像我一樣正在使用最新版本的 OS X, 你可能會想著安裝 OS X Fuse。OS X Fuse 可以讓你用 SFTP/SSH 在本地 Finder 中從遠程機器上掛載文件夾。或者如果你不想花費時間去掛載你的遠程/home 文件夾,你可以簡單地使用 GIT PUSH/PULL 在本地機器和遠程機器之間傳送代碼,但是這樣效率不高。所以在長時間運行的過程中掛載這些文件夾會替你節省大量時間。
設置一個遠程的 python 解釋器:在本地機器和遠程機器上使用同一個 docker 映像是避免以後可能會發生的環境配置問題的另一個方法。Pycharm 有這個很酷的功能,可以讓你在 docker 容器中運行代碼。在 Pycharm 中進行任何設置之前,請保證你已經獲取了正確 TensorFlow 的 docker 映像。在本地機器上,你可能僅僅需要以下步驟就可以獲取 TensorFlow 的 docker 映像:
# 啟動你的 docker 虛擬機
docker-machine start default
# 獲取最新 TensorFlow CPU 版本的 docker 映像
docker pull gcr.io/tensorflow/tensorflow:latest
當你獲取期望的 docker 映像之後,就去設置你的 Pycharm Project Interpreter。在 Pycharm 中,轉到 Preferences>Project Interpreter>Add Remote(如下圖)。當 docker 虛擬機的實例在你的本地機器上開始運行時,就需要選擇 docker 配置(Docker configuration)。一旦它連接到你的 docker 虛擬機,你應該會看到你剛才獲取的 TensorFlow 映像已經在可用映像的列表中了。當這個設置好之後,只要 pycharm 連接好了,你就可以開始了。
每日常規程序
本地機器上
掛載遠程文件夾:你想做的第一件事情就是確保你可以訪問你要在本地機器上運行的腳本。所以你要做的第一件事情就是在你的 Mac 上用 OS X Fuse 掛載 home/myusername 文件夾,並且選擇性地掛載深度學習數據。你可能希望為所有這些命令起一些別名,因為它們確實有些長。
# 掛載你的遠程 home 文件夾
sshfs -o uid=$(id -u) -o gid=$(id -g) myusername@mydeeplearningmachine.com:/home/myusername/ /LocalDevFolder/MountedRemoteHomeFolder
# 掛載你的遠程數據文件夾 (有選擇地)
sshfs -o uid=$(id -u) -o gid=$(id -g) myusername@mydeeplearningmachine.com:/data/myusername/ /LocalDevFolder/MountedRemoteDataFolder
這裡使用 uid 和 gid 來映射本地和遠程機器的用戶和組 ID,因為這些可能會有所不同。
在本地機器上啟動 docker:接下來,我們想保證 pycharm 會訪問正確的庫來在本地編譯我們的代碼。為了做到這個,僅僅需要在本地啟動一個 docker 虛擬機。如果你在設置中沒有改變任何地方,TensorFlow 的 CPU 映像應該已經在你的本地 docker 環境中了。
docker-machine start default
打開 pycharm,並選擇你剛才掛載的 home 文件夾中的項目。轉到 Project Interpreter 參數選擇中,在項目解釋器的可用列表中選擇你之前就創建好的遠程 TensorFlow 解釋器,pycharm 應該能夠正確地編譯你的代碼。這時候,你可以隨時隨地使用你的代碼,並且改變任何你想要改變的東西。
遠程機器上
Ok,你已經在 pycharm 中用一項新功能更新了你的代碼,然後你希望訓練/測試你的模型。
用 SSH 遠程登錄你的機器:你需要做的第一件事就是簡單地遠程登錄你的深度學習機器。
ssh myusername@mydeeplearningmachine.com
運行一個 SLURM 任務: 在你進行下一步之前,請確保你的團隊中沒有其他成員正在運行任務。這會阻止你的任務得到它所需要的資源,所以檢查一下目前有哪些任務正運行在遠程機器上總會是一個不錯的做法。使用 SLURM 做到這件事,只需要運行一下 squeue 命令即可,它會列出目前正運行在機器上的任務。如果由於某些原因你之前的某個任務仍然在運行,你可以使用 scancel 命令來取消它。在確定沒有其他任務在運行之後,讓我們開始一個新任務吧。你可以通過以下的命令來開始一個新的任務。
srun --pty --share --ntasks=1 --cpus-per-task=9 --mem=300G --gres=gpu:15 bash
srun 命令給出了相當多的選項來讓你指定一個特定的任務需要哪些資源。在這個例子中,cpus-per-task、 mem 以及 gres 選項讓你指定這個任務分別需要的 CPU 的數量、總體內存以及 GPU 的數量。pty 選項只是提供一個漂亮的命令行界面。
啟動 Nvidia docker:既然你已經得到了為你的任務所分配的資源,那麼,啟動一個 docker 容器來在正確的環境中運行你的代碼吧。與使用常規的 docker 有所不同,這裡我們會使用 NVIDIA-Docker 來充分地利用我們的 GPU。另外,為了充分利用你的硬體,請保證你運行的是 TensorFlow 的 GPU docker 映像而不是 docker CPU 映像。別忘了使用 - v 選項來在 docker 容器中掛載你的項目文件夾。當你在那個容器中以後,你就可以簡單地使用常規的 python 命令來運行你的代碼了。
# 啟動你的容器
nvidia-docker run -v /home/myusername/MyDeepLearningProject:/src -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-gpu /bin/bash
# 別忘記切換到你的源碼文件夾
cd src
# 運行你的模型
python myDLmodel.py
本地機器上
啟動 Tensorboard 可視化:你還差一點點就做完了。你的代碼現在正在順利地運行,然後你想著使用 tensorboard 去實時地看一下你的模型中的變數是如何變化的。實際上這是最簡單的一部分。首先,確保你知道自己本地 docker 機對應的 IP 地址。你可以使用下面的命令來做這件事:
docker-machine ls
然後,切換到已經掛載的遠程 home 文件夾,並啟動一個 TensorFlow docker 容器。因為你已經在本地機器上啟動了一個 Tensorflow docker 容器,所以要確保你正在啟動的是 CPU 版本的 docker 容器。如上面所述,不要忘記在 docker 容器中掛載你的項目文件夾。為了在本地機器可視化正在訓練的模型,你還需要用 - p 選項將 Tensorboard 使用的埠號從容器映射到你的本地機器。
docker run -v /LocalDevFolder/MountedRemoteHomeFolder/MyDeepLearningProject:/src -p 6006:6006 -it gcr.io/tensorflow/tensorflow:latest /bin/bash
一旦你進入 docker 容器,通過制定你的模型保存變數的路徑 (更可能是 checkpoint 文件夾的路徑) 來啟動 Tensorboard:
tensorboard—logdir=Checkpoints/LatestCheckpointFolder
如果一切進展順利,你現在需要做的就是使用你最喜歡的瀏覽器轉到到 http://DOCKER_MACHINE_IP:6006,
這會顯示在 Tensorboard 中顯示你在模型中正在跟蹤的所有變數。
圖 2.Tensorboard 可視化 (由 Jimgoo 提供)
※詳解首個系統性測試現實DL系統的白箱框架DeepXplore
※Tensorflow+Docker是我的深度學習開發環境,你的呢?
※詳解首個系統性測試現實深度學習系統的白箱框架DeepXplore
※斯坦福CS231n最新課程:詳解深度學習的框架對比與實現
※谷歌全attention機器翻譯模型Transformer的TensorFlow實現
TAG:機器之心 |
※谷歌開發者節DevFest&TensorFlowDay,約!
※谷歌開發者節DevFest&TensorFlow Day,約~
※Python web開發:Flask的URL和視圖
※HoloLens開發者:Magic Leap One確實比HoloLens好
※TensorFlow 開發者峰會:推出 TensorFlow.js,支持 Swift,TF 將更易於使用
※HoloLens開發者體驗報告:Magic Leap One確實比HoloLens好
※望城經濟技術開發區概況Wangcheng Economy and Technology Development Zone
※TensorFlow開發者峰會:重磅發布TensorFlow.js
※Facebook正在開發一種「Talk the Walk」的AI
※Python web開發:Flask的項目配置
※TensorFlow,為什麼選擇 PyThon 作為開發語言?
※安卓開發中的Model-View-Presenter
※谷歌開發新系統Fuchsia 計劃取代Android和Chrome OS
※Mixed Reality Toolkit-Unity開發系列—Sharing模塊
※無人機開發商PrecisionHawk收購Droners、AirVid,建造行業專才網路
※Core開發者眼鏡蛇Cobra公開打臉 Blockstream
※適用於Android和iPhone的Swype鍵盤停止開發
※Justin Timberlake 著用未公開發售「Air Higher」Air Jordan 3 Sample
※如何在Windows下開發Python:在cmd下運行Python腳本
※如何開發一個基於 Docker 的 Python 應用