FastTransformer

news2024/12/19 19:45:21

文章目录

  • FastTransformer:高效 Transformer 架构解析
    • 什么是 FastTransformer?
    • FastTransformer 与传统 Transformer 的对比
    • 为什么选择 FastTransformer?
      • 优点
      • 局限性
    • FastTransformer 的工作原理
      • 核心优化
    • FastTransformer 的数学表示
      • 传统 Attention 公式
      • FastTransformer 的优化
      • 稀疏注意力矩阵的计算过程
        • 1. 注意力矩阵的计算
        • 2. 稀疏化注意力矩阵
        • 3. 计算稀疏加权结果
        • 4. 最终输出
      • 总结
        • 稀疏化步骤:
    • FastTransformer 实现代码示例
      • 传统 Attention 实现
      • FastTransformer 分块优化示例
    • FastTransformer 矩阵计算示例
      • 场景假设
      • 输入矩阵
      • FastTransformer 的应用场景
  • FastTransformer 与 Flash Attention 的对比
    • 概述
    • 特性对比
    • 优势与局限性
      • FastTransformer
      • Flash Attention
    • 适用场景对比
    • 结论

FastTransformer:高效 Transformer 架构解析

什么是 FastTransformer?

FastTransformer 是一种针对 Transformer 模型 进行优化的高效实现,旨在通过架构调整和计算优化,减少计算时间和内存占用,解决标准 Transformer 在处理 长序列任务实时任务 中的性能瓶颈问题。

与传统 Transformer 相比,FastTransformer 通过 稀疏注意力机制分块计算CUDA 并行优化 等方法,实现了显著的计算加速和内存优化。


FastTransformer 与传统 Transformer 的对比

特性传统 TransformerFastTransformer
计算复杂度 O ( n 2 ) O(n^2) O(n2),注意力机制计算开销大 O ( n ⋅ log ⁡ n ) O(n \cdot \log n) O(nlogn) 或更低,通过稀疏注意力优化
显存占用存储完整的注意力矩阵,显存开销高通过分块或稀疏注意力减少显存需求
并行计算支持一定程度的并行,但受到注意力矩阵大小限制结合 CUDA 核心优化,充分利用 GPU 并行计算
适用场景短序列或中等长度任务长序列任务、实时推理、高效训练

为什么选择 FastTransformer?

优点

  1. 显存高效:减少注意力矩阵的存储,支持更长的输入序列。
  2. 计算加速:通过稀疏注意力和并行优化,计算速度显著提升。
  3. 适用长序列:适合文本、视频、语音等长序列任务。
  4. 实时推理:加速推理过程,使 Transformer 可部署在低延迟场景中。

局限性

  1. 实现复杂:需使用高级优化工具如 CUDA 和自定义内核。
  2. 硬件依赖:高度依赖于现代 GPU 和高效内存管理。

FastTransformer 的工作原理

核心优化

  1. 稀疏注意力机制

    • 传统 Attention 的复杂度为 O ( n 2 ) O(n^2) O(n2)
    • FastTransformer 通过稀疏化注意力机制,仅计算部分注意力权重,将复杂度降至 O ( n ⋅ log ⁡ n ) O(n \cdot \log n) O(nlogn) 或更低。
  2. 分块计算

    • 将序列划分为多个小块,逐块计算注意力,从而减少显存占用并实现并行化加速。
  3. CUDA 并行优化

    • 利用 GPU 上的高效计算单元,通过自定义 CUDA 核心实现高效注意力计算。
  4. 低秩近似

    • 使用低秩分解方法减少注意力矩阵的计算量,同时保持准确性。

FastTransformer 的数学表示

传统 Attention 公式

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

