Google Colaboratory是最近推出的云服务,旨在简化机器学习和深度学习的研究。 使用协作实验室,您可以远程访问带有连接的视频卡的计算机,而且该计算机是完全免费的,从而极大地简化了必须训练深度神经网络的工作。 我们可以说这与Jupyter Notebook的Google文档类似。
Colaboratory预先
安装了 Tensorflow,并且几乎所有需要使用的Python库。 如果缺少软件包,则可以通过
pip
或
apt-get
轻松安装它。 但是,如果您需要从源代码构建项目并连接到GPU,该怎么办? 事实证明,这可能并非如此简单,以至于我在构建
SSD-Caffe时发现了这一点。 在本出版物中,我将对合作实验室进行简要说明,描述遇到的困难以及如何解决这些困难,并提供一些有用的技巧。
所有代码都可以在我的
协作笔记本中找到 。
简述合作
粗略地说,Colaboratory允许您在远程计算机上运行Jupyter Notebook。 合作文件是普通的.ipynb“笔记本电脑”,并存储在Google磁盘上。 还有一组功能可让您将文件从远程计算机上传到Google磁盘,反之亦然。 您也可以与其他人共享这些文件,也可以像在Google文档中一样对它们写评论。
在协作实验室中,您可以使用GPU,即Tesla K80。 为此,请在以下设置中进行连接:运行时
更改运行时类型
硬件加速器。 值得注意的是,GPU并非总是可用,然后协作者会在没有它的情况下启动机器。
除了Jupyter Notebook本身,似乎什么也无法启动,但是可以间接访问终端:为此,您需要在终端命令前面添加一个感叹号,例如
!mkdir images
。 通常,我们可以假设我们正在处理一台完美的普通计算机,该计算机上安装了Ubuntu 17.10(在撰写本文时),但是该计算机是远程连接的。 因此,可以通过终端(而不是交互式)完成的所有操作都可以在终端上完成,包括:
- 使用
git clone
克隆存储库, - 使用
wget
加载数据(顺便说一下,即使是大文件也几乎可以立即从Google磁盘加载), - 使用
make
(最有可能是cmake
) - 使用
apt-get
和pip
安装工具和库
关于合作实验室的更多评论:
- 看来用户可以无限制地访问系统中的所有文件(任何命令都需要编写而不使用
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']
另外,在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可能不可用,包括很长时间。