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(nw)),其中 ( 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(nw) ),其中 ( 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(nwd) )。

示例:

  • 设 ( 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(nw) )。
  • 可扩展到长序列:支持 8K-16K tokens 甚至更长。
  • 适用于文档级任务:如长文摘要、法律分析、医疗 NLP 任务。

缺点

  • 不能捕捉远距离依赖:只能处理窗口范围内的 token 交互。
  • 需要全局注意力补充:必须结合 Global Attention 来补充远程信息(例如 CLS 位置)。

5. 结论

  • Sliding Window Attention 解决了 Transformer 计算复杂度随序列长度二次增长的问题
  • 通过限制每个 token 只关注局部窗口内的 token,使得计算复杂度降低为 ( O ( n ⋅ w ) O(n \cdot w) O(nw) )
  • 适用于长文本处理,并可结合 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(n2d)
即随着序列长度 ( 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(nwd)
通常 ( w ≪ n w \ll n wn )(如 ( 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(nw) ),可扩展到长文本。
  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(nw) ),适用于长文本。
  • 全局依赖捕捉:全局注意力允许关键 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(nw) )。
  • 关键 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.rhkb.cn/news/24824.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPHP:配置Redis并使用

文章目录 一、环境说明二、php.ini中配置Redis扩展1、下载php_redis.dll文件2、安装Redis扩展3、修改php.ini4、重启wamp服务 三、thinkphp6项目中修改配置及使用 一、环境说明 我的是64位Windows10环境,安装了wamp环境集成工具,方便学习使用。 php版本…

[ComfyUI]官方已支持Skyreels混元图生视频,速度更快,效果更好(附工作流)

一、介绍 昨天有提到官方已经支持了Skyreels,皆大欢喜,效果更好一些,还有GGUF量化版本,进一步降低了大家的显存消耗。 今天就来分享一下官方流怎么搭建,我体验下来感觉更稳了一些,生成速度也更快&#xf…

ui设计公司兰亭妙微分享:科研单位UI界面设计

科研单位的UI界面设计是一项至关重要的任务,它不仅关乎科研工作的效率,还直接影响到科研人员的用户体验。以下是对科研单位UI界面设计的详细分析: 一、设计目标 科研单位的UI界面设计旨在提升科研工作的效率与便捷性,同时确保科…

纷析云:赋能企业财务数字化转型的开源解决方案

在企业数字化转型的浪潮中,财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案,为企业提供了一条理想的转型路径。 一、开源的力量:自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…

Win11安装dpanel实现docker可视化面板,并解决端口冲突的问题

目标是给Win11的docker安装dpanel可视化面板,可以更直观的看到docker中的数据。 执行镜像(没有则自动拉取) 首先配置好docker加速环境(阿里云的docker加速等),然后访问GitHub - donknap/dpanel: 轻量化 do…

Jmeter聚合报告导出log文档,Jmeter聚合报告导出到CSV

Jmeter聚合报告导出log文档 在Filename中输入 EKS_perf_log\\${type}_log\\${__P(UNIQUEID,${__time(YMDHMS)})}\all-graph-results-log.csv 可以得到执行的log,文件夹包含时间戳 Jmeter聚合报告导出到CSV 点击Save Table Data,保存到CSV文件中

OpenAPI Generator:API开发的瑞士军刀

一、工具介绍 OpenAPI Generator是基于OpenAPI规范(Swagger)的代码生成工具,支持50种编程语言的客户端/服务端代码生成。其核心价值在于: 自动化生成⇒减少重复劳动规范API开发流程 核心能力矩阵: 功能支持示例客户端SDK生成Java/Python/T…

【Linux探索学习】第二十七弹——信号(上):Linux 信号基础详解

Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 前面我们已经将进程通信部分讲完了,现在我们来讲一个进程部分也非常重要的知识点——信号,信号也是进程间通信的一…

DeepSeek行业应用实践报告-智灵动力【112页PPT全】

DeepSeek(深度搜索)近期引发广泛关注并成为众多企业/开发者争相接入的现象,主要源于其在技术突破、市场需求适配性及生态建设等方面的综合优势。以下是关键原因分析: 一、技术核心优势 开源与低成本 DeepSeek基于开源架构&#xf…

探索AI新前沿,CoT推理赋能文生图!港中文首次提出文生图的o1推理和inference scaling新范式

OpenAI的o1模型凭借思维链(Chain-of-Thought, CoT)技术,在推理能力上实现了质的飞跃,引领了大模型理解领域的新风尚。然而,这一创新的火花能否照亮图像生成领域?近日,来自香港中文大学、北京大学…

C# | GDI+图像测距辅助线的实现思路

C# | GDI图像测距辅助线的实现思路 文章目录 C# | GDI图像测距辅助线的实现思路一、辅助线需求概述二、坐标系与角度计算2.1 笛卡尔坐标系2.2 线长和角度计算方法2.3 文本角度矫正计算方法2.4 坐标变换实现步骤 三、与if判断方式对比四、总结 一、辅助线需求概述 在图像测量工…

SQL Server2019下载及安装教程

一、软件下载 SQLServer2019及SSMS管理工具下载链接: 百度网盘 请输入提取码 二、SQLServer2019安装 选中要安装的iso映像文件,右键点击装载(有些系统可以直接双击打开,有些需要安装Daemon Tools软件去打开) 找到s…

嵌入式开发--STM32的USB不识别和需要重新拔插的解决

STM32在通过USB口设备连接电脑时,一般是将其模拟为虚拟串口(VCP)。如果在调试中按了复位键,就不能连接电脑了。此时一般需要拔插一下USB口,但这样会给用户带来许多麻烦。 USB接口电路 电路接口中,USB-P线会…

深度剖析数据中台架构图,铸造数字文明的基石

🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨奥零数据科技官网:http://www.aolingdata.com ✨AllData开源项目:https://github.com/alldatacenter/a…

MySQL练习

将安装包下载并上传 方法一 步骤 创建组与用户 [rootlocalhost ~]# groupadd mysql [rootlocalhost ~]# useradd -r -g mysql -s /bin/false mysql 解压安装包 [rootlocalhost ~]# tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz -C /usr/local/软连接 [rootlocalh…

jdk21下载、安装(Windows、Linux、macOS)

Windows 系统 1. 下载安装 访问 Oracle 官方 JDK 下载页面 或 OpenJDK 下载页面,根据自己的系统选择合适的 Windows 版本进行下载(通常选择 .msi 安装包)。 2. 配置环境变量 右键点击 “此电脑”,选择 “属性”。 在左侧导航栏…

docker的下载与使用(一)

本文默认使用linux系统以及会linux的基本指令,windows下安装docker较为繁琐 docker是什么 Docker 是一个开源的应用容器引擎,基于go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&…

WIn32 笔记:本专栏课件

专栏导航 上一篇:在VS2019里面,调整代码字体大小 回到目录 下一篇:计算机基础:二进制基础01,比特与字节 本节前言 在之前的讲解里面,我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始&am…

【NLP 27、文本分类任务 —— 传统机器学习算法】

不要抓着枯叶哭泣,你要等待初春的新芽 —— 25.1.23 一、文本分类任务 定义:预先设定好一个文本类别集合,对于一篇文本,预测其所属的类别 例如: 情感分析: 这家饭店太难吃了 —> 正类 …

基于YOLO11深度学习的医学X光骨折检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…