Sliding Window Attention(滑動窗口注意力)解析: Pytorch實現并結合全局注意力(Global Attention )

Sliding Window Attention(滑動窗口注意力)解析


Sliding Window Attention(滑動窗口注意力)Longformer (來源:https://arxiv.org/pdf/2004.05150)提出的 稀疏注意力機制,旨在解決 標準 Transformer 計算復雜度隨序列長度增加呈二次增長 的問題。它的核心思想是:

  • 每個 token 僅關注局部窗口內的其他 token,而不是整個序列。
  • 計算復雜度從 ( O ( n 2 ) O(n^2) O(n2)) 降至 ( O ( n ? w ) O(n \cdot w) O(n?w)),其中 ( w w w) 是窗口大小。
  • 支持更長的文本處理,避免傳統 Transformer 處理長序列時的顯存和計算瓶頸。

該方法使 Transformer 能夠高效處理上千到上萬個 token 的長文本,特別適用于 文檔級任務,如長文摘要、法律文本分析、醫療文檔理解等。


1. 為什么需要 Sliding Window Attention?

1.1 傳統 Transformer 的問題

Transformer 的 自注意力(Self-Attention) 機制需要計算所有 token 之間的交互:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax} \left(\frac{QK^T}{\sqrt{d_k}} \right) V Attention(Q,K,V)=softmax(dk? ?QKT?)V
其中:

  • ( Q, K, V ) 分別是 查詢(Query)、鍵(Key)、值(Value) 矩陣,形狀為 ( n × d k n \times d_k n×dk? )。
  • 計算量為 ( O ( n 2 d k ) O(n^2 d_k) O(n2dk?) ),隨著序列長度 ( n n n ) 增加,計算量急劇上升。
  • 這導致 Transformer 無法處理長文本,因為顯存需求和計算復雜度都 隨 ( n 2 n^2 n2 ) 增長

1.2 Sliding Window Attention 解決了什么問題?

  • 局部注意力(Local Attention):每個 token 僅與附近窗口內的 token 交互,而不是整個序列。
  • 計算復雜度降低:從 ( O ( n 2 ) O(n^2) O(n2) ) 降為 ( O ( n ? w ) O(n \cdot w) O(n?w) ),其中 ( w w w ) 是窗口大小。
  • 顯存占用減少:只需要存儲窗口內的注意力權重,而非完整的 ( n × n n \times n n×n ) 矩陣。

這意味著,Sliding Window Attention 允許 Transformer 處理更長的序列,從傳統的 512 tokens 提高到 8K-16K tokens 甚至更長


2. Sliding Window Attention 計算原理

2.1 標準 Transformer Attention

在標準 Transformer 結構中:

  1. 每個 token 計算所有其他 token 的注意力權重
  2. 形成一個 ( n × n n \times n n×n ) 的注意力矩陣
  3. 計算復雜度:( O ( n 2 d ) O(n^2 d) O(n2d) )。

2.2 Sliding Window Attention

Sliding Window Attention 結構中:

  1. 每個 token 僅與窗口內的其他 token 交互
  2. 注意力矩陣變為稀疏矩陣,只有窗口大小 ( w w w ) 內的注意力權重被計算。
  3. 計算復雜度變為:( O ( n ? w ? d ) O(n \cdot w \cdot d) O(n?w?d) )。

示例:

  • 設 ( w = 5 w = 5 w=5 ),則:
    • 第 10 個 token 僅關注 [8, 9, 10, 11, 12]
    • 第 20 個 token 僅關注 [18, 19, 20, 21, 22]
    • 這樣每個 token 只計算 5 個注意力權重,而不是所有 n 個。

3. Sliding Window Attention 的 PyTorch 實現

以下是 Longformer 的 Sliding Window Attention 計算的 PyTorch 實現:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass SlidingWindowAttention(nn.Module):def __init__(self, embed_dim, num_heads, window_size):"""滑動窗口注意力機制Args:embed_dim: 詞嵌入維度 dnum_heads: 注意力頭的數量 hwindow_size: 滑動窗口大小 w"""super(SlidingWindowAttention, self).__init__()self.embed_dim = embed_dimself.num_heads = num_headsself.window_size = window_sizeself.head_dim = embed_dim // num_heads  # 每個頭的維度assert self.head_dim * num_heads == embed_dim, "embed_dim 必須是 num_heads 的整數倍"# 線性投影層self.q_proj = nn.Linear(embed_dim, embed_dim, bias=False)self.k_proj = nn.Linear(embed_dim, embed_dim, bias=False)self.v_proj = nn.Linear(embed_dim, embed_dim, bias=False)self.o_proj = nn.Linear(embed_dim, embed_dim, bias=False)def forward(self, x):"""前向傳播Args:x: 輸入張量 [batch, seq_len, embed_dim]Returns:輸出張量 [batch, seq_len, embed_dim]"""batch_size, seq_len, _ = x.shape# 計算 Q, K, VQ = self.q_proj(x).view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)  # [b, h, seq, d]K = self.k_proj(x).view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)V = self.v_proj(x).view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)# 初始化注意力矩陣attn_scores = torch.full((batch_size, self.num_heads, seq_len, seq_len), float("-inf"), device=x.device)# 計算滑動窗口注意力for i in range(seq_len):start = max(0, i - self.window_size)end = min(seq_len, i + self.window_size + 1)attn_scores[:, :, i, start:end] = torch.matmul(Q[:, :, i, :], K[:, :, start:end, :].transpose(-2, -1))# 歸一化attn_scores /= self.head_dim ** 0.5attn_weights = F.softmax(attn_scores, dim=-1)# 計算注意力加權的 Valueoutput = torch.matmul(attn_weights, V)# 重新排列形狀output = output.transpose(1, 2).contiguous().view(batch_size, seq_len, self.embed_dim)output = self.o_proj(output)  # 線性變換回原始維度return output

4. Sliding Window Attention 的優缺點

? 優點

  • 計算復雜度降低:從 ( O ( n 2 ) O(n^2) O(n2) ) 降至 ( O ( n ? w ) O(n \cdot w) O(n?w) )。
  • 可擴展到長序列:支持 8K-16K tokens 甚至更長。
  • 適用于文檔級任務:如長文摘要、法律分析、醫療 NLP 任務。

? 缺點

  • 不能捕捉遠距離依賴:只能處理窗口范圍內的 token 交互。
  • 需要全局注意力補充:必須結合 Global Attention 來補充遠程信息(例如 CLS 位置)。

5. 結論

  • Sliding Window Attention 解決了 Transformer 計算復雜度隨序列長度二次增長的問題
  • 通過限制每個 token 只關注局部窗口內的 token,使得計算復雜度降低為 ( O ( n ? w ) O(n \cdot w) O(n?w) )
  • 適用于長文本處理,并可結合 Global Attention 進一步提升模型性能

🚀 這是 Transformer 在長文本任務上的關鍵優化方案之一!

Sliding Window Attention 如何支持長序列,并處理遠距離依賴?


你提到的 “Sliding Window Attention 只能處理局部信息,那為什么還能支持 8K-16K 甚至更長的序列?” 這個問題很好。我們來詳細拆解這個機制,看看它如何 既能高效處理長序列,又能解決遠距離依賴問題


1. Sliding Window Attention 適用于長序列的原因

(1) 計算復雜度降低

傳統 全自注意力(Full Self-Attention) 計算復雜度為:
O ( n 2 ? d ) O(n^2 \cdot d) O(n2?d)
即隨著序列長度 ( n n n ) 增加,計算量呈二次增長。例如:

  • ( n = 1024 n = 1024 n=1024 ) 時,需要計算 百萬級 注意力分數。
  • ( n = 8192 n = 8192 n=8192 ) 時,需要計算 千萬級 注意力分數,顯存消耗極大。

Sliding Window Attention 僅在局部窗口 ( w w w ) 內計算注意力:
O ( n ? w ? d ) O(n \cdot w \cdot d) O(n?w?d)
通常 ( w ? n w \ll n w?n )(如 ( w = 512 , n = 8192 w=512, n=8192 w=512,n=8192 )),計算復雜度大幅降低,使得 處理長序列成為可能


(2) 通過層級疊加,間接傳播長距離信息

雖然單個 Sliding Window 只能看到局部范圍的 token,但 Transformer 具有多層結構,可以通過 層級疊加 逐步擴展信息傳播范圍。

示例:

  • 設窗口大小 ( w = 512 ),模型有 12 層 Transformer
  • 第 1 層:每個 token 只看到 相鄰 512 個 token
  • 第 2 層:由于前一層已經融合了 512 個 token 信息,相當于 間接看到 1024 個 token
  • 第 3 層:可看到 1536 個 token
  • ……
  • 第 12 層:最終可以捕捉 6144+ token 的信息

這意味著,即使單層 Sliding Window 只能看到局部信息,但多層疊加后, 整個 Transformer 仍然能捕捉遠程依賴

? 這類似 CNN 中的感受野(Receptive Field)擴展:

  • 低層捕捉局部信息,高層逐步擴大感受野。
  • 頂層的 CLS token 可以聚合全局信息。

2. 如何進一步增強遠程依賴能力?

(1) 結合全局注意力(Global Attention)

Sliding Window 主要用于局部注意力,但為了處理關鍵任務位置(如 CLS,任務相關實體),通常會額外增加 Global Attention
Hybrid?Attention = Sliding?Window + Global?Attention \text{Hybrid Attention} = \text{Sliding Window} + \text{Global Attention} Hybrid?Attention=Sliding?Window+Global?Attention

  • Global Attention 讓 CLS token 直接看到所有位置,用于捕捉全局信息。
  • 關鍵 token(如問題 token、摘要 token)可被全局注意力連接,使遠距離 token 之間的信息傳遞更高效。

(2) 結合 Dilated Attention(擴張窗口注意力)

為了提高遠程依賴能力,可以使用 Dilated Sliding Window Attention(擴張窗口注意力)

  • 例如,窗口間隔 gap = 2,每個 token 除了看到最近的 512 個 token,還能看到更遠的 token。
  • 這種方法 類似 CNN 的 Dilated Convolution,可以擴大感受野,而不會增加太多計算量。

3. Sliding Window Attention 如何影響長文本任務?

  • 適用于 8K+ 長文本摘要(Summarization)

    • 長文摘要模型(如 Longformer)使用 Sliding Window + Global Attention,使 CLS 位置能整合全局信息。
    • 例如:arXiv 論文摘要任務,輸入 16K tokens,模型仍然可以高效運行。
  • 適用于長文 QA(Long Document QA)

    • 傳統 QA 需要截斷上下文(如 BERT 只能用 512 tokens)。
    • Longformer 可以處理 8K+ tokens,保證所有信息被覆蓋,提升答案查找準確率。
  • 適用于長文分類(Long Document Classification)

    • CLS 位置的 Global Attention 可以整合 8K+ tokens 的全局信息,提高分類準確度。

4. 結論

? Sliding Window Attention 可以擴展到 8K+ 序列,原因如下:

  1. 降低計算復雜度,從 ( O ( n 2 ) O(n^2) O(n2) ) 變為 ( O ( n ? w ) O(n \cdot w) O(n?w) ),可擴展到長文本。
  2. 通過 Transformer 層級堆疊,多層次傳遞信息,間接覆蓋全局依賴
  3. 結合 Global Attention,讓關鍵 token 直接連接全局,提高遠程依賴建模能力
  4. 結合 Dilated Attention(擴張窗口)可以進一步提升長距離信息傳播

🔹 最終,Sliding Window Attention + Global Attention + Dilated Attention 讓 Transformer 既能高效處理長文本,又能捕捉全局依賴! 🚀

