Day 34

?GPU訓練
要讓模型在 GPU 上訓練,主要是將模型和數據遷移到 GPU 設備上。

在 PyTorch 里,.to(device) 方法的作用是把張量或者模型轉移到指定的計算設備(像 CPU 或者 GPU)上。

對于張量(Tensor):調用 .to(device) 之后,會返回一個在新設備上的新張量。
對于模型(nn.Module):調用 .to(device) 會直接對模型進行修改,讓其所有參數和緩沖區都移到新設備上。在進行計算時,所有輸入張量和模型必須處于同一個設備。要是它們不在同一設備上,就會引發運行時錯誤。并非所有 PyTorch 對象都有 .to(device) 方法,只有繼承自 torch.nn.Module 的模型以及 torch.Tensor 對象才有此方法。
RuntimeError: Tensor for argument #1 'input' is on CPU, but expected it to be on GPU 這個常見錯誤就是輸入張量和模型處于不同的設備。

import torchif torch.cuda.is_available():print("CUDA可用!")device_count = torch.cuda.device_count()print(f"可用的CUDA設備數量: {device_count}")current_device = torch.cuda.current_device()print(f"當前使用的CUDA設備索引: {current_device}")device_name = torch.cuda.get_device_name(current_device)print(f"當前CUDA設備的名稱: {device_name}")cuda_version = torch.version.cudaprint(f"CUDA版本: {cuda_version}")print("cuDNN版本:", torch.backends.cudnn.version())else:print("CUDA不可用。")iris = load_iris()
X = iris.data 
y = iris.target  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)X_train = torch.FloatTensor(X_train).to(device)
y_train = torch.LongTensor(y_train).to(device)
X_test = torch.FloatTensor(X_test).to(device)
y_test = torch.LongTensor(y_test).to(device)class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 = nn.Linear(4, 10)self.relu = nn.ReLU()self.fc2 = nn.Linear(10, 3)def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)return outmodel = MLP().to(device)criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)num_epochs = 20000
losses = []
start_time = time.time()for epoch in range(num_epochs):outputs = model(X_train)loss = criterion(outputs, y_train)optimizer.zero_grad()loss.backward()optimizer.step()losses.append(loss.item())if (epoch + 1) % 100 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')time_all = time.time() - start_time
print(f'Training time: {time_all:.2f} seconds')plt.plot(range(num_epochs), losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss over Epochs')
plt.show()

能夠優化的只有數據傳輸時間,針對性解決即可,很容易想到2個思路:
1. 直接不打印訓練過程的loss了,但是這樣會沒辦法記錄最后的可視化圖片,只能肉眼觀察loss數值變化。
2. 每隔200個epoch保存一下loss,不需要20000個epoch每次都打印,

下面先嘗試第一個思路:

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import numpy as npiris = load_iris()
X = iris.data 
y = iris.target  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)X_train = torch.FloatTensor(X_train)
y_train = torch.LongTensor(y_train)
X_test = torch.FloatTensor(X_test)
y_test = torch.LongTensor(y_test)class MLP(nn.Module): def __init__(self): super(MLP, self).__init__() self.fc1 = nn.Linear(4, 10)  self.relu = nn.ReLU()self.fc2 = nn.Linear(10, 3)  def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)return outmodel = MLP()criterion = nn.CrossEntropyLoss()optimizer = optim.SGD(model.parameters(), lr=0.01)num_epochs = 20000 losses = []import time
start_time = time.time() for epoch in range(num_epochs): outputs = model.forward(X_train)  # outputs = model(X_train) loss = criterion(outputs, y_train) optimizer.zero_grad() loss.backward(optimizer.step() if (epoch + 1) % 100 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')time_all = time.time() - start_time
print(f'Training time: {time_all:.2f} seconds')

優化后發現確實效果好,近乎和用cpu訓練的時長差不多。所以可以理解為數據從gpu到cpu的傳輸占用了大量時間。

