Colab 介绍

  • Jupyter Notebook:在 Colab 中,python 代码的执行是基于 .ipynb 文件,也就是 Jupyter Notebook 格式的 python 文件
  • 代码执行程序:代码执行程序就是 Colab 在云端的 “服务器”。笔记本连接到代码执行程序的时长是有限制的,这体现在三个方面:如果关闭浏览器,代码执行程序会在短时间内断开而不是在后台继续执行(这个 “短时间” 大概在几分钟左右,如果只是切换一下 wifi 之类的操作不会产生任何影响);如果空闲状态过长(无互动操作或正在执行的代码块),则会立即断开连接 (可以下载谷歌浏览器扩展工具 Colab Auto Reconnect);如果连接时长到达上限免费用户最长连接 12 小时),也会立刻断开连接。因此运行的代码必须支持 “断点续传” 能力,简单来说就是必须定义 checkpoint 相关功能的函数;假设训练完第 n nn 个 epoch 后掉线,模型能够从第 n + 1 n+1n+1 个 epoch 继续训练而不必从头开始
  • 实例空间:连接到代码执行程序后,Colab 需要为其分配实例空间 (Instance),可以简单理解为运行笔记本而创建的 “虚拟机”,其中包含了执行 ipynb 文件时的默认配置、环境变量、自带的库等等。笔记本连接到代码执行程序后就可以看到虚拟机的 RAM、磁盘大小以及磁盘中的文件

实例空间内的文件保存不是永久的,当代码执行程序被断开时,实例空间内的所有资源都会被释放,因此训练过后的模型日志和其他重要的文件需要保存到谷歌云盘,而不是本地的实例空间

  • 会话:当笔记本连接到代码执行程序并分配到实例空间后,就成为了一个会话 (Session)。通过点击 “管理会话” 即可查看当前的所有会话,点击 “终止” 即可断开代码执行程序

用户所能连接的会话数量是有限的,因此到达上限时再开启新会话需要主动断开之前的会话。免费用户只能开启 1 个会话,Pro 用户则可以开启多个会话。不同的用户可以在一个笔记本上可以进行多个会话,但只能有一个会话执行代码块。如果某个代码块已经开始执行,另一个用户连接到笔记本的会话会显示 “忙碌状态”,需要等待代码块执行完后才能执行其他的代码块。注意:掉线重连、切换网络、刷新页面等操作也会使笔记本进入 “忙碌状态”

Colab 工作流程

新建笔记本

  • 打开 Google Drive,在云端硬盘中右键创建 Google Colaboratory

  • 也可以直接打开 https://colab.research.google.com/,进入 Colab 的页面后点击新建笔记本即可。使用这种方法新建的笔记本时,会在云端硬盘的根目录自动创建一个叫 Colab Notebook 的文件夹,新创建的笔记本就保存在这个文件夹中
    载入笔记本

  • 可以打开云端硬盘中的已经存在的笔记本,还可以从 Github 中导入笔记本。如果关联 Github 账户,就可以选择一个账户中的 Project,如果其中有 .ipynb 文件就可以在 Colab 中打开

设置笔记本的运行时类型

  • 打开笔记本后点击连接按钮即可在 5s 左右的时间内连接到代码执行程序并分配实例空间,此时可以看到消耗的 RAM 和磁盘
  • 笔记本在打开时的默认硬件加速器是 None,运行规格是标准。在深度学习中,我们希望使用 GPU 来训练模型,同时如果购买了 pro,我们希望使用高内存模式。点击代码执行程序,然后点击 “更改运行时类型” 即可。由于免费的用户所能使用的 GPU 运行时有限,因此建议在模型训练结束后调回 None 模式或直接结束会话

执行代码块

  • 在打开笔记本后,我们默认的文件路径是 “/content”,这个路径也是执行笔记本时的路径,同时我们一般把用到的各种文件也保存在这个路径下。在点击 “…” 后即可返回查看根目录 “/”,可以看到根目录中保存的是一些虚拟机的环境变量和预装的库等等。不要随意修改根目录中的内容,以避免运行出错,我们所有的操作都应在 “/content” 中进行

  • notebook 文件通过的代码块来执行代码,同时支持通过“!<command>” 的方式来执行 UNIX 终端命令。Colab 已经预装了大多数常见的深度学习库,比如 pytorch,tensorflow 等等,如果有需要额外安装的库可以通过 “!pip3 install <package>” 命令来安装。下面是一些常见的命令

# 加载云端硬盘
* from google.colab import drive
drive.mount('/content/drive')    # 谷歌云盘默认的加载路径是 "/content/drive/MyDrive"