Hybrid Attention(滑動窗口注意力 + 全局注意力)解析


Longformer 等長序列 Transformer 結構中,Hybrid Attention 結合了 Sliding Window Attention(局部注意力)和 Global Attention(全局注意力),以同時實現:

  • 高效計算:滑動窗口注意力降低計算復雜度到 ( O ( n ? w ) O(n \cdot w) O(n?w) ),適用于長文本。
  • 全局依賴捕捉:全局注意力允許關鍵 token(如 CLS、問題 token)能訪問所有 tokens,確保長距離信息流通。

1. 什么是 Global Attention?

在標準 全自注意力(Self-Attention) 機制中:

  • 每個 token 計算所有 token 的注意力權重,計算復雜度 ( O ( n 2 ) O(n^2) O(n2) )。
  • Sliding Window Attention 僅計算局部窗口內的 token,無法直接建模遠程依賴。

Global Attention 的作用:

  • 指定部分 token 作為“全局節點”,這些 token 可以訪問所有 tokens,同時 所有 tokens 也可以訪問這些全局節點
  • 一般用于關鍵任務相關 tokens,例如:
    • [CLS](分類任務)
    • 問題 tokens(問答任務)
    • 摘要 tokens(摘要任務)

Hybrid Attention 結合兩者的方式:
Hybrid?Attention = Sliding?Window?Attention + Global?Attention \text{Hybrid Attention} = \text{Sliding Window Attention} + \text{Global Attention} Hybrid?Attention=Sliding?Window?Attention+Global?Attention

  • 大部分 tokens 采用 Sliding Window 計算注意力,計算復雜度為 ( O ( n ? w ) O(n \cdot w) O(n?w) )。
  • 關鍵 tokens 采用 Global Attention,可以訪問整個序列,補充長距離信息。

2. Hybrid Attention 計算方法

假設:

  • window_size = 512
  • global_mask 指定哪些 token 需要全局注意力(如 CLS)。

計算步驟:

  1. 計算 Sliding Window Attention
    • 每個 token 僅計算 窗口范圍內的注意力
  2. 計算 Global Attention
    • 只有被標記為全局注意力的 token 計算 全局 self-attention
    • 這些 token 可以訪問所有 tokens,所有 tokens 也可以訪問它們。
  3. 合并兩種注意力機制
    • 局部 token 使用 Sliding Window Attention。
    • 全局 token 額外加上 Global Attention 權重,確保遠程依賴信息傳遞。

3. PyTorch 實現(可運行)

下面是完整的 Hybrid Attention(滑動窗口注意力 + 全局注意力) 的 PyTorch 實現:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass HybridAttention(nn.Module):def __init__(self, embed_dim, num_heads, window_size):"""Hybrid Attention: Sliding Window Attention + Global AttentionArgs:embed_dim: 詞嵌入維度 dnum_heads: 注意力頭數量 hwindow_size: 滑動窗口大小 w"""super(HybridAttention, self).__init__()self.embed_dim = embed_dimself.num_heads = num_headsself.window_size = window_sizeself.head_dim = embed_dim // num_heads  # 每個頭的維度assert self.head_dim * num_heads == embed_dim, "embed_dim 必須是 num_heads 的整數倍"# 線性投影層self.q_proj = nn.Linear(embed_dim, embed_dim, bias=False)self.k_proj = nn.Linear(embed_dim, embed_dim, bias=False)self.v_proj = nn.Linear(embed_dim, embed_dim, bias=False)self.o_proj = nn.Linear(embed_dim, embed_dim, bias=False)def forward(self, x, global_mask):"""Args:x: 輸入張量 [batch, seq_len, embed_dim]global_mask: 是否是全局注意力的 mask [batch, seq_len],1 表示全局注意力,0 表示普通窗口注意力Returns:輸出張量 [batch, seq_len, embed_dim]"""batch_size, seq_len, _ = x.shape# 計算 Q, K, VQ = self.q_proj(x).view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)  # [b, h, seq, d]K = self.k_proj(x).view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)V = self.v_proj(x).view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)# 初始化注意力分數attn_scores = torch.full((batch_size, self.num_heads, seq_len, seq_len), float("-inf"), device=x.device)# 計算 Sliding Window Attentionfor i in range(seq_len):start = max(0, i - self.window_size)end = min(seq_len, i + self.window_size + 1)attn_scores[:, :, i, start:end] = torch.matmul(Q[:, :, i, :], K[:, :, start:end, :].transpose(-2, -1))# 計算 Global Attentionglobal_mask_expanded = global_mask.unsqueeze(1).unsqueeze(1)  # [batch, 1, 1, seq_len]global_indices = global_mask_expanded.expand(-1, self.num_heads, seq_len, -1)  # 擴展到注意力頭維度attn_scores.masked_fill_(global_indices == 0, float("-inf"))  # 讓非全局 token 只計算滑動窗口注意力global_attn_scores = torch.matmul(Q, K.transpose(-2, -1))  # 全局 attention 計算attn_scores = torch.where(global_indices == 1, global_attn_scores, attn_scores)  # 合并全局和局部注意力# 歸一化 softmaxattn_scores /= self.head_dim ** 0.5attn_weights = F.softmax(attn_scores, dim=-1)# 計算注意力加權的 Valueoutput = torch.matmul(attn_weights, V)# 重新排列形狀output = output.transpose(1, 2).contiguous().view(batch_size, seq_len, self.embed_dim)output = self.o_proj(output)  # 線性變換回原始維度return output

4. 代碼解讀

  1. 計算 Sliding Window Attention

    • 只在窗口范圍內計算注意力分數,保證計算復雜度 ( O(n \cdot w) )。
  2. 計算 Global Attention

    • 通過 global_mask 選擇需要全局注意力的 token(如 CLS)。
    • 計算這些 token 與所有 tokens 之間的注意力分數。
  3. 融合全局 & 局部注意力

    • 使用 torch.where() 選擇是否應用全局注意力:
      • 全局 token:使用全局 self-attention 計算的權重。
      • 局部 token:僅計算滑動窗口內的注意力。

5. 運行示例

# 測試 Hybrid Attention
batch_size, seq_len, embed_dim, num_heads, window_size = 2, 16, 64, 8, 4
x = torch.randn(batch_size, seq_len, embed_dim)
global_mask = torch.zeros(batch_size, seq_len, dtype=torch.long)  # 默認無全局注意力
global_mask[:, 0] = 1  # 讓 CLS 位置作為全局注意力hybrid_attn = HybridAttention(embed_dim, num_heads, window_size)
output = hybrid_attn(x, global_mask)
print(output.shape)  # 預期: (batch_size, seq_len, embed_dim)

6. 結論

  • Hybrid Attention 結合了 Sliding Window 和 Global Attention,使 Transformer 既高效又能捕捉遠程依賴
  • PyTorch 實現支持運行,適用于長文本任務(如長文摘要、QA、分類等)
  • 適用于 8K+ 長文本,提高推理效率,同時保持全局信息流通!🚀

Hybrid Attention 計算 Global Attention 詳細解析


代碼段

# 計算 Global Attention
global_mask_expanded = global_mask.unsqueeze(1).unsqueeze(1)  # [batch, 1, 1, seq_len]
global_indices = global_mask_expanded.expand(-1, self.num_heads, seq_len, -1)  # 擴展到注意力頭維度
attn_scores.masked_fill_(global_indices == 0, float("-inf"))  # 讓非全局 token 只計算滑動窗口注意力
global_attn_scores = torch.matmul(Q, K.transpose(-2, -1))  # 全局 attention 計算
attn_scores = torch.where(global_indices == 1, global_attn_scores, attn_scores)  # 合并全局和局部注意力

1. 代碼解析


(1) 處理 global_mask

