Pytorch混合精度訓練最佳實踐

混合精度訓練(Mixed Precision Training)是一種通過結合單精度(FP32)和半精度(FP16/FP8)計算來加速訓練、減少顯存占用的技術。它在保持模型精度的同時,通常能帶來 2-3 倍的訓練速度提升,并減少約 50% 的顯存使用,是平衡訓練效率與數值穩定性的核心技術,尤其在大模型訓練中不可或缺。
以下從GradScaler 底層邏輯、避坑技巧(含 NaN 解決方案)、PyTorch Lightning 實戰三個維度展開,結合實戰細節提供更深入的最佳實踐。

一、核心思想

混合精度訓練的核心原理
傳統訓練使用 32 位浮點數(FP32)存儲參數和計算梯度,但研究發現:

  • 模型參數和激活值對精度要求較高(需 FP32)
  • 梯度計算和反向傳播對精度要求較低(可用 FP16)

混合精度訓練的核心邏輯:

  • 用 FP16 執行大部分計算(前向 / 反向傳播),加速運算并減少顯存
  • 用 FP32 保存模型參數和優化器狀態,確保數值穩定性
  • 通過 “損失縮放”(Loss Scaling)解決 FP16 梯度下溢問題

二、GradScaler 縮放機制:從原理到細節

GradScaler 的核心是解決 FP16 梯度下溢問題,但縮放邏輯并非簡單的固定倍數,而是動態自適應的。理解其底層邏輯能更好地控制訓練穩定性。

  1. 核心流程

    • 縮放損失:將損失乘以一個縮放因子(初始值通常為 2^16),使梯度按比例放大,避免下溢;
    • 反向傳播:用縮放后的損失計算梯度(FP16);
    • 梯度修正:將梯度除以縮放因子,恢復真實梯度值;
    • 參數更新:用修正后的梯度更新參數(FP32)。
  2. 縮放因子的動態調整邏輯
    GradScaler 維護一個初始縮放因子(默認2^16),并根據每次迭代的梯度是否溢出動態調整:

    • 無溢出:若連續多次(默認2000次)未溢出,縮放因子乘以growth_factor(默認1.0001),逐步放大以更充分利用 FP16 范圍;
    • 有溢出:縮放因子乘以backoff_factor(默認0.5),并跳過本次參數更新(避免錯誤梯度影響模型)
    # 查看當前縮放因子(調試用)
    print(scaler.get_scale())  # 輸出當前縮放因子值
    
  3. PyTorch 原生混合精度訓練實現

import torch
import torch.nn as nn
from torch.optim import Adam# 1. 初始化模型、損失函數、優化器
model = nn.Linear(10, 2).cuda()
criterion = nn.CrossEntropyLoss()
optimizer = Adam(model.parameters(), lr=1e-3)# 2. 初始化GradScaler(關鍵)
scaler = torch.cuda.amp.GradScaler()# 3. 訓練循環
for inputs, labels in train_loader:inputs, labels = inputs.cuda(), labels.cuda()# 清零梯度optimizer.zero_grad()# 前向傳播:用FP16計算(torch.cuda.amp.autocast上下文)with torch.cuda.amp.autocast():  # 自動將FP32操作轉為FP16(支持的操作)outputs = model(inputs)loss = criterion(outputs, labels)  # 損失仍以FP32計算(更穩定)# 反向傳播:縮放損失,計算梯度scaler.scale(loss).backward()  # 縮放損失,避免梯度下溢# 梯度裁剪(可選,防止梯度爆炸)scaler.unscale_(optimizer)  # 先將梯度恢復(除以縮放因子)torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)  # 裁剪梯度# 更新參數:用修正后的梯度scaler.step(optimizer)  # 僅當梯度未溢出時更新(內部會判斷)# 更新縮放因子(動態調整)scaler.update()  # 若本次無溢出,增大因子;若溢出,減小因子并跳過本次更新

