Chainer - 深度学习 AMI
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Chainer

注意

从 v28 版本开始,我们将不再在 Amazon Deep Learning AMI 中包含 Chainer Conda 环境。包含这些环境 Amazon Deep Learning AMI 的先前版本将继续可用。但是,只有在开源社区针对这些框架发布安全修补程序时,我们才会为这些环境提供更新。

Chainer 是一种基于 Python 的灵活框架,用于轻松直观地编写复杂的神经网络架构。利用 Chainer,您可以轻松使用多 GPU 实例进行训练。Chainer 还会自动记录结果、图表损失和精度并生成用于使用计算图来可视化神经网络的输出。它包含在带 Conda 的深度学习 AMI(带 Conda 的 DLAMI)中。

以下主题介绍如何在多个 GPU、单个 GPU 和一个 CPU 上进行训练,如何创建可视化以及如何测试您的 Chainer 安装。

使用 Chainer 训练模型

本教程介绍如何使用示例 Chainer 脚本来通过 MNIST 数据集训练模型。MNIST 是通常用于训练图像识别模型的手写编号的数据库。本教程还将介绍在一个 CPU 上训练与在一个或多个 GPU 上训练之间的训练速度差异。

使用 Chainer 在多个 GPU 上训练

在多个 GPU 上训练
  1. 连接到运行带 Conda 的深度学习 AMI 的实例。有关如何选择或连接到实例,请参阅 选择 DLAMI 的实例类型Amazon EC2 文档。要运行此教程,您将需要使用带至少两个 GPU 的实例。

  2. 激活 Python 3 Chainer 环境:

    $ source activate chainer_p36
  3. 要获取最新教程,请克隆 Chainer 存储库并导航到示例文件夹:

    (chainer_p36) :~$ cd ~/src (chainer_p36) :~/src$ CHAINER_VERSION=v$(python -c "import chainer; print(chainer.__version__)") (chainer_p36) :~/src$ git clone -b $CHAINER_VERSION https://github.com/chainer/chainer.git (chainer_p36) :~/src$ cd chainer/examples/mnist
  4. train_mnist_data_parallel.py 脚本中运行示例。默认情况下,该脚本使用在带 Conda 的深度学习 AMI 的实例上运行的 GPU。该脚本最多可在两个 GPU 上运行。它将忽略前两个 GPU 之后的所有 GPU。它会自动检测其中一个 GPU 或检测到这两个 GPU。如果您运行的是不带 GPU 的实例,请跳到本教程后面的使用 Chainer 在 CPU 上训练

    (chainer_p36) :~/src/chainer/examples/mnist$ python train_mnist_data_parallel.py
    注意

    由于包含未在 DLAMI 中包含 beta 功能,此示例将返回以下错误。

    chainerx ModuleNotFoundError: No module named 'chainerx'

    当 Chainer 脚本使用 MNIST 数据库训练模型时,您会看到每个纪元的结果。

    然后,您会在脚本运行时看到示例输出。以下示例输出是在 p3.8xlarge 实例上运行的。该脚本的输出显示“GPU: 0, 1”,这表示它正在使用 4 个可用 GPU 中的前两个。这些脚本通常使用的是以零开头而不是以总计数开头的 GPU 索引。

    GPU: 0, 1 # unit: 1000 # Minibatch-size: 400 # epoch: 20 epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.277561 0.114709 0.919933 0.9654 6.59261 2 0.0882352 0.0799204 0.973334 0.9752 8.25162 3 0.0520674 0.0697055 0.983967 0.9786 9.91661 4 0.0326329 0.0638036 0.989834 0.9805 11.5767 5 0.0272191 0.0671859 0.9917 0.9796 13.2341 6 0.0151008 0.0663898 0.9953 0.9813 14.9068 7 0.0137765 0.0664415 0.995434 0.982 16.5649 8 0.0116909 0.0737597 0.996 0.9801 18.2176 9 0.00773858 0.0795216 0.997367 0.979 19.8797 10 0.00705076 0.0825639 0.997634 0.9785 21.5388 11 0.00773019 0.0858256 0.9978 0.9787 23.2003 12 0.0120371 0.0940225 0.996034 0.9776 24.8587 13 0.00906567 0.0753452 0.997033 0.9824 26.5167 14 0.00852253 0.082996 0.996967 0.9812 28.1777 15 0.00670928 0.102362 0.997867 0.9774 29.8308 16 0.00873565 0.0691577 0.996867 0.9832 31.498 17 0.00717177 0.094268 0.997767 0.9802 33.152 18 0.00585393 0.0778739 0.998267 0.9827 34.8268 19 0.00764773 0.107757 0.9975 0.9773 36.4819 20 0.00620508 0.0834309 0.998167 0.9834 38.1389
  5. 当您的训练正在运行时,查看您的 GPU 利用率会很有用。您可以验证哪些 GPU 处于活动状态并查看它们的负载。NVIDIA 为此提供了一种工具,可使用命令 nvidia-smi 运行该工具。但是,它只会为您提供利用率的快照,因此,将该工具与 Linux 命令 watch 结合使用更具参考性。以下命令将 watchnvidia-smi 结合使用,以便以十分之一秒的时间间隔刷新当前 GPU 利用率。打开指向您的 DLAMI 的另一个终端会话,然后运行以下命令:

    (chainer_p36) :~$ watch -n0.1 nvidia-smi

    您将看到一个类似于以下结果的输出。使用 ctrl-c 关闭该工具,或者在您在第一个终端会话中试用其他示例的同时保持其运行。

    Every 0.1s: nvidia-smi Wed Feb 28 00:28:50 2018 Wed Feb 28 00:28:50 2018 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 384.111 Driver Version: 384.111 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:1B.0 Off | 0 | | N/A 46C P0 56W / 300W | 728MiB / 16152MiB | 10% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla V100-SXM2... On | 00000000:00:1C.0 Off | 0 | | N/A 44C P0 53W / 300W | 696MiB / 16152MiB | 4% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla V100-SXM2... On | 00000000:00:1D.0 Off | 0 | | N/A 42C P0 38W / 300W | 10MiB / 16152MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla V100-SXM2... On | 00000000:00:1E.0 Off | 0 | | N/A 46C P0 40W / 300W | 10MiB / 16152MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 54418 C python 718MiB | | 1 54418 C python 686MiB | +-----------------------------------------------------------------------------+

    在本示例中,GPU 0 和 GPU 1 处于活动状态,而 GPU 2 和 3 不处于活动状态。您还可以查看每个 GPU 的内存利用率。

  6. 在训练完成后,记下您的第一个终端会话的已用时间。在本示例中,已用时间为 38.1389 秒。

