Быстрое практическое глубокое обучение в Google Colab

TensorFlow глубокое обучение

Большая часть этой статьи посвященаОфициальное приветствие ColabКраткое изложение серии, больше ссылок на знания, связанные с искусственным интеллектом и глубоким обучениемИскусственный интеллект и глубокое обучение на практике https://github.com/wx-chevalier/AIDL-Seriesсерия статей.

Colaboratory

Colaboratory — это бесплатная среда для ноутбуков Jupyter, которая не требует настройки для использования и полностью работает в облаке. С помощью Colaboratory мы можем писать и выполнять код в браузере, сохранять результаты анализа и делиться ими, а также использовать мощные вычислительные ресурсы, включая GPU и TPU, для запуска нашего экспериментального кода.

Colab может легко связать с Google Driver и Github, мы можем использоватьOpen in Colabплагин для быстрого открытия блокнота на Github или используйте что-то вродеcol AB.research.Google.com/GitHub/ о боже...Такая ссылка открывается. Если вам нужно сохранить блокнот обратно в Github, просто используйтеFile→Save a copy to GitHubВот и все. Например, весь авторский код, относящийся к Colab, размещен вAIDL-Workbench/colab.

зависимости и время выполнения

Установка зависимостей

Colab предоставляет удобную функцию установки зависимостей, которая позволяет выполнять установку с помощью команд pip или apt-get:

# Importing a library that is not in Colaboratory
!pip install -q matplotlib-venn
!apt-get -qq install -y libfluidsynth1

# Upgrading TensorFlow
# To determine which version you're using:
!pip show tensorflow

# For the current version:
!pip install --upgrade tensorflow

# For a specific version:
!pip install tensorflow==1.2

# For the latest nightly build:
!pip install tf-nightly

# Install 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.4.0-{platform}-linux_x86_64.whl torchvision

# Install 7zip reader libarchive
# https://pypi.python.org/pypi/libarchive
!apt-get -qq install -y libarchive-dev && pip install -q -U libarchive
import libarchive

# Install GraphViz & PyDot
# https://pypi.python.org/pypi/pydot
!apt-get -qq install -y graphviz && pip install -q pydot
import pydot

# Install cartopy
!apt-get -qq install python-cartopy python3-cartopy
import cartopy

Переменные среды также можно установить в Colab:

%env KAGGLE_USERNAME=abcdefgh

Аппаратное ускорение

Мы видим аппаратное обеспечение, которое нам предоставляет Colab:

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

!ls /proc
# CPU信息
!cat /proc/cpuinfo
# 内存
!cat /proc/meminfo
# 版本
!cat /proc/version
# 设备
!cat /proc/devices
# 空间
!df

Если вам нужно включить поддержку графического процессора для ноутбука:Click Edit->notebook settings->hardware accelerator->GPU, а затем в коде, чтобы определить, доступно ли устройство GPU:

import tensorflow as tf
device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
  raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))

Мы можем сравнить разницу в вычислениях между GPU и CPU, построив классический сверточный слой CNN:

import tensorflow as tf
import timeit

# See https://www.tensorflow.org/tutorials/using_gpu#allowing_gpu_memory_growth
config = tf.ConfigProto()
config.gpu_options.allow_growth = True

with tf.device('/cpu:0'):
  random_image_cpu = tf.random_normal((100, 100, 100, 3))
  net_cpu = tf.layers.conv2d(random_image_cpu, 32, 7)
  net_cpu = tf.reduce_sum(net_cpu)

with tf.device('/gpu:0'):
  random_image_gpu = tf.random_normal((100, 100, 100, 3))
  net_gpu = tf.layers.conv2d(random_image_gpu, 32, 7)
  net_gpu = tf.reduce_sum(net_gpu)

sess = tf.Session(config=config)

# Test execution once to detect errors early.
try:
  sess.run(tf.global_variables_initializer())
except tf.errors.InvalidArgumentError:
  print(
      '\n\nThis error most likely means that this notebook is not '
      'configured to use a GPU.  Change this in Notebook Settings via the '
      'command palette (cmd/ctrl-shift-P) or the Edit menu.\n\n')
  raise

def cpu():
  sess.run(net_cpu)

def gpu():
  sess.run(net_gpu)

# Runs the op several times.
print('Time (s) to convolve 32x7x7x3 filter over random 100x100x100x3 images '
      '(batch x height x width x channel). Sum of ten runs.')
print('CPU (s):')
cpu_time = timeit.timeit('cpu()', number=10, setup="from __main__ import cpu")
print(cpu_time)
print('GPU (s):')
gpu_time = timeit.timeit('gpu()', number=10, setup="from __main__ import gpu")
print(gpu_time)
print('GPU speedup over CPU: {}x'.format(int(cpu_time/gpu_time)))

sess.close()

работать локально

Colab также поддерживает подключение ноутбуков напрямую к локальному серверу Jupyter для запуска, сначала вам нужно включить расширение jupyter_http_over_ws:

pip install jupyter_http_over_ws
jupyter serverextension enable --py jupyter_http_over_ws

Затем запустите сервер Jupyter обычным способом, установив флаг, чтобы явно доверять подключениям WebSocket из интерфейса Colaboratory:

jupyter notebook \
  --NotebookApp.allow_origin='https://colab.research.google.com' \
  --port=8888 \
  --NotebookApp.port_retries=0

