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.pswp.cn/news/903733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903733.shtml
英文地址,請注明出處:http://en.pswp.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 系列角色的多鏈游…