# 查看分配到的 GPU
gpu_info = !nvidia-smi
gpu_info = '\n'.join(gpu_info)
if gpu_info.find('failed') >= 0:
  print('Not connected to a GPU')
else:
  print(gpu_info)

# 安装 python 包
!pip3 install <package>

# 使用 Tensorboard
%reload_ext tensorboard
%tensorboard --logdir "pathoflogfile"

加载数据集

  • (1) 将整个数据集从本地上传到实例空间。理论可行但实际不可取。无论是上传压缩包还是文件夹,这种方法都非常的浪费时间,对于较大的数据集不具备可操作性

  • (2) 将整个数据集上传到谷歌云盘,挂载谷歌云盘的之后直接读取云盘内的数据集。理论可行但风险较大。根据谷歌的说明,Colab 读取云盘的 I/O 次数也是有限制的,太琐碎的 I/O 会导致出现 “配额限制”。而且云盘的读取效率也低于直接读取实例空间中的数据的效率

  • (3) 将数据集以压缩包形式上传到谷歌云盘,然后解压到 Colab 实例空间

运行 Github 项目

  • Colab的基本运行单位是 Jupyter Notebook,如何在一个 notebook 上运行一整个复杂的 Github 项目呢?首先创建多个笔记本来对应多个 py 模块是不行的,因为不同的笔记本会对应不同实例空间,而同一个项目的不同模块应放在同一个实例空间中。为解决这个问题,可以考虑以下几种方法

  • (1) 克隆 git 仓库到实例空间或云盘,通过脚本的方式直接执行项目的主程序
# 克隆仓库到 /content/my-repo 目录下
!git clone https://github.com/my-github-username/my-git-repo.git 
%cd my-git-repo
!./train.py --logdir /my/log/path --data_root /my/data/root --resume
  • (2) 克隆 git 仓库到实例空间或云盘,把主程序中的代码用函数封装,然后在 notebook 中调用这些函数
import sys
sys.path.append('/content/my-git-repo') # 把 git 仓库的目录添加到系统目录
from train import my_training_method

my_training_method(arg1, arg2, ...)
  • (3) 克隆 git 仓库到实例空间或云盘,把原来的主程序模块直接复制到笔记本中

    Kaggle

    Public API

    Installation & Authentication
pip install kaggle
  • Authenticate using an API token: From the site header, click on your user profile picture, then on “My Account” from the dropdown menu. Scroll down to the section of the page labelled API:

To create a new token, click on the “Create New API Token” button. This will download a fresh authentication token onto your machine. If you are using the Kaggle CLI tool, the tool will look for this token at ~/.kaggle/kaggle.json on Linux, OSX, and other UNIX-based operating systems, and at C:\Users.kaggle\kaggle.json on Windows.

Interacting with Competitions
  • You cannot accept Competition rules via the API. You must do this by visiting the Kaggle website and accepting the rules there.
# list the currently active competitions
kaggle competitions list
# download files associated with a competition
kaggle competitions download -c [COMPETITION]
# make a competition submission
kaggle competitions submit -c [COMPETITION] -f [FILE] -m [MESSAGE]
# list all previous submission
kaggle competitions submissions -c [COMPETITION NAME]
Interacting with Datasets
# list datasets matching a search term
kaggle datasets list -s [KEYWORD]
# download files associated with a dataset
kaggle datasets download -d [DATASET]
Create a New Dataset
# generate a metadata file
kaggle datasets init -p /path/to/dataset
# create the dataset
kaggle datasets create -p /path/to/dataset

Your dataset will be private by default. You can also add a -u flag to make it public when you create it.

Create a New Dataset Version
# generate a metadata file
# Make sure the id field in dataset-metadata.json (or datapackage.json) points to your dataset
kaggle datasets init -p /path/to/dataset
# create a new dataset version
kaggle datasets version -p /path/to/dataset -m "Your message here"
Interacting with Notebooks
# list Notebooks matching a search term
kaggle kernels list -s [KEYWORD]
# create and run a Notebook on Kaggle
kaggle kernels push -k [KERNEL] -p /path/to/kernel
# download code files and metadata associated with a Notebook
kaggle kernels pull [KERNEL] -p /path/to/download -m
Creating and Running a New Notebook
  • Create a local folder containing the code files you want to upload
# generate a metadata file
kaggle kernels init -p /path/to/kernel
  • Add your Notebook’s metadata to the generated file, kernel-metadata.json; As you add your title and slug, please be aware that Notebook titles and slugs are linked to each other. A Notebook slug is always the title lowercased with dashes (-) replacing spaces and removing special characters.
# create and run the Notebook on Kaggle
kaggle kernels push -p /path/to/kernel

参考文献