使用 Chainer 在单个 GPU 上训练

本示例介绍如何在单个 GPU 上训练。如果您只有一个 GPU 可用或者只是想了解多 GPU 训练如何利用 Chainer 进行扩展,则可以执行此操作。

使用 Chainer 在单个 GPU 上训练
  • 在本示例中,您使用另一个脚本 train_mnist.py,并指示它仅使用带 --gpu=0 参数的 GPU 0。要查看不同的 GPU 如何在 nvidia-smi 控制台中激活,您可以通过使用 --gpu=1 来指示脚本使用 GPU 编号 1。

    (chainer_p36) :~/src/chainer/examples/mnist$ python train_mnist.py --gpu=0
    GPU: 0 # unit: 1000 # Minibatch-size: 100 # epoch: 20 epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.192348 0.0909235 0.940934 0.9719 5.3861 2 0.0746767 0.069854 0.976566 0.9785 8.97146 3 0.0477152 0.0780836 0.984982 0.976 12.5596 4 0.0347092 0.0701098 0.988498 0.9783 16.1577 5 0.0263807 0.08851 0.991515 0.9793 19.7939 6 0.0253418 0.0945821 0.991599 0.9761 23.4643 7 0.0209954 0.0683193 0.993398 0.981 27.0317 8 0.0179036 0.080285 0.994149 0.9819 30.6325 9 0.0183184 0.0690474 0.994198 0.9823 34.2469 10 0.0127616 0.0776328 0.996165 0.9814 37.8693 11 0.0145421 0.0970157 0.995365 0.9801 41.4629 12 0.0129053 0.0922671 0.995899 0.981 45.0233 13 0.0135988 0.0717195 0.995749 0.9857 48.6271 14 0.00898215 0.0840777 0.997216 0.9839 52.2269 15 0.0103909 0.123506 0.996832 0.9771 55.8667 16 0.012099 0.0826434 0.996616 0.9847 59.5001 17 0.0066183 0.101969 0.997999 0.9826 63.1294 18 0.00989864 0.0877713 0.997116 0.9829 66.7449 19 0.0101816 0.0972672 0.996966 0.9822 70.3686 20 0.00833862 0.0899327 0.997649 0.9835 74.0063

    在本示例中,在单个 GPU 上运行花费了将近两倍的时间!训练较大的模型或较大的数据集将产生不同于本示例的结果,因此,请通过试验来进一步评估 GPU 性能。