FastTransformer 的优化

  • 将输入序列分块,分别计算每块的局部注意力。
  • 稀疏化注意力权重,仅保留高权重元素:
    A i j ′ = { A i j , 若  A i j > τ 0 , 否则 A'_{ij} = \begin{cases} A_{ij}, & \text{若 } A_{ij} > \tau \\ 0, & \text{否则} \end{cases} Aij={Aij,0, Aij>τ否则
  • 分块加权结果:
    Output i = ∑ j ∈ Blocks Softmax ( Q i K j T / d k ) V j \text{Output}_i = \sum_{j \in \text{Blocks}} \text{Softmax}(Q_i K_j^T / \sqrt{d_k}) V_j Outputi=jBlocksSoftmax(QiKjT/dk )Vj

稀疏注意力矩阵的计算过程

1. 注意力矩阵的计算

对于输入的查询矩阵 Q Q Q 和键矩阵 K K K,注意力权重 A A A 由以下公式计算:

A i j = Q i ⋅ K j T d k A_{ij} = \frac{Q_i \cdot K_j^T}{\sqrt{d_k}} Aij=dk QiKjT

其中:

  • Q i Q_i Qi:查询向量的第 i i i 行。
  • K j K_j Kj:键向量的第 j j j 行。
  • d k d_k dk:注意力向量的维度。

示例计算
假设 Q Q Q K K K 2 × 2 2 \times 2 2×2 的矩阵, d k = 2 d_k = 2 dk=2

Q = [ 1 2 3 4 ] , K = [ 1 0 0 1 ] Q = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad K = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} Q=[1324],K=[1001]

计算 A A A

A = Q ⋅ K T d k = 1 2 [ 1 ⋅ 1 + 2 ⋅ 0 1 ⋅ 0 + 2 ⋅ 1 3 ⋅ 1 + 4 ⋅ 0 3 ⋅ 0 + 4 ⋅ 1 ] = 1 2 [ 1 2 3 4 ] A = \frac{Q \cdot K^T}{\sqrt{d_k}} = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 \cdot 1 + 2 \cdot 0 & 1 \cdot 0 + 2 \cdot 1 \\ 3 \cdot 1 + 4 \cdot 0 & 3 \cdot 0 + 4 \cdot 1 \end{bmatrix} = \frac{1}{\sqrt{2}} \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} A=dk QKT=2 1[11+2031+4010+2130+41]=2 1[1324]

缩放后:

A = [ 0.707 1.414 2.121 2.828 ] A = \begin{bmatrix} 0.707 & 1.414 \\ 2.121 & 2.828 \end{bmatrix} A=[0.7072.1211.4142.828]


2. 稀疏化注意力矩阵

根据阈值 τ \tau τ,将 A A A 中小于 τ \tau τ 的元素置为 0 0 0。例如设 τ = 2 \tau = 2 τ=2

A = [ 0.707 1.414 2.121 2.828 ] A = \begin{bmatrix} 0.707 & 1.414 \\ 2.121 & 2.828 \end{bmatrix} A=[0.7072.1211.4142.828]

筛选条件 A i j > τ A_{ij} > \tau Aij>τ

  • 0.707 < 2 → 0 0.707 < 2 \rightarrow 0 0.707<20
  • 1.414 < 2 → 0 1.414 < 2 \rightarrow 0 1.414<20
  • 2.121 > 2 → 2.121 2.121 > 2 \rightarrow 2.121 2.121>22.121
  • 2.828 > 2 → 2.828 2.828 > 2 \rightarrow 2.828 2.828>22.828

稀疏化后的矩阵 A ′ A' A

A ′ = [ 0 0 2.121 2.828 ] A' = \begin{bmatrix} 0 & 0 \\ 2.121 & 2.828 \end{bmatrix} A=[02.12102.828]


3. 计算稀疏加权结果

对于稀疏化后的注意力矩阵 A ′ A' A 和值矩阵 V V V,通过加权求和计算输出:

Output i = ∑ j A i j ′ V j \text{Output}_i = \sum_j A'_{ij} V_j Outputi=jAijVj

假设值矩阵 V V V 为:

V = [ 5 6 7 8 ] V = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} V=[5768]

