从事深度学习的研究者都知道, 深度学习代码需要设计海量的数据, 需要很大很大很大 (重要的事情说三遍) 的计算量, 以至于 CPU 算不过来, 需要通过 GPU 帮忙, 但这必不意味着 CPU 的性能没 GPU 强, CPU 是那种综合性的, GPU 是专门用来做图像渲染的, 这我们大家都知道, 做图像矩阵的计算 GPU 更加在行, 应该我们一般把深度学习程序让 GPU 来计算, 事实也证明 GPU 的计算速度比 CPU 块, 但是 (但是前面的话都是废话) 我们穷, 买不起呀, 一块 1080Ti 现在也要 3500 左右, 2080Ti 要 9000 左右, 具体价格还要看显存大小, 因此本文给大家带来了福利 --Google 免费的 GPU Colaboratory.
Google Colab 简介
Google Colaboratory 是谷歌开放的一款研究工具, 主要用于机器学习的开发研究, 这款工具现在可以免费使用, 但是不是永久免费暂时还不确定, Google Colab 最大的好处是给广大开发 AI 者提供免费的 GPU 使用! GPU 型号是 Tesla K80, 你可以在上面轻松地跑例如: keras,Tensorflow,Pytorch 等框架.
Colabortory 是一个 jupyter notebook 环境, 它支持 python2 和 python3, 还包括 TPU 和 GPU 加速, 该软件与 Google 云盘硬盘集成, 用户可以轻松共享项目或将其他共享项目复制到自己的帐户中.
Colaboratory 使用步骤
1, 登录谷歌云盘
https://drive.google.com/drive/my-drive (没有账号的可以注册一个)
(1), 右键新建文件夹, 作为我们的项目文件夹.
2, 创建 Colab 文件
右键在更多里面选择 google Colaboratry(如果没有 Colaboratory 需要在关联更多应用里面关联 Colaboratory)
3, 开始使用
这时候会直接跳转到 Colaboratory 界面, 这个界面很像 Jupyter Notebook,Jupyter 的命令在 Colaboratory 一样适用, 值得一提的是, Colab 不仅可以运行 Python 代码, 只要在命令前面加一个 "!", 这条命令就变成了 Linux 命令, 比如我们可以 "! ls" 查看文件夹文件, 还可以! pip 安装库. 以及运行 py 程序! python2 temp.py
可以写一段代码进行测试
更改工作目录, 在 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 -1
(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 官方文档
一位外国小哥写的博客, 总结的不错
来源: https://www.cnblogs.com/LXP-Never/p/11614053.html