關鍵細節:

  • torch.cuda.amp.autocast:自動將支持 FP16 的操作轉為 FP16(如卷積、線性層),不支持的仍用 FP32(如 softmax);
    • 在 torch.cuda.amp.autocast 上下文(混合精度訓練)中,損失函數默認以 FP32 計算以提高數值穩定性:
      • 損失值通常較小:模型輸出的損失(如交叉熵、MSE)數值范圍往往較小(例如 1e-3 ~ 10),FP16 的小數精度有限(僅能精確表示 1e-4 以上的數值),若用 FP32 計算可避免精度損失。
      • 梯度計算的起點:損失是反向傳播的起點,其精度直接影響梯度的準確性。FP32 損失能提供更穩定的梯度初始值,減少后續梯度下溢 / 爆炸的風險。
    • 實際上,autocast 上下文會自動判斷操作是否適合 FP16:
      • 對于計算密集型操作(如卷積、線性層),自動轉為 FP16 以提升速度;
      • 對于精度敏感操作(如損失計算、softmax、 BatchNorm),默認保留 FP32 或自動回退到 FP32。
  • scaler.step(optimizer):內部會檢查梯度是否溢出(若梯度為 inf/NaN 則跳過更新);
  • 保存 / 加載 checkpoint 時,需同步保存scaler.state_dict(),否則縮放因子狀態丟失會導致訓練不穩定。

三、避免 Loss 為 NaN 的實踐方法

Loss 為 NaN 通常源于數值不穩定(梯度爆炸 / 下溢、極端值計算),可從以下方面解決:

  1. 控制梯度范圍

    • 梯度裁剪:如上述代碼中clip_grad_norm_,限制梯度 L2 范數(建議 max_norm=1.0~10.0);
    • 調整 GradScaler 參數:通過growth_factor(默認 1.0001,增大因子的速度)和backoff_factor(默認 0.5,減小因子的速度)控制縮放因子,避免過度放大導致梯度爆炸。
     # 更保守的scaler配置(適合易溢出場景)scaler = torch.cuda.amp.GradScaler(init_scale=2.**10,  # 初始縮放因子(默認2^16,減小初始值更保守)growth_factor=1.1,backoff_factor=0.8)
    
  2. 檢查數據與標簽

    • 確保輸入數據無異常值(如 inf/NaN),可通過torch.isnan(inputs).any()檢查;
    • 標簽需在有效范圍內(如分類任務標簽不超過類別數)。
  3. 調整關鍵計算為 FP32

    • 部分操作在 FP16 下易不穩定(如 softmax、交叉熵、BatchNorm),可強制用 FP32 計算:
     with torch.cuda.amp.autocast():outputs = model(inputs)# 強制損失計算用FP32loss = criterion(outputs.float(), labels)  # 將outputs轉為FP32
    
  4. 降低學習率

    • 過大的學習率可能導致參數更新幅度過大,引發數值爆炸。建議初始學習率比 FP32 訓練時小(如縮小 10 倍),再逐步調整。
  5. 禁用FP16的 BatchNorm/LayerNorm/RevIN等

    • BatchNorm 在 FP16 下可能因均值 / 方差計算精度不足導致不穩定,可強制用 FP32:
    for m in model.modules():if isinstance(m, nn.BatchNorm2d):m.float()  # 將BatchNorm參數轉為FP32
    

四、PyTorch Lightning 實現混合精度訓練

PyTorch Lightning 通過封裝torch.cuda.amp,大幅簡化混合精度訓練流程,只需在Trainer中設置precision參數。

import pytorch_lightning as pl
from torch.utils.data import DataLoader, Datasetclass MyDataset(Dataset):def __len__(self): return 1000def __getitem__(self, idx): return torch.randn(10), torch.randint(0, 2, (1,)).item()class LitModel(pl.LightningModule):def __init__(self):super().__init__()self.model = nn.Linear(10, 2)self.criterion = nn.CrossEntropyLoss()def training_step(self, batch, batch_idx):x, y = batchlogits = self.model(x)loss = self.criterion(logits, y)self.log("train_loss", loss)return lossdef configure_optimizers(self):return Adam(self.parameters(), lr=1e-3)# 訓練器配置(關鍵:設置precision)
trainer = pl.Trainer(max_epochs=10,accelerator="gpu",devices=1,precision=16,  # 16: FP16混合精度;"bf16": BF16混合精度;32: 純FP32gradient_clip_val=1.0  # 梯度裁剪(防NaN)
)# 啟動訓練
model = LitModel()
train_loader = DataLoader(MyDataset(), batch_size=32)
trainer.fit(model, train_loader)