逐行计算输出:

  • 第 1 行输出(由于 A 1 j ′ = 0 A'_{1j} = 0 A1j=0,结果为 0 0 0):

Output 1 = 0 ⋅ [ 5 , 6 ] + 0 ⋅ [ 7 , 8 ] = [ 0 , 0 ] \text{Output}_1 = 0 \cdot [5, 6] + 0 \cdot [7, 8] = [0, 0] Output1=0[5,6]+0[7,8]=[0,0]

  • 第 2 行输出

Output 2 = 2.121 ⋅ [ 5 , 6 ] + 2.828 ⋅ [ 7 , 8 ] \text{Output}_2 = 2.121 \cdot [5, 6] + 2.828 \cdot [7, 8] Output2=2.121[5,6]+2.828[7,8]

逐元素计算:

Output 2 = [ 2.121 ⋅ 5 + 2.828 ⋅ 7 ,    2.121 ⋅ 6 + 2.828 ⋅ 8 ] \text{Output}_2 = [2.121 \cdot 5 + 2.828 \cdot 7, \; 2.121 \cdot 6 + 2.828 \cdot 8] Output2=[2.1215+2.8287,2.1216+2.8288]

Output 2 = [ 10.605 + 19.796 ,    12.726 + 22.624 ] = [ 30.401 , 35.350 ] \text{Output}_2 = [10.605 + 19.796, \; 12.726 + 22.624] = [30.401, 35.350] Output2=[10.605+19.796,12.726+22.624]=[30.401,35.350]


4. 最终输出

最终的加权输出矩阵为:

Output = [ 0 0 30.401 35.350 ] \text{Output} = \begin{bmatrix} 0 & 0 \\ 30.401 & 35.350 \end{bmatrix} Output=[030.401035.350]


总结

稀疏化步骤:
  1. 计算注意力矩阵 A A A:通过 Q ⋅ K T / d k Q \cdot K^T / \sqrt{d_k} QKT/dk
  2. 稀疏化:将小于阈值 τ \tau τ 的元素置为 0 0 0,得到稀疏矩阵 A ′ A' A
  3. 加权求和:利用稀疏注意力矩阵 A ′ A' A 和值矩阵 V V V 计算输出结果。

FastTransformer 实现代码示例

传统 Attention 实现

import torch

def attention(Q, K, V):
    d_k = Q.size(-1)
    scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k))
    attention = torch.softmax(scores, dim=-1)
    output = torch.matmul(attention, V)
    return output

FastTransformer 分块优化示例

def fast_transformer(Q, K, V, block_size=32):
    batch_size, seq_len, hidden_dim = Q.size()
    output = torch.zeros_like(Q)
    
    # 分块计算
    for i in range(0, seq_len, block_size):
        for j in range(0, seq_len, block_size):
            Q_block = Q[:, i:i+block_size, :]
            K_block = K[:, j:j+block_size, :]
            V_block = V[:, j:j+block_size, :]
            
            # 注意力计算
            scores = torch.matmul(Q_block, K_block.transpose(-2, -1)) / torch.sqrt(torch.tensor(hidden_dim))
            attention = torch.softmax(scores, dim=-1)
            output[:, i:i+block_size, :] += torch.matmul(attention, V_block)
    
    return output

FastTransformer 矩阵计算示例

场景假设

假设有以下输入数据:

  • 输入矩阵 Q(Query):形状为 ( 4 * 4 ),表示序列长度为 4,隐藏维度为 4。
  • 输入矩阵 K(Key):形状为 ( 4 * 4 ),与 Q 形状一致。
  • 输入矩阵 V(Value):形状为 ( 4 * 4 ),与 QK 形状一致。
  • 分块大小:假设 block_size = 2,表示一次处理 2 行/列。

输入矩阵

Q = [[1, 2, 3, 4],
     [4, 3, 2, 1],
     [1, 1, 1, 1],
     [2, 2, 2, 2]]

K = [[1, 0, 1, 0],
     [0, 1, 0, 1],
     [1, 1, 1, 1],
     [2, 2, 2, 2]]

V = [[1, 1, 1, 1],
     [2, 2, 2, 2],
     [3, 3, 3, 3],
     [4, 4, 4, 4]]

FastTransformer 分块计算步骤

Step 1:将输入分块

将 Q、K 和 V 按行/列分成大小为 2 × 2 的块:
	•	Q 分块:
	•	( Q_1 ):第 1-2 行
	•	( Q_2 ):第 3-4 行
	•	K 和 V 分块:
	•	( K_1 )( V_1 ):第 1-2 行
	•	( K_2 )( V_2 ):第 3-4 行

Q_1 = [[1, 2, 3, 4],
       [4, 3, 2, 1]]

Q_2 = [[1, 1, 1, 1],
       [2, 2, 2, 2]]

K_1 = [[1, 0, 1, 0],
       [0, 1, 0, 1]]

K_2 = [[1, 1, 1, 1],
       [2, 2, 2, 2]]

V_1 = [[1, 1, 1, 1],
       [2, 2, 2, 2]]

V_2 = [[3, 3, 3, 3],
       [4, 4, 4, 4]]

Step 2:分块计算注意力权重

