知識點回歸:
-
CPU性能的查看:看架構代際、核心數、線程數
-
GPU性能的查看:看顯存、看級別、看架構代際
-
GPU訓練的方法:數據和模型移動到GPU device上
-
類的call方法:為什么定義前向傳播時可以直接寫作self.fc1(x)
CPU性能的查看
上述是在cpu的情況下訓練,(即使安裝了cuda,但是沒有使用cuda),我們借這個機會簡單介紹下cpu的性能差異。
-
# pip install wmi -i https://pypi.tuna.tsinghua.edu.cn/simple # 這是Windows專用的庫,Linux和MacOS不支持,其他系統自行詢問大模型 # 我想查看一下CPU的型號和核心數 import wmic = wmi.WMI() processors = c.Win32_Processor()for processor in processors:print(f"CPU 型號: {processor.Name}")print(f"核心數: {processor.NumberOfCores}")print(f"線程數: {processor.NumberOfLogicalProcessors}")
?
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
這個常見錯誤就是輸入張量和模型處于不同的設備。
如何衡量GPU的性能好壞呢?
以RTX 3090 Ti, RTX 3080, RTX 3070 Ti, RTX 3070, RTX 4070等為例
通過“代” 前兩位數字代表“代”: 40xx (第40代), 30xx (第30代), 20xx (第20代)。“代”通常指的是其底層的架構 (Architecture)。每一代新架構的發布,通常會帶來工藝制程的進步和其他改進。也就是新一代架構的目標是在能效比和絕對性能上超越前一代同型號的產品。
通過級別 后面的數字代表“級別”,
xx90: 通常是該代的消費級旗艦或次旗艦,性能最強,顯存最大 (如 RTX 4090, RTX 3090)。
xx80: 高端型號,性能強勁,顯存較多 (如 RTX 4080, RTX 3080)。
xx70: 中高端,甜點級,性能和價格平衡較好 (如 RTX 4070, RTX 3070)。
xx60: 主流中端,性價比較高,適合入門或預算有限 (如 RTX 4060, RTX 3060)。
xx50: 入門級,深度學習能力有限。
通過后綴 Ti 通常是同型號的增強版,性能介于原型號和更高一級型號之間 (如 RTX 4070 Ti 強于 RTX 4070,小于4080)。
通過顯存容量 VRAM (最重要!!) 他是GPU 自身的獨立高速內存,用于存儲模型參數、激活值、輸入數據批次等。單位通常是 GB(例如 8GB, 12GB, 24GB, 48GB)。如果顯存不足,可能無法加載模型,或者被迫使用很小的批量大小,從而影響訓練速度和效果
訓練階段:小批量梯度是對真實梯度的一個有噪聲的估計。批量越小,梯度的方差越大(噪聲越大)。顯存小只能夠使用小批量梯度。
推理階段:有些模型本身就非常龐大(例如大型語言模型、高分辨率圖像的復雜 CNN 網絡)。即使你將批量大小減到 1,模型參數本身占用的顯存可能就已經超出了你的 GPU 顯存上限。
import torch# 檢查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不可用。")
CUDA可用!
可用的CUDA設備數量: 1
當前使用的CUDA設備索引: 0
當前CUDA設備的名稱: NVIDIA GeForce RTX 2060 SUPER
CUDA版本: 12.1
cuDNN版本: 90100
@浙大疏錦行?
?
?
?