在Google合作实验室上构建Caffe:云中的免费图形卡

Google Colaboratory是最近推出的云服务,旨在简化机器学习和深度学习的研究。 使用协作实验室,您可以远程访问带有连接的视频卡的计算机,而且该计算机是完全免费的,从而极大地简化了必须训练深度神经网络的工作。 我们可以说这与Jupyter Notebook的Google文档类似。

Colaboratory预先安装了 Tensorflow,并且几乎所有需要使用的Python库。 如果缺少软件包,则可以通过pipapt-get轻松安装它。 但是,如果您需要从源代码构建项目并连接到GPU,该怎么办? 事实证明,这可能并非如此简单,以至于我在构建SSD-Caffe时发现了这一点。 在本出版物中,我将对合作实验室进行简要说明,描述遇到的困难以及如何解决这些困难,并提供一些有用的技巧。

所有代码都可以在我的协作笔记本中找到


简述合作


粗略地说,Colaboratory允许您在远程计算机上运行Jupyter Notebook。 合作文件是普通的.ipynb“笔记本电脑”,并存储在Google磁盘上。 还有一组功能可让您将文件从远程计算机上传到Google磁盘,反之亦然。 您也可以与其他人共享这些文件,也可以像在Google文档中一样对它们写评论。

在协作实验室中,您可以使用GPU,即Tesla K80。 为此,请在以下设置中进行连接:运行时  rightarrow更改运行时类型  rightarrow硬件加速器。 值得注意的是,GPU并非总是可用,然后协作者会在没有它的情况下启动机器。

除了Jupyter Notebook本身,似乎什么也无法启动,但是可以间接访问终端:为此,您需要在终端命令前面添加一个感叹号,例如!mkdir images 。 通常,我们可以假设我们正在处理一台完美的普通计算机,该计算机上安装了Ubuntu 17.10(在撰写本文时),但是该计算机是远程连接的。 因此,可以通过终端(而不是交互式)完成的所有操作都可以在终端上完成,包括:

  • 使用git clone克隆存储库,
  • 使用wget加载数据(顺便说一下,即使是大文件也几乎可以立即从Google磁盘加载),
  • 使用make (最有可能是cmake
  • 使用apt-getpip安装工具和库

关于合作实验室的更多评论:

  • 看来用户可以无限制地访问系统中的所有文件(任何命令都需要编写而不使用sudo );
  • 终端状态不会在团队之间转移,即使它们在同一个单元中(例如, cd dir如果需要,则必须在每个命令的开头写入);
  • 如果您长时间与协作实验室断开连接,则虚拟机中的所有更改都将被删除,包括所有已安装的软件包和下载的文件,因此,建议在Jupyter Notebook中包含软件包的安装;否则,建议您将其删除。
  • 连续使用12个小时后,机器会自动关闭,但随后可以重新启动(理论上,实际上,GPU可能不可用)。

SSD-Caffe构建


我想尝试一下Single Shot Detector(SSD) ,即它在Google Colaboratory中的Caffe实现 ,但是为此,该项目需要从源头进行组装。

顺便说一句,如果有任何版本的Caffe适合您,那么还有一种更简单的方法(即使我没有尝试运行任何工具,它也可以工作):

 !apt install caffe-cuda 

从源头组装SSD-Caffe是一个很长的过程,需要几个步骤,而这只能用拐杖完成。

步骤1:安装依赖项

在这里,我们必须使用apt下载Caffe的所有依赖项。 但是,在执行此操作之前,必须允许apt下载依赖项源代码。 Caffe安装指南说,这需要“ sources.list文件中的deb-src行”。 不幸的是,那里没有详细信息,所以我只是取消注释/etc/apt/sources.list文件中的所有deb-src行:

 with open('/etc/apt/sources.list') as f: txt = f.read() with open('/etc/apt/sources.list', 'w') as f: f.write(txt.replace('# deb-src','deb-src')) 

而且有效。 它仅保留下载依赖项:

 !apt update !apt build-dep caffe-cuda 

步骤2:需要其他编译器

这里的问题是这样的: g++-7 (默认情况下为默认值)由于某种原因与nvcc CUDA编译器不兼容,因此您必须使用其他内容。 我下载了g++-5并使其成为默认的编译器:

 !apt install g++-5 !update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20 !update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 20 

步骤3:必须增强

如果您在此阶段尝试构建Caffe,则在尝试连接boost时会出现问题,因为它是由另一个编译器构建的,因此您必须下载其源代码并使用g++-5构建( 更多内容请参见boost网站 ):

 !wget https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.bz2 !tar --bzip2 -xf boost_1_67_0.tar.bz2 !cd boost_1_67_0 && ./bootstrap.sh --exec-prefix=/usr/local --with-libraries=system,filesystem,regex,thread,python --with-python-version=2.7 --with-python-root=/usr !cd boost_1_67_0 && ./b2 install 

步骤4:配置Makefile

使用GitHub克隆Caffe:

 !git clone https://github.com/weiliu89/caffe.git && cd caffe && git checkout ssd 

然后我们更改了Makefile.config中的必填字段-我将路径更改为CUDA,更改了BLAS选项,将OpenCV的版本更改为第三个,添加了Python层,还向已安装的库添加了所有路径,但是由于某种原因未找到(所有这些都很方便使用Python完成):

 with open('caffe/Makefile.config.example') as f: config = f.read() comment = ['CUDA_DIR := /usr/local/cuda', 'BLAS := open'] uncomment = ['# CUDA_DIR := /usr', '# BLAS := atlas', '# OPENCV_VERSION := 3', '# WITH_PYTHON_LAYER := 1'] # replace = [('INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include', 'INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial /usr/local/lib/python2.7/dist-packages/numpy/core/include/'), ('LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib', 'LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial')] for c in uncomment: config = config.replace(c, c[2:]) for c in comment: config = config.replace(c, '# '+c) for c1,c2 in replace: config = config.replace(c1, c2) with open('caffe/Makefile.config', 'w') as f: f.write(config) 

另外,在Makefile本身中,我必须用-I替换所有-isystem标记:两者都负责查找标头,但是它们的处理方式略有不同,并且在连接stdlib时没有发生这种替换问题( 更多详细信息,在这里 ):

 with open('caffe/Makefile') as f: mfile = f.read() with open('caffe/Makefile', 'w') as f: f.write(mfile.replace('-isystem','-I')) 

步骤5:建立

最后只剩下一个拐杖了-要更正c++config.h ,否则存在nan类型的问题( 更多 ):

 with open('/usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h') as f: txt = f.read() with open('/usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h', 'w') as f: f.write(txt.replace('/* #undef _GLIBCXX_USE_C99_MATH */', '/* #undef _GLIBCXX_USE_C99_MATH */\n#define _GLIBCXX_USE_C99_MATH 1')) 

现在,实际上,您可以构建Caffe:

 !cd caffe && make -j8 && make pycaffe && make test -j8 && make distribute !echo /usr/local/lib >> /etc/ld.so.conf && ldconfig !echo /content/caffe/distribute/lib >> /etc/ld.so.conf && ldconfig 

最后两行添加库路径,即boost和Caffe。

现在可以使用Caffe(您只需在PYTHONPATH中指定其路径)即可:

 import sys caffe_path = !cd caffe/python && pwd sys.path.insert(0, caffe_path[0]) import caffe 

为了测试它,我测试了Mobilenet-SSD项目:该代码也位于我的Colaboratory Notebook中

特别是,我测量了一张图片的预测时间,GPU上的加速度约为3.8。

奖励:一些有用的技巧


Google Colaboratory上有一篇有关Medium的出色教程 。 同样在协作实验室本身中,也包含几乎所有可能需要的示例文件。

将Google磁盘挂载到虚拟机的文件系统中:

 !apt-get install -y -qq software-properties-common python-software-properties module-init-tools !add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null !apt-get update -qq 2>&1 > /dev/null !apt-get -y install -qq google-drive-ocamlfuse fuse from google.colab import auth auth.authenticate_user() from oauth2client.client import GoogleCredentials creds = GoogleCredentials.get_application_default() import getpass !google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL vcode = getpass.getpass() !echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} 