Затем выберите подключение к исполнителю собственного кода в блокноте Colab.

Данные и внешние модули

Файлы блокнота и py в Colab по умолчанию используют /content/ в качестве рабочего каталога Вам необходимо выполнить следующую команду, чтобы вручную переключить рабочий каталог, например:

import os

path = "/content/drive/colab-notebook/lesson1-week2/assignment2"
os.chdir(path)
os.listdir(path)

Google Driver

В прошлых экспериментах сбор, хранение и загрузка большого количества обучающих и тестовых данных всегда были головной болью, в Colab автор будетAwesome DataSets https://url.wx-coder.cn/FqwyP) в соответствующих данных черезAIDL-Workbench/datasetsСкрипты сохраняются в драйвере Google.

В Colab мы можем подключить драйвер Google к текущему рабочему пути:

from google.colab import drive
drive.mount("/content/drive")

print('Files in Drive:')
!ls /content/drive/'My Drive'

Затем создайте и работайте с помощью обычных команд Linux Shell:

# Working with files
# Create directories for the new project
!mkdir -p drive/kaggle/talkingdata-adtracking-fraud-detection

!mkdir -p drive/kaggle/talkingdata-adtracking-fraud-detection/input/train
!mkdir -p drive/kaggle/talkingdata-adtracking-fraud-detection/input/test
!mkdir -p drive/kaggle/talkingdata-adtracking-fraud-detection/input/valid

# Download files
!wget -O /content/drive/'My Drive'/Data/fashion_mnist/train-images-idx3-ubyte.gz http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz

# Download and Unzip files
%env DIR=/content/drive/My Drive/Data/animals/cats_and_dogs

!rm -rf "$DIR"
!mkdir -pv "$DIR"
!wget -O "$DIR"/Cat_Dog_data.zip https://s3.amazonaws.com/content.udacity-data.com/nd089/Cat_Dog_data.zip

# remove existing directories
!(cd "$DIR" && unzip -qqj Cat_Dog_data.zip -d .)

Внешний файл Python

Colab позволяет нам загружать файлы Python в рабочий каталог или загружать Python из драйвера Google:

# Import modules
import imp
helper = imp.new_module('helper')
exec(open("drive/path/to/helper.py").read(), helper.__dict__)

fc_model = imp.new_module('fc_model')
exec(open("pytorch-challenge/deep-learning-v2-pytorch/intro-to-pytorch/fc_model.py").read(), fc_model.__dict__)

Загрузка и скачивание файлов

Colab также позволяет нам загружать напрямую из локального файла при запуске скрипта или загружать сгенерированную модель в локальный файл:

from google.colab import files

# Upload file
uploaded = files.upload()

for fn in uploaded.keys():
  print('User uploaded file "{name}" with length {length} bytes'.format(
      name=fn, length=len(uploaded[fn])))

# Download file
with open('example.txt', 'w') as f:
  f.write('some content')

files.download('example.txt')

BigQuery

Если мы используем BigQuery для обеспечения запросов к большим данным и функций управления, то источник данных в BigQuery также можно напрямую ввести в Colab:

from google.cloud import bigquery

client = bigquery.Client(project=project_id)

sample_count = 2000
row_count = client.query('''
  SELECT
    COUNT(*) as total
  FROM `bigquery-public-data.samples.gsod`''').to_dataframe().total[0]

df = client.query('''
  SELECT
    *
  FROM
    `bigquery-public-data.samples.gsod`
  WHERE RAND() < %d/%d
''' % (sample_count, row_count)).to_dataframe()

print('Full dataset has %d rows' % row_count)

контроль использования

сетка

Colab предоставляет нам элементы управления Grid и Tab, чтобы облегчить нам создание простых макетов диаграмм:

import numpy as np
import random
import time
from matplotlib import pylab
grid = widgets.Grid(2, 2)
for i in range(20):
  with grid.output_to(random.randint(0, 1), random.randint(0, 1)):
    grid.clear_cell()
    pylab.figure(figsize=(2, 2))
    pylab.plot(np.random.random((10, 1)))
  time.sleep(0.5)

TabBar предоставляет макет с вкладками:

from __future__ import print_function

from google.colab import widgets
from google.colab import output
from matplotlib import pylab
from six.moves import zip


def create_tab(location):
  tb = widgets.TabBar(['a', 'b'], location=location)
  with tb.output_to('a'):
    pylab.figure(figsize=(3, 3))
    pylab.plot([1, 2, 3])
  # Note you can access tab by its name (if they are unique), or
  # by its index.
  with tb.output_to(1):
    pylab.figure(figsize=(3, 3))
    pylab.plot([3, 2, 3])
    pylab.show()


print('Different orientations for tabs')

positions = ['start', 'bottom', 'end', 'top']

for p, _ in zip(positions, widgets.Grid(1, 4)):
  print('---- %s ---' % p)
  create_tab(p)

форма

Похвально, что Colab также предоставляет компоненты интерактивных форм, которые облегчают нам создание приложений, которые можно вводить динамически:

#@title String fields

text = 'value' #@param {type:"string"}
dropdown = '1st option' #@param ["1st option", "2nd option", "3rd option"]
text_and_dropdown = '2nd option' #@param ["1st option", "2nd option", "3rd option"] {allow-input: true}

print(text)
print(dropdown)
print(text_and_dropdown)

дальнейшее чтение