了解用于机器学习项目的Google Colab

670 阅读11分钟

你是否曾经想要一个易于配置的交互式环境来运行你的机器学习代码,并免费获得GPU?谷歌Colab就是你一直在寻找的答案。它是在云上运行Jupyter笔记本的一种方便和易于使用的方式,他们的免费版本也带有一些对GPU的有限访问。

如果你熟悉Jupyter笔记本,学习Colab将是小菜一碟,我们甚至可以导入Jupyter笔记本,在谷歌Colab上运行。但是,Colab还有很多有趣的事情可以做,我们将在本文中进行探讨。让我们直接进入!

完成本教程后,你将学会如何。

  • 使用谷歌Colab的免费层级,用GPU加快训练速度
  • 使用Google Colab的扩展来保存到Google Drive,为pandas DataFrame呈现互动显示,等等。
  • 在使用Google Colab训练时,保存你的模型的进度

让我们开始吧!

概述

本教程分为五个部分;它们是:。

  • 什么是Google Colab?
  • 谷歌Colab快速入门指南
  • 探索你的Colab环境
  • 有用的Google Colab扩展
  • 例子。在Google Drive上保存模型进度

什么是谷歌Colab?

来自 "欢迎来到Colab"笔记本。

Colab笔记本允许你在一个文档中结合可执行代码 和富文本,以及图像、HTML、LaTeX等。当你创建自己的Colab笔记本时,它们会存储在你的Google Drive账户中。你可以轻松地与同事或朋友分享你的Colab笔记本,让他们对你的笔记本进行评论,甚至编辑它们。

我们可以像Jupyter笔记本一样使用谷歌Colabs。它们真的很方便,因为谷歌Colab托管了它们,所以我们不使用任何自己的计算机资源来运行笔记本。我们还可以分享这些笔记本,这样其他人就可以轻松地运行我们的代码,所有的环境都是标准的,因为它不依赖于我们自己的本地机器。然而,在初始化过程中,我们可能需要在环境中安装一些库。

谷歌Colab快速入门指南

要创建你的Google Colab文件并开始使用Google Colab,你可以到Google Drive去,如果你没有Google Drive账户,可以创建一个Google Drive账户。现在,点击Google Drive页面左上角的 "新建 "按钮,然后点击更多▷Google Colaboratory。

创建一个新的Google Colab笔记本

然后你将进入你的新Google Colab文件的页面。

新的Google Colab 笔记本

在这里,你可以使用右上角的分享按钮与他人分享你的Google Colab文件,或者开始编码

Colab上的热键和Jupyter笔记本上的热键是相似的。这些是一些有用的。

  • 运行单元。Ctrl + Enter
  • 运行单元格并在下面添加新单元格。Alt + Enter
  • 运行单元格并转到下面的单元格。Shift + Enter
  • 缩进两个空格的行。按Ctrl + ] 键
  • 取消缩进两个空格的行。Ctrl + [

但也有一个非常有用的额外功能,可以让你只运行单元格中特定的选定部分的代码。

  • 运行单元格的选定部分。Ctrl + Shift + Enter

就像Jupyter笔记本一样,你也可以用Markdown单元格写文本。但是Colab有一个额外的功能,可以根据你的markdown内容自动生成一个目录,你也可以根据markdown单元格中的标题来隐藏代码的一部分。

谷歌Colab与Markdown和目录

如果你在自己的电脑上运行Jupyter,你没有选择,只能使用你电脑的CPU。但是在Colab中,你可以改变运行时间,除了CPU之外还包括GPU和TPU,因为它是在谷歌的云端执行的。你可以通过进入Runtime ▷ Change runtime type切换到不同的运行时。

改变谷歌Colab的运行时间类型

然后你可以从不同的硬件加速器中选择,为你的环境配备。

将GPU/TPU添加到Google Colab笔记本环境中

与你自己的电脑不同,Google Colab没有提供终端来输入命令管理你的Python环境。为了安装Python库和其他程序,我们可以使用! 字符来运行shell命令,就像在Jupyter笔记本中一样,例如!pip install numpy (但是正如我们在后面看到的,Colab已经预装了很多我们需要的库,例如NumPy)。

现在我们知道了如何设置我们的Colab环境并开始运行一些代码,让我们对这个环境进行一些探索吧

探索你的Colab环境

由于我们可以用! ,使用wget 命令来运行一些shell命令,这可能是获得一些数据的最简单方法。例如,运行这个会给你带来一个CSV文件到Colab环境中。

! wget https://raw.githubusercontent.com/jbrownlee/Datasets/master/shampoo.csv

要探索你在虚拟机上的Colab文件的当前工作目录,点击屏幕左边的文件图标。默认情况下,Colab为你提供了一个名为sample_data 的目录,里面有一些文件。

谷歌Colab笔记本的文件标签

这就是我们Colab笔记本的当前工作目录。你可以通过在笔记本上使用这样的代码,在Python中读取这些文件中的一个。

file = open("sample_data/mnist_test.csv")

稍后我们将看到如何使用Colab扩展将我们的Google Drive挂载到这个目录,以便存储和访问Google Drive账户上的文件。

通过使用! ,运行shell命令,我们还可以看看我们Colab环境的硬件配置。要看一下CPU,我们可以使用。

!cat /proc/cpuinfo

这给我的环境的输出是:。

processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU @ 2.30GHz
stepping	: 0
microcode	: 0x1
cpu MHz	: 2299.998
cache size	: 46080 KB
…

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU @ 2.30GHz
stepping	: 0
microcode	: 0x1
cpu MHz	: 2299.998
cache size	: 46080 KB
…

我们还可以通过使用来检查我们是否有一个连接到运行时的GPU。

!nvidia-smi

如果你有一个GPU,这将给出输出结果。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.32.03    Driver Version: 460.32.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla K80           Off  | 00000000:00:04.0 Off |                    0 |
| N/A   57C    P8    31W / 149W |      0MiB / 11441MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+                                                                         

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

这些只是我们可以用来探索Colab环境的一些shell命令的例子。还有很多其他的命令,比如!pip list 来查看Colab环境可以访问的库,标准的!ls 来查看工作目录中的文件,等等。

有用的Colab扩展

Colab还附带了很多非常有用的扩展。其中一个扩展允许我们将Google Drive挂载到我们的工作目录。我们可以通过以下方式实现。

import os
from google.colab import drive

MOUNTPOINT = "/content/gdrive"
DATADIR = os.path.join(MOUNTPOINT, "MyDrive")
drive.mount(MOUNTPOINT)

然后,Colab会请求访问你的Google Drive文件的权限,你可以在选择你想给它访问的Google账户后进行。给予它所需的权限后,我们可以在左侧的文件标签中看到我们的Google Drive被挂载了。

谷歌驱动器挂载在谷歌Colab笔记本的当前工作目录上

然后,为了向我们的Google Drive写一个文件,我们可以做以下事情。

...
# writes directly to google drive
with open(f"{DATADIR}/test.txt", "w") as outfile:
    outfile.write("Hello World!")

这个代码片段将Hello World! 到你的Google Drive顶层的一个test.txt 文件。同样,我们也可以通过使用来读取我们Google Drive中的文件。

...
with open(f"{DATADIR}/test.txt", "r") as infile:
    file_data = infile.read()
    print(file_data)

这个输出。

Hello World!

它是基于我们先前的例子。

此外,Google Colab带有一些扩展功能,以创造更好的使用笔记本的体验。如果我们经常使用pandas DataFrame,有一个扩展可以显示交互式表格。为了使用这个,我们可以使用魔法函数。

%load_ext google.colab.data_table

这样就可以启用DataFrame的交互式显示,然后当我们运行时。

from sklearn.datasets import fetch_openml
X = fetch_openml("diabetes", version=1, as_frame=True, return_X_y=False)["frame"]
X

这将把DataFrame显示为一个交互式表格,我们可以根据列进行过滤,看到表格中的不同行,等等。

Google Colab中的pandas DataFrame的交互式界面

要想以后停用这个功能,我们可以运行。

%unload_ext google.colab.data_table

当我们再次显示同一个DataFrameX ,我们会得到标准的Pandas DataFrame界面。

pandas DataFrame的标准接口

例子。在Google Drive上保存模型进度

谷歌Colab可能是为你的机器学习项目提供强大的GPU资源的最简单方法。但是在Colab的免费版本中,Google限制了我们在每个会话中可以使用Colab笔记本的时间。我们的内核可能会无缘无故地终止。我们可以重新启动我们的笔记本,继续我们的工作,但我们可能会失去内存中的一切。如果我们需要长时间训练我们的模型,这就是一个问题。我们的Colab实例可能在训练完成之前就终止了。

使用Google Colab扩展来挂载我们的Google Drive和Keras ModelCheckpoint回调,我们可以在Google Drive上保存我们的模型进度。这对解决Colab超时的问题特别有用。这对付费的专业版和专业版用户来说比较宽松,但我们的模型训练总是有可能在随机的时候中途终止。如果我们不想失去我们的部分训练模型,它就很有价值。

在这个演示中,我们将在MNIST数据集上使用LeNet-5模型。

import tensorflow as tf
from tensorflow import keras
from keras.layers import Input, Dense, Conv2D, Flatten, MaxPool2D
from keras.models import Model

class LeNet5(tf.keras.Model):
  def __init__(self):
    super(LeNet5, self).__init__()
    #creating layers in initializer
    self.conv1 = Conv2D(filters=6, kernel_size=(5,5), padding="same", activation="relu")
    self.max_pool2x2 = MaxPool2D(pool_size=(2,2))
    self.conv2 = Conv2D(filters=16, kernel_size=(5,5), padding="same", activation="relu")
    self.flatten = Flatten()
    self.fc1 = Dense(units=120, activation="relu")
    self.fc2 = Dense(units=84, activation="relu")
    self.fc3=Dense(units=10, activation="softmax")
  def call(self, input_tensor):
    conv1 = self.conv1(input_tensor)
    maxpool1 = self.max_pool2x2(conv1)
    conv2 = self.conv2(maxpool1)
    maxpool2 = self.max_pool2x2(conv2)
    flatten = self.flatten(maxpool2)
    fc1 = self.fc1(flatten)
    fc2 = self.fc2(fc1)
    fc3 = self.fc3(fc2)
    return fc3

然后,为了在Google Drive上保存训练期间的模型进度,首先,我们需要将Google Drive安装到我们的Colab环境。

import os
from google.colab import drive
MOUNTPOINT = "/content/gdrive"
DATADIR = os.path.join(MOUNTPOINT, "MyDrive")
drive.mount(MOUNTPOINT)

之后,我们声明Callback将我们的检查点模型保存到Google Drive上。

import tensorflow as tf

checkpoint_path = DATADIR + "/checkpoints/cp-epoch-{epoch}.ckpt"
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
                                                 save_weights_only=True,
                                                 verbose=1)

接下来,我们开始用检查点回调在MNIST数据集上进行训练,以确保在Colab会话超时时,我们可以在最后一个纪元恢复训练。

import tensorflow as tf
from tensorflow import keras
from keras.layers import Input, Dense, Conv2D, Flatten, MaxPool2D
from keras.models import Model

mnist_digits = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist_digits.load_data()

input_layer = Input(shape=(28,28,1))
model = LeNet5()(input_layer)
model = Model(inputs=input_layer, outputs=model)
model.compile(optimizer="adam", loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics="acc")
model.fit(x=train_images, y=train_labels, batch_size=256, validation_data = [test_images, test_labels], epochs=5, callbacks=[cp_callback])

这就训练了我们的模型并给出了输出。

Epoch 1/5
235/235 [==============================] - ETA: 0s - loss: 0.9580 - acc: 0.8367
Epoch 1: saving model to /content/gdrive/MyDrive/checkpoints/cp-epoch-1.ckpt
235/235 [==============================] - 11s 7ms/step - loss: 0.9580 - acc: 0.8367 - val_loss: 0.1672 - val_acc: 0.9492
Epoch 2/5
229/235 [============================>.] - ETA: 0s - loss: 0.1303 - acc: 0.9605
Epoch 2: saving model to /content/gdrive/MyDrive/checkpoints/cp-epoch-2.ckpt
235/235 [==============================] - 1s 5ms/step - loss: 0.1298 - acc: 0.9607 - val_loss: 0.0951 - val_acc: 0.9707
Epoch 3/5
234/235 [============================>.] - ETA: 0s - loss: 0.0810 - acc: 0.9746
Epoch 3: saving model to /content/gdrive/MyDrive/checkpoints/cp-epoch-3.ckpt
235/235 [==============================] - 1s 6ms/step - loss: 0.0811 - acc: 0.9746 - val_loss: 0.0800 - val_acc: 0.9749
Epoch 4/5
230/235 [============================>.] - ETA: 0s - loss: 0.0582 - acc: 0.9818
Epoch 4: saving model to /content/gdrive/MyDrive/checkpoints/cp-epoch-4.ckpt
235/235 [==============================] - 1s 6ms/step - loss: 0.0580 - acc: 0.9819 - val_loss: 0.0653 - val_acc: 0.9806
Epoch 5/5
222/235 [===========================>..] - ETA: 0s - loss: 0.0446 - acc: 0.9858
Epoch 5: saving model to /content/gdrive/MyDrive/checkpoints/cp-epoch-5.ckpt
235/235 [==============================] - 1s 6ms/step - loss: 0.0445 - acc: 0.9859 - val_loss: 0.0583 - val_acc: 0.9825

从输出中,我们可以看到检查点已被保存。看一下我的Google Drive文件夹,我们也可以看到检查点存储在那里。

存放在Google Drive中的检查点

Colab实例是在谷歌的云环境中。它所运行的机器有一些存储空间,所以我们可以安装一个包或下载一些文件到里面。但是,我们不应该把我们的检查点保存在那里,因为我们不能保证在我们的会话终止后能把它拿回来。因此,在上面的例子中,我们将谷歌硬盘挂载到实例中,并将检查点保存在谷歌硬盘中。这样我们才能保证检查点文件的可访问性。

这里我们附上模型训练和保存到Google Drive的完整代码。

import os
from google.colab import drive
import tensorflow as tf
from tensorflow import keras
from keras.layers import Input, Dense, Conv2D, Flatten, MaxPool2D
from keras.models import Model

MOUNTPOINT = "/content/gdrive"
DATADIR = os.path.join(MOUNTPOINT, "MyDrive")
drive.mount(MOUNTPOINT)

class LeNet5(tf.keras.Model):
  def __init__(self):
    super(LeNet5, self).__init__()
    self.conv1 = Conv2D(filters=6, kernel_size=(5,5), padding="same", activation="relu")
    self.max_pool2x2 = MaxPool2D(pool_size=(2,2))
    self.conv2 = Conv2D(filters=16, kernel_size=(5,5), padding="same", activation="relu")
    self.flatten = Flatten()
    self.fc1 = Dense(units=120, activation="relu")
    self.fc2 = Dense(units=84, activation="relu")
    self.fc3=Dense(units=10, activation="softmax")
  def call(self, input_tensor):
    conv1 = self.conv1(input_tensor)
    maxpool1 = self.max_pool2x2(conv1)
    conv2 = self.conv2(maxpool1)
    maxpool2 = self.max_pool2x2(conv2)
    flatten = self.flatten(maxpool2)
    fc1 = self.fc1(flatten)
    fc2 = self.fc2(fc1)
    fc3 = self.fc3(fc2)
    return fc3

mnist_digits = keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist_digits.load_data()

# saving checkpoints
checkpoint_path = DATADIR + "/checkpoints/cp-epoch-{epoch}.ckpt"
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
                                                 save_weights_only=True,
                                                 verbose=1)
input_layer = Input(shape=(28,28,1))
model = LeNet5()(input_layer)
model = Model(inputs=input_layer, outputs=model)
model.compile(optimizer="adam", loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics="acc")

model.fit(x=train_images, y=train_labels, batch_size=256, validation_data = [test_images, test_labels], 
          epochs=5, callbacks=[cp_callback])

如果模型训练中途停止,我们可以继续,只需重新编译模型并加载权重,然后我们就可以继续我们的训练。

checkpoint_path = DATADIR + "/checkpoints/cp-epoch-{epoch}.ckpt"
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
                                                 save_weights_only=True,
                                                 verbose=1)

input_layer = Input(shape=(28,28,1))
model = LeNet5()(input_layer)
model = Model(inputs=input_layer, outputs=model)
model.compile(optimizer="adam", loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics="acc")

# to resume from epoch 5 checkpoints
model.load_weights(DATADIR + "/checkpoints/cp-epoch-5.ckpt")

# continue training
model.fit(x=train_images, y=train_labels, batch_size=256, validation_data = [test_images, test_labels], 
          epochs=5, callbacks=[cp_callback])

总结

在本教程中,您已经了解了什么是Google Colab,如何利用Google Colab获得免费访问GPU的机会,如何用Google Drive账户使用Google Colab,以及如何在Google Drive上保存模型以在Google Colab笔记本中存储训练期间的模型进度。