python打卡day34

GPU訓練及類的call方法

知識點回歸:

  1. CPU性能的查看:看架構代際、核心數、線程數
  2. GPU性能的查看:看顯存、看級別、看架構代際
  3. GPU訓練的方法:數據和模型移動到GPU device上
  4. 類的call方法:為什么定義前向傳播時可以直接寫作self.fc1(x)

判斷 CPU 的好壞需要綜合考慮硬件參數、性能表現、適用場景:

  1. 看架構代際,新一代架構通常優化指令集、緩存設計和能效比。如Intel 第 13 代 i5-13600K 比第 12 代 i5-12600K 多核性能提升約 15%
  2. 看制程工藝,制程越小,晶體管密度越高,能效比越好,如AMD Ryzen 7000 系列(5nm)比 Ryzen 5000 系列(7nm)能效比提升約 30%
  3. 看核心數:性能核負責高負載任務(如游戲、視頻剪輯),單核性能強。能效核負責多任務后臺處理(如下載、殺毒),功耗低。如游戲 / 辦公:4-8 核足夠,內容創作 / 編程:12 核以上更優
  4. ?看線程數目
  5. 看頻率,高頻適合單線程任務(如游戲、Office),低頻多核適合多線程任務(如 3D 渲染)
  6. 支持的指令集和擴展能力

如何衡量GPU的性能好壞?

1.通過“代”

前兩位數字代表“代”: 40xx (第40代), 30xx (第30代), 20xx (第20代)。“代”通常指的是其底層的架構 (Architecture)。每一代新架構的發布,通常會帶來工藝制程的進步和其他改進。也就是新一代架構的目標是在能效比和絕對性能上超越前一代同型號的產品

2.通過級別

后面的數字代表“級別”:

? - xx90: 通常是該代的消費級旗艦或次旗艦,性能最強,顯存最大 (如 RTX 4090, RTX 3090)

? - xx80: 高端型號,性能強勁,顯存較多 (如 RTX 4080, RTX 3080)

? - xx70: 中高端,甜點級,性能和價格平衡較好 (如 RTX 4070, RTX 3070)

? - xx60: 主流中端,性價比較高,適合入門或預算有限 (如 RTX 4060, RTX 3060)

? - xx50: 入門級,深度學習能力有限

3.通過后綴

Ti 通常是同型號的增強版,性能介于原型號和更高一級型號之間 (如 RTX 4070 Ti 強于 RTX 4070,小于4080)

4.通過顯存容量 VRAM (最重要!!)

他是GPU 自身的獨立高速內存,用于存儲模型參數、激活值、輸入數據批次等。單位通常是 GB(例如 8GB, 12GB, 24GB, 48GB)。如果顯存不足,可能無法加載模型,或者被迫使用很小的批量大小,從而影響訓練速度和效果

1、GPU訓練

要讓模型在 GPU 上訓練,主要是將模型和數據遷移到 GPU 設備上。在 PyTorch 里,.to(device) 方法的作用是把張量或者模型轉移到指定的計算設備(像 CPU 或者 GPU)上

  • 對于張量(Tensor):調用 .to(device) 之后,會返回一個在新設備上的新張量
  • 對于模型(nn.Module):調用 .to(device) 會直接對模型進行修改,讓其所有參數和緩沖區都移到新設備上

在進行計算時,所有輸入張量和模型必須處于同一個設備,要是它們不在同一設備上,就會引發運行時錯誤。并非所有 PyTorch 對象都有 .to(device) 方法,只有繼承自 torch.nn.Module 的模型以及 torch.Tensor 對象才有此方法

我這里用的kaggle的云服務器(算力平臺真的很推薦,環境啥的都配置好了,猛猛用就行),遷移到GPU時先看看CUDA,再設置一下設備

import torch# ----------- cell 1 ------------
# 檢查CUDA是否可用
if torch.cuda.is_available():print("CUDA可用!")# 獲取可用的CUDA設備數量device_count = torch.cuda.device_count()print(f"可用的CUDA設備數量: {device_count}")# 獲取當前使用的CUDA設備索引current_device = torch.cuda.current_device()print(f"當前使用的CUDA設備索引: {current_device}")# 獲取當前CUDA設備的名稱device_name = torch.cuda.get_device_name(current_device)print(f"當前CUDA設備的名稱: {device_name}")# 獲取CUDA版本cuda_version = torch.version.cudaprint(f"CUDA版本: {cuda_version}")# 查看cuDNN版本(如果可用)print("cuDNN版本:", torch.backends.cudnn.version())else:print("CUDA不可用。")# ------------ cell 2 ------------
# 設置GPU設備
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"使用設備: {device}")

代碼改動很小,就是張量和模型實例化的時候改一改

# 轉換為張量
x_train = torch.FloatTensor(x_train).to(device)
x_test = torch.FloatTensor(x_test).to(device)
y_train = torch.LongTensor(y_train).to(device)
y_test = torch.LongTensor(y_test).to(device)# 實例化網絡
model = MLP().to(device)

