1.4 关于PyTorch如何支持深度学习项目的概述
我们已经提示了PyTorch中的一些构建基块。 现在,我们花一些时间来正式确定构成PyTorch的主要组件的高级地图。 通过查看PyTorch的深度学习项目需要什么,我们可以做到最好。
首先,PyTorch与Python一样具有“ Py”,但其中包含许多非Python代码。 实际上,出于性能原因,大多数PyTorch都是用C ++和CUDA(www.geforce.com/hardware/technology/cuda)编写的,这是NVIDIA的一种类似C ++的语言,可以将其编译为在GPU上具有大规模并行性。 有很多方法可以直接从C ++运行PyTorch,我们将在第15章中进行介绍。此功能的动机之一是为在生产中部署模型提供可靠的策略。 但是,大多数时候,我们会与Python中的PyTorch进行交互,构建模型,对其进行训练,并使用经过训练的模型来解决实际问题。
实际上,PyTorch在可用性和与更广泛的Python生态系统的集成方面是Python API的亮点。 让我们来看看PyTorch是什么的内在模型。
正如我们已经谈到的,PyTorch的核心是一个提供多维数组或张量的库(以PyTorch的说法)(我们将在第3章中详细介绍),以及由其提供的广泛的操作库。 张量和它们上的操作都可以在CPU或GPU上使用。 在PyTorch中从CPU到GPU的移动计算只需要一两个额外的函数调用即可。 PyTorch提供的第二个核心功能是张量能够跟踪对它们执行的操作,并能够相对于其任何输入来分析计算输出的导数。 这是用于数值优化的,它是由张量通过在引擎盖下通过PyTorch的autograd引擎进行调度而提供的。
通过拥有张量和启用了autograd的张量标准库,PyTorch可以用于物理,渲染,优化,模拟,建模等,我们很可能会看到PyTorch在整个科学应用领域以创新的方式使用。 但是PyTorch首先是深度学习库,因此它提供了构建和训练神经网络所需的所有构造块。 图1.2显示了一个标准设置,该标准设置可加载数据,训练模型,然后将该模型部署到生产环境。
用于构建神经网络的核心PyTorch模块位于¥torch.nn中,该模块提供了常见的神经网络层和其他体系结构组件。完全连接的层,卷积层,激活函数和损失函数都可以在此处找到(在本书的其余部分中,我们将详细介绍所有含义)。 这些组件可用于构建和初始化我们在图1.2中心看到的未经训练的模型。 为了训练我们的模型,我们需要一些额外的东西:训练数据源,用于使模型适应训练数据的优化器,以及将模型和数据获取到将实际执行训练模型所需的计算的硬件的方法。
image.png
在图1.2的左侧,我们看到在训练数据甚至到达我们的模型之前,需要进行大量数据处理。 首先,我们需要从物理上获取数据,通常是从某种形式的存储中获取数据。 然后,我们需要将数据中的每个样本转换为PyTorch可以实际处理的东西:张量。 我们的自定义数据(可能采用任何格式)与标准化PyTorch张量之间的桥梁是PyTorch在torch.utils.data中提供的Dataset类。 由于每个问题的处理过程都截然不同,因此我们将不得不自行实施此数据收集。 在第4章中,我们将详细研究如何表示我们可能希望作为张量使用的各种类型的数据。
由于数据存储通常很慢,尤其是由于访问延迟,因此我们希望并行化数据加载。 但是,由于Python广受青睐的许多事物不包括简单,高效,并行处理,因此我们将需要多个过程来加载数据,以便将它们组装成批处理:包含多个样本的张量。 这是相当详尽的; 但由于PyTorch也相对通用,因此可以轻松地在DataLoader类中提供所有这些操作。 它的实例可以生成子进程以从后台的数据集中加载数据,以便其准备就绪,并在循环可以使用后立即等待训练循环。 我们将在第7章中接触并使用Dataset和DataLoader。
有了批量获取样本的机制,我们可以转到图1.2中心的训练循环本身。 通常,训练循环是作为标准Python for循环实现的。 在最简单的情况下,模型可以在本地CPU或单个GPU上运行所需的计算,并且一旦训练循环获得了数据,就可以立即开始计算。 这也将是您的基本设置,这也是我们在本书中假设的设置。
在训练循环的每个步骤中,我们都会根据从数据加载器获得的样本评估模型。 然后,我们使用一些准则或损失函数将模型的输出与所需的输出(目标)进行比较。 正如PyTorch提供用于构建模型的组件一样,它在我们的处理过程中也具有多种损失函数。 它们也提供在torch.nn中。 在将我们的实际输出与具有损失函数的理想输出进行比较之后,我们需要稍微推动模型以移动其输出以更好地接近目标。 如前所述,这就是PyTorch autograd引擎出现的地方。 但是我们还需要一个优化程序来执行更新,这就是PyTorch在torch.optim中提供给我们的。 我们将在第5章开始研究具有损失函数和优化器的训练循环,然后在第2部分开始我们的大项目之前,在第6至8章中磨练我们的技能。
如图1.2底部中央所示,使用复杂的硬件(例如多个GPU或多台机器)来贡献其资源来训练大型模型变得越来越普遍。 在这些情况下,可以使用torch.nn.parallel.Distributed-DataParallel和torch.distributed子模块来使用其他硬件。
训练循环可能是深度学习项目中最令人兴奋但最耗时的部分。 最后,我们将得到一个模型,该模型的参数已针对我们的任务进行了优化:该模型在图中训练循环的右侧进行了描述。 拥有解决任务的模型很棒,但是为了使它产生作用,我们必须将其放在需要工作的地方。 如图1.2右侧所示,该过程的部署部分可能涉及将模型放在服务器上或将其导出以将其加载到云引擎,如图所示。 或者我们可能将其与更大的应用程序集成,或在手机上运行它。
部署练习的一个特定步骤可以是导出模型。 如前所述,PyTorch默认为立即执行模型(动态图模式)。 每当Python解释器执行涉及PyTorch的指令时,相应的操作就会由基础C ++或CUDA实现立即执行。 随着更多的指令对张量进行操作,后端实现将执行更多的操作。
PyTorch还提供了一种通过TorchScript提前编译模型的方法。 使用TorchScript,PyTorch可以将模型序列化为一组指令,这些指令可以独立于Python(例如,从C ++程序或在移动设备上)调用。 我们可以将其视为具有特定于张量操作的有限指令集的虚拟机。 这使我们可以导出模型,将其导出为与PyTorch运行时一起使用的TorchScript或称为ONNX的标准化格式。 这些功能是PyTorch生产部署功能的基础。 我们将在第15章中介绍。
网友评论