高級配置

  • 自定義 GradScaler:若需調整 scaler 參數,可重寫configure_gradient_clipping:
    def configure_gradient_clipping(self, optimizer, optimizer_idx, gradient_clip_val, gradient_clip_algorithm):scaler = self.trainer.scaler  # 獲取Lightning內部的scalerscaler._init_scale = 2.** 10  # 調整初始縮放因子super().configure_gradient_clipping(optimizer, optimizer_idx, gradient_clip_val, gradient_clip_algorithm)
    

五、模型層面避坑點

在混合精度訓練中,模型層面需要針對性修改的模塊主要是那些對數值精度敏感、容易在 FP16(半精度)下產生不穩定的組件。這些模塊的特性(如動態范圍大、依賴精確統計量計算)使其在低精度下容易出現梯度下溢、數值爆炸或精度損失,需要特殊處理。以下是需要重點關注和修改的模塊及具體策略:

  1. 歸一化層(BatchNorm/GroupNorm/LayerNorm)
    歸一化層依賴均值(mean)和方差(variance)的統計量計算,這些值通常較小(接近 0),在 FP16 下可能因精度不足導致數值不穩定(如方差變為 0,引發除以 0 錯誤)。此外,歸一化層的縮放參數(gamma/beta)若動態范圍大,也容易在 FP16 下溢出。
    修改策略:
  • 強制使用 FP32 參數和統計量:
    • 將歸一化層的權重(weight)、偏置(bias)及運行統計量(running_mean/running_var)保留在 FP32 精度,僅計算過程中的中間結果可使用 FP16。
      for m in model.modules():if isinstance(m, (nn.BatchNorm2d, nn.BatchNorm1d, nn.GroupNorm, nn.LayerNorm)):m.float()  # 強制參數為FP32# 對于LayerNorm,可進一步固定eps避免過小值if isinstance(m, nn.LayerNorm):m.eps = 1e-5  # 增大eps,避免除以接近0的方差
      
  1. 激活函數(Softmax/LogSoftmax/Sigmoid 等)
  • Softmax/LogSoftmax 數值穩定化:
    減去輸入的最大值(不改變結果),避免指數運算溢出:
    def safe_softmax(x, dim=-1):x = x - x.max(dim=dim, keepdim=True).values  # 數值穩定技巧return torch.softmax(x, dim=dim)# 替換模型中的原生Softmax
    model.classifier.softmax = safe_softmax  # 假設模型最后一層有softmax
    
  • 激活函數輸入截斷:
    對輸入范圍進行限制,避免極端值進入激活函數:
    class SafeSigmoid(nn.Module):def forward(self, x):x = torch.clamp(x, min=-10, max=10)  # 截斷到[-10,10],避免梯度下溢return torch.sigmoid(x)
    
  • 優先使用 FP32 計算激活:
    對敏感激活函數,強制在 FP32 下計算:
    with torch.cuda.amp.autocast():x = model.conv(x)  # FP16計算x = x.float()  # 轉為FP32x = torch.softmax(x, dim=-1)  # FP32下計算softmax
    
  1. 損失函數(CrossEntropy/MSE 等)
    • 損失計算強制 FP32:
      將模型輸出轉為 FP32 后再計算損失,避免低精度導致的不穩定:
    with torch.cuda.amp.autocast():logits = model(inputs)  # FP16輸出# 轉為FP32計算損失loss = criterion(logits.float(), labels)
    
  • 損失值截斷或縮放:
    對回歸任務的 MSE 損失,可先縮放目標值到合理范圍(如[-1,1]),或對損失值進行截斷:
    def safe_mse_loss(pred, target):pred = torch.clamp(pred, min=-1000, max=1000)  # 截斷預測值target = torch.clamp(target, min=-1000, max=1000)return torch.nn.functional.mse_loss(pred, target)
    
  1. 優化器
    • 優化器參數保留 FP32:
      PyTorch 默認會將優化器狀態(如 Adam 的 m 和 v)存儲為與參數相同的精度,需強制用 FP32:
    # 初始化優化器時指定參數為FP32
    optimizer = Adam([p.float() for p in model.parameters()], lr=1e-3)
    
  2. 模塊修改優先級
    • 最高優先級:BatchNorm/GroupNorm(統計量敏感)、Softmax/LogSoftmax(易溢出);
    • 高優先級:Transformer 注意力機制(分數計算范圍大)、交叉熵損失(log 運算敏感);
    • 中等優先級:Sigmoid 等激活函數(梯度易下溢)、優化器狀態(需 FP32 累積);
    • 低優先級:卷積層 / 線性層(PyTorch 對其 FP16 支持較好,通常無需修改)。

通過針對性修改這些模塊,可在混合精度訓練中顯著提升數值穩定性,避免因精度問題導致的 Loss 為 NaN 或模型收斂異常。實際應用中,建議結合訓練日志(如監控縮放因子變化、梯度范圍)逐步調整,找到最適合模型的配置。

六、PyTorch Lightning 中手動指定模塊用 FP32 的方法

PyTorch Lightning(PL)雖然自動封裝了混合精度邏輯,但仍支持手動控制特定模塊的精度(如強制某層用 FP32)。核心思路是在模塊的前向傳播中顯式轉換數據類型,或局部禁用 autocast。

  1. 方法一:在模型層中顯式轉換為 FP32
    適用于需要對特定模塊(如 BatchNorm、損失計算)強制 FP32 的場景,直接在模塊的 forward 方法中轉換輸入 / 參數類型:
import pytorch_lightning as pl
import torch
import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super().__init__()self.conv = nn.Conv2d(3, 64, 3)  # 常規卷積層(可FP16)self.bn = nn.BatchNorm2d(64)     # 對精度敏感的BN層(強制FP32)self.fc = nn.Linear(64, 10)      # 輸出層(可FP16)def forward(self, x):# 1. 卷積層:默認FP16(PL的autocast生效)x = self.conv(x)# 2. BN層:強制FP32計算x = x.float()  # 輸入轉為FP32x = self.bn(x)  # BN層參數已在初始化時設為FP32(見下方)x = x.half()   # 轉回FP16,不影響后續層# 3. 全連接層:默認FP16x = self.fc(x)return xclass LitModel(pl.LightningModule):def __init__(self):super().__init__()self.model = MyModel()# 強制BN層參數為FP32(關鍵)for m in self.model.modules():if isinstance(m, nn.BatchNorm2d):m.float()  # 權重和統計量用FP32self.criterion = nn.CrossEntropyLoss()def training_step(self, batch, batch_idx):x, y = batchlogits = self.model(x)# 2. 損失計算:強制FP32(類似原生PyTorch)loss = self.criterion(logits.float(), y)  # logits轉為FP32self.log("train_loss", loss)return lossdef configure_optimizers(self):return torch.optim.Adam(self.parameters(), lr=1e-3)
  1. 方法二:局部禁用 autocast 上下文
    若需要某段代碼完全禁用混合精度(強制 FP32),可使用 torch.cuda.amp.autocast(enabled=False) 覆蓋 PL 的全局設置:
class LitModel(pl.LightningModule):def training_step(self, batch, batch_idx):x, y = batch# PL會自動開啟autocast,但可局部禁用with torch.cuda.amp.autocast(enabled=False):  # 此范圍內強制FP32# 例如:對敏感操作(如注意力分數計算)強制FP32logits = self.model(x.float())  # 輸入轉為FP32loss = self.criterion(logits, y)self.log("train_loss", loss)return loss
  1. 方法三:通過 PrecisionPlugin 自定義精度策略
    對于更復雜的場景(如部分模塊用 FP16、部分用 FP32),可自定義 PrecisionPlugin 控制全局精度邏輯:
from pytorch_lightning.plugins import MixedPrecisionPlugin# 自定義混合精度插件
class CustomMixedPrecisionPlugin(MixedPrecisionPlugin):def __init__(self):super().__init__(precision=16, scaler=torch.cuda.amp.GradScaler())def autocast_context_manager(self):# 全局默認開啟autocast,但可在模型中局部禁用return torch.cuda.amp.autocast(dtype=torch.float16)# 在Trainer中使用自定義插件
trainer = pl.Trainer(accelerator="gpu",precision=16,plugins=[CustomMixedPrecisionPlugin()],max_epochs=10
)
  1. 總結
    在大多數情況下,torch.cuda.amp.autocast 能夠自動判斷操作是否適合 FP16,無需手動干預(如強制類型轉換)。PyTorch 對 autocast 的設計目標就是 “開箱即用”,通過內置的操作映射規則,自動為不同操作選擇最優精度。
    autocast 內部維護了一份操作 - 精度映射表,對 PyTorch 原生算子(如卷積、線性層、激活函數等)做了精細化適配:
    • 優先 FP16 的操作:計算密集型且對精度不敏感的操作,如 nn.Conv2d、nn.Linear、nn.ReLU 等,這些操作在 FP16 下速度提升明顯,且精度損失可接受。
    • 自動回退 FP32 的操作:精度敏感或易溢出的操作,如:
      • 損失函數(nn.CrossEntropyLoss、nn.MSELoss 等);
      • 歸一化層(nn.BatchNorm、nn.LayerNorm 的內部統計量計算);
      • 數值不穩定的操作(torch.softmax、torch.log_softmax 等)。
      • 例如,當你在 autocast 上下文內調用 loss = criterion(outputs, labels) 時,即使 outputs 是 FP16,PyTorch 也會自動將其轉換為 FP32 進行損失計算,再將損失以 FP32 輸出 —— 整個過程無需手動干預。

盡管 autocast 設計得很智能,但在自定義操作或復雜模型結構中,可能出現自動適配不符合預期的情況,此時需要手動控制精度。常見場景包括:

  • 自定義算子或未被 autocast 覆蓋的操作
    如果模型中包含 PyTorch 原生算子之外的自定義操作(如自研 CUDA 算子、特殊數學運算),autocast 可能無法識別,導致其默認使用 FP32(影響速度)或錯誤使用 FP16(導致精度問題)。比如在時間序列模型經常使用RevIN模塊,該模塊為了解決時序的分布漂移,如果不手動干預,torch.amp.autocast是不能很好處理的.
  • 模型中間層出現數值異常(如溢出 / 下溢)
    即使使用原生算子,某些特殊場景(如輸入值范圍極端、模型深度過深)可能導致中間層數值異常(如 FP16 下卷積輸出突然變為 inf)。此時需對異常層手動干預。
  • 對精度有極致要求的場景
    某些任務(如醫療影像、高精度回歸)對數值精度要求極高,即使 autocast 自動適配,也可能需要關鍵模塊強制 FP32 以減少精度損失。

簡言之,autocast 的自動適配是 “最優解”,手動干預僅作為 “異常修復手段”。實際開發中,建議先依賴自動適配,遇到問題再針對性調整。

七、Debug問題定位

在 PyTorch Lightning(PL)混合精度訓練中出現 Loss 為 NaN,通常是數值不穩定累積的結果(而非突然出現)。定位問題需要從數據→模型→訓練機制→混合精度配置逐步排查,結合 PL 的調試工具可高效定位根因。以下是具體的 debug 流程和操作方法:

7.1 復現與簡化:縮小問題范圍

首先通過簡化實驗快速復現問題,排除偶然因素:

  1. 縮短訓練流程:用fast_dev_run=True讓模型快速跑 1 個 batch 的訓練 + 驗證,觀察是否立即出現 NaN(排除多 epoch 累積效應)。
trainer = pl.Trainer(fast_dev_run=True,  # 快速驗證流程precision=16,accelerator="gpu"
)
  1. 固定隨機種子:確保結果可復現,排除數據隨機波動導致的偶然 NaN:
pl.seed_everything(42, workers=True)  # 固定所有隨機種子
  1. 減少 batch size:若大 batch 下出現 NaN,嘗試batch_size=1,判斷是否與數據分布不均相關。

7.2 模型層面:定位敏感模塊的數值不穩定

混合精度下,模型中對精度敏感的模塊(如歸一化層、激活函數、注意力分數)易成為 NaN 源頭。可通過模塊輸出監控和精度隔離測試定位問題。

  1. 監控模塊輸出范圍
    在模型的關鍵模塊后添加輸出范圍監控,追蹤數值是否異常膨脹:
class MyModel(nn.Module):def __init__(self):super().__init__()self.conv = nn.Conv2d(3, 64, 3)self.bn = nn.BatchNorm2d(64)self.relu = nn.ReLU()def forward(self, x):x = self.conv(x)# 監控卷積層輸出(易數值膨脹)if torch.isnan(x).any():print("Conv層輸出NaN!")self.log("conv_max", x.max().item())  # 記錄到PL日志x = self.bn(x)# 監控BN層輸出(方差為0會導致NaN)self.log("bn_max", x.max().item())x = self.relu(x)self.log("relu_max", x.max().item())return x

