pytorch | 使用vmap对自定义函数进行并行化/ 向量化的执行
0. 参考
- pytorch官方文档:https://pytorch.org/docs/stable/generated/torch.func.vmap.html#torch-func-vmap
- 关于if语句如何执行:https://github.com/pytorch/functorch/issues/257
1. 问题背景
-
笔者现在需要执行如下的功能:
root_ls = [func(x,b) for x in input]
因此突然想到pytorch或许存在对于自定义的函数的向量化执行的支持 -
一顿搜索发现了
from functorch import vmap这种好东西,虽然还在开发中,但是很多功能已经够用了
2. 具体例子
- 这里只介绍笔者需要的一个方面,
vmap的其他支持还请参阅pytorch官方文档 - 自定义函数及其输入:
# 自定义函数
def func_2(t,b):return torch.where((t>5.),t*b,-t)
# 输入t = torch.tensor([1.,2.,3.,4.,5.,6.,7.,8.])
b = torch.tensor([1.],requires_grad=True)
- 注意1:自定义函数不要出现
if,用torch.where替代。至于为什么参阅这个issue,大概的原因是“ifisn’t a differentiability requirement;”,强行使用会报错error of Data-dependent control flow
-
然后对于
b,我们需要扩张到和t同样的大小:
b_extend = torch.expand_copy(b,size=t.shape) # 必须把b扩张到和t同一个size否则报错 -
利用
vmap,它返回一个新的函数func_vec,具有向量化执行的支持,也可以利用autograd求导
# Use vmap() to construct a new function.
func_vec = vmap(func_2) # [N, D], [N, D] -> [N]
ans = func_vec(t,b_extend)
ans.sum().backward() # 等价于: ans.backward(torch.ones(b_extend.shape))
b_extend.grad # 可以预见:b的导数是t:在t>5.时导数是t,在t<=5.时导数是0
- 全部代码:
import torch
from functorch import vmap# if分支isn't a differentiability requirement;
def func(t,b):tmp = t*bif tmp > 5: # error: Data-dependent control flowroot = t*belse:root = -treturn rootdef func_2(t,b):return torch.where((t>5.),t*b,-t)t = torch.tensor([1.,2.,3.,4.,5.,6.,7.,8.])
b = torch.tensor([1.],requires_grad=True)
b_extend = torch.expand_copy(b,size=t.shape) # 必须把b扩张到和t同一个size否则报错
b_extend.retain_grad()print(f"shape of t:{t.shape}, shape of b_extend:{b_extend.shape}")
# shape of t:torch.Size([8]), shape of b_extend:torch.Size([8])# Use vmap() to construct a new function. # [D], [D] -> []
func_vec = vmap(func_2) # [N, D], [N, D] -> [N]
ans = func_vec(t,b_extend)
ans.sum().backward() # 等价于: ans.backward(torch.ones(b_extend.shape))b_extend.grad # 可以预见:b的导数是t:在t>5.时导数是t,在t<=5.时导数是0
# tensor([0., 0., 0., 0., 0., 6., 7., 8.])
- 问题在于,它真的比
root_ls = [func(x,b) for x in input]这种快吗?在笔者的设计中确实是使用vmap更快一些,但是不见得总是好用,只是在pytorch中写大量的for实在是太愚蠢了QAQ
感谢阅读,欢迎交流
相关文章:
pytorch | 使用vmap对自定义函数进行并行化/ 向量化的执行
0. 参考 pytorch官方文档:https://pytorch.org/docs/stable/generated/torch.func.vmap.html#torch-func-vmap关于if语句如何执行:https://github.com/pytorch/functorch/issues/257 1. 问题背景 笔者现在需要执行如下的功能: root_ls [fu…...
Docker部署RabbitMQ(单机,集群,仲裁队列)
RabbitMQ部署指南 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一:在线拉取 docker pull rabbitmq:3-management方式二:从本地加载 在课前资料已经提供了镜像包: 上传到虚拟机中后,使用命令加载镜…...
生活污水处理设备选购指南
生活污水中含有大量的有机物(如蛋白质、碳水化合物、脂肪、尿素、氨氮等)及大量的病原微生物,可导致传染病蔓延流行。因此,生活污水在排放前,需要进行处理。那么如何正确的选择生活污水处理设备呢? 一、生活…...
奥威BI数据可视化大屏分享|多场景、多风格
数据可视化大屏一般应用在品牌推广展示、商务交流、数据分析决策、数据监控等场景,由此催生出各种不同风格的BI数据可视化大屏设计。下面就从奥威BI软件的BI报表模板中截取几个有着不同风格,起着不同作用的BI数据可视化大屏报表,一起来了解一…...
超越时空:加速预训练语言模型的训练
超越时空:加速预训练语言模型的训练 随着自然语言处理(NLP)领域的快速发展,预训练语言模型(PTLM)已成为许多NLP任务的重要基石,如文本生成、情感分析、文本分类等。然而,传统的PTLM…...
数据库管理系统PostgreSQL部署安装完整教程
PostgreSQL是一个开源的关系型数据库管理系统,它支持大量的数据类型和复杂的查询语言,可以用于各种应用程序。它是一个高性能的数据库,可以处理大量的数据,并且具有良好的可扩展性和可靠性。 目录 一.Linux系统安装PostgresSQL&a…...
有学生问我,重构是什么?我应该如何回答?
重构到底是什么?只是代码的推倒重新编码?还是有规则、有方法可寻?当然,结论肯定是有的,本文,我们通过一个简单的实例,来理解一下重构。 1.借助一个实例需求 这是一个影片出租店用的程序&#…...
交际场合---英文单词
目录 前言原文邀请生日和聚会离别探病婚礼新居落成葬礼聚会相关单词婚礼相关单词乔迁相关单词丧礼相关单词前言 加油 原文 邀请 1.invite[ɪnˈvaɪt]vt. 邀请 invitation [ˌɪnvəˈteʃən] n. 邀请;邀请函 invite sb to v. 邀请某人从事…… accept / decline /…...
【网络安全】文件上传漏洞及中国蚁剑安装
文件上传漏洞描述中国蚁剑安装1. 官网下载源码和加载器2.解压至同一目录并3.安装4.可能会出现的错误文件上传过程必要条件代码示例dvwa靶场攻击示例1.书写一句话密码进行上传2. 拼接上传地址3.使用中国蚁剑链接webshell前端js绕过方式服务端校验请求头中content-type黑名单绕过…...
[Java]面向对象高级篇
文章目录包装类包装类层次结构基本类型包装类特殊包装类数组一维数组多维数组可变长参数字符串String类StringBuilder类内部类成员内部类静态内部类局部内部类匿名内部类Lambda表达式方法引用异常机制自定义异常抛出异常异常的处理常用工具类数学工具类随机数数组工具类包装类 …...
苹果应用商店上架流程
上架过程分七个步骤,按步骤一步步来。 仔细看这个流程,少走很多弯路,不用一步步去试错,新手也能快速掌握上架流程。 1、创建APP身份证(App IDs) 2、申请iOS发布证书 3、申请iOS发布描述文件 4、上传ios证…...
基于Eclipse下使用arm gcc开发GD32调用printf
系列目录 第一章 xxx 目录 系列目录 文章目录 文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结前言 开发环境:Eclipse代替Keil,IAR 开发平台:GD32 开发编译器:arm-none-eabi- …...
5个降低云成本并提高IT运营效率的优先事项
在过去的十年里,公司在公有云和私有云基础设施上构建了大量的计算工作负载,或者将工作负载转移到云端。Gartner 预测,到2023年,全球终端用户在公共云服务上的支出将达到5910亿美元,比2021年增长43%。这是一个显著的增长…...
95-拥塞控制
拥塞控制1.什么是拥塞控制2.拥塞控制的方法(1)慢启动和拥塞避免(2)快速重传和快速恢复1.什么是拥塞控制 在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超…...
Linux常见操作命令【二】
一、Vi 编辑器 Vi 编辑器存在三者模式:命令、末行、编辑 1.1 命令模式 输入 vi 默认进入命令模式 输入n或者nG:定位到某一行行首 输入G:跳到文件最后一行行首 输入hjkl:表示左下上右移动光标(方向键也可以…...
Linux驱动中断和定时器
目录 中断 顶半部/底半部机制 软中断: Tasklet: 工作队列: 定时器 中断 中断是正在执行的程序被另一个程序打断,去执行另一个程序的处理函数,当执行完再返回执行被打断的程序。分为内中断(异常)和外中断(硬件中断)。 当cp…...
表达式和函数
表达式: 将数字和运算符连接起来的组合称为表达式。我们可以将数字称为操作数,单个操作数也可以被看作是一个表达式。 操作数:常数,列名,函数调用,其他表达式 运算符:算数运算符,…...
C#基础复习
目录 格式字符串 多重标记和值 预定义类型 用户定义类型 值类型和引用类型 存储引用类型对象的成员 C#类型的分类 静态类型和dynamic关键字 类的基本概念 类成员的类型 为数据分配内存 访问修饰符 格式字符串 多重标记和值 C#程序就是一组类型声明,学习C#就是学习…...
Windows服务器使用代码SSH免密登录并执行脚本
服务器操作系统 Window Server 2016 1、Windows服务器安装OpenSSH 有多种方式,本文介绍一种方式 下载页: https://github.com/PowerShell/Win32-OpenSSH/releases 在下载页下载文件OpenSSH-Win64.zip 本次实验解压至 D:\OpenSSH-Win64\OpenSSH-Win6…...
(Deep Learning)交叉验证(Cross Validation)
交叉验证(Cross Validation) 交叉验证(Cross Validation)是一种评估模型泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。 交叉验证不但可以解决数据集中数据量不够大的问题,也可以…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...
