深度学习入门(三十五)计算性能 编译器和解释器

news2024/10/2 6:39:49

深度学习入门(三十五)计算性能 编译器和解释器

  • 前言
  • 计算性能——编译器和解释器
    • 教材
      • 1 符号式编程
      • 2 混合式编程
      • 3 Sequential的混合式编程
        • 3.1 通过混合式编程加速
      • 3.2 序列化
      • 4 小结

前言

核心内容来自博客链接1博客连接2希望大家多多支持作者
本文记录用,防止遗忘

计算性能——编译器和解释器

教材

目前为止,主要关注的是命令式编程(imperative programming)。 命令式编程使用诸如print、“+”和if之类的语句来更改程序的状态。 考虑下面这段简单的命令式程序:

def add(a, b):
    return a + b

def fancy_func(a, b, c, d):
    e = add(a, b)
    f = add(c, d)
    g = add(e, f)
    return g

print(fancy_func(1, 2, 3, 4))

输出:

10

Python是一种解释型语言(interpreted language)。因此,当对上面的fancy_func函数求值时,它按顺序执行函数体的操作。也就是说,它将通过对e = add(a, b)求值,并将结果存储为变量e,从而更改程序的状态。接下来的两个语句f = add(c, d)g = add(e, f)也将执行类似地操作,即执行加法计算并将结果存储为变量。 下图说明了数据流。
在这里插入图片描述
尽管命令式编程很方便,但可能效率不高。一方面原因,Python会单独执行这三个函数的调用,而没有考虑add函数在fancy_func中被重复调用。如果在一个GPU(甚至多个GPU)上执行这些命令,那么Python解释器产生的开销可能会非常大。此外,它需要保存ef的变量值,直到fancy_func中的所有语句都执行完毕。这是因为程序不知道在执行语句e = add(a, b)f = add(c, d)之后,其他部分是否会使用变量ef

1 符号式编程

考虑另一种选择符号式编程(symbolic programming),即代码通常只在完全定义了过程之后才执行计算。这个策略被多个深度学习框架使用,包括Theano和TensorFlow(后者已经获得了命令式编程的扩展)。一般包括以下步骤:
1、定义计算流程。
2、将流程编译成可执行的程序。
3、给定输入,调用编译好的程序执行。
这将允许进行大量的优化。首先,在大多数情况下,我们可以跳过Python解释器。从而消除因为多个更快的GPU与单个CPU上的单个Python线程搭配使用时产生的性能瓶颈。其次,编译器可以将上述代码优化和重写为print((1 + 2) + (3 + 4))甚至print(10)。因为编译器在将其转换为机器指令之前可以看到完整的代码,所以这种优化是可以实现的。例如,只要某个变量不再需要,编译器就可以释放内存(或者从不分配内存),或者将代码转换为一个完全等价的片段。下面,我们将通过模拟命令式编程来进一步了解符号式编程的概念。

def add_():
    return '''
def add(a, b):
    return a + b
'''

def fancy_func_():
    return '''
def fancy_func(a, b, c, d):
    e = add(a, b)
    f = add(c, d)
    g = add(e, f)
    return g
'''

def evoke_():
    return add_() + fancy_func_() + 'print(fancy_func(1, 2, 3, 4))'

prog = evoke_()
print(prog)
y = compile(prog, '', 'exec')
exec(y)

输出:

def add(a, b):
    return a + b

def fancy_func(a, b, c, d):
    e = add(a, b)
    f = add(c, d)
    g = add(e, f)
    return g
print(fancy_func(1, 2, 3, 4))
10

命令式(解释型)编程和符号式编程的区别如下:

  • 命令式编程更容易使用。在Python中,命令式编程的大部分代码都是简单易懂的。命令式编程也更容易调试,这是因为无论是获取和打印所有的中间变量值,或者使用Python的内置调试工具都更加简单。
  • 符号式编程运行效率更高,更易于移植。符号式编程更容易在编译期间优化代码,同时还能够将程序移植到与Python无关的格式中,从而允许程序在非Python环境中运行,避免了任何潜在的与Python解释器相关的性能问题。
  • 2 混合式编程

    历史上,大部分深度学习框架都在命令式编程与符号式编程之间进行选择。例如,Theano、TensorFlow(灵感来自前者)、Keras和CNTK采用了符号式编程。相反地,Chainer和PyTorch采取了命令式编程。在后来的版本更新中,TensorFlow2.0和Keras增加了命令式编程

    如上所述,PyTorch是基于命令式编程并且使用动态计算图。为了能够利用符号式编程的可移植性和效率,开发人员思考能否将这两种编程模型的优点结合起来,于是就产生了torchscript。torchscript允许用户使用纯命令式编程进行开发和调试,同时能够将大多数程序转换为符号式程序,以便在需要产品级计算性能和部署时使用。

    3 Sequential的混合式编程

    要了解混合式编程的工作原理,最简单的方法是考虑具有多层的深层网络。按照惯例,Python解释器需要执行所有层的代码来生成一条指令,然后将该指令转发到CPU或GPU。对于单个的(快速的)计算设备,这不会导致任何重大问题。另一方面,如果我们使用先进的8-GPU服务器,比如AWS P3dn.24xlarge实例,Python将很难让所有的GPU都保持忙碌。在这里,瓶颈是单线程的Python解释器。让我们看看如何通过将Sequential替换为HybridSequential来解决代码中这个瓶颈。首先,我们定义一个简单的多层感知机。

    import torch
    from torch import nn
    from d2l import torch as d2l
    
    
    # 生产网络的工厂模式
    def get_net():
        net = nn.Sequential(nn.Linear(512, 256),
                nn.ReLU(),
                nn.Linear(256, 128),
                nn.ReLU(),
                nn.Linear(128, 2))
        return net
    
    x = torch.randn(size=(1, 512))
    net = get_net()
    net(x)
    

    输出:

    tensor([[ 0.0244, -0.0361]], grad_fn=<AddmmBackward0>)
    

    通过使用torch.jit.script函数来转换模型,我们就有能力编译和优化多层感知机中的计算,而模型的计算结果保持不变

    net = torch.jit.script(net)
    net(x)
    

    输出:

    tensor([[ 0.0244, -0.0361]], grad_fn=<AddmmBackward0>)
    

    我们编写与之前相同的代码,再使用torch.jit.script简单地转换模型,当完成这些任务后,网络就将得到优化(我们将在下面对性能进行基准测试)。

    3.1 通过混合式编程加速

    class Benchmark:
        """用于测量运行时间"""
        def __init__(self, description='Done'):
            self.description = description
    
        def __enter__(self):
            self.timer = d2l.Timer()
            return self
    
        def __exit__(self, *args):
            print(f'{self.description}: {self.timer.stop():.4f} sec')
    

    现在我们可以调用网络两次,一次使用torchscript,一次不使用torchscript。

    net = get_net()
    with Benchmark('无torchscript'):
        for i in range(1000): net(x)
    
    net = torch.jit.script(net)
    with Benchmark('有torchscript'):
        for i in range(1000): net(x)
    

    输出;

    无torchscript: 1.8929 sec
    有torchscript: 1.8184 sec
    

    如以上结果所示,在nn.Sequential的实例被函数torch.jit.script脚本化后,通过使用符号式编程提高了计算性能。

    3.2 序列化

    编译模型的好处之一是我们可以将模型及其参数序列化(保存)到磁盘。这允许这些训练好的模型部署到其他设备上,并且还能方便地使用其他前端编程语言。同时,通常编译模型的代码执行速度也比命令式编程更快。

    4 小结

    命令式编程使得新模型的设计变得容易,因为可以依据控制流编写代码,并拥有相对成熟的Python软件生态。

    符号式编程要求我们先定义并且编译程序,然后再执行程序,其好处是提高了计算性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【离散数学】第一章 测试

1. A. 对 B. 错 正确答案&#xff1a;A 2. A. 对 B. 错 正确答案&#xff1a;B 3. A. 错 B. 对 正确答案&#xff1a;B 4.p↔q⇔p↔q A. 对 B. 错 正确答案&#xff1a;A 5. A. 对 B. 错 正确答案&#xff1a;A 6.n个命题变元组成的命题公式共有( )种不同的…

小胶质细胞仅仅是神经系统内的“配角”?

大脑中存在着数量众多的神经胶质细胞&#xff0c;约占人类大脑细胞的 90%&#xff1b;不同类型的胶质细胞在起源、组成、形态和解剖学上都是不同的&#xff0c;而且它们发挥着不同的功能。 图 1. 中枢神经系统的四种神经细胞 小胶质细胞与 AD 疾病进程 小胶质细胞是一类来源于…

数据分析的重要性体现在哪?

近几年&#xff0c;数据分析成为了当今IT界的新起之秀&#xff0c;在我国互联网飞速发展的浪潮下&#xff0c;无论是公司职员还是个体商户或大公司管理者&#xff0c;都需要学习掌握数据分析的能力&#xff0c;它已经成为数据时代各行各业突破各自行业发展瓶颈的最有效手段。 那…

微信小程序复习题

文章目录填空题选择题判断题分析题&#xff08;20&#xff09;分析代码显示效果页面设计题&#xff08;40&#xff09;填空题 微信小程序创始人是 张小龙 &#xff0c;英文缩写 Mini Program小程序是一种无需下载和无需安装即可使用的应用&#xff0c;它实现了应用“ 触手可得…

[附源码]java毕业设计基于web的硕士研究生入学考务管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

5、Redis的发布和订阅

文章目录5、Redis的发布和订阅5.1、什么是发布和订阅5.2、Redis的发布和订阅5.2.1、客户端可以订阅频道如下图5.2.2、当给这个频道发布消息后&#xff0c;消息就会发送给订阅的客户端5.3、发布订阅命令行实现5.3.1、打开一个客户端订阅channel15.3.2、打开另一个客户端&#xf…

Day32——二叉树专题