CPU和GPU都用kaggle的跑,CPU訓練用時0.3726秒,GPU訓練用時0.7579秒,照理說GPU會更快對吧。但對于非常小的數據集和簡單的模型,CPU通常會比GPU更快,本質是因為GPU在計算的時候,相較于cpu多了3個時間上的開銷:

  • 數據傳輸開銷 (CPU 內存 <-> GPU 顯存),對于少量數據和非常快速的計算任務,這個傳輸時間可能比 GPU 通過并行計算節省下來的時間還要長
  • 核心啟動開銷 (GPU 核心啟動時間),GPU執行的每個操作都涉及到在GPU上啟動一個“核心”(kernel),如果核心內的實際計算量非常小(本項目的小型網絡和鳶尾花數據),這個啟動開銷在總時間中的占比就會比較大
  • 性能浪費:計算量和數據批次,這個數據量太少,GPU的很多計算單元都沒有被用到,即使用了全批次也沒有用到的全部計算單元

所以綜上所述,GPU適合大型數據集,大型模型,復雜繁瑣的并行計算操作

2、__call__方法

在 Python 中,__call__ 方法是一個特殊的魔術方法(雙下劃線方法),如果一個類定義了 __call__?方法,它的實例可以通過 實例名() 的方式調用,就像調用函數一樣,這種特性使得對象可以表現得像函數,同時保留對象的內部狀態

舉個例子,之前訓練時要選定損失函數,nn.CrossEntropyLoss() 是一個類,criterion 是它的實例,criterion(output, y_train) 實際上是?criterion.__call__(output, y_train),這個__call__方法內部會計算交叉熵損失,并返回結果

criterion = nn.CrossEntropyLoss()  # 實例化損失函數
loss = criterion(output, y_train)  # 像函數一樣調用

說白了,PyTorch 的損失函數、模型層(如?nn.Linear)等模塊都通過__call__方法來實現相應的功能,它們內部可能保存了參數和狀態,每次調用時利用這些狀態進行計算,所以用的時候一定要記住實例化(加括號),忘了好多次總會出莫名其妙的錯誤

