10.23 居然有免费的GPU可以跑深度学习代码

后台回复【入门资料】

送你十本Python电子书

居然有免费的GPU可以跑深度学习代码

原文:https://www.cnblogs.com/LXP-Never/p/11614053.html

从事深度学习的研究者都知道,深度学习代码需要设计海量的数据,需要很大很大很大(重要的事情说三遍)的计算量,以至于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)、右键新建文件夹,作为我们的项目文件夹。

居然有免费的GPU可以跑深度学习代码

2、创建Colab文件

右键在更多里面选择google Colaboratry(如果没有Colaboratory需要在关联更多应用里面关联Colaboratory)

居然有免费的GPU可以跑深度学习代码

3、开始使用

这时候会直接跳转到Colaboratory界面,这个界面很像Jupyter Notebook,Jupyter的命令在Colaboratory一样适用,值得一提的是,Colab不仅可以运行Python代码,只要在命令前面加一个" !",这条命令就变成了linux命令,比如我们可以" ! ls"查看文件夹文件,还可以!pip安装库。以及运行py程序!python2 temp.py

可以写一段代码进行测试

居然有免费的GPU可以跑深度学习代码

更改工作目录,在Colab中cd命令是无效的,切换工作目录使用chdir函数

  1. <code>!pwd # 用 pwd 命令显示工作路径/<code>

  2. <code># /content/<code>

  3. <code>!ls # 查看的是 content 文件夹下有哪些文件/<code>

  4. <code># sample_data/<code>

  5. <code>!ls "drive/My Drive"/<code>

  6. <code># TensorFlow (这就是我们之前创建的那个文件夹)/<code>


  7. <code># 更改工作目录/<code>

  8. <code>import os/<code>

  9. <code>os.chdir("/content/drive/My Drive/TensorFlow")/<code>

  10. <code>os.getcwd/<code>

  11. <code># '/content/drive/My Drive/TensorFlow'/<code>

重新启动Colab命令:!kill -9 -1

(3)、选择配置环境

我们大家肯定会疑虑,上述方法跑的那段程序是不是用GPU跑的呢?不是,想要用GPU跑程序我们还需要配置环境,

点击工具栏“修改”,选择笔记本设置

居然有免费的GPU可以跑深度学习代码居然有免费的GPU可以跑深度学习代码

在运行时类型我们可以选择Python 2或Python 3,硬件加速器我们可以选择GPU或者TPU(后面会讲到),或者None什么都不用。

加载数据

从本地加载数据

从本地上传数据

<code>files.upload/<code>会返回已上传文件的字典。此字典的键为文件名,值为已上传的数据。

  1. <code>from google.colab import files/<code>


  2. <code>uploaded = files.upload/<code>

  3. <code>for fn in uploaded.keys:/<code>

  4. <code>print('用户上传的文件 "{name}" 有 {length} bytes'.format(/<code>

  5. <code>name=fn, length=len(uploaded[fn])))/<code>

我们运行该段程序之后,就会让我们选择本地文件,点击上传后,该文件就能被读取了

居然有免费的GPU可以跑深度学习代码

将文件下载到本地

  1. <code>from google.colab import files/<code>


  2. <code>files.download('./example.txt') #

    下载文件/<code>

从谷歌云盘加载数据

使用授权代码在运行时装载 Google 云端硬盘

  1. <code>from google.colab import drive/<code>

  2. <code>drive.mount('/content/gdrive')/<code>

在Colab中运行上述代码,会出现一段链接,点击链接,复制链接中的密钥,输入到Colab中就可以成功把Colab与谷歌云盘相连接,连接后进行路径切换,就可以直接读取谷歌云盘数据了。

居然有免费的GPU可以跑深度学习代码

向Google Colab添加表单

为了不每次都在代码中更改超参数,您可以简单地将表单添加到Google Colab。

居然有免费的GPU可以跑深度学习代码居然有免费的GPU可以跑深度学习代码

点击之后就会出现左右两个框,我们在左框中输入

居然有免费的GPU可以跑深度学习代码
  1. <code># @title 字符串/<code>


  2. <code>text = 'value' #@param {type:"string"}/<code>

  3. <code>dropdown = '1st option' #@param ["1st option", "2nd option", "3rd option"]/<code>

  4. <code>text_and_dropdown = 'value' #@param ["选项1", "选项2", "选项3"] {allow-input: true}/<code>


  5. <code>print(text)/<code>

  6. <code>print(dropdown)/<code>

  7. <code>print(text_and_dropdown)/<code>

居然有免费的GPU可以跑深度学习代码

双击右边栏可以隐藏代码

居然有免费的GPU可以跑深度学习代码

Colab中的GPU

首先我们要让Colab连上GPU,导航栏-->编辑-->笔记本设置-->选择GPU

接下来我们来确认可以使用Tensorflow连接到GPU

  1. <code>import tensorflow as tf/<code>


  2. <code>device_name = tf.test.gpu_device_name/<code>

  3. <code>if device_name != '/device:GPU:0':/<code>

  4. <code>raise SystemError('没有发现GPU device')/<code>


  5. <code>print('Found GPU at: {}'.format(device_name))/<code>

  6. <code># Found GPU at: /device:GPU:0/<code>

