【自然语言处理】【大模型】DeepSeek-V2论文解析

论文地址:https://arxiv.org/pdf/2405.04434

相关博客
【自然语言处理】【大模型】DeepSeek-V2论文解析
【自然语言处理】【大模型】BitNet:用1-bit Transformer训练LLM
【自然语言处理】BitNet b1.58:1bit LLM时代
【自然语言处理】【长文本处理】RMT:能处理长度超过一百万token的Transformer
【自然语言处理】【大模型】MPT模型结构源码解析(单机版)
【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)
【自然语言处理】【大模型】BLOOM模型结构源码解析(单机版)

一、简介

  • DeepSeek-V2是一个总参数为236B的MoE模型,每个token仅激活21B的参数,并支持128K的上下文长度。
  • 提出了Multi-head Latent Attention(MLA),通过压缩kv cache至隐向量,从而保证高效推理。
  • 相比于DeepSeek 67B,DeepSeek-V2实现了更好的表现,节约了42.5%的训练成本,降低了93.3%的kv cache,提升最大吞吐5.76倍。
  • 预训练语料包含了8.1T tokens并进一步进行SFT和RL。

二、模型结构

1. MLA(Multi-Head Latent Attention)

​ 传统Transformer采用MHA(Multi-Head Attention),但是kv cache会成为推理瓶颈。MQA(Multi-Query Attention)和GQA(Grouped-Query Attention)可以一定程度减少kv cache,但效果上不如MHA。DeepSeek-V2设计了一种称为MLA(Multi-Head Latent Attention)的注意力机制。MLA通过低秩key-value联合压缩,实现了比MHA更好的效果并且需要的kv cache要小很多。

1.1 标准MHA

​ 令 d d d为embedding维度, n h n_h nh是注意力头的数量, d h d_h dh是每个头的维度, h t ∈ R d \textbf{h}_t\in\mathbb{R}^d htRd是注意力层中第 t t t个token的输入。标准MHA通过三个矩阵 W Q , W K , W V ∈ R d h n h × d W^Q,W^K,W^V\in\mathbb{R}^{d_h n_h\times d} WQ,WK,WVRdhnh×d来产生 q t , k t , v t ∈ R d h n h \textbf{q}_t,\textbf{k}_t,\textbf{v}_t\in\mathbb{R}^{d_h n_h} qt,kt,vtRdhnh
q t = W Q h t k t = W K h t v t = W V h t \begin{align} \textbf{q}_t&=W^Q\textbf{h}_t \tag{1}\\ \textbf{k}_t&=W^K\textbf{h}_t \tag{2}\\ \textbf{v}_t&=W^V\textbf{h}_t \tag{3}\\ \end{align} \\ qtktvt=WQht=WKht=WVht(1)(2)(3)
在MHA中 q t , k t , v t \textbf{q}_t,\textbf{k}_t,\textbf{v}_t qt,kt,vt会被划分为 n h n_h nh个头:
[ q t , 1 ; q t , 2 ; … , q t , n h ] = q t [ k t , 1 ; k t , 2 ; … , k t , n h ] = k t [ v t , 1 ; v t , 2 ; … , v t , n h ] = v t o t , i = ∑ j = 1 t Softmax ( q t , i ⊤ k j , i d h ) v j , i u t = W O [ o t , 1 ; o t , 2 ; … , o t , n h ] \begin{align} &[\textbf{q}_{t,1};\textbf{q}_{t,2};\dots,\textbf{q}_{t,n_h}]=\textbf{q}_t \tag{4}\\ &[\textbf{k}_{t,1};\textbf{k}_{t,2};\dots,\textbf{k}_{t,n_h}]=\textbf{k}_t \tag{5}\\ &[\textbf{v}_{t,1};\textbf{v}_{t,2};\dots,\textbf{v}_{t,n_h}]=\textbf{v}_t \tag{6}\\ &\textbf{o}_{t,i}=\sum_{j=1}^t\text{Softmax}(\frac{\textbf{q}_{t,i}^\top\textbf{k}_{j,i}}{\sqrt{d_h}})\textbf{v}_{j,i} \tag{7}\\ &\textbf{u}_t=W^O[\textbf{o}_{t,1};\textbf{o}_{t,2};\dots,\textbf{o}_{t,n_h}] \tag{8}\\ \end{align} \\ [qt,1;qt,2;,qt,nh]=qt[kt,1;kt,2;,kt,nh]=kt[vt,1;vt,2;,vt,nh]=vtot,i=j=1tSoftmax(dh qt,ikj,i)vj,iut=WO[ot,1;ot,2;,ot,nh](4)(5)(6)(7)(8)
其中 q t , i , k t , i , v t , i ∈ R d h \textbf{q}_{t,i},\textbf{k}_{t,i},\textbf{v}_{t,i}\in\mathbb{R}^{d_h} qt,i,kt,i,vt,iRdh是第 i i i个注意力头的query、key和value, W O ∈ R d × d h n h W^O\in\mathbb{R}^{d\times d_h n_h} WORd×dhnh是输出投影矩阵。在推理时,所有的key和value都会被缓存来加速推理。对于每个token,MHA需要缓存 2 n h d h l 2n_h d_h l 2nhdhl个元素。

