在這篇文章中,研究員 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 提供)
深度學習開發環境問卷調查
這份「深度學習開發環境調查問卷」的問題涉及到開發者的基礎資訊(職業、研究領域等)、選擇的硬體、系統、語言、框架等問題。此外,如果各位有感興趣或認為此份調查問卷缺少的問題,也可在問卷中補充。
為了感謝大家的積極參與,我們會選擇其中回答最詳細的 5 位調查者贈送機器之心禮品一套(包含:機器之心貼紙、馬克杯、T 恤、公仔)。
提醒大家,期望獲得禮品的讀者不要忘了填寫聯絡方式。
參與問卷