我们可以在Colab上运行以下代码测试GPU和CPU的速度

居然有免费的GPU可以跑深度学习代码
居然有免费的GPU可以跑深度学习代码
  1. <code>import tensorflow as tf import timeit/<code>


  2. <code>config = tf.ConfigProto/<code>

  3. <code>config.gpu_options.allow_growth = True/<code>


  4. <code>with tf.device('/cpu:0'):/<code>

  5. <code>random_image_cpu = tf.random_normal((

    100,100,100,3))/<code>

  6. <code>net_cpu = tf.layers.conv2d(random_image_cpu, 32,7)/<code>

  7. <code>net_cpu = tf.reduce_sum(net_cpu)/<code>


  8. <code>with tf.device('/device:GPU:0'):/<code>

  9. <code>random_image_gpu = tf.random_normal((100,100,100,3))/<code>

  10. <code>net_gpu = tf.layers.conv2d(random_image_gpu, 32,7)/<code>

  11. <code>net_gpu = tf.reduce_sum(net_gpu)/<code>


  12. <code>sess = tf.Session(config=config) # 确保TF可以检测到GPU/<code>

  13. <code>try:/<code>

  14. <code>sess.run(tf.global_variables_initializer) except tf.errors.InvalidArgumentError: print( 'nn此错误很可能表示此笔记本未配置为使用GPU。'/<code>

  15. <code>'通过命令面板(CMD/CTRL-SHIFT-P)或编辑菜单在笔记本设置中更改此设置.nn') raise/<code>


  16. <code>def cpu:/<code>

  17. <code>sess.run(net_cpu) def gpu:/<code>

  18. <code>sess.run(net_gpu) # 运行一次进行测试/<code>

  19. <code>cpu/<code>

  20. <code>gpu # 多次运行op/<code>

  21. <code>print('将100*100*100*3通过滤波器卷积到32*7*7*3(批处理x高度x宽度x通道)大小的图像'/<code>

  22. <code>'计算10次运训时间的总和') print('CPU (s):')/<code>

  23. <code>cpu_time = timeit.timeit('cpu', number=10, setup="from __main__ import cpu") print(cpu_time) print('GPU (s):')/<code>

  24. <code>gpu_time = timeit.timeit('gpu', number=10, setup="from __main__ import gpu") print(gpu_time) print('GPU加速超过CPU: {}倍'.format(int(cpu_time/gpu_time)))/<code>


  25. <code>sess.close # CPU (s): # 3.593296914000007 # GPU (s): # 0.1831514239999592 # GPU加速超过CPU: 19倍/<code>

Colab中的TPU

首先我们要让Colab连上GPU,导航栏-->编辑-->笔记本设置-->选择TPU

接下来我们来确认可以使用Tensorflow连接到TPU

  1. <code>import os/<code>

  2. <code>import pprint/<code>

  3. <code>import tensorflow as tf/<code>


  4. <code>if 'COLAB_TPU_ADDR' not in os.environ:/<code>

  5. <code>print('您没有连接到TPU,请完成上述操作')/<code>

  6. <code>else:/<code>

  7. <code>tpu_address = 'grpc://' + os.environ['COLAB_TPU_ADDR']/<code>

  8. <code>print ('TPU address is', tpu_address)/<code>

  9. <code># TPU address is grpc://10.97.206.146:8470/<code>


  10. <code>with tf.Session(tpu_address) as session:/<code>

  11. <code>devices = session.list_devices/<code>


  12. <code>print('TPU devices:')/<code>

  13. <code>pprint.pprint(devices)/<code>

使用TPU进行简单运算

  1. <code>import numpy as np/<code>


  2. <code>def add_op(x, y):/<code>

  3. <code>return x + y/<code>


  4. <code>x = tf.placeholder(tf.float32, [10,])/<code>

  5. <code>y = tf.placeholder(tf.float32, [10,])/<code>

  6. <code>tpu_ops = tf.contrib.tpu.rewrite(add_op, [x, y])/<code>


  7. <code>session = tf.Session(tpu_address)/<code>

  8. <code>try:/<code>

  9. <code>print('Initializing...')/<code>

  10. <code>session.run(tf.contrib.tpu.initialize_system)/<code>

  11. <code>print('Running ops')/<code>

  12. <code>print(session.run(tpu_ops, {x: np.arange(10), y: np.arange(10)}))/<code>

  13. <code># [array([ 0., 2., 4., 6., 8., 10., 12., 14., 16., 18.], dtype=float32)]/<code>

  14. <code>finally:/<code>

  15. <code># 目前,tpu会话必须与关闭会话分开关闭。/<code>

  16. <code>session.run(tf.contrib.tpu.shutdown_system)/<code>

  17. <code>session.close/<code>

在Colab中运行Tensorboard