1.2 低秩Key-Value联合压缩

在这里插入图片描述

​ MLA通过低秩联合压缩key和value来减少kv cache:
c t K V = W D K V h t k t C = W U K c t K V v t C = W U V c t K V \begin{align} \textbf{c}_t^{KV}&=W^{DKV}\textbf{h}_t \tag{9}\\ \textbf{k}_t^C&=W^{UK}\textbf{c}_t^{KV} \tag{10}\\ \textbf{v}_t^C&=W^{UV}\textbf{c}_t^{KV} \tag{11}\\ \end{align} \\ ctKVktCvtC=WDKVht=WUKctKV=WUVctKV(9)(10)(11)
其中 c t K V ∈ R d c \textbf{c}_t^{KV}\in\mathbb{R}^{d_c} ctKVRdc是用于压缩key和value的隐向量; d c ( ≪ d h n h ) d_c(\ll d_h n_h) dc(dhnh)表示KV压缩的维度; W D K V ∈ R d c × d W^{DKV}\in\mathbb{R}^{d_c\times d} WDKVRdc×d是下投影矩阵, W U K , W U V ∈ R d h n h × d c W^{UK},W^{UV}\in\mathbb{R}^{d_h n_h\times d_c} WUK,WUVRdhnh×dc表示上投影矩阵。在推理时,MLA仅需要缓存 c t K V \textbf{c}_t^{KV} ctKV,因此kv cache仅需要缓存 d c l d_c l dcl个元素。此外,在推理时可以把 W U K W^{UK} WUK吸收到 W Q W^Q WQ W U V W^{UV} WUV吸收到 W O W^O WO中,这样甚至都不需要计算key和value。

关于推理时权重融合的理解:

​ 这里不考虑具体注意力头,仅就单个头进行分析。先来分析 q t ⊤ k j C \textbf{q}_t^\top\textbf{k}_j^C qtkjC
q t ⊤ k j C = ( W Q h t ) ⊤ W U K c j K V = h t ⊤ W Q ⊤ W U K c j K V = h t ⊤ W Q U K c j K V \begin{align} \textbf{q}_t^\top\textbf{k}_j^C&=(W^Q\textbf{h}_t)^\top W^{UK}\textbf{c}_j^{KV} \\ &=\textbf{h}_t^\top {W^Q}^\top W^{UK} \textbf{c}_j^{KV} \\ &=\textbf{h}_t^\top W^{QUK} \textbf{c}_j^{KV} \\ \end{align} \\ qtkjC=(WQht)WUKcjKV=htWQWUKcjKV=htWQUKcjKV
推理时可以将 W Q ⊤ W U K {W^Q}^\top W^{UK} WQWUK预先计算出来,记为 W Q U K W^{QUK} WQUK。再来看整个注意力输出值的计算过程
u t = W O o t = W O ∑ j = 1 t Softmax j ( q t ⊤ k j d h ) v j = W O ∑ j = 1 t Softmax j ( q t ⊤ k j d h ) W U V c j K V = W O W U V ∑ j = 1 t Softmax j ( q t ⊤ k j d h ) c j K V = W O U V ∑ j = 1 t Softmax j ( q t ⊤ k j d h ) c j K V \begin{align} \textbf{u}_t&=W^O\textbf{o}_t \\ &=W^O\sum_{j=1}^t\text{Softmax}_j(\frac{\textbf{q}_t^\top\textbf{k}_j}{\sqrt{d_h}})\textbf{v}_j \\ &=W^O\sum_{j=1}^t\text{Softmax}_j(\frac{\textbf{q}_t^\top\textbf{k}_j}{\sqrt{d_h}})W^{UV}\textbf{c}_j^{KV} \\ &=W^OW^{UV}\sum_{j=1}^t\text{Softmax}_j(\frac{\textbf{q}_t^\top\textbf{k}_j}{\sqrt{d_h}})\textbf{c}_j^{KV} \\ &=W^{OUV}\sum_{j=1}^t\text{Softmax}_j(\frac{\textbf{q}_t^\top\textbf{k}_j}{\sqrt{d_h}})\textbf{c}_j^{KV} \\ \end{align} \\ ut=WOot=WOj=1tSoftmaxj(dh qtkj)vj=WOj=1tSoftmaxj(dh qtkj)WUVcjKV=WOWUVj=1tSoftmaxj(dh qtkj)cjKV=WOUVj=1tSoftmaxj(dh qtkj)cjKV
W O W U V W^O W^{UV} WOWUV的结果记为 W O U V W^{OUV} WOUV。通过这样的方式就不需要显式计算key和value。

