一般而言,大型的神经网络对硬件能力有着较高的需求――往往需要强劲的 GPU 来加速计算。但是你也许还是想拿着一台笔记本坐在咖啡店里安静地写 TensorFlow 代码,同时还能享受每秒数万亿次的浮点运算(teraFLOPS)速度?其实这个目标不难实现,使用 PyCharm 中的一个远程解释器,你就能通过远程的方式获得几乎和本地计算时一样的性能。Erik Hallstrm 在本文中分享了如何使用 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/ppasudo 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.debsudo 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.tgzsudo 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"' >> ~/.bashrcecho '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验证安装是否有效,在终端输入:
pythonimport 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 pythonbrew 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/configecho '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 &g