想要在Google Colab中运行Tensorboard,请运行以下代码

  1. <code>!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip/<code>

  2. <code>!unzip ngrok-stable-linux-amd64.zip/<code>


  3. <code># 添加TensorBoard的路径/<code>

  4. <code>import os/<code>

  5. <code>log_dir = 'tb_logs'/<code>

  6. <code>if not os.path.exists(log_dir):/<code>

  7. <code>os.makedirs(log_dir)/<code>


  8. <code># 开启ngrok service,绑定port 6006(tensorboard)/<code>

  9. <code>get_ipython.system_raw('tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'.format(log_dir))/<code>

  10. <code>get_ipython.system_raw('./ngrok http 6006 &')/<code>


  11. <code># 产生网站,点击网站访问tensorboard/<code>

  12. <code>!curl -s http://localhost:4040/api/tunnels | python3 -c \\/<code>

  13. <code>"import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"/<code>

您可以使用创建的ngrok.io URL 跟踪Tensorboard日志。您将在输出末尾找到URL。请注意,您的Tensorboard日志将保存到tb_logs目录。当然,您可以更改目录名称。

居然有免费的GPU可以跑深度学习代码

之后,我们可以看到Tensorboard发挥作用!运行以下代码后,您可以通过ngrok URL跟踪Tensorboard日志。

  1. <code>from __future__ import print_function/<code>

  2. <code>import keras/<code>

  3. <code>from keras.datasets import mnist/<code>

  4. <code>from keras.models import Sequential/<code>

  5. <code>from keras.layers import Dense,Dropout,Flatten/<code>

  6. <code>from keras.layers import Conv2D,MaxPooling2D/<code>

  7. <code>from keras import backend as K/<code>

  8. <code>from keras.callbacks import TensorBoard

    /<code>


  9. <code>batch_size = 128/<code>

  10. <code>num_classes = 10/<code>

  11. <code>epochs = 12/<code>


  12. <code># input image dimensions/<code>

  13. <code>img_rows, img_cols = 28,28/<code>


  14. <code># the data, shuffled and split between train and test sets/<code>

  15. <code>(x_train, y_train), (x_test, y_test) = mnist.load_data/<code>


  16. <code>if K.image_data_format == 'channels_first':/<code>

  17. <code>x_train = x_train.reshape(x_train.shape[0],1, img_rows, img_cols)/<code>

  18. <code>x_test = x_test.reshape(x_test.shape[0],1, img_rows, img_cols)/<code>

  19. <code>input_shape = (1, img_rows, img_cols)/<code>

  20. <code>else:/<code>

  21. <code>x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols,1)/<code>

  22. <code>x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols,1)/<code>

  23. <code>input_shape = (img_rows, img_cols, 1)/<code>


  24. <code>x_train = x_train.astype('float32')/<code>

  25. <code>x_test = x_test.astype('float32')/<code>

  26. <code>x_train /= 255/<code>

  27. <code>x_test /= 255/<code>

  28. <code>print('x_train shape:', x_train.shape)/<code>

  29. <code>print(x_train.shape[0], 'train samples')/<code>

  30. <code>print(x_test.shape[0], 'test samples')/<code>


  31. <code># convert class vectors to binary class matrices/<code>

  32. <code>y_train = keras.utils.to_categorical(y_train, num_classes)/<code>

  33. <code>y_test = keras.utils.to_categorical(y_test, num_classes)/<code>


  34. <code>model =

    Sequential/<code>

  35. <code>model.add(Conv2D(32, kernel_size=(3,3),/<code>

  36. <code>activation='relu',/<code>

  37. <code>input_shape=input_shape))/<code>

  38. <code>model.add(Conv2D(64, (3,3), activation='relu'))/<code>

  39. <code>model.add(MaxPooling2D(pool_size=(2,2)))/<code>

  40. <code>model.add(Dropout(

    0.25))/<code>

  41. <code>model.add(Flatten)/<code>

  42. <code>model.add(Dense(128, activation='relu'))/<code>

  43. <code>model.add(Dropout(0.5))/<code>

  44. <code>model.add(Dense(num_classes, activation='softmax'))/<code>


  45. <code>model.compile(loss=keras.losses.categorical_crossentropy,/<code>

  46. <code>optimizer=keras.optimizers.Adadelta,/<code>

  47. <code>metrics=['accuracy'])/<code>



  48. <code>tbCallBack = TensorBoard(log_dir=LOG_DIR,/<code>

  49. <code>histogram_freq=1,/<code>

  50. <code>write_graph=True,/<code>

  51. <code>write_grads=True,/<code>

  52. <code>batch_size=batch_size,/<code>

  53. <code>write_images=True)/<code>


  54. <code>model.fit(x_train, y_train,/<code>

  55. <code>batch_size=batch_size,/<code>

  56. <code>epochs=epochs,/<code>

  57. <code>verbose=1,/<code>

  58. <code>validation_data=(x_test, y_test),/<code>

  59. <code>callbacks=[tbCallBack])/<code>

  60. <code>score = model.evaluate(x_test, y_test, verbose=0)/<code>

  61. <code>print('Test loss:', score[0])/<code>

  62. <code>print('Test accuracy:', score[1])/<code>

居然有免费的GPU可以跑深度学习代码


分享到:


相關文章: