1. 程式人生 > >教程 | 一步步從零開始:使用PyCharm和SSH搭建遠端TensorFlow開發環境

教程 | 一步步從零開始:使用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