​ 此外,为了在训练时降低激活的显存占用,对query也进行低秩压缩,即使其不能降低kv cache。具体来说,
c t Q = W D Q h t q t C = W U Q c t Q \begin{align} \textbf{c}_t^Q&=W^{DQ}\textbf{h}_t \tag{12}\\ \textbf{q}_t^C&=W^{UQ}\textbf{c}_t^Q \tag{13} \\ \end{align} \\ ctQqtC=WDQht=WUQctQ(12)(13)
其中 c t Q ∈ R d c ′ \textbf{c}_t^Q\in\mathbb{R}^{d_c'} ctQRdc是query的压缩后隐向量; d c ′ ( ≪ d h n h ) d_c'(\ll d_h n_h) dc(dhnh)表示query的压缩维度; W D Q ∈ R d c ′ × d , W U Q ∈ R d h n h × d c ′ W^{DQ}\in\mathbb{R}^{d_c'\times d},W^{UQ}\in\mathbb{R}^{d_h n_h\times d_c'} WDQRdc×d,WUQRdhnh×dc是下投影矩阵和上投影矩阵。

1.3 解耦RoPE

​ RoPE与低秩KV压缩并不兼容。具体来说,RoPE对于query和key是位置敏感的。若将RoPE应用在 k t C \textbf{k}_t^C ktC上,等式10中的 W U K W^{UK} WUK将与位置敏感RoPE矩阵耦合。但是在推理时, W U K W^{UK} WUK就无法被吸收到 W Q W^Q WQ中,因为对当前生成token相关的RoPE矩阵将位于 W Q W^Q WQ W U K W^{UK} WUK之间,而矩阵乘法不满足交换律。因此,推理时必须重新计算前面token的key,这会显著影响推理效率。

关于RoPE与抵秩KV压缩不兼容的理解。

RoPE向 k t C \textbf{k}_t^C ktC注入位置信息的方式为 f ( k t C , t ) = R t k t C f(\textbf{k}_t^C,t)=R_t\textbf{k}_t^C f(ktC,t)=RtktC,其中 R t R_t Rt是一个位置敏感的矩阵。那么有
q t ⊤ f ( k j C , j ) = ( W Q h t ) ⊤ R j W U K c j K V = h t ⊤ W Q ⊤ R j W U K c j K V \begin{align} \textbf{q}_t^\top f(\textbf{k}_j^C,j)&=(W^Q\textbf{h}_t)^\top R_j W^{UK}\textbf{c}_j^{KV} \\ &=\textbf{h}_t^\top {W^Q}^\top R_j W^{UK} \textbf{c}_j^{KV} \\ \end{align} \\ qtf(kjC,j)=(WQht)RjWUKcjKV=htWQRjWUKcjKV
由于 R j R_j Rj是未知敏感的,导致 W Q ⊤ R j W U K {W^Q}^\top R_j W^{UK} WQRjWUK针对不同的token,取值不一样。无法像先前那样直接融合为 W Q U K W^{QUK} WQUK

​ 为了解决这个问题,提出使用额外的多头query q t , i R ∈ R d h R \textbf{q}_{t,i}^R\in\mathbb{R}^{d_h^R} qt,iRRdhR和共享key k t R ∈ R d h R \textbf{k}_t^R\in\mathbb{R}^{d_h^R} ktRRdhR来携带RoPE,其中 d h R d_h^R dhR表示解耦query和key的每个头的维度。在MLA中使用解耦RoPE策略的方式为:
q t R = [ q t , 1 R ; q t , 2 R ; … ; q t , n h R ] = RoPE ( W Q R c t Q ) k t R = RoPE ( W K R h t ) q t , i = [ q t , i C ; q t , i R ] k t , i = [ k t , i C ; k t R ] o t , i = ∑ j = 1 t Softmax j ( q t , i ⊤ k j , i d h + d h R ) v j , i C u t = W O [ o t , 1 ; o t , 2 ; … ; o t , n h ] \begin{align} \textbf{q}_t^R&=[\textbf{q}_{t,1}^R;\textbf{q}_{t,2}^R;\dots;\textbf{q}_{t,n_h}^R]=\text{RoPE}(W^{QR}\textbf{c}_t^Q) \tag{14}\\ \textbf{k}_t^R&=\text{RoPE}(W^{KR}\textbf{h}_t) \tag{15}\\ \textbf{q}_{t,i}&=[\textbf{q}_{t,i}^C;\textbf{q}_{t,i}^R] \tag{16}\\ \textbf{k}_{t,i}&=[\textbf{k}_{t,i}^C;\textbf{k}_t^R] \tag{17} \\ \textbf{o}_{t,i}&=\sum_{j=1}^t\text{Softmax}_j(\frac{\textbf{q}_{t,i}^\top\textbf{k}_{j,i}}{\sqrt{d_h+d_h^R}})\textbf{v}_{j,i}^C \tag{18} \\ \textbf{u}_t&=W^O[\textbf{o}_{t,1};\textbf{o}_{t,2};\dots;\textbf{o}_{t,n_h}] \tag{19}\\ \end{align} \\ qtRktRqt,ikt,iot,iut=[qt,1R;qt,2R;;qt,nhR]=RoPE(WQRctQ)=RoPE(WKRht)=[qt,iC;qt,iR]=[kt,iC;ktR]=j=1tSoftmaxj(dh+dhR qt,ikj,i)vj,iC=WO[ot,1;ot,2;;ot,nh](14)(15)(16)(17)(18)(19)
其中 W Q R ∈ R d h R n h × d c ′ W^{QR}\in\mathbb{R}^{d_h^R n_h\times d_c'} WQRRdhRnh×dc W K R ∈ R d h R × d W^{KR}\in\mathbb{R}^{d_h^R\times d} WKRRdhR×d是用于产生解耦query和key的矩阵; RoPE ( ⋅ ) \text{RoPE}(\cdot) RoPE()表示应用RoPE的操作; [ ⋅ ; ⋅ ] [\cdot;\cdot] [;]表示拼接操作。在推理时,解耦的key也需要被缓存。因此,DeekSeek-V2需要的总kv cache包含 ( d c + d h R ) l (d_c+d_h^R)l (dc+dhR)l个元素。

1.4 结论

在这里插入图片描述

MLA能够通过更少的kv cache实现比MHA更好的效果

2. 整体结构

2.1 基础结构

​ 对于FFN层,利用DeepSeekMoE架构,即将专家划分为更细粒度,从而获得更专业化的专家以及获取更准确的知识。在具有相同激活和总专家参数的情况下,DeepSeekMoE能够大幅度超越传统MoE架构。

​ 令 u t \textbf{u}_t ut是第t个token对FFN的输入,那么计算FFN的输出 h t ′ \textbf{h}_t' ht为:
h t ′ = u t + ∑ i = 1 N s FFN i ( s ) ( u t ) + ∑ i = 1 N r g i , t FFN i ( r ) ( u t ) g i , t = { s i , t , s i , t ∈ Topk ( { s j , t ∣ 1 ≤ j ≤ N r } , K r ) 0 , otherwise s i , t = Softmax i ( u t ⊤ e i ) \begin{align} \textbf{h}_t'&=\textbf{u}_t+\sum_{i=1}^{N_s}\text{FFN}_i^{(s)}(\textbf{u}_t)+\sum_{i=1}^{N_r}g_{i,t}\text{FFN}_{i}^{(r)}(\textbf{u}_t) \tag{20}\\ g_{i,t}&=\begin{cases} s_{i,t},& s_{i,t}\in\text{Topk}(\{s_{j,t}|1\leq j\leq N_r\},K_r)\\ 0,&\text{otherwise} \end{cases}\tag{21}\\ s_{i,t}&=\text{Softmax}_i(\textbf{u}_t^\top \textbf{e}_i) \tag{22}\\ \end{align} \\ htgi,tsi,t=ut+i=1NsFFNi(s)(ut)+i=1Nrgi,tFFNi(r)(ut)={si,t,0,si,tTopk({sj,t∣1jNr},Kr)otherwise=Softmaxi(utei)(20)(21)(22)
其中 N s N_s Ns N r N_r Nr表示共享专家和路由专家的数量; FFN i ( s ) ( ⋅ ) \text{FFN}_i^{(s)}(\cdot) FFNi(s)() FFN i ( r ) ( ⋅ ) \text{FFN}_i^{(r)}(\cdot) FFNi(r)()表示第i个共享专家和第i个路由专家; K r K_r Kr表示激活路由专家的数量; g i , t g_{i,t} gi,t是第i个专家的门限值; e i \textbf{e}_i ei是当前层第i个路由专家的中心。

2.2 设备受限路由

​ 设计了一种设备受限路由机制来控制MoE相关的通信成本。当采用专家并行时,路由专家将分布在多个设备上。对于每个token,MoE相关的通信频率与目标专家覆盖的设备数量成正比。由于在DeepSeekMoE中细粒度专家划分,激活专家的数量会很大,因此应用专家并行时,与MoE相关的通信将更加昂贵。

​ 对于DeepSeek-V2,除了路由专家会选择top-K个以外,还会确保每个token的目标专家最多分布在M个设备上。具体来说,对于每个token,先选择包含最高分数专家的M个设备。然后在这M个设备上执行top-K选择。在实践中,当 M ≥ 3 M\geq 3 M3时,设备受限路由能够实现与不受限top-K路由大致一致的良好性能。

2.3 用于负载均衡的辅助loss

​ 不平衡的负载会增加路由坍缩的风险,使一些专家无法得到充分的训练和利用。此外,当使用专家并行时,不平衡的负载降低计算效率。在DeepSeek-V2训练时,设计了三种辅助损失函数用于控制专家级别负载均衡 ( L ExpBal ) (\mathcal{L}_{\text{ExpBal}}) (LExpBal)、设备级别负载均衡 ( L DevBal ) (\mathcal{L}_{\text{DevBal}}) (LDevBal)和通信均衡 L CommBal \mathcal{L}_{\text{CommBal}} LCommBal

专家级均衡loss。专家级均衡loss用于缓解路由坍缩问题:
L ExpBal = α 1 ∑ i = 1 N r f i P i , f i = N r K r T ∑ t = 1 T 1 (Token t selects Expert i) P i = 1 T ∑ t = 1 T s i , t \begin{align} \mathcal{L}_{\text{ExpBal}}&=\alpha_1\sum_{i=1}^{N_r}f_iP_i, \tag{23} \\ f_i&=\frac{N_r}{K_r T}\sum_{t=1}^T\mathbb{1}\text{(Token t selects Expert i)} \tag{24} \\ P_i&=\frac{1}{T}\sum_{t=1}^T s_{i,t} \tag{25} \\ \end{align} \\ LExpBalfiPi=α1i=1NrfiPi,=KrTNrt=1T1(Token t selects Expert i)=T1t=1Tsi,t(23)(24)(25)
其中 α 1 \alpha_1 α1是称为专家级均衡因子的超参数; 1 ( ⋅ ) \mathbb{1}(\cdot) 1()是指示函数; T T T是序列中token的数量。

设备级均衡loss。除了专家级均衡loss以外,也设计了设备级别均衡loss来确保跨设备均衡计算。在DeepSeek-V2训练过程中,将所有的专家划分至 D D D { E 1 , E 2 , … , E D } \{\mathcal{E}_1,\mathcal{E}_2,\dots,\mathcal{E}_D\} {E1,E2,,ED}并在单个设备上部署每个组。设备级均衡loss计算如下:
L DevBal = α 2 ∑ i = 1 D f i ′ P i ′ f i ′ = 1 E i ∑ j ∈ E i f j P i ′ = ∑ j ∈ E i P j \begin{align} \mathcal{L}_{\text{DevBal}}&=\alpha_2\sum_{i=1}^D f_i' P_i'\tag{26} \\ f_i'&=\frac{1}{\mathcal{E}_i}\sum_{j\in\mathcal{E}_i}f_j \tag{27} \\ P_i'&=\sum_{j\in\mathcal{E}_i}P_j \tag{28} \\ \end{align} \\ LDevBalfiPi=α2i=1DfiPi=Ei1jEifj=jEiPj(26)(27)(28)
其中 α 2 \alpha_2 α2是称为设备级均衡因子的超参数。

通信均衡loss。通信均衡loss能够确保每个设备通信的均衡。虽然设备限制路由机制能够确保每个设备发送信息有上限,但是当某个设备比其他设备接收更多的tokens,那么实际通信效率将会有影响。为了缓解这个问题,设计了一种通信均衡loss如下:
L CommBal = α 3 ∑ t = 1 D f i ′ ′ P i ′ ′ f i ′ ′ = D M T ∑ t = 1 T 1 (Token t is sent to Device i) P i ′ ′ = ∑ j ∈ E i P j \begin{align} \mathcal{L}_{\text{CommBal}}&=\alpha_3\sum_{t=1}^D f_i''P_i''\tag{29} \\ f_i''&=\frac{D}{MT}\sum_{t=1}^T\mathbb{1}\text{(Token t is sent to Device i)}\tag{30} \\ P_i''&=\sum_{j\in\mathcal{E}_i}P_j\tag{31} \\ \end{align} \\ LCommBalfi′′Pi′′=α3t=1Dfi′′Pi′′=MTDt=1T1(Token t is sent to Device i)=jEiPj(29)(30)(31)
其中 α 3 \alpha_3 α3是称为通信均衡因子的超参数。设备受限路由机制操作主要确保每个设备至多向其他设备传输MT个hidden states。同时,通信均衡loss用来鼓励每个设备从其他设备接受MT个hidden states。通信均衡loss确保设备间信息均衡交换,实现高效通信。

2.4 Token-Dropping策略

​ 虽然均衡loss的目标是确保均衡负载,但是其并不能严格确保负载均衡。为了进一步缓解由于不均衡导致的计算浪费,在训练时引入了设备级别的token-dropping策略。该方法会先计算每个设备的平均计算预算,这意味着每个设备的容量因子等于1.0。然而,在每个设备上drop具有最低affinity分数的token,直到达到计算预算。此外,确保大约10%的训练序列的token永远不会被drop。这样,可以根据效率要求灵活地决定是否在推理过程中drop token,并确保训练和推理的一致性。

三、预训练

1. 实验设置

1.1 数据构造

​ 数据处理过程同DeepSeek 67B,并进一步扩展数据量和质量。采用与DeepSeek 67B相同的tokenizer。预训练语料包含8.1T tokens,中文token比英文多12%。

1.2 超参数

​ 略

1.3 Infrastructures

​ DeepSeek-V2训练基于HAI-LLM框架。利用16路0气泡流水并行、8路专家并行和ZeRO-1数据并行。考虑到DeepSeek-V2具有相对较少的激活参数,并且对一部分操作进行重计算来节约激活显存,因此可以不使用张量并行,从而降低通信开销。此外,为了进一步提高训练效率,使用专家并行all-to-all通信来重叠共享专家的计算。使用定制化的CUDA核来改善通信、路由算法和不同专家之间融合线性计算。此外,MLA基于改善版本的FlashAttention-2进行优化。

1.4 长上下文扩展

​ 使用YaRN将上下文窗口尺寸从4K扩展至128K。

2. 评估

在这里插入图片描述

四、对齐

SFT。 使用了150万样本的微调数据,其中120万是用于有用性,30万则用于安全性。

强化学习。仍然采用GRPO。

结果
在这里插入图片描述

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

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

相关文章

11.偏向锁原理及其实战

文章目录 偏向锁原理及其实战1.偏向锁原理2.偏向锁案例代码演示2.1.偏向锁案例代码2.2.1.无锁情况下状态2.1.2.偏向锁状态2.1.3.释放锁后的状态 2.2.偏向锁的膨胀和撤销2.2.1.偏向锁撤销的条件2.2.2.偏向锁的撤销 2.2.3.偏向锁的膨胀 2.3.全局安全点原理和偏向锁撤销性能问题2.…

EPAI手绘建模APP工程图顶部工具栏

7、工程图 图 302 工程图 工程图包括顶部常用工具栏、右侧工程图工具栏、左侧模型列表栏、中间的工程图。 (1) 常用工具栏 ① 删除,选中场景中工程图元素后,删除。可以选择多个工程图元素同时删除。 ② 设置,打开工程图设置页面&#xff0…

2024 年最新本地、云服务器安装部署 miniconda 环境详细教程(更新中)

Anaconda 概述 Anaconda 是专门为了方便使用 Python 进行数据科学研究而建立的一组软件包,涵盖了数据科学领域常见的 Python 库,并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。主要是提供了包管理与环境管理的功能,可以很方便…

picoCTF-Web Exploitation-More SQLi

Description Can you find the flag on this website. Additional details will be available after launching your challenge instance. Hints SQLiLite 先随便输入个账号密码登录一下,得到查询SQL,接下来应该对SQL进行某些攻击来绕过密码登录成功 -- …

微信小程序踩坑,skyline模式下,简易双向绑定无效

工具版本 基础库版本 Skline模式 页面json设置 问题描述 skyline模式下,textarea,input标签设置简易双向绑定 model:value是无效的,关闭skyline模式就正常使用了 截图展示 这里只展示了textarea标签,input标签的简易双向绑定也是无效的 总结 我在文档里面是没找到skyline里面不…

动态规划----股票买卖问题(详解)

目录 一.买卖股票的最佳时机: 二.买卖股票的最佳时机含冷冻期: 三.买卖股票的最佳时期含⼿续费: 四.买卖股票的最佳时机III: 五.买卖股票的最佳时机IV: 买卖股票的最佳时机问题介绍:动态规划买卖股票的最佳时机是一个经典的…

windows使用Docker-Desktop部署lobe-chat

文章目录 window安装docker-desktop下载和启动lobe-chatAI大语言模型的选择lobe-chat设置大模型连接 window安装docker-desktop docker-desktop下载地址 正常安装应用,然后启动应用,注意启动docker引擎 打开右上角的设置,进入Docker Engine设…

算法学习系列(六十):区间DP

目录 引言区间合并模板一、石子合并二、环形石子合并三、能量项链 引言 关于这个区间 D P DP DP ,其实是有套路和模板的,题型的话也是变化不多,感觉就那几种,只不过有些题会用到高精度或者是要记录方案,所以整体来说…

Unity编辑器如何多开同一个项目?

在联网游戏的开发过程中,多开客户端进行联调是再常见不过的需求。但是Unity并不支持编辑器多开同一个项目,每次都得项目打个包(耗时2分钟以上),然后编辑器开一个进程,exe 再开一个,真的有够XX的。o(╥﹏╥)o没错&#…

Rust学习笔记(上)

前言 笔记的内容主要参考与《Rust 程序设计语言》,一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下,其它两个地址在Rust学习笔记(中)和Rust学习笔记(下)。 编译与运行 Ru…

python使用yaml文件以及元组样式字符串使用eval的类型转换

编程中,对于可变内容,最好是将其放入配置文件中,经过这段时间的学习,感觉使用yaml文件很方便。我的环境:win10,python3.8.10。 python使用yaml文件,首先要安装库。 pip38 install pyyaml 安装…

AWTK 开源串口屏开发(18) - 用 C 语言自定义命令

AWTK-HMI 内置了不少模型,利用这些模型开发应用程序,不需要编写代码即可实现常见的应用。但是,有时候我们需要自定义一些命令,以实现一些特殊的功能。 本文档介绍如何使用 C 语言自定义命令。 1. 实现 hmi_model_cmd_t 接口 1.1…

实现二叉树的基本操作

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1我们先来模拟创建一个二叉树 public class TestBinaryTreee {static class TreeNode{public char val;public TreeNode left;public TreeNode right;public TreeNode(char val) {this.val val;}}public TreeNode …

linux 安装 mangodb 并设置服务开机自启

1、下载 wget http://mosquitto.org/files/source/mosquitto-1.6.8.tar.gz 2、解压 tar -zxvf mosquitto-1.6.8.tar.gz 3、编译安装cd mosquitto-1.6.8 make sudo make install4、在当前目录。进入mosquitto服务文件存放的文件夹 cd service/systemd可以看到3个文件 点击read…

【C/C++】设计模式——工厂模式:简单工厂、工厂方法、抽象工厂

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

二.基础篇: 面向对象进阶

1. 基础篇语法篇&#xff1a;一.基础篇&#xff1a;基础语法-CSDN博客 面向对象进阶 本章主要学习内容&#xff1a; static继承包&#xff0c;final&#xff0c;权限修饰符&#xff0c;代码块抽象类接口多态内部类 1. static static翻译过来就是静态的意思static表示静态&am…

AI语音模型PaddleSpeech踩坑(安装)指南

PaddleSpeech简介 PaddleSpeech 是基于飞桨 PaddlePaddle 的语音方向的开源模型库&#xff0c;用于语音和音频中的各种关键任务的开发&#xff0c;包含大量基于深度学习前沿和有影响力的模型。 PaddleSpeech安装步骤 提示&#xff1a;要找到一个合适的PaddleSpeech版本与pad…

java项目之相亲网站的设计与实现源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的相亲网站的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 相亲网站的设计与实…

连升三级!openGauss单机版从2.1.0经停3.0.0升级至5.0.0

前言 如前文所述&#xff0c;我们的小demo项目起初安装了openGauss的2.1.0版本&#xff0c;由于2.1.0不是长期维护&#xff08;LTS&#xff09;版本&#xff0c;所以要升级到5.0.0LTS。考虑到虽然是DEMO项目&#xff0c;但也有些体验用户&#xff0c;所以为了保障业务连续性&a…

2023版brupsuite专业破解安装

安装教程&#xff0c;分两部分&#xff1a; 1、安装java环境、参考链接JAVA安装配置----最详细的教程&#xff08;测试木头人&#xff09;_java安装教程详细-CSDN博客 2、安装2023.4版本brupsuite&#xff1a;参考链接 2023最新版—Brup_Suite安装配置----最详细的教程&…