使用 Chainer 在 CPU 上训练

现在尝试在仅 CPU 模式下训练。运行相同的脚本 python train_mnist.py (不带参数):

(chainer_p36) :~/src/chainer/examples/mnist$ python train_mnist.py

在输出中,GPU: -1 表示未使用任何 GPU:

GPU: -1 # unit: 1000 # Minibatch-size: 100 # epoch: 20 epoch main/loss validation/main/loss main/accuracy validation/main/accuracy elapsed_time 1 0.192083 0.0918663 0.94195 0.9712 11.2661 2 0.0732366 0.0790055 0.977267 0.9747 23.9823 3 0.0485948 0.0723766 0.9844 0.9787 37.5275 4 0.0352731 0.0817955 0.987967 0.9772 51.6394 5 0.029566 0.0807774 0.990217 0.9764 65.2657 6 0.025517 0.0678703 0.9915 0.9814 79.1276 7 0.0194185 0.0716576 0.99355 0.9808 93.8085 8 0.0174553 0.0786768 0.994217 0.9809 108.648 9 0.0148924 0.0923396 0.994983 0.9791 123.737 10 0.018051 0.099924 0.99445 0.9791 139.483 11 0.014241 0.0860133 0.995783 0.9806 156.132 12 0.0124222 0.0829303 0.995967 0.9822 173.173 13 0.00846336 0.122346 0.997133 0.9769 190.365 14 0.011392 0.0982324 0.996383 0.9803 207.746 15 0.0113111 0.0985907 0.996533 0.9813 225.764 16 0.0114328 0.0905778 0.996483 0.9811 244.258 17 0.00900945 0.0907504 0.9974 0.9825 263.379 18 0.0130028 0.0917099 0.996217 0.9831 282.887 19 0.00950412 0.0850664 0.997133 0.9839 303.113 20 0.00808573 0.112367 0.998067 0.9778 323.852

在本示例中,MNIST 在 323 秒内完成了训练,这比使用两个 GPU 时的训练的时间多 11 倍以上。如果您曾怀疑过 GPU 的能力,本示例将展示它们的效率高多少。

绘制结果

Chainer 还会自动记录结果、图表损失和精度并生成用于绘制计算图的输出。

生成计算图
  1. 在任何训练运行完成之后,您可导航到 result 目录并查看运行的精度和损失(以两个自动生成的图像形式显示)。现在,导航到该处,然后列出内容:

    (chainer_p36) :~/src/chainer/examples/mnist$ cd result (chainer_p36) :~/src/chainer/examples/mnist/result$ ls

    result 目录包含两个 .png 格式的文件:accuracy.pngloss.png

  2. 要查看这些图表,请使用 scp 命令将它们复制到您的本地计算机。

    在 macOS 终端中,运行以下 scp 命令会将这三个文件全部下载到您的 Downloads 文件夹。将密钥文件的位置和服务器地址的占位符替换为您的信息。对于其他操作系统,请使用合适的 scp 命令格式。注意,对于 Amazon Linux AMI,用户名是 ec2-user。

    (chainer_p36) :~/src/chainer/examples/mnist/result$ scp -i "your-key-file.pem" ubuntu@your-dlami-address.compute-1.amazonaws.com:~/src/chainer/examples/mnist/result/*.png ~/Downloads

下图分别是精度图、损失图和计算图的示例。


                MNIST 训练精度

                MNIST 训练损失

                MNIST 训练计算图

测试 Chainer

要使用预安装的测试脚本测试 Chainer 和验证 GPU 支持,请运行以下命令:

(chainer_p36) :~/src/chainer/examples/mnist/result$ cd ~/src/bin (chainer_p36) :~/src/bin$ ./testChainer

这将下载 Chainer 源代码并运行 Chainer 多 GPU MNIST 示例。

更多信息

要了解有关 Chainer 的更多信息,请参阅 Chainer 文档网站Chainer 示例文件夹包含多个示例。请试用这些示例以了解其性能。