( Q 1 × K 1 T ) ( Q_1 \times K_1^T ) (Q1×K1T) 计算

Scores 1 = Q 1 × K 1 T / d k ( 其中  d k = 4 ) \text{Scores}_1 = Q_1 \times K_1^T / \sqrt{d_k} \quad (\text{其中 } d_k = 4) Scores1=Q1×K1T/dk (其中 dk=4)

  • ( Q 1 ) 为 ( 2 × 4 ) , ( K 1 T ) 为 ( 4 × 2 ) ( Q_1 ) 为 ( 2 \times 4 ),( K_1^T ) 为 ( 4 \times 2 ) (Q1)(2×4)(K1T)(4×2)
  • 结果为 ( 2 × 2 ) 结果为 ( 2 \times 2 ) 结果为(2×2)

Scores 1 = [ ( 1 × 1 + 2 × 0 + 3 × 1 + 4 × 0 ) ( 1 × 0 + 2 × 1 + 3 × 0 + 4 × 1 ) ( 4 × 1 + 3 × 0 + 2 × 1 + 1 × 0 ) ( 4 × 0 + 3 × 1 + 2 × 0 + 1 × 1 ) ] \text{Scores}_1 = \begin{bmatrix} (1 \times 1 + 2 \times 0 + 3 \times 1 + 4 \times 0) & (1 \times 0 + 2 \times 1 + 3 \times 0 + 4 \times 1) \\ (4 \times 1 + 3 \times 0 + 2 \times 1 + 1 \times 0) & (4 \times 0 + 3 \times 1 + 2 \times 0 + 1 \times 1) \end{bmatrix} Scores1=[(1×1+2×0+3×1+4×0)(4×1+3×0+2×1+1×0)(1×0+2×1+3×0+4×1)(4×0+3×1+2×0+1×1)]

S c o r e s 1 = [ [ 4 , 6 ] , [ 6 , 4 ] ] Scores_1 = [[4, 6], [6, 4]] Scores1=[[4,6],[6,4]]

缩放:
Scores 1 = Scores 1 4 = 1 2 × Scores 1 = [ [ 2 , 3 ] , [ 3 , 2 ] ] \text{Scores}_1 = \frac{\text{Scores}_1}{\sqrt{4}} = \frac{1}{2} \times\text{Scores}_1 = [[2, 3], [3, 2]] Scores1=4 Scores1=21×Scores1=[[2,3],[3,2]]

Softmax 计算 ( Softmax ( S c o r e s 1 ) ) ( \text{Softmax}(Scores_1) ) (Softmax(Scores1))

对每行计算 Softmax:

Softmax ( x ) = exp ⁡ ( x i ) ∑ j exp ⁡ ( x j ) \text{Softmax}(x) = \frac{\exp(x_i)}{\sum_j \exp(x_j)} Softmax(x)=jexp(xj)exp(xi)

Softmax ( Scores 1 ) = [ exp ⁡ ( 2 ) exp ⁡ ( 2 ) + exp ⁡ ( 3 ) exp ⁡ ( 3 ) exp ⁡ ( 2 ) + exp ⁡ ( 3 ) exp ⁡ ( 3 ) exp ⁡ ( 3 ) + exp ⁡ ( 2 ) exp ⁡ ( 2 ) exp ⁡ ( 3 ) + exp ⁡ ( 2 ) ] \text{Softmax}(\text{Scores}_1) = \begin{bmatrix} \frac{\exp(2)}{\exp(2) + \exp(3)} & \frac{\exp(3)}{\exp(2) + \exp(3)} \\ \frac{\exp(3)}{\exp(3) + \exp(2)} & \frac{\exp(2)}{\exp(3) + \exp(2)} \end{bmatrix} Softmax(Scores1)=[exp(2)+exp(3)exp(2)exp(3)+exp(2)exp(3)exp(2)+exp(3)exp(3)exp(3)+exp(2)exp(2)]
Softmax ( Scores 1 ) ≈ [ 0.2689 0.7311 0.7311 0.2689 ] \text{Softmax}(\text{Scores}_1) \approx \begin{bmatrix} 0.2689 & 0.7311 \\ 0.7311 & 0.2689 \end{bmatrix} Softmax(Scores1)[0.26890.73110.73110.2689]

Step 3:计算加权输出 ( Q 1 × V 1 Q_1 \times V_1 Q1×V1 )

