PyTorch中“原地”赋值的思考

在开发一个PyTorch模块时,遇到了一个诡异的现象,将他描述出来就是下面这样:

f[..., :p_index - 1] = f[..., 1:p_index]

这个操作将f张量的部分数值进行左移,我在模型训练的时候还能正常跑,但是当我将模型部署到项目中时,这行代码报错了!

Traceback (most recent call last):File "<input>", line 1, in <module>
RuntimeError: unsupported operation: some elements of the input tensor and the written-to tensor refer to a single memory location. Please clone() the tensor before performing the operation.

这个PyTorch报错是因为在执行操作时,输入张量和目标张量共享了同一块内存地址(存在内存重叠),导致PyTorch无法安全地完成原地(in-place)操作。

既然这样的话为什么在模型训练的时候不会这样呢?后面我仔细研究了一下午,发现了下面的原因:


当我们模型在训练阶段中,f的形状通常是(B,F)的形式存在的,而在部署的时候,作推理时数据通常是(1,F)的形式,所以会出现下面的情况:

# 创建高维张量(3维)
f_3d = torch.randn(16, 1, 25)
slice_3d = f_3d[..., 1:24]  # 源切片print("高维张量切片是否连续:")
print(slice_3d.is_contiguous())  # 输出 False# 创建一维张量对比
f_1d = torch.randn(1, 1, 25)
slice_1d = f_1d[..., 1:24]print("\n一维张量切片是否连续:")
print(slice_1d.is_contiguous())  # 输出 True

可以看到,当张量是维度大于1时,其在内存中是非连续存储的,而张量维度为1时,其在内存中是连续存储的。对于非连续张量,PyTorch会在赋值时隐式创建临时副本,避免内存覆盖。因此在进行原地赋值时不会报错。

最后,为了加强代码的鲁棒性,我在所有涉及这部分操作的代码后面加上了clone()函数。

f[..., :p_index - 1] = f[..., 1:p_index].clone()

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

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

相关文章

什么是:云边端一体化架构

什么是云边端一体化架构 文章目录 什么是云边端一体化架构云、边、端云计算边缘计算终端设备 云边端一体化协同云边端一体化架构协同的流程云边端一体化架构协同的应用云边端一体化架构协同的价值云边端一体化架构协同未来发展趋势 云、边、端 云&#xff08;Cloud&#xff09…

gephi绘图

参考&#xff1a; 如何在Gephi中正确的显示中文&#xff1f; Gephi绘制网络图初步探索 gephi 节点标签 调节_图分析与可视化-从Gephi开始

马克·雷伯特:用算法让机器人飞奔的人

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 马克雷伯特:用算法让机器人飞奔的人 一、天才的起点 在机器人领域,有一个名字如雷贯耳——马克雷伯特(Marc Raibert)。作为波士顿动力公司(Boston…

三维装配可视化界面开发笔记

三维装配可视化界面开发笔记 项目概述 这是一个基于Vue.js和Three.js的三维装配可视化系统&#xff0c;用于展示机械零部件的装配和拆解过程。系统支持模型加载、拆解/装配路径生成、动画展示和工艺流程图生成等功能。 技术栈 前端框架: Vue 3 (使用组合式API)构建工具: Vi…

深⼊理解指针(8)

1.对上一篇的补充内容 typedef int* ptr_t #define PTR_T int* 这两种写法都是可以的 ptr_t p1, p2; //p1, p2 都是指针变量 PTR_T p3, p4; //p3 是指针变量, p4是整型变量 为什么p3 是指针变量, p4是整型变量呢&#xff1f; 因为PTR_T 真的被改为了 int* 在编译器中…

neo4j暴露公网ip接口——给大模型联通知识图谱

特别鸣谢 我的领导&#xff0c;我的脑子&#xff0c;我的学习能力&#xff0c;感动了 1. 搭建知识图谱数据库&#xff08;见上一章博客&#xff09; 这里不加赘述了&#xff0c;请参考上一篇博客搭建 2. FastApi包装接口 这里注意&#xff1a;NEO4J_URI不得写http:,只能写…

AI编程新选择!VSCode + RooCode,超越Cursor​

在当今快节奏的开发环境中&#xff0c;AI编程助手已经成为提升开发效率的关键工具。然而&#xff0c;面对众多选择&#xff0c;开发者往往陷入纠结&#xff1a;如何在众多AI编程工具中找到最适合自己的方案&#xff1f;尤其是当VSCode搭配RooCode时&#xff0c;相比Cursor&…

电子病历高质量语料库构建方法与架构项目(环境聆听与自动化文档生成篇)

电子病历高质量语料库的构建是一个复杂而系统的工程,涉及数据收集、清洗、标注、验证等多个环节。在项目实施过程中,"环境聆听"和"自动化文档生成"是两个关键支撑要素,前者确保项目能够适应不断变化的技术和业务环境,后者则保障项目过程的可追溯性和知…

Python协程入门指北

一、什么是协程&#xff1f; 协程&#xff08;Coroutine&#xff09;就像可以暂停执行的函数&#xff0c;能够在执行过程中主动让出控制权&#xff0c;等准备好后再继续执行。 生活小例子 想象你在咖啡店排队&#xff1a; 普通函数&#xff1a;必须一直排到取餐&#xff08…

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下载安装和使用

资源获取链接&#xff1a; mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用说明资源-CSDN文库 详细作用 数据库服务器的核心文件&#xff1a; 这是一个压缩包&#xff0c;解压后包含 MySQL 数据库服务器的可执行文件、库文件、配置文件模板等。 它用于在 Linux 系统上安装…

C++笔记-继承(下)(包含派生类的默认成员函数,菱形继承等)

一.派生类的默认成员函数 1.14个常见默认成员函数 默认成员函数&#xff0c;默认的意思就是指我们不写&#xff0c;编译器会自动为我们生成一个&#xff0c;那么在派生类中&#xff0c;这几个成员函数是如何生成的呢&#xff1f; 1.派生类的构造函数必须调用基类的构造函数初…

C++中指针使用详解(3)数组、指针和函数参数传递的底层 ABI实现

要深入理解 数组、指针和函数参数传递 的底层 ABI&#xff08;Application Binary Interface&#xff09;实现&#xff0c;需要从以下几个维度出发进行学习&#xff1a; 一、什么是 ABI&#xff1f; ABI 是编译器和操作系统之间的协定&#xff0c;规定了&#xff1a; 函数如何…

【RustDesk 】中继1:压力测试 Python 版 RustDesk 中继服务器

测试 Python 版 RustDesk 中继服务器 测试我们实现的中继服务器有几种方法,从简单到复杂依次如下: 1. 基本连接测试客户端 创建一个简单的测试客户端来验证中继服务器的基本功能: 2. 用两个测试客户端测试中继功能 要测试完整的中继功能,你需要运行两个客户端实例来模拟…

Spring Boot集成Spring Cloud 2024(不使用Feign)

本文介绍Spring Boot集成Spring Cloud 2024&#xff0c;且不使用Feign&#xff0c;而是采用Spring 6自带的HttpExchange方式进行服务调用的详细步骤&#xff1a; 环境准备 Spring Boot版本&#xff1a;推荐使用Spring Boot 3.4.1及以上版本&#xff0c;以更好地与Spring Clou…

vue中$set原理

Vue 中的 $set 方法&#xff08;Vue.set&#xff09;主要用于 向响应式对象中添加一个新的属性&#xff0c;并确保这个新属性是响应式的&#xff0c;能够触发视图更新。 &#x1f4cc; 背景问题&#xff1a;为什么需要 $set&#xff1f; 在 Vue 2 中&#xff0c;直接给对象新增…

Superset二次开发之深度解读系列:1.概述

Apache Superset 是一款现代化的企业级商业智能 Web 应用程序&#xff0c;专为数据探索和可视化而设计。本概述介绍了 Superset 的架构、核心组件和主要功能&#xff0c;以帮助开发人员了解该系统的工作原理。 What is Apache Superset? Apache Superset 是一个开源数据探索…

Linux系统之elfedit详解

elfedit 是一个用于修改 ELF&#xff08;可执行与可链接格式&#xff09;文件头的工具。它允许用户根据指定的条件&#xff08;如机器类型、文件类型、操作系统/ABI&#xff09;匹配并更新 ELF 文件的头部信息。支持 32 位和 64 位 ELF 文件&#xff0c;以及包含 ELF 文件的归档…

前端HTML基础知识

1.HTML介绍 HTML(HyperText Markup Language&#xff0c;超文本标记语言)是构成网页的基本元素&#xff0c;是一种用于创建网页的标准化标记语言。HTML不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;通过标签来描述网页的结构和内容。 超文本&#xff1a;超文本是…

【IP101】图像滤波技术详解:从均值滤波到高斯滤波的完整指南

&#x1f31f; 图像滤波魔法指南 &#x1f3a8; 在图像处理的世界里&#xff0c;滤波就像是给图片"美颜"的魔法工具。让我们一起来探索这些神奇的滤波术吧&#xff01; &#x1f4d1; 目录 1. 均值滤波&#xff1a;图像的"磨皮"大法2. 中值滤波&#xff1…

LINE FRIENDS 正式与 Walrus 合作,全新 AI 驱动的游戏即将上线

风靡全球的 LINE FRIENDS 角色即将以“minini”迷你造型登陆 Walrus&#xff0c;虽然尺寸更小&#xff0c;但承诺带来“大”动作。IPX&#xff08;LINE FRIENDS 背后的公司&#xff09;打造了《minini universe: ROOM》游戏&#xff0c;这是一款基于其 minini 系列角色的多链游…