global_mask_expanded = global_mask.unsqueeze(1).unsqueeze(1)  # [batch, 1, 1, seq_len]
作用
  • global_mask 是一個 [batch, seq_len] 形狀的張量,標識哪些 token 是全局注意力。
  • unsqueeze(1).unsqueeze(1) 作用是擴展維度,使其形狀變成 [batch, 1, 1, seq_len],以便后續 expand() 操作匹配 attn_scores 形狀。
示例

假設 global_mask

global_mask = torch.tensor([[1, 0, 0, 0, 0],  # Batch 0:CLS(位置 0)是全局 token[0, 0, 1, 0, 0]   # Batch 1:位置 2 是全局 token
])

經過 unsqueeze() 變成:

global_mask_expanded = torch.tensor([[[[1, 0, 0, 0, 0]]],  # Batch 0[[[0, 0, 1, 0, 0]]],  # Batch 1
])  # 形狀 [batch=2, 1, 1, seq_len=5]

(2) 擴展 global_mask 維度以匹配 attn_scores

global_indices = global_mask_expanded.expand(-1, self.num_heads, seq_len, -1)  # [batch, num_heads, seq_len, seq_len]
作用
  • expand(-1, self.num_heads, seq_len, -1) 擴展維度,使 global_indices 形狀與 attn_scores 匹配。
