如何無償使用GPU跑深度學習代碼

  從事深度學習的研究者都知道,深度學習代碼須要設計海量的數據,須要很大很大很大(重要的事情說三遍)的計算量,以致於CPU算不過來,須要經過GPU幫忙,但這必不意味着CPU的性能沒GPU強,CPU是那種綜合性的,GPU是專門用來作圖像渲染的,這咱們你們都知道,作圖像矩陣的計算GPU更加在行,應該咱們通常把深度學習程序讓GPU來計算,事實也證實GPU的計算速度比CPU塊,可是(可是前面的話都是廢話)咱們窮,買不起呀,一塊1080Ti如今也要3500左右,2080Ti要9000左右,具體價格還要看顯存大小,所以本文給你們帶來了福利——Google免費的GPU Colaboratory。python

Google Colab簡介

  Google Colaboratory是谷歌開放的一款研究工具,主要用於機器學習的開發研究,這款工具如今能夠無償使用,可是不是永久免費暫時還不肯定,Google Colab最大的好處是給廣大開發AI者提供免費的GPU使用!GPU型號是Tesla K80,你能夠在上面輕鬆地跑例如:Keras、Tensorflow、Pytorch等框架。linux

  Colabortory是一個jupyter notebook環境,它支持python2和python3,還包括TPU和GPU加速,該軟件與Google雲盤硬盤集成,用戶能夠輕鬆共享項目或將其餘共享項目複製到本身的賬戶中。json

Colaboratory使用步驟

一、登陸谷歌雲盤

https://drive.google.com/drive/my-drive(沒有帳號的能夠註冊一個)api

(1)、右鍵新建文件夾,做爲咱們的項目文件夾。session

二、建立Colab文件

右鍵在更多裏面選擇google Colaboratry(若是沒有Colaboratory須要在關聯更多應用裏面關聯Colaboratory)框架

三、開始使用

這時候會直接跳轉到Colaboratory界面,這個界面很像Jupyter Notebook,Jupyter的命令在Colaboratory同樣適用,值得一提的是,Colab不只能夠運行Python代碼,只要在命令前面加一個"  !",這條命令就變成了linux命令,好比咱們能夠" ! ls"查看文件夾文件,還能夠!pip安裝庫。以及運行py程序!python2 temp.pydom

能夠寫一段代碼進行測試curl

更改工做目錄,在Colab中cd命令是無效的,切換工做目錄使用chdir函數機器學習

!pwd # 用 pwd 命令顯示工做路徑
# /content
!ls # 查看的是 content 文件夾下有哪些文件
# sample_data
!ls "drive/My Drive"
# TensorFlow (這就是咱們以前建立的那個文件夾)

# 更改工做目錄
import os
os.chdir("/content/drive/My Drive/TensorFlow")
os.getcwd()
# '/content/drive/My Drive/TensorFlow'

從新啓動Colab命令:!kill -9 -1ide

(3)、選擇配置環境

  咱們你們確定會疑慮,上述方法跑的那段程序是否是用GPU跑的呢?不是,想要用GPU跑程序咱們還須要配置環境,

  點擊工具欄「修改」,選擇筆記本設置

在運行時類型咱們能夠選擇Python 2或Python 3,硬件加速器咱們能夠選擇GPU或者TPU(後面會講到),或者None什麼都不用。

加載數據

從本地加載數據

從本地上傳數據

files.upload 會返回已上傳文件的字典。 此字典的鍵爲文件名,值爲已上傳的數據。

from google.colab import files

uploaded = files.upload()
for fn in uploaded.keys():
  print('用戶上傳的文件 "{name}" 有 {length} bytes'.format(
      name=fn, length=len(uploaded[fn])))

咱們運行該段程序以後,就會讓咱們選擇本地文件,點擊上傳後,該文件就能被讀取了

將文件下載到本地

from google.colab import files

files.download('./example.txt')        # 下載文件

從谷歌雲盤加載數據

使用受權代碼在運行時裝載 Google 雲端硬盤

from google.colab import drive
drive.mount('/content/gdrive')

在Colab中運行上述代碼,會出現一段連接,點擊連接,複製連接中的密鑰,輸入到Colab中就能夠成功把Colab與谷歌雲盤相鏈接,鏈接後進行路徑切換,就能夠直接讀取谷歌雲盤數據了。

向Google Colab添加表單

爲了避免每次都在代碼中更改超參數,您能夠簡單地將表單添加到Google Colab。

點擊以後就會出現左右兩個框,咱們在左框中輸入

# @title 字符串

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

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

雙擊右邊欄能夠隱藏代碼

Colab中的GPU