判斷到底是函數還是類的實例化,可以看官方文檔決定,但是看看命名也是好方法:

  • 類名:通常首字母大寫(如?CrossEntropyLoss, torch.FloatTensor

  • 函數名:全小寫(如sum,add

@浙大疏錦行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84501.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Newtonsoft Json序列化數據不序列化默認數據

問題描述 數據在序列號為json時,一些默認值也序列化了,像旋轉rot都是0、縮放scal都是1,這樣的默認值完全可以去掉,減少和服務器通信數據量 核心代碼 數據結構字段增加[DefaultValue(1.0)]屬性,縮放的默認值為1 public class Vec3DataOne{[DefaultValue(1.0)] public flo…

可增添功能的鼠標右鍵優化工具

軟件介紹 本文介紹一款能優化Windows電腦的軟件&#xff0c;它可以讓鼠標右鍵菜單添加多種功能。 軟件基本信息 這款名為Easy Context Menu的鼠標右鍵菜單工具非常小巧&#xff0c;軟件大小僅1.14MB&#xff0c;打開即可直接使用&#xff0c;無需進行安裝。 添加功能列舉 它…

Gemini 2.5 Pro 一次測試

您好&#xff0c;您遇到的重定向循環問題&#xff0c;即在 /user/messaging、/user/login?return_to/user/messaging 和 /user/login 之間反復跳轉&#xff0c;通常是由于客戶端的身份驗證狀態檢查和頁面重定向邏輯存在沖突或競爭條件。 在分析了您提供的代碼&#xff08;特別…

vue3前端后端地址可配置方案

在開發vue3項目過程中&#xff0c;需要切換不同的服務器部署&#xff0c;代碼中配置的服務需要可靈活配置&#xff0c;不隨著run npm build把網址打包到代碼資源中&#xff0c;不然每次切換都需要重新run npm build。需要一個配置文件可以修改服務地址&#xff0c;而打包的代碼…

大模型微調與高效訓練

隨著預訓練大模型(如BERT、GPT、ViT、LLaMA、CLIP等)的崛起,人工智能進入了一個新的范式:預訓練-微調(Pre-train, Fine-tune)。這些大模型在海量數據上學習到了通用的、強大的表示能力和世界知識。然而,要將這些通用模型應用于特定的下游任務或領域,通常還需要進行微調…

編程技能:字符串函數10,strchr

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;編程技能&#xff1a;字符串函數09&#xff0c;strncmp 回到目錄…

動態規劃-53.最大子數組和-力扣(LeetCode)

一、題目解析 在給定順序的數組中找出一段具有最大和的連續子數組&#xff0c;且大小最小為1. 二、算法原理 1.狀態表示 我們可以意一一枚舉出所有的子數組&#xff0c;但我們想要的是最大子數組&#xff0c;所以f[i]表示&#xff1a;以i位置為結尾&#xff0c;所有子數組的最…

C++ queue對象創建、queue賦值操作、queue入隊、出隊、獲得隊首、獲得隊尾操作、queue大小操作、代碼練習

對象創建&#xff0c;代碼見下 #include<iostream> #include<queue>using namespace std;int main() {// 1 默認構造函數queue<int> q1;// 2 拷貝構造函數queue<int> q2(q1);return 0;} queue賦值操作&#xff0c;代碼見下 #include<iostream>…

全鏈路解析:影刀RPA+Coze API自動化工作流實戰指南

在數字化轉型加速的今天&#xff0c;如何通過RPA與API的深度融合實現業務自動化提效&#xff0c;已成為企業降本增效的核心命題。本文以「影刀RPA」與「Coze API」的深度協作為例&#xff0c;系統性拆解從授權配置、數據交互到批量執行的完整技術鏈路&#xff0c;助你快速掌握跨…

php本地 curl 請求證書問題解決

錯誤: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for 解決方案 在php目錄下創建證書文件夾, 執行下面生成命令, 然后在php.ini 文件中配置證書路徑; 重啟環境 curl --eta…

【圖數據庫】--Neo4j 安裝

目錄 1.Neo4j --概述 2.JDK安裝 3.Neo4j--下載 3.1.下載資源包 3.2.創建環境變量 3.3.運行 Neo4j 是目前最流行的圖形數據庫(Graph Database)&#xff0c;它以節點(Node)、關系(Relationship)和屬性(Property)的形式存儲數據&#xff0c;專門為處理高度連接的數據而設計。…

MIT 6.S081 2020Lab5 lazy page allocation 個人全流程

文章目錄 零、寫在前面一、Eliminate allocation from sbrk()1.1 說明1.2 實現 二、Lazy allocation2.1 說明2.2 實現 三、Lazytests and Usertests3.1 說明3.2 實現3.2.1 lazytests3.2.2 usertests 零、寫在前面 可以閱讀下4.6頁面錯誤異常 像應用程序申請內存&#xff0c;內…

(Git) 稀疏檢出(Sparse Checkout) 拉取指定文件

文章目錄 &#x1f3ed;作用&#x1f3ed;指令總覽&#x1f477;core.sparseCheckout&#x1f477;sparse-checkout 文件 &#x1f3ed;實例演示?END&#x1f31f;交流方式 &#x1f3ed;作用 類似于 .gitignore 進行文件的規則匹配。 一般在需要拉取大型項目指定的某些文件…

docker初學

加載鏡像&#xff1a;docker load -i ubuntu.tar 導出鏡像&#xff1a;docker save -o ubuntu1.tar ubuntu 運行&#xff1a; docker run -it --name mu ubuntu /bin/bash ocker run -dit --name mmus docker.1ms.run/library/ubuntu /bin/bash 進入容器&#xff1a;docke…

Docker系列(二):開機自啟動與基礎配置、鏡像加速器優化與疑難排查指南

引言 docker 的快速部署與高效運行依賴于兩大核心環節&#xff1a;基礎環境搭建與鏡像生態優化。本期博文從零開始&#xff0c;系統講解 docker 服務的管理配置與鏡像加速實踐。第一部分聚焦 docker 服務的安裝、權限控制與自啟動設置&#xff0c;確保環境穩定可用&#xff1b…

計算機視覺(圖像算法工程師)學習路線

計算機視覺學習路線 Python基礎 常量與變量 列表、元組、字典、集合 運算符 循環 條件控制語句 函數 面向對象與類 包與模塊Numpy Pandas Matplotlib numpy機器學習 回歸問題 線性回歸 Lasso回歸 Ridge回歸 多項式回歸 決策樹回歸 AdaBoost GBDT 隨機森林回歸 分類問題 邏輯…

工業軟件國產化:構建自主創新生態,賦能制造強國建設

隨著全球產業環境的變化和技術的發展&#xff0c;建立自主可控的工業體系成為我國工業轉型升級、走新型工業化道路、推動國家制造業競爭水平提升的重要抓手。 市場倒逼與政策護航&#xff0c;國產化進程雙輪驅動 據中商產業研究院預測&#xff0c;2025年中國工業軟件市場規模…

OpenCV CUDA 模塊圖像過濾------創建一個高斯濾波器函數createGaussianFilter()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::createGaussianFilter 是 OpenCV CUDA 模塊中的一個工廠函數&#xff0c;用于創建一個高斯濾波器。這個濾波器可以用來平滑圖像&#…

【RocketMQ 生產者和消費者】- 生產者發送故障延時策略

文章目錄 1. 前言2. FaultItem3. LatencyFaultToleranceImpl 容錯集合處理類3.1 updateFaultItem 更新容錯集合3.2 isAvailable 判斷 broker 是否可用3.3 pickOneAtLeast 至少選出一個故障 broker 4. MQFaultStrategy 故障策略類4.1 屬性4.2 updateFaultItem 更新延遲故障容錯信…

【HarmonyOS 5】Map Kit 地圖服務之應用內地圖加載

#HarmonyOS SDK應用服務&#xff0c;#Map Kit&#xff0c;#應用內地圖 目錄 前期準備 AGC 平臺創建項目并創建APP ID 生成調試證書 生成應用證書 p12 與簽名文件 csr 獲取 cer 數字證書文件 獲取 p7b 證書文件 配置項目簽名 項目開發 配置Client ID 開通地圖服務 配…