示例(假設 num_heads = 2
global_indices = torch.tensor([# Batch 0[[[1, 0, 0, 0, 0],  # 頭 1[1, 0, 0, 0, 0]]], # 頭 2# Batch 1[[[0, 0, 1, 0, 0],  # 頭 1[0, 0, 1, 0, 0]]]  # 頭 2
])  # 形狀 [batch=2, num_heads=2, seq_len=5, seq_len=5]
  • 現在,每個 batch 的 global_indices 里:
    • 1 表示全局注意力 token。
    • 0 表示普通 token。

(3) 讓普通 token 只計算滑動窗口內的注意力

attn_scores.masked_fill_(global_indices == 0, float("-inf"))
作用
  • 非全局 token 的注意力變成 -inf,確保它們只能計算滑動窗口范圍的注意力。
示例

假設 attn_scores 初始值:

attn_scores = torch.tensor([[[10, 20, 30, 40, 50],  [15, 25, 35, 45, 55]],  [[5, 10, 15, 20, 25],  [10, 15, 20, 25, 30]]
], dtype=torch.float32)

執行 masked_fill_() 后:

attn_scores = torch.tensor([[[10, -inf, -inf, -inf, -inf],  [15, -inf, -inf, -inf, -inf]],  [[-inf, -inf, 15, -inf, -inf],  [-inf, -inf, 20, -inf, -inf]]
])

現在:

  • 普通 token 的注意力分數變成 -inf,它們只能計算滑動窗口范圍內的 token
  • 全局 token(如 CLS)不受影響,它們仍然可以訪問所有 token

(4) 計算全局 Attention

global_attn_scores = torch.matmul(Q, K.transpose(-2, -1))  # 計算全局注意力
作用
  • 全局 token 應該能訪問所有 token,所以這里 計算完整的注意力分數矩陣
  • Q @ K^T 計算所有 QK 之間的點積注意力。

(5) 合并全局和滑動窗口注意力

attn_scores = torch.where(global_indices == 1, global_attn_scores, attn_scores)
作用
  • global_indices == 1 位置使用 完整的全局注意力 global_attn_scores
  • 其他位置仍然使用 滑動窗口注意力 attn_scores
示例

假設 global_attn_scores

global_attn_scores = torch.tensor([[[100, 110, 120, 130, 140],  [105, 115, 125, 135, 145]],  [[50, 60, 70, 80, 90],  [55, 65, 75, 85, 95]]
])

執行 torch.where() 后:

attn_scores = torch.tensor([[[100, -inf, -inf, -inf, -inf],  [105, -inf, -inf, -inf, -inf]],  [[-inf, -inf, 70, -inf, -inf],  [-inf, -inf, 75, -inf, -inf]]
])

現在:

  • 全局 token (global_indices == 1) 采用全局注意力 global_attn_scores
  • 普通 token (global_indices == 0) 繼續使用滑動窗口注意力(-inf 表示屏蔽)

6. 結論

代碼作用
global_mask_expanded = global_mask.unsqueeze(1).unsqueeze(1)擴展 global_mask 形狀,方便與 attn_scores 匹配
global_indices = global_mask_expanded.expand(-1, self.num_heads, seq_len, -1)復制 global_mask 到所有注意力頭
attn_scores.masked_fill_(global_indices == 0, float("-inf"))讓普通 token 只能訪問滑動窗口內的 token
global_attn_scores = torch.matmul(Q, K.transpose(-2, -1))計算完整的全局注意力分數
attn_scores = torch.where(global_indices == 1, global_attn_scores, attn_scores)讓全局 token 采用全局注意力,而普通 token 繼續使用滑動窗口

🚀 最終,我們的 Hybrid Attention 既能高效計算長文本,又能讓 CLS 等關鍵 token 訪問全局信息! 🎯

后記

2025年2月23日14點36分于上海,在GPT 4o大模型輔助下完成。

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

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

相關文章

【運維】內網服務器借助通過某臺可上外網的服務器實現公網訪問

背景: 內網服務器無法連接公網,但是辦公電腦可以連接內網服務器又可以連接公網。 安裝軟件 1、frp 2、ccproxy 配置 1、內網服務器 # 內網服務器啟動frp服務配置文件參考vi frps.ini# frps.ini [common] bind_port 7000# 備注: bind_port端口可以隨意配置。配置完…

flask 是如何分發請求的?

這篇博客會涉及一些 WSGI 的知識,不了解的可以看這篇博客,簡單了解一下。 Python 的 WSGI 簡單入門 一、請求在 flask 中的處理過程 我們先來看一下 werkzeug.routing 包下 Map 和 Rule 方法的使用,這里給出一個官方的示例(我進…

怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗

怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗 目錄 怎么獲取免費的 GPU 資源完成大語言模型(LLM)實驗在線平臺類Google ColabKaggle NotebooksHugging Face Spaces百度飛槳 AI Studio在線平臺類 Google Colab 特點:由 Google 提供的基于云端的 Jupyter 筆記本環境,提…

Python開發Django面試題及參考答案

目錄 Django 的請求生命周期是怎樣的? Django 的 MTV 架構中的各個組件分別是什么? Django 的 URL 路由是如何工作的? Django 的視圖函數和視圖類有什么區別? Django 的模板系統是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中間件是什么?它的作用是…

【圖像的讀寫與基本操作】

圖像的讀寫與基本操作 目錄 圖像的讀寫與基本操作目標知識點1. 圖像的讀寫 :2. 圖像的縮放 :3. 圖像的翻轉 :4. 圖像的裁剪 :5. 顏色空間轉換 : 示例代碼1. 圖像的讀寫 :2. 圖像的縮放 :3. 圖像…

《數字圖像處理》筆記

文章目錄 第一章 緒論1.1 什么是數字圖像處理數字圖像的概念數字圖像的組成數字圖像處理的概念 1.4 數字圖像處理的基本步驟 第二章 數字圖像基礎2.2 光和電磁波譜可見光單色光灰度級發光強度光通量亮度 2.3 圖像感知和獲取將照射能量變換為數字圖像的傳感器簡單的圖像形成模型…

網絡安全掃描--基礎篇

前言 1、了解互聯網安全領域中日趨重要的掃描技術 2、了解在不同網絡場景下掃描技術手段 3、熟悉linux下系統內核防護策略并能大件一個有效的系統防護體系 4、增強工作安全意識,并能有效的實踐于工作場景中 目錄 1、熟悉主機掃描工具(fping,…

前端防重復請求終極方案:從Loading地獄到精準攔截的架構升級

🔥 事故現場還原:瘋狂點擊引發的血案 凌晨1點23分,監控系統突然告警: 📉 服務器CPU飆升至98% 🗃? 數據庫出現3000臟數據 💥 用戶端彈出上百個錯誤彈窗 事故原因:黑產腳本通過0.5秒…

基于Spring Boot的供應商管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

Redis|事務

文章目錄 是什么能干嘛Redis 事務 VS 數據庫事務怎么玩小總結 是什么 首先回想一下什么是數據庫的事務?數據庫事務是指作為單個邏輯單元執行的一系列操作,具備以下四個關鍵特性(ACID): 原子性(Atomicity&am…

一周學會Flask3 Python Web開發-Jinja2模板繼承和include標簽使用

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程: 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 不管是開發網站還是后臺管理系統,我們頁面里多多少少有公共的模塊。比如博客網站,就有公共的頭部&…

二十三種設計模式詳解

二十三種設計模式是軟件開發中用于解決常見問題的經典解決方案,它們由 Erich Gamma 等四位作者在《設計模式:可復用面向對象軟件的基礎》一書中提出。這些模式分為三大類:創建型模式、結構型模式 和 行為型模式。 1. 創建型模式(…

用pyside6創建一個界面并實現一個小功能且能打包成問題記錄

現在我們要開發一個程序,讓用戶輸入一段文本包含:員工姓名、薪資、年齡。該程序可以把薪資在 2萬 以上、以下的人員名單分別打印出來。 1用designer創建界面并生成UI文件; 2直接調用ui文件實現功能; from PySide6.QtWidgets im…

計算機畢業設計 ——jspssm510springboot 的人職匹配推薦系統

作者:程序媛9688 開發技術:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 🌟文末獲取源碼數據庫🌟 感興趣的可以先收藏起來,還有大家在畢設選題(免費咨詢指導選題)&#xf…

包子湊數——藍橋杯真題Python

包子湊數 輸入輸出樣例 示例 1 輸入 2 4 5輸出 6樣例說明 湊不出的數目包括:1, 2, 3, 6, 7, 11。 示例 2 輸入 2 4 6輸出 INF樣例說明 所有奇數都湊不出來,所以有無限多個 運行限制 最大運行時間:1s最大運行內存: 256M 最大公約數 最大公…

SSM和SpringBoot有什么區別?

SSM(Spring、Spring MVC、MyBatis)和 Spring Boot 有以下一些區別: 配置方式 SSM:配置相對繁瑣,需要在多個 XML 文件中進行大量的配置。Spring Boot:采用“約定大于配置”的原則,極大地簡化了配…

極簡Python服務器后端

在Python中,可以使用http.server模塊和json模塊來創建一個簡單的HTTP服務器,該服務器可以響應80端口上的/query POST請求,并且請求體為JSON格式。 需要注意,在Linux系統上,使用低于1024的端口(如80端口&…

文檔檢索服務平臺

文檔檢索服務平臺是基于Elasticsearch的全文檢索,包含數據采集、數據清洗、數據轉換、數據檢索等模塊。 項目地址:Github、國內Gitee 演示地址:http://silianpan.cn/gdss/ 以下是演示角色和賬號(密碼同賬號)&#xf…

關于Postman自動獲取token

在使用postman測試聯調接口時,可能每個接口都需要使用此接口生成的令牌做Authorization的Bearer Token驗證,最直接的辦法可能會是一步一步的點擊,如下圖: 在Authorization中去選擇Bearer Token,然后將獲取到的token粘貼…

清華大學DeepSeek文檔下載,清華大學deepseek下載(完成版下載)

文章目錄 前言一、清華大學DeepSeek使用手冊下載二、清華大學DeepSeek使用手冊思維導圖 前言 這是一篇關于清華大學deepseek使用手冊pdf的介紹性文章,主要介紹了DeepSeek的定義、功能、使用方法以及如何通過提示語設計優化AI性能。以下是對這些核心內容的簡要概述&…