此代码将返回链接并提供一个输入窗口。 您需要点击链接,复制代码并将其输入到窗口中。 由于某种原因,我必须这样做两次。 下一个:

 !mkdir -p drive !google-drive-ocamlfuse drive 

之后,您可以将Google磁盘用作常规目录。 此外,此目录中的所有更改都会自动与Google驱动器同步。

Keras安装:

 !pip install -q keras import keras 

安装PyTorch

 from os import path from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag platform = '{}{}-{}'.format(get_abbr_impl(), get_impl_ver(), get_abi_tag()) accelerator = 'cu80' if path.exists('/opt/bin/nvidia-smi') else 'cpu' !pip install -q http://download.pytorch.org/whl/{accelerator}/torch-0.3.0.post4-{platform}-linux_x86_64.whl torchvision import torch 

更改工作目录:

 import os os.chdir("/path/to/wdir") 

清除所有更改并重新启动计算机:

 !kill -9 -1 

将文件上传到本地计算机:

 from google.colab import files files.download('file.ext') 

从上传到Google磁盘的文件中获取字典:

 from google.colab import files uploaded = files.upload() 

使终端命令输出静音(重定向到变量):

 lines_list = !pwd 

通常,Google合作实验室提供了一个很好的机会,可以在云中进行神经网络的培训。 的确,对于非常大的网格,这可能还不够。 另一个优点是能够独立于本地操作系统运行代码(这对可重复性很有用),并且还可以在同一项目上一起工作。 要注意的是,GPU可能不可用,包括很长时间。

Source: https://habr.com/ru/post/zh-CN413229/


All Articles