当前位置: 首页 > news >正文

pytorch | 使用vmap对自定义函数进行并行化/ 向量化的执行

0. 参考

  1. pytorch官方文档:https://pytorch.org/docs/stable/generated/torch.func.vmap.html#torch-func-vmap
  2. 关于if语句如何执行:https://github.com/pytorch/functorch/issues/257

1. 问题背景

  1. 笔者现在需要执行如下的功能:
    root_ls = [func(x,b) for x in input]
    因此突然想到pytorch或许存在对于自定义的函数的向量化执行的支持

  2. 一顿搜索发现了from functorch import vmap这种好东西,虽然还在开发中,但是很多功能已经够用了

2. 具体例子

  1. 这里只介绍笔者需要的一个方面,vmap的其他支持还请参阅pytorch官方文档
  2. 自定义函数及其输入:
# 自定义函数
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,大概的原因是“if isn’t a differentiability requirement;”,强行使用会报错error of Data-dependent control flow
  1. 然后对于b,我们需要扩张到和t同样的大小:
    b_extend = torch.expand_copy(b,size=t.shape) # 必须把b扩张到和t同一个size否则报错

  2. 利用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
  1. 全部代码:
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.])
  1. 问题在于,它真的比root_ls = [func(x,b) for x in input]这种快吗?在笔者的设计中确实是使用vmap更快一些,但是不见得总是好用,只是在pytorch中写大量的for实在是太愚蠢了QAQ

感谢阅读,欢迎交流

相关文章:

pytorch | 使用vmap对自定义函数进行并行化/ 向量化的执行

0. 参考 pytorch官方文档&#xff1a;https://pytorch.org/docs/stable/generated/torch.func.vmap.html#torch-func-vmap关于if语句如何执行&#xff1a;https://github.com/pytorch/functorch/issues/257 1. 问题背景 笔者现在需要执行如下的功能&#xff1a; root_ls [fu…...

Docker部署RabbitMQ(单机,集群,仲裁队列)

RabbitMQ部署指南 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management方式二&#xff1a;从本地加载 在课前资料已经提供了镜像包&#xff1a; 上传到虚拟机中后&#xff0c;使用命令加载镜…...

生活污水处理设备选购指南

生活污水中含有大量的有机物&#xff08;如蛋白质、碳水化合物、脂肪、尿素、氨氮等&#xff09;及大量的病原微生物&#xff0c;可导致传染病蔓延流行。因此&#xff0c;生活污水在排放前&#xff0c;需要进行处理。那么如何正确的选择生活污水处理设备呢&#xff1f; 一、生活…...

奥威BI数据可视化大屏分享|多场景、多风格

数据可视化大屏一般应用在品牌推广展示、商务交流、数据分析决策、数据监控等场景&#xff0c;由此催生出各种不同风格的BI数据可视化大屏设计。下面就从奥威BI软件的BI报表模板中截取几个有着不同风格&#xff0c;起着不同作用的BI数据可视化大屏报表&#xff0c;一起来了解一…...

超越时空:加速预训练语言模型的训练

超越时空&#xff1a;加速预训练语言模型的训练 随着自然语言处理&#xff08;NLP&#xff09;领域的快速发展&#xff0c;预训练语言模型&#xff08;PTLM&#xff09;已成为许多NLP任务的重要基石&#xff0c;如文本生成、情感分析、文本分类等。然而&#xff0c;传统的PTLM…...

数据库管理系统PostgreSQL部署安装完整教程

PostgreSQL是一个开源的关系型数据库管理系统&#xff0c;它支持大量的数据类型和复杂的查询语言&#xff0c;可以用于各种应用程序。它是一个高性能的数据库&#xff0c;可以处理大量的数据&#xff0c;并且具有良好的可扩展性和可靠性。 目录 一.Linux系统安装PostgresSQL&a…...

有学生问我,重构是什么?我应该如何回答?

重构到底是什么&#xff1f;只是代码的推倒重新编码&#xff1f;还是有规则、有方法可寻&#xff1f;当然&#xff0c;结论肯定是有的&#xff0c;本文&#xff0c;我们通过一个简单的实例&#xff0c;来理解一下重构。 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表达式方法引用异常机制自定义异常抛出异常异常的处理常用工具类数学工具类随机数数组工具类包装类 …...