重點關注:

  • 卷積 / 線性層輸出是否突然增大(如超過1e4);
  • BN 層輸出是否出現inf(可能因方差為 0 導致);
  • 激活函數(如 ReLU)后是否仍有極端值(說明激活未起到截斷作用)。
  1. 隔離測試:逐步禁用模塊的 FP16
    若懷疑某模塊在 FP16 下不穩定,可強制其用 FP32 計算,觀察是否消除 NaN(即 “精度隔離測試”):

7.4 混合精度機制:檢查 GradScaler 與精度切換

PL 的混合精度依賴GradScaler和autocast,若這兩者配置不當,會直接導致梯度溢出或參數更新異常。

  1. 監控 GradScaler 的縮放因子
    縮放因子(scale)的異常變化是數值不穩定的重要信號:
    • 若縮放因子突然從1e4暴跌到1e-2,說明梯度頻繁溢出(Scaler 被迫減小因子);
    • 若縮放因子持續為初始值(如2^16)且無增長,可能存在梯度下溢。
      在 PL 中可通過Trainer的log_every_n_steps監控縮放因子:
    # 在LightningModule中添加scaler監控
    def training_step(self, batch, batch_idx):# ... 前向傳播 ...self.log("scaler_scale", self.trainer.scaler.get_scale(), prog_bar=True)return loss
    
    應對措施:若縮放因子暴跌,說明當前學習率可能過大,可嘗試降低學習率(如縮小為原來的 1/10)。
  2. 檢查梯度是否溢出
    PL 的Trainer可啟用梯度異常檢測,定位梯度溢出的具體參數:
    trainer = pl.Trainer(precision=16,detect_anomaly=True,  # 啟用梯度異常檢測(會降低速度,僅調試用)accelerator="gpu"
    )
    
    啟用后,若梯度出現inf/NaN,會打印具體的參數名稱(如conv.weight),直接定位到異常模塊。
  3. 驗證是否是混合精度本身的問題
    對比純 FP32 訓練結果,判斷是否由混合精度機制導致:
    • 若純 FP32 訓練無 NaN,說明問題與混合精度的數值敏感相關;
    • 若純 FP32 仍有 NaN,說明問題在模型或數據本身(如學習率過大、數據異常)。

7.5 訓練配置:排查學習率與梯度裁剪

混合精度下,梯度經過縮放后,實際有效學習率可能被放大,導致參數更新幅度過大,最終引發 NaN。

  1. 降低學習率并監控參數更新幅度
    混合精度訓練的初始學習率建議為純 FP32 的 1/2~1/10(因梯度縮放可能等效放大學習率)。可在configure_optimizers中臨時降低學習率:
def configure_optimizers(self):optimizer = Adam(self.parameters(), lr=1e-4)  # 從1e-3降至1e-4return optimizer

同時監控參數更新幅度(更新前后的 L2 距離):

def training_step(self, batch, batch_idx):# ... 前向傳播 ...loss.backward()  # 手動觸發反向傳播(便于調試)if batch_idx % 10 == 0:  # 每10個batch檢查一次for name, param in self.named_parameters():if param.grad is not None:update_norm = (param.grad * self.optimizers().param_groups[0]['lr']).norm()self.log(f"update_{name}", update_norm, prog_bar=True)return loss

若更新幅度超過1e2,說明學習率可能過大。
2. 檢查梯度裁剪是否生效
PL 的gradient_clip_val參數若配置不當,可能導致梯度未被有效裁剪:

trainer = pl.Trainer(precision=16,gradient_clip_val=1.0,  # 裁剪梯度L2范數至1.0gradient_clip_algorithm="norm",  # 推薦用L2范數裁剪
)

可在training_step中驗證裁剪效果:

def training_step(self, batch, batch_idx):# ... 前向傳播與反向傳播 ...self.manual_backward(loss)  # 手動反向傳播(PL默認自動處理,顯式寫出方便調試)# 裁剪前檢查梯度范數grad_norm = torch.nn.utils.clip_grad_norm_(self.parameters(), max_norm=1.0, norm_type=2)self.log("grad_norm_before_clip", grad_norm, prog_bar=True)self.optimizers().step()self.optimizers().zero_grad()

