12k 11 分钟

# 硬件 🏷 sec_hardware 很好地理解算法和模型才可以捕获统计方面的问题,构建出具有出色性能的系统。同时,至少对底层硬件有一定的了解也是必不可少的。本节不能替代硬件和系统设计的相关课程。相反,本节的内容可以作为理解某些算法为什么比其他算法更高效以及如何实现良好吞吐量的起点。一个好的设计可以很容易地在性能上造就数量级的差异,这也是后续产生的能够训练网络(例如,训练时间为111 周)和无法训练网络(训练时间为333 个月,导致错过截止期)之间的差异。我们先从计算机的研究开始。然后深入查看 CPU 和 GPU。最后,再查看数据中心或云中的多台计算机的连接方式。 🏷...
3.7k 3 分钟

# 编译器和解释器 🏷 sec_hybridize 目前为止,本书主要关注的是命令式编程(imperative programming)。 命令式编程使用诸如 print 、“ + ” 和 if 之类的语句来更改程序的状态。 考虑下面这段简单的命令式程序: def add(a, b): return a + bdef fancy_func(a, b, c, d): e = add(a, b) f = add(c, d) g = add(e, f) return gprint(fancy_func(1, 2, 3, 4))10 Python 是一种解释型语言(interpreted...
298 1 分钟

# 计算性能 🏷 chap_performance 在深度学习中,数据集和模型通常都很大,导致计算量也会很大。 因此,计算的性能非常重要。 本章将集中讨论影响计算性能的主要因素:命令式编程、符号编程、 异步计算、自动并行和多 GPU...
5.1k 5 分钟

# 参数服务器 🏷 sec_parameterserver 当我们从一个 GPU 迁移到多个 GPU 时,以及再迁移到包含多个 GPU 的多个服务器时(可能所有服务器的分布跨越了多个机架和多个网络交换机),分布式并行训练算法也需要变得更加复杂。通过细节可以知道,一方面是不同的互连方式的带宽存在极大的区别(例如,NVLink 可以通过设置实现跨666 条链路的高达 100GB/s 的带宽,16 通道的 PCIe4.0 提供 32GB/s 的带宽,而即使是高速 100GbE 以太网也只能提供大约 10GB/s...
3k 3 分钟

# 多 GPU 的简洁实现 🏷 sec_multi_gpu_concise 每个新模型的并行计算都从零开始实现是无趣的。此外,优化同步工具以获得高性能也是有好处的。下面我们将展示如何使用深度学习框架的高级 API 来实现这一点。数学和算法与 :numref: sec_multi_gpu 中的相同。本节的代码至少需要两个 GPU 来运行。 import torchfrom torch import nnfrom d2l import torch as d2l# [简单网络] 让我们使用一个比 :numref: sec_multi_gpu 的 LeNet...
3k 3 分钟

# 注意力提示 🏷 sec_attention-cues 感谢读者对本书的关注,因为读者的注意力是一种稀缺的资源: 此刻读者正在阅读本书(而忽略了其他的书), 因此读者的注意力是用机会成本(与金钱类似)来支付的。 为了确保读者现在投入的注意力是值得的, 作者们尽全力(全部的注意力)创作一本好书。 自经济学研究稀缺资源分配以来,人们正处在 “注意力经济”...
7.5k 7 分钟

# 多 GPU 训练 🏷 sec_multi_gpu 到目前为止,我们讨论了如何在 CPU 和 GPU 上高效地训练模型,同时在 :numref: sec_auto_para 中展示了深度学习框架如何在 CPU 和 GPU 之间自动地并行化计算和通信,还在 :numref: sec_use_gpu 中展示了如何使用 nvidia-smi 命令列出计算机上所有可用的 GPU。 但是我们没有讨论如何真正实现深度学习训练的并行化。 是否一种方法,以某种方式分割数据到多个设备上,并使其能够正常工作呢? 本节将详细介绍如何从零开始并行地训练网络, 这里需要运用小批量随机梯度下降算法(详见...
5.6k 5 分钟

# Bahdanau 注意力 🏷 sec_seq2seq_attention :numref: sec_seq2seq 中探讨了机器翻译问题: 通过设计一个基于两个循环神经网络的编码器 - 解码器架构, 用于序列到序列学习。 具体来说,循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量, 然后循环神经网络解码器根据生成的词元和上下文变量 按词元生成输出(目标)序列词元。 然而,即使并非所有输入(源)词元都对解码某个词元都有用, 在每个解码步骤中仍使用编码相同的上下文变量。 有什么方法能改变上下文变量呢? 我们试着从 :cite: Graves.2013...
4.7k 4 分钟

# 多头注意力 🏷 sec_multihead-attention 在实践中,当给定相同的查询、键和值的集合时, 我们希望模型可以基于相同的注意力机制学习到不同的行为, 然后将不同的行为作为知识组合起来, 捕获序列内各种范围的依赖关系 (例如,短距离依赖和长距离依赖关系)。 因此,允许注意力机制组合使用查询、键和值的不同 子空间表示(representation subspaces)可能是有益的。 为此,与其只使用单独一个注意力汇聚, 我们可以用独立学习得到的hhh 组不同的 线性投影(linear projections)来变换查询、键和值。 然后,这hhh...
7k 6 分钟

# 注意力评分函数 🏷 sec_attention-scoring-functions :numref: sec_nadaraya-watson 使用了高斯核来对查询和键之间的关系建模。 :eqref: eq_nadaraya-watson-gaussian 中的 高斯核指数部分可以视为注意力评分函数(attention scoring function), 简称评分函数(scoring function), 然后把这个函数的输出结果输入到 softmax...