Output 1 = Softmax ( S c o r e s 1 ) × V 1 \text{Output}_1 = \text{Softmax}(Scores_1) \times V_1 Output1=Softmax(Scores1)×V1

  • ( Softmax ( S c o r e s 1 ) ) 为 ( 2 × 2 ) ( \text{Softmax}(Scores_1) ) 为 ( 2 \times 2 ) (Softmax(Scores1))(2×2)
  • ( V 1 ) 为 ( 2 × 4 ) ( V_1 ) 为 ( 2 \times 4 ) (V1)(2×4)

Output 1 = [ 0.2689 0.7311 0.7311 0.2689 ] × [ 1 1 1 1 2 2 2 2 ] \text{Output}_1 = \begin{bmatrix} 0.2689 & 0.7311 \\ 0.7311 & 0.2689 \end{bmatrix} \times \begin{bmatrix} 1 & 1 & 1 & 1 \\ 2 & 2 & 2 & 2 \end{bmatrix} Output1=[0.26890.73110.73110.2689]×[12121212]

Output 1 = [ 1.7311 1.7311 1.7311 1.7311 1.2689 1.2689 1.2689 1.2689 ] \text{Output}_1 = \begin{bmatrix} 1.7311 & 1.7311 & 1.7311 & 1.7311 \\ 1.2689 & 1.2689 & 1.2689 & 1.2689 \end{bmatrix} Output1=[1.73111.26891.73111.26891.73111.26891.73111.2689]
Step 4:重复计算 ( Q 2 × K 2 T ) ( Q_2 \times K_2^T ) (Q2×K2T) 和加权输出

按照同样的步骤计算 ( Q_2 ) 与 ( K_2 ) 的注意力权重和加权输出,最终将结果合并得到完整的输出。

结果

FastTransformer 通过分块的方式逐步计算注意力,避免存储完整的注意力矩阵,从而有效降低显存占用。

最终输出结果为:

Output = [ 1.7311 1.7311 1.7311 1.7311 1.2689 1.2689 1.2689 1.2689 3.0 3.0 3.0 3.0 3.0 3.0 3.0 3.0 ] \text{Output} = \begin{bmatrix} 1.7311 & 1.7311 & 1.7311 & 1.7311 \\ 1.2689 & 1.2689 & 1.2689 & 1.2689 \\ 3.0 & 3.0 & 3.0 & 3.0 \\ 3.0 & 3.0 & 3.0 & 3.0 \end{bmatrix} Output= 1.73111.26893.03.01.73111.26893.03.01.73111.26893.03.01.73111.26893.03.0

FastTransformer 的应用场景

1.	自然语言处理:
•	处理长文档(如书籍、研究论文等)。
•	实现高效文本分类、问答系统等任务。
2.	视频建模:
•	高分辨率视频分析,处理长时间序列帧。
3.	生物信息学:
•	序列建模(如蛋白质序列预测)。
4.	实时推理:
•	语音识别、实时翻译等低延迟场景。

FastTransformer 与 Flash Attention 的对比

概述

FastTransformerFlash Attention 是两种针对标准 Transformer 进行优化的高效实现方法,旨在解决 Transformer 在处理长序列时的计算复杂度高、显存占用大的问题。但它们采用的优化方法有所不同,适用场景也各有侧重。


特性对比

特性FastTransformerFlash Attention
核心优化方式稀疏注意力机制、分块计算、低秩近似分块计算、CUDA Kernel 优化、数值稳定的 Softmax
计算复杂度 O ( n ⋅ log ⁡ n ) O(n \cdot \log n) O(nlogn)(稀疏注意力优化) O ( n 2 ) O(n^2) O(n2),但显存占用显著优化
显存占用显著降低,通过稀疏注意力和块处理显存优化,通过分块计算,避免存储完整注意力矩阵
数值稳定性较稳定,尤其在稀疏注意力下处理大规模数据使用分块归一化(log-sum-exp 技术),数值更稳定
并行计算支持 GPU 并行计算,通过稀疏注意力减少计算量深度 CUDA Kernel 优化,利用 GPU 最大化并行计算效率
适用场景长序列任务,如 NLP 长文档、视频序列长序列任务、高显存效率的高精度任务,如大规模语言模型
易用性实现较复杂,通常需要专门优化框架基于成熟 CUDA Kernel 库,易于集成至模型中
速度适中,依赖任务和稀疏性加速 2-4 倍,尤其适用于高性能 GPU