苹果应用商店上架流程

上架过程分七个步骤&#xff0c;按步骤一步步来。 仔细看这个流程&#xff0c;少走很多弯路&#xff0c;不用一步步去试错&#xff0c;新手也能快速掌握上架流程。 1、创建APP身份证&#xff08;App IDs&#xff09; 2、申请iOS发布证书 3、申请iOS发布描述文件 4、上传ios证…...

基于Eclipse下使用arm gcc开发GD32调用printf

系列目录 第一章 xxx 目录 系列目录 文章目录 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结前言 开发环境&#xff1a;Eclipse代替Keil&#xff0c;IAR 开发平台&#xff1a;GD32 开发编译器&#xff1a;arm-none-eabi- …...

5个降低云成本并提高IT运营效率的优先事项

在过去的十年里&#xff0c;公司在公有云和私有云基础设施上构建了大量的计算工作负载&#xff0c;或者将工作负载转移到云端。Gartner 预测&#xff0c;到2023年&#xff0c;全球终端用户在公共云服务上的支出将达到5910亿美元&#xff0c;比2021年增长43%。这是一个显著的增长…...

95-拥塞控制

拥塞控制1.什么是拥塞控制2.拥塞控制的方法(1)慢启动和拥塞避免(2)快速重传和快速恢复1.什么是拥塞控制 在计算机网络中的链路容量&#xff08;即带宽&#xff09;、交换结点中的缓存和处理机等&#xff0c;都是网络的资源。在某段时间&#xff0c;若对网络中某一资源的需求超…...

Linux常见操作命令【二】

一、Vi 编辑器 Vi 编辑器存在三者模式&#xff1a;命令、末行、编辑 1.1 命令模式 输入 vi 默认进入命令模式 输入n或者nG&#xff1a;定位到某一行行首 输入G&#xff1a;跳到文件最后一行行首 输入hjkl&#xff1a;表示左下上右移动光标&#xff08;方向键也可以&#xf…...

Linux驱动中断和定时器

目录 中断 顶半部/底半部机制 软中断&#xff1a; Tasklet: 工作队列&#xff1a; 定时器 中断 中断是正在执行的程序被另一个程序打断&#xff0c;去执行另一个程序的处理函数&#xff0c;当执行完再返回执行被打断的程序。分为内中断(异常)和外中断(硬件中断)。 当cp…...

表达式和函数

表达式&#xff1a; 将数字和运算符连接起来的组合称为表达式。我们可以将数字称为操作数&#xff0c;单个操作数也可以被看作是一个表达式。 操作数&#xff1a;常数&#xff0c;列名&#xff0c;函数调用&#xff0c;其他表达式 运算符&#xff1a;算数运算符&#xff0c;…...

C#基础复习

目录 格式字符串 多重标记和值 预定义类型 用户定义类型 值类型和引用类型 存储引用类型对象的成员 C#类型的分类 静态类型和dynamic关键字 类的基本概念 类成员的类型 为数据分配内存 访问修饰符 格式字符串 多重标记和值 C#程序就是一组类型声明&#xff0c;学习C#就是学习…...

Windows服务器使用代码SSH免密登录并执行脚本

服务器操作系统 Window Server 2016 1、Windows服务器安装OpenSSH 有多种方式&#xff0c;本文介绍一种方式 下载页&#xff1a; https://github.com/PowerShell/Win32-OpenSSH/releases 在下载页下载文件OpenSSH-Win64.zip 本次实验解压至 D:\OpenSSH-Win64\OpenSSH-Win6…...

(Deep Learning)交叉验证(Cross Validation)

交叉验证&#xff08;Cross Validation&#xff09; 交叉验证&#xff08;Cross Validation&#xff09;是一种评估模型泛化性能的统计学方法&#xff0c;它比单次划分训练集和测试集的方法更加稳定、全面。 交叉验证不但可以解决数据集中数据量不够大的问题&#xff0c;也可以…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上

一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema&#xff0c;不需要复杂的查询&#xff0c;只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 &#xff1a;在几秒钟…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...