首先咱們要讓Colab連上GPU,導航欄-->編輯-->筆記本設置-->選擇GPU

接下來咱們來確承認以使用Tensorflow鏈接到GPU

import tensorflow as tf

device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
  raise SystemError('沒有發現GPU device')
print('Found GPU at: {}'.format(device_name))
# Found GPU at: /device:GPU:0

咱們能夠在Colab上運行如下代碼測試GPU和CPU的速度

import tensorflow as tf
import timeit

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('/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)

# 確保TF能夠檢測到GPU
try:
  sess.run(tf.global_variables_initializer())
except tf.errors.InvalidArgumentError:
  print(
      '\n\n此錯誤極可能表示此筆記本未配置爲使用GPU。 '
      '經過命令面板(CMD/CTRL-SHIFT-P)或編輯菜單在筆記本設置中更改此設置.\n\n')
  raise

def cpu():
  sess.run(net_cpu)
  
def gpu():
  sess.run(net_gpu)
  
# 運行一次進行測試
cpu()
gpu()

# 屢次運行op
print('將100*100*100*3經過濾波器卷積到32*7*7*3(批處理x高度x寬度x通道)大小的圖像'
    '計算10次運訓時間的總和')
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加速超過CPU: {}倍'.format(int(cpu_time/gpu_time)))

sess.close()
# CPU (s):
# 3.593296914000007
# GPU (s):
# 0.1831514239999592
# GPU加速超過CPU: 19倍
View Code

Colab中的TPU

首先咱們要讓Colab連上GPU,導航欄-->編輯-->筆記本設置-->選擇TPU

接下來咱們來確承認以使用Tensorflow鏈接到TPU

import os
import pprint
import tensorflow as tf

if 'COLAB_TPU_ADDR' not in os.environ:
  print('您沒有鏈接到TPU,請完成上述操做')
else:
  tpu_address = 'grpc://' + os.environ['COLAB_TPU_ADDR']
  print ('TPU address is', tpu_address)     
  # TPU address is grpc://10.97.206.146:8470

  with tf.Session(tpu_address) as session:
    devices = session.list_devices()
    
  print('TPU devices:')
  pprint.pprint(devices)

使用TPU進行簡單運算

import numpy as np

def add_op(x, y):
  return x + y
  
x = tf.placeholder(tf.float32, [10,])
y = tf.placeholder(tf.float32, [10,])
tpu_ops = tf.contrib.tpu.rewrite(add_op, [x, y])
  
session = tf.Session(tpu_address)
try:
  print('Initializing...')
  session.run(tf.contrib.tpu.initialize_system())
  print('Running ops')
  print(session.run(tpu_ops, {x: np.arange(10), y: np.arange(10)}))
  # [array([ 0.,  2.,  4.,  6.,  8., 10., 12., 14., 16., 18.], dtype=float32)]
finally:
  # 目前,tpu會話必須與關閉會話分開關閉。
  session.run(tf.contrib.tpu.shutdown_system())
  session.close()

在Colab中運行Tensorboard

想要在Google Colab中運行Tensorboard,請運行如下代碼

!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip

# 添加TensorBoard的路徑
import os
log_dir = 'tb_logs'
if not os.path.exists(log_dir):
  os.makedirs(log_dir)

# 開啓ngrok service,綁定port 6006(tensorboard)
get_ipython().system_raw('tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'.format(log_dir))
get_ipython().system_raw('./ngrok http 6006 &')

# 產生網站,點擊網站訪問tensorboard
!curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

您可使用建立的ngrok.io URL 跟蹤Tensorboard日誌。您將在輸出末尾找到URL。請注意,您的Tensorboard日誌將保存到tb_logs目錄。固然,您能夠更改目錄名稱。

以後,咱們能夠看到Tensorboard發揮做用!運行如下代碼後,您能夠經過ngrok URL跟蹤Tensorboard日誌。

from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras.callbacks import TensorBoard

batch_size = 128
num_classes = 10
epochs = 12

# input image dimensions
img_rows, img_cols = 28, 28

# the data, shuffled and split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()

if K.image_data_format() == 'channels_first':
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
    input_shape = (1, img_rows, img_cols)
else:
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
    input_shape = (img_rows, img_cols, 1)

x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])


tbCallBack = TensorBoard(log_dir=LOG_DIR, 
                         histogram_freq=1,
                         write_graph=True,
                         write_grads=True,
                         batch_size=batch_size,
                         write_images=True)

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test),
          callbacks=[tbCallBack])
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
View Code

參考

Colaboratory官方文檔

一位外國小哥寫的博客,總結的不錯

相關文章
相關標籤/搜索