O Google Colaboratory é um serviço de nuvem lançado recentemente, que visa simplificar a pesquisa em aprendizado de máquina e aprendizado profundo. Usando o Colaboratory, você pode obter acesso remoto a uma máquina com uma placa de vídeo conectada e é totalmente gratuito, o que simplifica bastante a vida quando você precisa treinar redes neurais profundas. Podemos dizer que é um análogo dos documentos do Google para o Jupyter Notebook.
O Colaboratory possui o Tensorflow pré- 
instalado e quase todas as bibliotecas Python necessárias para o trabalho. Se um pacote estiver faltando, ele é facilmente instalado em qualquer lugar através do 
pip ou 
apt-get . Mas e se você precisar criar um projeto a partir da fonte e se conectar à GPU? Acontece que isso pode não ser tão simples que eu descobri durante a construção do 
SSD-Caffe . Nesta publicação, darei uma breve descrição do Colaboratório, descreverei as dificuldades encontradas e como resolvê-las, além de fornecer alguns truques úteis.
Todo o código está disponível no meu 
Caderno Colaborativo .
Brevemente sobre Colaboratory
Grosso modo, o Colaboratory permite executar o Jupyter Notebook em uma máquina remota. Os arquivos colaborativos são "laptops" .ipynb comuns e são armazenados no disco do Google. Há também um conjunto de funções que permite fazer upload de arquivos de uma máquina remota para o disco do Google e vice-versa. Você também pode compartilhar esses arquivos com outras pessoas, escrever comentários sobre eles, como nos documentos do Google.
No Colaboratório, você pode usar a GPU, ou seja, o Tesla K80. Para fazer isso, conecte-o nas configurações: Tempo de execução 
Alterar o tipo de tempo de execução 
Acelerador de hardware. Vale ressaltar que nem sempre as GPUs estão disponíveis e, em seguida, o Colaboratory oferecerá iniciar a máquina sem ela.
Parece que nada pode ser iniciado, exceto o próprio Jupyter Notebook, mas há acesso indireto ao terminal: para isso, é necessário adicionar um ponto de exclamação na frente do comando do terminal, por exemplo 
!mkdir images . Em geral, podemos assumir que estamos lidando com uma máquina comum perfeita na qual o Ubuntu 17.10 está instalado (no momento da escrita), mas conectado remotamente. Daqui resulta que tudo o que pode ser feito através do terminal (não interativamente) pode ser feito nele, incluindo:
- clonar repositórios usando git clone,
- carregar dados usando o wget(a propósito, até arquivos grandes são carregados quase instantaneamente em um disco do Google),
- use make(e provavelmentecmake)
- instalar ferramentas e bibliotecas usando o apt-gete opip
Mais alguns comentários sobre o Colaboratory:
- Parece que o usuário tem acesso ilimitado a todos os arquivos do sistema (qualquer comando precisa ser escrito sem o sudo);
- O estado do terminal não é transferido entre equipes, mesmo que estejam na mesma célula (por exemplo, cd dirse necessário, você precisará escrever no início de cada comando);
- Se você se desconectar do Colaboratory por um longo tempo, todas as alterações na máquina virtual serão apagadas, incluindo todos os pacotes instalados e arquivos baixados; portanto, é recomendável que a instalação dos pacotes seja incluída no Jupyter Notebook;
- Após 12 horas de uso contínuo, a máquina desliga automaticamente, mas pode ser reiniciada (em teoria, na prática, a GPU pode não estar disponível).
Construção SSD-Caffe
Eu queria experimentar o 
Single Shot Detector (SSD) , ou seja, sua 
implementação Caffe no Google Colaboratory, mas, para isso, o projeto precisava ser montado a partir da fonte.
A propósito, se qualquer versão do 
Caffe é adequada para você, existe uma maneira muito mais fácil (funciona mesmo, embora eu não tenha tentado executar nada):
 !apt install caffe-cuda 
A montagem do SSD-Caffe a partir da fonte é uma busca bastante longa de várias etapas, o que só pode ser feito com muletas.
Etapa 1: instalando dependênciasAqui devemos baixar todas as dependências do Caffe usando o 
apt . No entanto, antes de fazer isso, você deve permitir que o 
apt download do código fonte da dependência. 
O guia de instalação do Caffe diz que isso requer uma "linha deb-src no arquivo sources.list". Infelizmente, não há detalhes lá, então apenas descomentei todas as linhas 
deb-src no arquivo 
/etc/apt/sources.list :
 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')) 