若grad_norm_before_clip持續超過1.0,說明裁剪未生效(可能是 PL 版本 bug,可嘗試手動裁剪)。

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

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

相關文章

Qt C++動態庫SDK在Visual Studio 2022使用(C++/C#版本)

01 將C SDK 集成到 IDE 中以下是在 Microsoft Visual Studio 平臺下 SDK 的集成。2.1 Visual Studio 平臺下 C/C環境配置及集成到 IDE 中xxx.lib 和 xxx.dll 適合在 Windows 操作系統平臺使用,這里以 VS2022 環境為例。2.1.1 C/C 工程環境配置與集成1、C# SDK 接口…

大語言模型 LLM 通過 Excel 知識庫 增強日志分析,根因分析能力的技術方案(2):LangChain + LlamaIndex 實現

文章大綱 1 技術原理總覽 2 詳細實現步驟(含代碼) 2.1 環境準備 2.2 Excel → LlamaIndex 節點 2.3 構建向量索引(FAISS 本地) 2.4 Google Cloud 向量檢索(可選替換 FAISS) 2.5 LangChain 問答鏈 A. RAG 模式(向量檢索 + LLM 生成) B. SQL 模式(無 RAG,直接查表) 2.…

提升ARM Cortex-M系統性能的關鍵技術:TCM技術解析與實戰指南

文章目錄引言一、TCM基礎架構與工作原理1.1 TCM的物理特性1.2 與緩存機制的對比1.3 ARM Cortex-M系列對TCM的支持二、TCM的典型應用場景2.1 實時中斷處理2.2 低功耗模式下的待機代碼2.3 高性能算法執行2.4 系統初始化階段的關鍵代碼三、實戰指南:在STM32H7上配置和優…

大數據之路:阿里巴巴大數據實踐——大數據領域建模綜述

為什么需要數據建模 核心痛點 數據冗余:不同業務重復存儲相同數據(如用戶基礎信息),導致存儲成本激增。計算資源浪費:未經聚合的明細數據直接參與計算(如全表掃描),消耗大量CPU/內存…

實戰演練1:實戰演練之命名實體識別

實戰演練1:實戰演練之命名實體識別 命名實體識別簡介 代碼 命名實體識別簡介 什么是命名實體識別任務 命名實體識別(Named Entity Recognition,簡稱NER)是指識別文本中具有特定意義的實體,主要包括人名、地名、機構名、專有名詞等。通常包括兩部分: (1)實體邊界識別。(2)確定…

數據結構基礎內容(第七篇:堆、哈夫曼樹)

# 堆 Heap 優先隊列(Priority Queue) 結構性:用 *數組* 表示的完全二叉樹; 有序性:任一結點的關鍵字是其子樹所有結點的最大值(或最小值) * “最大堆(MaxHeap)”,也稱“大頂堆”:最大值 * “最小堆(MinHeap)”,也稱“小頂堆” :最小值 主要操作有: ? MaxHeap Create( i…

CS231n-2017 Lecture7訓練神經網絡(二)筆記

本節主要是神經網絡的動態部分,也就是神經網絡學習參數和搜索最優超參數的過程梯度檢查:進行梯度檢查,就是簡單地把解析梯度與數值計算梯度進行比較,防止反向傳播的邏輯出錯,僅在調試過程中使用。有如下技巧 &#xff…

IntelliJ IDEA 中左上方未顯示項目根目錄問題

問題: 在IDEA中編寫代碼時,發現左上方只顯示項目的子模塊,未顯示根項目名稱。 如圖所示,未顯示子模塊的根項目:問題分析 頂層根目錄未被識別為項目根目錄,需要手動添加識別。 問題解決 進入File – Project…

OpenCV 圖像變換全解析:從鏡像翻轉到仿射變換的實踐指南

前言處理圖像時,翻轉、旋轉、平移等操作很常用。OpenCV 提供了簡單的方法實現這些變換,本文帶你快速學會用它做圖像翻轉和仿射變換。1 圖像翻轉(圖像鏡像旋轉)在OpenCV中,圖片的鏡像旋轉是以圖像的中心為原點進行鏡像翻轉的。cv2.flip(img,fl…

【運維】Linux運維命令記錄

重置root密碼使用命令重新設置一下root賬戶的密碼 passwd root根據提示設置一下密碼,然后使用sudo -i 時輸入密碼就可以切換到root賬戶了ssh登陸以后,要用sudo -i命令給用戶提權,提到超級管理員,然后輸入密碼才有用

PandasAI連接LLM進行智能數據分析

1. 引言 Pandas是一個數據分析開源組件庫,提供了高性能、易用的數據結構和數據分析工具。它的核心的功能是其DataFrame對象,這是一個帶有行和列標簽的二維表格數據結構,支持缺失數據處理、時間序列功能、靈活的數據輸入輸出方法、數據對齊和…

Spring之【Bean的生命周期】

目錄 1、生成BeanDefinition BeanDefinitionRegistry接口 DefaultListableBeanFactory實現類 2、合并BeanDefnition AbstractBeanFactory類 3、BeanFactoryPostProcessor的方法回調 AbstractApplicationContext類 PostProcessorRegistrationDelegate類 4、BeanPostPro…

搜狐新聞直播間適配HarmonyOs實現點贊動畫

01背景介紹隨著新聞客戶端鴻蒙單框架系統適配工作的推進,從原來的基礎功能到現在已經適配全功能的85%以上。與此同時,我們也在持續深入挖掘鴻蒙系統的特性,以提升整體應用的質量與用戶體驗。在這一過程中,動畫作為增強交互與視覺體…

83、設置有人DTU設備USR-M100采集傳感器數據,然后上傳阿里云服務

基本思想:設置M100 采集傳感器數據 一、首先將DTU設備USR-M100連接路由器上,然后使用python代碼搜索同一局域網設備, import platform import sys import os import time import threadinglive_ip = 0def get_os():os = platform.system()if os == "Windows":re…

P1019 [NOIP 2000 提高組] 單詞接龍

題目描述單詞接龍是一個與我們經常玩的成語接龍相類似的游戲,現在我們已知一組單詞,且給定一個開頭的字母,要求出以這個字母開頭的最長的“龍”(每個單詞都最多在“龍”中出現兩次),在兩個單詞相連時&#…

詳解力扣高頻SQL50題之1633. 各賽事的用戶注冊率【簡單】

傳送門:1633. 各賽事的用戶注冊率 題目 用戶表: Users -------------------- | Column Name | Type | -------------------- | user_id | int | | user_name | varchar | -------------------- user_id 是該表的主鍵(具有唯一值的列)。 該表中的每行包…

FROM stakater/java8-alpine 構建cocker鏡像

在 Dockerfile 中,FROM stakater/java8-alpine 是第一條也是最核心的指令,它定義了構建新鏡像所基于的「基礎鏡像」。以下是逐層解析:🔍 關鍵字拆解 1. FROM —— 起點指令 ? 作用:聲明當前鏡像的起點(父鏡…

Word2Vec模型訓練全流程解析:從數據預處理到實體識別應用

請添加圖片描述 訓練Word2Vec模型 概述 問題 我們如何訓練Word2Vec模型?在特定數據集上訓練Word2Vec模型何時是有利的? 目標 理解在自有數據上訓練Word2Vec模型而非使用預訓練模型的優勢 Colab環境配置 運行以下代碼以啟用輔助函數并重新讀取數據…

在Ubuntu上使用QEMU學習RISC-V程序(2)gdb調試

文章目錄一、準備工作二、基本調試流程1. 設置斷點2. 執行程序3. 查看源代碼/匯編三、查看寄存器1. 查看通用寄存器2. 查看特殊寄存器四、查看內存1. 內存查看命令2. 內存修改命令五、調試實戰示例六、高級調試技巧1. 條件斷點2. 自動顯示3. 內存斷點(觀察點&#x…

不止于“亮”:一盞智慧路燈的技術進化史——塔能科技用“落地性”定義行業標準

在凌晨3點的園區道路之上,路燈會隨著車輛的靠近而自動亮起,待車輛逐漸遠去之后,又會緩緩地調暗下來;當電纜意外被觸碰的時候,系統能夠在短短3秒之內自動發出報警信息,并且推送出維修工單;而當一…