本文档概述了实现d2l-zh代码库跨框架兼容性的技术框架架构。它解释了该系统如何通过统一的API抽象层支持多种深度学习框架(PyTorch、MXNet、TensorFlow 和 PaddlePaddle),从而使得相同的教学内容可以在不同框架下实现。
框架架构的目的是提供跨多个深度学习框架的统一编程接口,使读者能够使用自己偏好的框架学习深度学习概念,同时使用相同的教学内容。本文档侧重于实现跨框架兼容性的技术组件。有关生成文档的构建系统信息,请参阅 构建系统。
d2l-zh 仓库实现了一个与框架无关的 API,允许代码示例编写一次后即可在任何支持的深度学习框架中执行。这是通过一个具有特定框架实现的模块化包结构来实现的。
来源: d2l/__init__.py1-13 config.ini126-208
d2l包组织结构模块化,支持多种框架
__init__.py 文件作为入口点,并提供使用不同框架导入包的说明。每个特定于框架的文件都包含相同的 API 函数实现,但使用相应的框架的语法和结构。
来源: d2l/__init__.py1-13 d2l/torch.py1-10 d2l/mxnet.py1-10 d2l/tensorflow.py1-10 d2l/paddle.py1-38
框架架构的关键组件之一是函数映射系统,它将与框架无关的 API 调用映射到特定于框架的实现。这在 config.ini 文件中通过几种类型的映射进行配置:
| d2l函数 | PyTorch | MXNet | TensorFlow | PaddlePaddle |
|---|---|---|---|---|
| ones | torch.ones | np.ones | tf.ones | paddle.ones |
| zeros | torch.zeros | np.zeros | tf.zeros | paddle.zeros |
| tensor | torch.tensor | np.array | tf.constant | paddle.to_tensor |
| concat | torch.cat | np.concatenate | tf.concat | paddle.concat |
来源: config.ini126-145 config.ini152-170 config.ini172-190 config.ini192-208
每个特定于框架的文件(torch.py、mxnet.py、tensorflow.py、paddle.py)都使用特定框架实现了相同的 API 函数。让我们看一下这些文件的结构。
每个特定于框架的文件都遵循相似的结构,实现相同的函数,但使用适合特定框架的语法。
来源: d2l/torch.py1-1000 d2l/mxnet.py1-1000 d2l/tensorflow.py1-1000 d2l/paddle.py1-1000
跨框架抽象的一个关键示例是 `nn_Module` 变量,它为不同框架的神经网络模块提供了通用基类。
这使得代码示例可以将 `d2l.nn_Module` 用作基类,该类将被映射到相应的特定于框架的类。
来源: d2l/torch.py13 d2l/mxnet.py12 d2l/tensorflow.py7 d2l/paddle.py38 config.ini166 config.ini184 config.ini204
config.ini 中的配置系统控制着框架架构的各个方面。
这种配置驱动的方法允许构建一个灵活且易于维护的架构,可以轻松支持新框架或更新现有框架。
PyTorch 库配置示例
来源: config.ini1-22 config.ini126-145 config.ini152-170 config.ini172-190 config.ini192-208
d2l 包使用 Python 的导入系统,允许用户选择他们偏好的框架。这通过导入语句来实现。
__init__.py 文件处理这些导入,并将它们定向到相应的特定框架实现。
框架架构依赖于每个深度学习框架的特定版本,以确保兼容性。
这些依赖项在 setup.py 和 static/build.yml 文件中指定。
来源: setup.py4-11 static/build.yml1-17
d2l-zh 存储库的框架架构通过结合模块化的包结构、函数映射系统和由配置驱动的设计,实现了跨多个深度学习框架的统一教育体验。它允许代码示例编写一次,即可在任何支持的框架下执行。该架构支持了教授深度学习概念的教育目标,无论读者选择哪个特定框架。
来源: d2l/__init__.py1-13 config.ini1-250 d2l/torch.py1-50 d2l/mxnet.py1-50 d2l/tensorflow.py1-50 d2l/paddle.py1-50