E funcionou. Resta apenas fazer o download das dependências:
 !apt update !apt build-dep caffe-cuda 
Etapa 2: precisar de outro compiladorAqui está o problema: 
g++-7 , que é o padrão por padrão, é, por algum motivo, incompatível com o compilador 
nvcc CUDA, portanto, você deve usar outra coisa. Eu baixei o 
g++-5 e fiz dele o compilador padrão:
 !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 
Etapa 3: precisa criar impulsoSe você tentar criar o Caffe nesta fase, surgirão problemas quando você tentar conectar o boost, porque ele foi criado por outro compilador, então você precisa fazer o download de suas fontes e também construir usando o 
g++-5 ( 
mais no site do 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 
Etapa 4: Configurar MakefileClone Caffe com GitHub:
 !git clone https://github.com/weiliu89/caffe.git && cd caffe && git checkout ssd 
E alteramos os campos necessários no Makefile.config - alterei o caminho para CUDA, alterei a opção BLAS, alterei a versão do OpenCV para um terceiro, adicionamos uma camada Python e também todos os caminhos para as bibliotecas instaladas, mas por algum motivo não foram encontrados (tudo isso é conveniente feito usando 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']  
Além disso, no Makefile, eu tive que substituir todas as tags 
-isystem por 
-I : ambas são responsáveis por encontrar os cabeçalhos, mas são processadas de maneira um pouco diferente e sem esses problemas de substituição já ocorreram quando o stdlib foi conectado ( 
mais detalhes aqui ):
 with open('caffe/Makefile') as f: mfile = f.read() with open('caffe/Makefile', 'w') as f: f.write(mfile.replace('-isystem','-I')) 
Etapa 5: criarHavia uma última muleta restante - para corrigir o 
c++config.h , caso contrário, há problemas com os tipos nan ( 
mais ):
 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')) 
Agora, de fato, você pode criar o 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 
As duas últimas linhas adicionam os caminhos da biblioteca, nomeadamente boost e Caffe.
Agora o Caffe pode ser usado (você só precisa especificar o caminho para ele no PYTHONPATH):
 import sys caffe_path = !cd caffe/python && pwd sys.path.insert(0, caffe_path[0]) import caffe 
Para testá-lo, testei o projeto 
Mobilenet-SSD : o código também está no meu 
Caderno de Colaboração .
Em particular, medi o tempo de previsão de uma imagem e a aceleração na GPU foi de cerca de 3,8.
Bônus: alguns truques úteis
Há um 
ótimo tutorial sobre Medium no Google Colaboratory. Também no próprio Colaboratório há arquivos com exemplos de quase tudo o que pode ser necessário.
Monte um disco do Google no sistema de arquivos de uma máquina virtual:
 !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} 
Este código retornará o link e fornecerá uma janela de entrada. Você precisa seguir o link, copiar o código e inseri-lo na janela. Por alguma razão, tenho que fazer isso duas vezes. Seguinte:
 !mkdir -p drive !google-drive-ocamlfuse drive 
Depois disso, você pode usar seu disco do Google como um diretório regular. Além disso, todas as alterações neste diretório são sincronizadas automaticamente com o Google-drive.
Instalação 
Keras :
 !pip install -q keras import keras 
Instale o 
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 
Alterar diretório de trabalho:
 import os os.chdir("/path/to/wdir") 
Apague todas as alterações e reinicie a máquina:
 !kill -9 -1 
Faça o upload do arquivo para a máquina local:
 from google.colab import files files.download('file.ext') 
Obtenha o dicionário dos arquivos enviados para o disco do Google:
 from google.colab import files uploaded = files.upload() 
Silenciar a saída do comando do terminal (redirecionar para variável):
 lines_list = !pwd 
Em geral, o Google Colaboratory oferece uma boa oportunidade para realizar o treinamento de redes neurais na nuvem. É verdade que isso pode não ser suficiente para grades muito grandes. Outra vantagem é a capacidade de executar código independentemente do sistema operacional local (o que é bom para a reprodutibilidade) e também trabalhar juntos no mesmo projeto. Como uma captura, a GPU pode não estar disponível, inclusive por um longo tempo.