文章目录28.删除二叉搜索树的节点29.修剪二叉搜索树30.将有序数组转换为二叉搜索树31. 把二叉搜索树转换为累加树28.删除二叉搜索树的节点 题目链接&#xff1a;450. 删除二叉搜索树中的节点 - 力扣&#xff08;LeetCode&#xff09; 如果目标节点大于当前节点值&#xff0c;则…

MapReduce编程模型——自定义序列化类实现多指标统计

&#x1f3e0;Hadoop序列化 &#x1f449;序列化 序列化就是把内存中的对象&#xff0c;转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据&#xff0c;转换成内存中的对象。 &#…

7天酒店亮相中国国际饭店业大会元宇宙线上展 创见酒店投资新未来

11月12日&#xff0c;由中国饭店协会主办的第一届酒旅菁英品牌嘉年华“元宇宙”线上展成功举行。7天酒店“元宇宙”展馆首度亮相&#xff0c;通过数字化交互、虚拟展厅、线上路演等&#xff0c;为行业和市场带来耳目一新的创新营销形式。 作为第七届中国国际饭店业大会的线上分…

基于微信小程序的药店管理系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mav…

蓝牙HID——将android设备变成蓝牙鼠标/触控板(BluetoothHidDevice)

前言 本篇为蓝牙HID系列篇章之一&#xff0c;本篇以红米K30&#xff08;MIUI13即Android 12&#xff09;手机作为蓝牙HID设备&#xff0c;可以与电脑、手机、平板等其他蓝牙主机进行配对从而实现鼠标触控板的功能。 蓝牙HID系列篇章&#xff1a; 蓝牙HID——将android设备变成…

babel-plugin-import 实现按需引入

官方文档&#xff1a;https://github.com/umijs/babel-plugin-import#usage 为什么需要这个插件&#xff1f; 在 antd 和 element 两个组件库中&#xff0c;index.js 分别是这样的&#xff1a; // antd export { default as Button } from ./button; export { default as Tab…

智能云门禁解决方案来了

传统门禁存在的问题 01、安全性差&#xff1a;传统门禁卡易被复制和盗用无法精准识别进出人员身份造成较大安全隐患。 02、通行不便&#xff1a;要求人员近距离操作&#xff0c;当使 用者双手被占用时通行不便 门禁卡丢失或密码遗忘造成 无法开门。 03、管理困难&#xff1a…

Multilevel Cooperative Coevolution for Large Scale Optimization

0、论文背景 本文在CCEA_G的基础上&#xff0c;提出了MLCC框架。在MLCC中&#xff0c;基于不同组大小的随机分组策略构造了一组问题分解器。演化过程分为若干个循环&#xff0c;在每个周期开始时&#xff0c;MLCC使用自适应机制根据其历史性能选择分解器。由于不同的组大小捕获…

数据结构-图的存储结构

目录 图的存储结构邻接矩阵邻接表图的邻接矩阵和邻接表两种存储结构各有什么优缺点?图的存储结构 邻接矩阵 邻接矩阵的主要特点:

spring7:总结56

1.handler的形参解析&#xff08;即如何把请求参数转化为形参&#xff09; 注解参数解析原理 model and map解析原理 自定义对象处理原理 2.数据响应原理&#xff08;即如何把返回值传给前端&#xff09; 整体返回原理 详解其中的内容协商流程&#xff08;基于请求头&#x…

数据库分区的通俗解释

关于数据库分区&#xff0c;分表&#xff0c;分库&#xff0c;我通俗易懂的来举几个栗子&#xff0c;看过还不懂&#xff0c;你打我。。。 村里一家四口人(老爹叫A)有两儿子(分别是A1&#xff0c;A2)&#xff0c;长大了要自己种地了&#xff0c;就嚷嚷着要分家&#xff0c;把村…

虚拟机(Vmware)磁盘扩容(xfs格式)

先将虚拟机关机&#xff0c;按上图调整虚拟磁盘大小。 1.开启并进入虚拟机&#xff0c;打开终端&#xff0c;输入命令 df -Th 查看格式&#xff0c;图示中 /dev/mapper/centos-root 类型为xfs。 [mangolocalhost ~]$ df -Th Filesystem Type Size Used Ava…

luffy-(9)

内容概览 redis图形化客户端redis字符串操作redis hash操作redis列表操作redis管道redis其他操作django中集成rediscelery介绍 redis图形化客户端 安装图形化客户端redis-desktop-manager 新版本收费&#xff0c;可以使用老版本 QT平台&#xff1a;可以写图形化界面 python&…

腾讯云~Kafka 监控 Kafka Eagle 图形化版本

文章目录1. 安装包下载2. 开启kafka JMX3. 安装JDK&#xff0c;配置JAVA_HOME4. 上传安装包、解压5. 配置Kafka-eagle环境变量6. 配置Kafka_eagle7. 配置ke.sh8. 启动Kafka_eagle9. 防火墙10. 访问Kafka eagle1. 安装包下载 官网地址&#xff1a;EFAK 本文使用3.0.1版本 2. …