下面嘗試下第二個思路:

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import time
import matplotlib.pyplot as pltdevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"使用設備: {device}")iris = load_iris()
X = iris.data 、
y = iris.target 、X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)X_train = torch.FloatTensor(X_train).to(device)
y_train = torch.LongTensor(y_train).to(device)
X_test = torch.FloatTensor(X_test).to(device)
y_test = torch.LongTensor(y_test).to(device)class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 = nn.Linear(4, 10)  self.relu = nn.ReLU()self.fc2 = nn.Linear(10, 3) def forward(self, x):out = self.fc1(x)out = self.relu(out)out = self.fc2(out)return outmodel = MLP().to(device)criterion = nn.CrossEntropyLoss()、
optimizer = optim.SGD(model.parameters(), lr=0.01)num_epochs = 20000 、losses = []start_time = time.time() 、for epoch in range(num_epochs):outputs = model(X_train)  、loss = criterion(outputs, y_train)optimizer.zero_grad()loss.backward()optimizer.step()if (epoch + 1) % 200 == 0:losses.append(loss.item()) # item()方法返回一個Python數值,loss是一個標量張量print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')if (epoch + 1) % 100 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')time_all = time.time() - start_time  、
print(f'Training time: {time_all:.2f} seconds')plt.plot(range(len(losses)), losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss over Epochs')
plt.show()

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

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

相關文章

C++筆試題(金山科技新未來訓練營):

題目分布: 17道單選(每題3分)3道多選題(全對3分,部分對1分)2道編程題(每一道20分)。 不過題目太多,就記得一部分了: 單選題: static變量的初始…

Spark(29)基礎自定義分區器

(一)什么是分區 【復習提問:RDD的定義是什么?】 在 Spark 里,彈性分布式數據集(RDD)是核心的數據抽象,它是不可變的、可分區的、里面的元素并行計算的集合。 在 Spark 中&#xf…

python打卡訓練營打卡記錄day35

知識點回顧: 三種不同的模型可視化方法:推薦torchinfo打印summary權重分布可視化進度條功能:手動和自動寫法,讓打印結果更加美觀推理的寫法:評估模式 作業:調整模型定義時的超參數,對比下效果 1…

【MySQL】07.表內容的操作

1. insert 我們先創建一個表結構,這部分操作我們使用這張表完成我們的操作: mysql> create table student(-> id int primary key auto_increment,-> name varchar(20) not null,-> qq varchar(20) unique-> ); Query OK, 0 rows affec…

使用SQLite Expert個人版VACUUM功能修復數據庫

使用SQLite Expert個人版VACUUM功能修復數據庫 一、SQLite Expert工具簡介 SQLite Expert 是一款功能強大的SQLite數據庫管理工具,分為免費的個人版(Personal Edition)和收費的專業版(Professional Edition)。其核心功…

LM-BFF——語言模型微調新范式

gpt3(GPT3——少樣本示例推動下的通用語言模型雛形)結合提示詞和少樣本示例后,展示出了強大性能。但大語言模型的訓練門檻太高,普通研究人員無力,LM-BFF(Making Pre-trained Language Models Better Few-shot Learners)的作者受gp…

遙感解譯項目Land-Cover-Semantic-Segmentation-PyTorch之二訓練模型

遙感解譯項目Land-Cover-Semantic-Segmentation-PyTorch之一推理模型 背景 上一篇文章了解了這個項目的環境安裝和模型推理,這篇文章介紹下如何訓練這個模型,添加類別 下載數據集 在之前的一篇文章中,也有用到這個數據集 QGIS之三十六Deepness插件實現AI遙感訓練模型 數…

【NLP 71、常見大模型的模型結構對比】

三到五年的深耕,足夠讓你成為一個你想成為的人 —— 25.5.8 模型名稱位置編碼Transformer結構多頭機制Feed Forward層設計歸一化層設計線性層偏置項激活函數訓練數據規模及來源參數量應用場景側重GPT-5 (OpenAI)RoPE動態相對編碼混合專家架構(MoE&#…

[250521] DBeaver 25.0.5 發布:SQL 編輯器、導航器全面升級,新增 Kingbase 支持!

目錄 DBeaver 25.0.5 發布:SQL 編輯器、導航器全面升級,新增 Kingbase 支持! DBeaver 25.0.5 發布:SQL 編輯器、導航器全面升級,新增 Kingbase 支持! 近日,DBeaver 發布了 25.0.5 版本&#xf…

服務器硬盤虛擬卷的處理

目前的情況是需要刪除邏輯卷,然后再重新來弄一遍。 數據已經備份好了,所以不用擔心數據會丟失。 查看服務器的具體情況 使用 vgdisplay 操作查看服務器的卷組情況: --- Volume group ---VG Name vg01System IDFormat …

Flutter 中 build 方法為何寫在 StatefulWidget 的 State 類中

Flutter 中 build 方法為何寫在 StatefulWidget 的 State 類中 在 Flutter 中,build 方法被設計在 StatefulWidget 的 State 類中而非 StatefulWidget 類本身,這種設計基于幾個重要的架構原則和實際考量: 1. 核心設計原因 1.1 生命周期管理…

傳統醫療系統文檔集中標準化存儲和AI智能化更新路徑分析

引言 隨著醫療數智化建設的深入推進,傳統醫療系統如醫院信息系統(HIS)、臨床信息系統(CIS)、護理信息系統(NIS)、影像歸檔與通信系統(PACS)和實驗室信息系統(LIS)已經成為了現代醫療機構不可或缺的技術基礎設施。這些系統各自承擔著不同的功能,共同支撐…

探索常識性概念圖譜:構建智能生活的知識橋梁

目錄 一、知識圖譜背景介紹 (一)基本背景 (二)與NLP的關系 (三)常識性概念圖譜的引入對比 二、常識性概念圖譜介紹 (一)常識性概念圖譜關系圖示例 (二&#xff09…

Linux/aarch64架構下安裝Python的Orekit開發環境

1.背景 國產化趨勢越來越強,從軟件到硬件,從操作系統到CPU,甚至顯卡,就產生了在國產ARM CPU和Kylin系統下部署Orekit的需求,且之前的開發是基于Python的,需要做適配。 2.X86架構下安裝Python/Orekit開發環…

Ctrl+鼠標滾動阻止頁面放大/縮小

項目場景: 提示:這里簡述項目相關背景: 一般在我們做大屏的時候,不希望Ctrl鼠標上下滾動的時候頁面會放大/縮小,那么在有時候,又不希望影響到別的頁面,比如說這個大屏是在另一個管理后臺中&am…

MySQL——復合查詢表的內外連

目錄 復合查詢 回顧基本查詢 多表查詢 自連接 子查詢 where 字句中使用子查詢 單行子查詢 多行子查詢 多列子查詢 from 字句中使用子查詢 合并查詢 實戰OJ 查找所有員工入職時候的薪水情況 獲取所有非manager的員工emp_no 獲取所有員工當前的manager 表的內外…

聊一下CSS中的標準流,浮動流,文本流,文檔流

在網絡上關于CSS的文章中,有時候能聽到“標準流”,“浮動流”,“定位流”等等詞語,還有像“文檔流”,“文本流”等詞,這些流是什么意思?它們是CSS中的一些布局方案和特性。今天我們就來聊一下CS…

python訓練營第33天

MLP神經網絡的訓練 知識點回顧: PyTorch和cuda的安裝查看顯卡信息的命令行命令(cmd中使用)cuda的檢查簡單神經網絡的流程 數據預處理(歸一化、轉換成張量)模型的定義 繼承nn.Module類定義每一個層定義前向傳播流程 定義…

JDK21深度解密 Day 1:JDK21全景圖:關鍵特性與升級價值

【JDK21深度解密 Day 1】JDK21全景圖:關鍵特性與升級價值 引言 歡迎來到《JDK21深度解密:從新特性到生產實踐的全棧指南》系列的第一天。今天我們將探討JDK21的關鍵特性和升級價值。作為近5年最重要的LTS版本,JDK21不僅帶來了性能上的巨大突…

[docker]更新容器中鏡像版本

從peccore-dev倉庫拉取鏡像 docker pull 10.12.135.238:8060/peccore-dev/configserver:v1.13.45如果報錯,請參考docker拉取鏡像失敗,添加倉庫地址 修改/etc/CET/Common/peccore-docker-compose.yml文件中容器的版本,為剛剛拉取的版本 # 配置中心confi…