优势与局限性

FastTransformer

优势

  1. 稀疏注意力:减少注意力计算量,显著降低复杂度,适合长序列任务。
  2. 分块和低秩优化:通过块级处理和低秩分解提高效率,减少冗余计算。
  3. 计算复杂度低:适用于大规模长序列数据建模。

局限

  1. 实现较复杂,稀疏注意力的有效性依赖任务的稀疏性。
  2. 对硬件优化程度较低,无法最大化 GPU 计算效率。

Flash Attention

优势

  1. 显存优化:分块计算避免存储完整注意力矩阵,适合长序列任务。
  2. 计算加速:使用 CUDA Kernel 优化,在 GPU 上加速 2-4 倍。
  3. 数值稳定:改进 Softmax 计算,避免数值溢出问题。

局限

  1. 计算复杂度仍为 O ( n 2 ) O(n^2) O(n2),虽然显存优化显著,但理论复杂度未变。
  2. 依赖现代高性能 GPU,无法在 CPU 或低性能硬件上高效运行。

适用场景对比

应用场景FastTransformerFlash Attention
自然语言处理长文档建模、长序列文本生成高效长文本建模,高精度语言模型
视频建模长时间序列视频分析,低资源需求高分辨率视频建模,显存优化显著
生物信息学蛋白质序列建模,大规模稀疏数据建模生物序列分析,数值稳定更为关键
实时推理实时处理长序列,任务计算复杂度较低实时任务,对显存和速度要求更高

结论

  • FastTransformer 更适用于长序列任务,特别是任务数据稀疏、需要降低计算复杂度的场景,适合在资源有限的情况下进行部署。
  • Flash Attention 更注重显存优化和计算速度,适用于需要高效并行计算、高数值稳定性的大规模任务,尤其在现代高性能 GPU 上表现最佳。

根据具体任务需求和硬件资源,可以灵活选择 FastTransformerFlash Attention 来优化 Transformer 模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2262338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言中文件是什么?文件文本和二进制文件的区别

1、C语言中文件是什么&#xff1f; 我们对文件的概念已经非常熟悉了&#xff0c;比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种&#xff0c;最主要的作用是保存数据。 在操作系统中&#xff0c;为了统一对各种硬件的操作&#xff0c;简化接口&#xff0c;不同…

vmware workstation pro上创建虚拟机

vmware workstation pro上创建虚拟机 下载vmware workstation pro软件安装后并运行点击主页&#xff0c;选择创建虚拟机 创建虚拟机成功后会出现如下界面 可以点击设置按钮删除不需要的硬件&#xff0c;也可以添加新的硬件设备&#xff0c;最终硬件信息如下图 至此虚拟机…

【数学建模】利用Matlab绘图(2)

一、Matlab中plot函数的基本用法 在matlab中&#xff0c;函数的基本用法主要包括以下几种 第一类&#xff1a; plot(X,Y,LineSpec) 第二类&#xff1a; plot(tbl,xvar,yvar) 1.1 第一类 1.1.1x-y坐标 x和y的选择取决于绘图所需的数据类型以及图像的类型。下表列出了几种…

ASP.NET Core - 依赖注入 自动批量注入

依赖注入配置变形 随着业务的增长&#xff0c;我们项目工作中的类型、服务越来越多&#xff0c;而每一个服务的依赖注入关系都需要在入口文件通过Service.Add{}方法去进行注册&#xff0c;这将是非常麻烦的&#xff0c;入口文件需要频繁改动&#xff0c;而且代码组织管理也会变…

Oracle 适配 OpenGauss 数据库差异语法汇总

背景 国产化进程中&#xff0c;需要将某项目的数据库从 Oracle 转为 OpenGauss &#xff0c;项目初期也是规划了适配不同数据库的&#xff0c;MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。 后面由于固定了数据库类型为 Oracle 后&#xff0c;只写…

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)

Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版) 文章目录 Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)一.环境准备1.服务器准备2.环境配置3.设置主机名4.修改国内镜像源地址5.配置时间同步6.配置内核转发及网桥过滤二.容器运行时Containerd安装(所有节点)…

[LeetCode-Python版]21. 合并两个有序链表(迭代+递归两种解法)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#x…

MATLAB引用矩阵元素的几种方法

