教程 | 一步步從零開始:使用PyCharm和SSH搭建遠端TensorFlow開發環境
作者:Erik Hallström
機器之心編譯
參與:機器之心編輯部
一般而言,大型的神經網路對硬體能力有著較高的需求——往往需要強勁的 GPU 來加速計算。但是你也許還是想拿著一臺筆記本坐在咖啡店裡安靜地寫 TensorFlow 程式碼,同時還能享受每秒數萬億次的浮點運算(teraFLOPS)速度?其實這個目標不難實現,使用 PyCharm 中的一個遠端直譯器,你就能通過遠端的方式獲得幾乎和本地計算時一樣的效能。Erik Hallström 在本文中分享瞭如何使用 PyCharm、TensorFlow 和 SSH 搭建遠端機器學習平臺的過程。
需要注意的是,目前僅有 PyCharm Professional 支援這一功能,Community Edition 尚不支援。
遠端資料處理機器
希望你的遠端機器看起來不是這樣的。
我們的目標是搭建一個固定的遠端機器,其中有一個或多個先進的 GPU,必須是英偉達的——雖然我不喜歡目前深度學習硬體領域的這種壟斷,但 TensorFlow 只能使用英偉達的 GPU。
首先,讓我們安裝最新版本的 Ubuntu,我推薦你使用桌面版,你可以終止其 GUI 服務,然後釋放圖形記憶體。然後將你的計算機聯網,並通過在終端(Terminal)輸入 ifconfig 來獲取 IP 地址,在本文中,我假設我們的 IP 地址是 192.168.0.1,在實際操作時,你需要根據你自己的情況進行修改。
設定 SSH
為了讓你的計算機與你的資料處理機器通訊,你需要在其上安裝 SSH。開啟你的固定計算機上的終端然後輸入以下程式碼進行安裝:
sudo apt-get install ssh
啟用 SSH X11 轉發讓你可以進行繪圖(plot),首先如下開啟配置檔案:
sudo gedit /etc/ssh/sshd_config
然後找到註釋行:
# X11Forwarding yes
移除前面的 # 號,然後儲存並關閉該檔案。
顯示卡
接下來安裝顯示卡驅動,通常不同的顯示卡都有自己專用的驅動,所以你需要在你的軟體包管理器中增加一個新的庫(repository)。你所需的軟體請根據你自己的顯示卡和 Ubuntu 版本進行選擇。我在這裡使用的是 NVIDIA-367,瞭解更多請參閱:https://help.ubuntu.com/community/BinaryDriverHowto/Nvidia
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-367
CUDA 和 cuDNN
現在應該安裝 CUDA 工具包和 cuDNN 了,這是執行 TensorFlow 所必須的。你可以從英偉達的網站上下載它們:
-
CUDA:https://developer.nvidia.com/cuda-downloads
-
cuDNN:https://developer.nvidia.com/cudnn
注意下載 cuDNN 需要註冊。這裡使用的是 CUDA 8.0 和 cuDNN 5.1。對於 CUDA,我更喜歡使用內建的軟體包管理器,這能讓我們可以更輕鬆地追蹤安裝情況:
sudo dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda-toolkit-8.0
確保其 symlink 設定正確:
readlink -f /usr/local/cuda
>> /usr/local/cuda-8.0
下面是如何提取 cuDNN 的標頭檔案,並將其複製到 CUDA 資料夾,並讓其可以在終端進行讀取(你的一些檔名可能會有所不同):
tar xvzf cudnn-8.0-linux-x64-v5.1.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
最後新增你所需的環境變數,將它們附加到你的 .bashrc 檔案,然後對其執行 source 命令:
echo 'export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"' >> ~/.bashrc
echo 'export CUDA_HOME=/usr/local/cuda' >> ~/.bashrc
source ~/.bashrc
Python 和 TensorFlow
安裝一些所需的 Python 包:
sudo apt-get install python-pip python-dev build-essential python-numpy python-scipy python-matplotlib
然後安裝啟用了 GPU 的 TensorFlow,你可以在這個頁面查閱你所需的版本:
https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html ;
注意 TF_BINARY_URL 根據不同的系統而有所不同:
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0rc2-cp27-none-linux_x86_64.whl
pip install --ignore-installed --upgrade $TF_BINARY_URL
驗證安裝是否有效,在終端輸入:
python
import tensorflow
如果你已經成功安裝了 GPU 已啟用的系統,你會得到類似下面的輸出:
>I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
>I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
>I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
>I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
>I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
搞定了嗎?下面該配置你的筆記本了!
超級便利的筆記本
開啟你的膝上型電腦,然後將其連線到你的固定計算機所在的本地網路:
各種安裝
我使用的是一臺 Macbook,所以我可以使用一個名叫 Homebrew 的軟體包管理器安裝程式。甚至也可以使用 Homebrew Cask 輕鬆安裝桌面應用。
-
Homebrew:http://brew.sh/
-
Homebrew Cask:https://caskroom.github.io/
安裝 Homebrew 和 Cask:
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"brew tap caskroom/cask
安裝你所需的,包括 PyCharm IDE:
brew install cask ssh-copy-id python
brew cask install java pycharm xquartz
設定 SSH
通過執行下列程式碼生成一組 SSH 金鑰對,然後繼續參考該指南(如果你之前沒有經驗):
ssh-keygen -t rsa
現在將該金鑰複製到你的遠端機器,這樣你以後連線它時就不用每次都輸入密碼了。第一次連線的時候你需要使用你遠端機器的密碼進行認證:
ssh-copy-id [remote username here]@[remote Ip here]
通過將以下程式碼附加到你本地機器上的 config 檔案來啟用壓縮和 X11 轉發(對資料繪圖有用):
echo 'ForwardX11 yes' >> ~/.ssh/config
echo 'Compression yes' >> ~/.ssh/config
用你的筆記本連線你的運程機器,檢查一下結果:
ssh [remote username here]@[remote Ip here]
現在還登入著,你應該禁用你的遠端機器上的密碼登入(為了安全)。使用你最喜歡的命令列編輯器開啟配置檔案:
sudo vim /etc/ssh/sshd_config
然後取消以下 # 行的註釋:
PasswordAuthentication no
在你登入著你的遠端機器時重啟你的 SSH 伺服器(你必須重新驗證一次):
service ssh restart
在你用 SSH 登入著你的遠端機器時,你應該要做的最後一件事是找到你的顯示器環境變數。後面我們將會用其來 plotting,我通常得到的是 localhost:10.0.
echo $DISPLAY
> localhost:10.0
記住這個命令的輸出,後面會用到。
PyCharm 中的遠端直譯器
這部分很有意思,我們如何設定遠端直譯器(remote interpreter)從而讓你能在遠端機器上執行指令碼呢?首先啟動 PyCharm,然後新建一個 Python 專案。
直譯器(Interpreter)
開啟 Preferences > Project > Project Interpreter,點選右上角的加點按鈕,然後點選 Add remote。
點選 SSH Credentials 按鈕然後輸入你的資訊。選擇 Auth Type 上的 Key pair,然後選擇 Private Key file。其路徑應該是 /Users/<your username>/.ssh/id_rsa
點選 OK > Apply。注意 Project Interpreter 上的 R 表示遠端。
部署
該遠端直譯器不能執行本地的檔案,PyCharm 必須將你的原始檔(你的專案)複製到你的遠端伺服器上的目標資料夾,但這是自動完成的,所以你無需多想!當你在 Preferences 面板時,開啟 Build, Execution, Deployment > Deployment > Options,確保勾選了 Create empty directories。這樣當你建立資料夾時,PyCharm 就會自動同步:
現在回到 Build, Execution, Deployment > Deployment,然後點選 + 按鈕,選擇 SFTP 併為你的遠端命名。點選 OK:
在 SFTP host 中首次輸入你的遠端機器的 IP 來設定連線,然後選擇 Auth type 上的 Key pair,最後選擇 Private Key file,路徑應該是 /Users/<your username>/.ssh/id_rsa,如截圖所示。然後你可能需要點選 Test SFTP connection 進行測試。如果你連線成功了,就應該設定 mapping 了。如果你願意,你可以點選 Rooth path 旁邊的 Autodetect,然後它會自動尋找你的遠端機器上的主目錄。在此之後你所特定的所有路徑都將相對於該主路徑。然後轉到 Mappings 標籤。
一旦你在你的本地路徑中儲存或建立了一個檔案,它就將會被複制到遠端機器上的 Deployment path,也許你想將其部署到如下所示的 DeployedProjects/ 資料夾。這是相對於你前面指定的 Rooth path,所以在我們的這個例子中,絕對的部署路徑是:/home/username/DeployedProjects/TestProject/
現在我們完成了偏好設定,點選 Apply > OK,然後點選 Tools > Deployment > Automatic Upload,確認其被選擇了:
要進行初始上傳,右擊專案瀏覽器中的專案資料夾,然後點選 Upload to remote:
在你的底部面板應該會出現一個 File transfer 標籤,你可以檢視程序:
然後點選 Tools > Deployment > Browse Remote Host。將該視窗拖拽到左邊 Project 標籤下面。這樣你就能輕鬆地在本地和遠端專案之間切換了。
一旦你儲存並運行了一個檔案後,這些部署設定將會無縫工作,它完成得非常快,你可能都無法察覺。
設定控制檯
開啟 Preferences > Build, Execution, Deployment > Console > Python console 然後選擇 Python interpreter。然後點選 Dotted button 並輸入所需的之間我們加入到 ~/.bashrc 中的環境變數。注意我們也給 DISPLAY 變數加了一個值,這個值是我們之前使用 SSH 連線伺服器時找到的:
然後回到 Preferences > Build, Execution, Deployment > Console > Python console 然後選擇 Always show the debug console。這在我們除錯的時候非常有用:
建立一個執行配置
在你的專案中建立一個簡單的名為 test.py 的測試檔案,其中僅包含:
importtensorflow
print"Tensorflow Imported"
現在進入 Run > Edit Configurations…,點選 + 按鈕建立一個新的 Python 配置。為其命名後選擇該指令碼執行:
現在像之前一樣進入所需的環境變數。小技巧:你可以直接從我們之前指定的控制檯設定中直接複製它們,在左下角使用 Ctrl+A 和複製/貼上即可。你可以通過點選 Environment variables 一行後面的加點按鈕獲取它們。
點選 OK > OK 開始測試!
測試該設定
現在我們應該全部完成了,改進行測試了。首先開啟終端並確保你至少有一個帶有 X 轉發的 SSH 通道連線到你的伺服器。如果你的連線已經開啟了一段時間了,你可能必須退出並重啟它們:
ssh [remote username here]@[remote Ip here]
控制檯
然後開啟 PyCharm 中底部欄的 Python Console 並輸入 import tensorflow。然後你可以輸入 ls/ 來驗證你確實在你的伺服器上執行該命令。輸出應該是這樣的:
執行指令碼
現在回到你的 test.py 指令碼,然後選擇頂部欄的 Run > Run…。選擇你新建的執行配置 Test,其應該輸出這樣的結果:
繪圖
讓我們做一些繪圖,把你的 test.py 檔案改成這樣:
import tensorflow
import matplotlib
matplotlib.use('GTKAgg')
import matplotlib.pyplot as plt
import numpy as np
print "Tensorflow Imported"
plt.plot(np.arange(100))
plt.show()
接著用你的執行配置 Test 再一次執行它,你會得到這個圖:
這個圖實際上在你的遠端伺服器上完成,但是視窗資料被轉向到了你的本地機器。注意我們可以用 matplotlib.use('GTXAgg') 改變支援,因為它是一個支援 X11 的顯示後臺。你可以在這裡閱讀更多關於 Matplotlib 後臺的資訊:
http://matplotlib.org/faq/usage_faq.html#what-is-a-backend
你也可以在 matplotlibrc 檔案中修改預設行為。記住在一個分離開的終端中你需要至少一個開放的 SSH 連線,使用 DISPLAY 環境變數的正確值以使其工作。如果無效嘗試重新啟動你的 SSH 連線。
除錯指令碼
最後做一些除錯。點選左側欄以放一個斷點(breakpoint),接著點選 Run > Debug…,並選擇 Test 配置。你將會看到執行已停止,然後你就可以遠端除錯指令碼了。
下一步
為了使你的機器聯網,你不得不在家庭路由器上轉發埠,這根據不同的供應商而變化。我建議在你的路由器上轉發一個超過 22 的不同埠。世界上存在很多動機不良的 bot 想要攻擊你,它們會檢查預設埠,也許會減慢你的連線(儘管你已經關閉了口令認證,所以你相當安全)。也許你可以把你的路由器上的埠 4343 轉發到 IP 192.168.0.1 上的埠 22(該教程中我們的遠端預設 IP)。另外,為了加快繪圖,你也許會需要更快的加密:
http://xmodulo.com/how-to-speed-up-x11-forwarding-in-ssh.html
原文地址:https://medium.com/@erikhallstrm/work-remotely-with-pycharm-tensorflow-and-ssh-c60564be862d#.4402jqsp2