引用矩阵元素可以通过索引&#xff0c;也可以通过逻辑值 索引 通过引用元素在矩阵中的位置来提取元素&#xff0c;例如&#xff1a; - 逻辑值 通过某种逻辑运算来使得要提取的值变为逻辑 1 1 1&#xff0c;用 A ( ) A() A()提取即可&#xff0c; A A A为原矩阵的名称。 例如&…

sql 批量修改字段 的默认值

SELECT COLUMN_NAME, NUMERIC_PRECISION, NUMERIC_SCALE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA financeproject AND TABLE_NAME finance_balance AND DATA_TYPE decimal; 查出的字段 excel 拼接 修改语句 ALTER TABLE finance_income MODIFY COLUMN yy…

CVE-2023-0562【春秋云镜】

目录 CVE-2023-0562漏洞概述漏洞利用方式影响范围修复建议安全编码示例靶标介绍 CVE-2023-0562 CVE-2023-0562 是一个针对银行储物柜管理系统的SQL注入漏洞。该漏洞影响了储物柜管理系统中处理用户输入的部分&#xff0c;攻击者可以利用此漏洞未经授权地访问数据库中的敏感信息…

vue el-dialog实现可拖拉

el-dialog实现拖拉&#xff0c;每次点击度居中显示&#xff0c;以下贴出代码具体实现&#xff0c;我是可以正常拖拉并且每次度显示在中间&#xff0c;效果还可以&#xff0c;需要的可以丢上去跑跑 组件部分&#xff1a; <el-dialog:visible.sync"dialogVisible"…

MySQL:库和表的操作

目录 一. 查看数据库 二. 创建数据库 三. 字符集和校验规则 四. 修改和删除数据库 4.1 数据库修改 4.2 数据库删除 五. 备份与恢复 5.1 备份 5.2 还原 5.3 注意事项 5.4 查看连接情况 六. 创建表 七. 查看表结构 八. 修改表 九. …

gitlab初始化+API批量操作

几年没接触gitlab了&#xff0c;新版本装完以后代码提交到默认的main分支&#xff0c;master不再是主分支 项目有几十个仓库&#xff0c;研发提交代码后仓库地址和之前的发生了变化 有几个点 需要注意 1、修改全局默认分支 2、关闭分支保护 上面修改了全局配置不会影响已经创…

Java集合(完整版)

集合框架 Collection集合 概念&#xff1a;对象的容器&#xff0c;定义了对多个对象进行操作的常用方法。可以实现数组的功能 和数组的区别&#xff1a; 数组的长度固定&#xff0c;集合长度不固定数组可以存储基本类型和引用类型&#xff0c;集合只能存储引用类型 Collec…

常耀斌:深度学习和大模型原理与实战(深度好文)

目录 机器学习 深度学习 Transformer大模型架构 人工神经元网络 卷积神经网络 深度学习是革命性的技术成果&#xff0c;有利推动了计算机视觉、自然语言处理、语音识别、强化学习和统计建模的快速发展。 深度学习在计算机视觉领域上&#xff0c;发展突飞猛进&#xff0c;…

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎&#xff0c;随着智能驾驶时代的到来&#xff0c;应用也会越来越广泛&#xff0c;关于mapbox-gl和其他地理引擎的详细对比&#xff08;比如CesiumJS&#xff09;&#xff0c;后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…

HIVE4.0.1在Hadoop HA部署hiveserver2模式

本文基于CENTOS7&#xff0c;在Hadoop3.4.0版本vm虚拟机3节点HA集群的基础上进行的搭建。 一、前置条件 本文使用MySQL8.0.26作为HIVE数据库&#xff0c;不使用hive自带的derby数据库&#xff0c;因为其不支持多客户端访问&#xff0c;也不方便查询。 所以必须先安装MySQL。版本…

Visual Studio 使用 GitHub Copilot 协助调试

&#x1f380;&#x1f380;&#x1f380;【AI辅助编程系列】&#x1f380;&#x1f380;&#x1f380; Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

C10.【C++ Cont】字符数组和万能头

目录 1.字符数组 1.初始化 1.按字符串初始化 2.按字符初始化 2.字符串的输入 1.无空格的字符串 2.带空格的字符串 解决方法 1.gets(了解即可) gets不安全的原因 2.fgets 3.改良后的scanf 4.getchar 3.字符数组的输出 2.C万能头 1.字符数组 C语言风格的字符串:用…