当前位置: 首页 > news >正文

【cs336学习笔记】[第11课]如何用好scaling law

文章目录


学习目标

什么是扩展大模型的最佳实践?
* chinchilla研究缩放定律的方法真的有效吗?
* 在训练和拟合这些东西时我们可以节省计算吗?
* 是否应该选择特定的架构或参数化方法,以便更好地进行扩展?
在这里插入图片描述

回顾-μP\mu PμP

当我们训练这些模型并使其更大时,我们需要调整某些超参数,如图左侧所示。可以看到当模型更宽(比如在MLP层的hidden size 增加)时,最优学习率会向左调整。因此需要为更大模型使用更小的学习率。

缺点是,这意味着在大规模训练时需要反复调整学习率,这将非常耗费计算资源。

另一方面,如果我们能重新参数化模型,使得最优学习率在整个规模范围内保持不变,就能大大简化我们的搜索流程。

我们希望所有超参数,在不同规模下保持稳定,这才是理想状态。

μP\mu PμP 是一类非常有趣的处理方法。

在这里插入图片描述

不同模型的 scaling law

每个模型都采用了截然不同的扩展策略,它们也教会我们如何正确实现扩展。

在这里插入图片描述

Cerebras-GPT

这是一个大型模型家族,训练了从0.1到130亿参数的模型,采用 chinchilla 训练方案。参数与token数量的比例大致最优,达到理想水平。

他们有一个非常重要的核心发现,即扩展 μP\mu PμP 方法,使扩展更加稳定,处理起来也更顺畅。

蓝色实线是 Cerebras-GPT,蓝色虚线是 Cerebras-GPT的scaling law,橙色实线是 Cerebras-Gpt 的 μP\mu PμP。可以看到, μP\mu PμP 展示了更平滑的扩展效果,甚至优于 Pythia 或 GPT-J

在这里插入图片描述

超参数调优策略

当使用标准参数化训练模型时, 发现在预测的 scaling point (虚线)附近存在较大的振荡现象(蓝色实线)。

出现振荡是因为,他们必须根据模型规模调整学习率。因此,他们很难真正精确地达到预测的性能。

另一方面,如果他们用 μP\mu PμP 缩放方法,会得到橙色实线,和 μP\mu PμP 版本的 scaling point 拟合结果更加接近。

他们的主张是,使用这种替代的参数化方法,能够让他们获得更可预测的模型缩放效果,并进行更方便的超参数调优。

在这里插入图片描述

μP\mu PμP 参数化

SP:Standard Parameterization,标准参数化
μP\mu PμP :Maximal Update,最大更新版本

μP\mu PμP 的方法是,每个非嵌入层的参数都用 1/width 来初始化,每层的学习率按 1/width 进行缩放。例如
Wqkv∼Ntrunc (0,σbase 2/mwidth )ηqkv=ηbase /mwidth \begin{array}{c} W_{\mathrm{qkv}} \sim N_{\text {trunc }}\left(0, \sigma_{\text {base }}^{2} / m_{\text {width }}\right) \\ \eta_{\mathrm{qkv}}=\eta_{\text {base }} / m_{\text {width }} \end{array} WqkvNtrunc (0,σbase 2/mwidth )ηqkv=ηbase /mwidth 

和 SP 相比,即使在初始化时采用了 1/width 的缩放,实际上每层的学习率是不同的。
在这里插入图片描述

设定经验值

μP\mu PμP 这种能让超参数选择更稳定的策略,和非常激进的缩放结合起来。

具体做法是,将模型的规模一直缩小到4000万个参数,并在这个小模型上进行了广泛的超参数搜索,再用 μP\mu PμP 方法将模型放大,以便尽可能保持超参数的稳定性。

图中每个点都代表一次模型运行,每个点都对应一组超参数,然后选择最小值。这类似于一种超参数网格。

在这里插入图片描述

总结:实现 μP\mu PμP 时,初始化会改变,层的学习率会改变

MiniCPM

https://arxiv.org/pdf/2404.06395

表面的目标是,使用大量计算资源来训练真正优秀的小模型。

在此过程中,他们进行了大量的 scaling 计算,也用 μP\mu PμP 来稳定和简化 scaling。

当他们最终扩展这些模型时,不是在模型大小上,而是在数据量上。

在这里插入图片描述

结果上看,训练了一批非常好的1.2B-2.4B 的模型。
在这里插入图片描述

技术点1: 用 μP\mu PμP 稳定 scaling

在小规模下选择超参数,希望它们保持稳定,再扩展到大模型。

对于嵌入层,只乘了一个常数缩放因子 scale_emb
对于残差层,通过 scale_depth/num_layersscale\_depth / \sqrt{num\_layers}scale_depth/num_layers 进行缩放
初始化 tensors 时,用 init_std/dm/dbaseinit\_std/\sqrt{d_m/d_{base}}init_std/dm/dbase (dm:d_model,d_base:基础宽度)
学习率也会根据模型的宽度进行缩放
heda也是类似的缩放策略

在这里插入图片描述
某种程度上,依赖于你的最佳学习率保持稳定,所以你会大致保持这些数值稳定。

从 9M 到 0.5B,获得了大约 5 倍的计算资源节省。然后就可以利用这一点,确定是否找到了随规模变化的最佳 Batch size。

在这里插入图片描述

随着模型变大,损失会降低。随着损失降低,你可以使用越来越大的 batch size。

临界 batch size,是收益递减的拐点。对于我当前操作下的,给定模型大小和 scaling,训练这些模型,合适的 batch size 是多少。

横坐标是batch size,

垂直线代表的是一条单一的训练曲线,然后拟合二次函数,试图找出最小值。

红线代表的是,随着我们向上移动,所有这些点的最小值。

在这里插入图片描述
图上预测的是你试图训练达到的损失,和临界 batch size 点上的 batch size。

可以看到,有一个对数-对数的线性关系,在目标损失和 batch size 之间。

在这里插入图片描述
Batch size 会随着目标损失和计算量的变化而调整。

图上展示的是,不同的模型大小(从浅色代表的小模型,到深色代表的大模型),使用了不同的学习率。其中大模型出于计算量考虑,只运行了一小段时间。

有一个相对宽的平坦区域,然后随着模型变得非常不稳定而急剧上升。重点是,最小值(横坐标为0.01)在相对大的模型数量级范围内保持固定。

正确地缩放模型初始化和每层学习率,可以避免调整学习率。

在这里插入图片描述

模型大小与数据的权衡关系

假设我想拟合一个 chinchill scaling law,需要改变 token 的数量和模型大小。这样做时,会固定一个模型大小,然后训练一个模型越来越长时间。

如果能提前停止并获取模型的检查点就太好了,并让它代表数据集大小的变化。(因为早期的检查点对应着较少的数据,这样我就能用一次运行来收集数据缩放的信息)

但是!不同数据目标的余弦学习率是不同的。如果数据量非常少,余弦曲线会上升得很快,或者说,预热阶段总是相同的,但冷却阶段非常快。如果数据量很大,余弦曲线会很缓慢地下降到底部。

也就是说,少量数据训练运行的学习率,和大数据训练的会不同。

所以!你不能只用一次余弦学习率模型的运行结果,试图从中获取早期检查点,并基于此推断数据缩放行为!

为了避免这种情况,你通常需要把一个模型从头训练到每个目标,这意味着要进行 n² 次运行。尽管有些运行规模较小, 但必须运行大量实验, 每个都有终止点, 而非单次运行收集检查点, 感觉这样做有点没意义。

在这里插入图片描述

解决方案:WSD(Warmup Stable Decay,预热-稳定-衰减) learning rate

图中黄线显示的是余弦学习率,有一个预热期(上升部分),通常非常短,以达到完整的学习率。然后曲线逐渐下降,到终止点附近,可能会停留在最小学习率。

WSD:梯形学习率。首先和余弦曲线一样有预热阶段,然后是一个平坦的稳定阶段,接着是衰减阶段,快速将学习率降到最低。

WSD的优点是,你可以重用稳定阶段。

在这里插入图片描述
实验效果很好!

黄色线是余弦学习率,其他颜色的线是WSD。

两种曲线效果都不错,但WSD胜在不必担心终止点,可以重复 cool down,以获得不同数据量的检查点。
在这里插入图片描述

其他估计 chinchilla曲线的方法
研究目标:当你不断添加更多数据时,你的损失比你按照chinchilla进行缩放要差多少?

随着 token 与参数比率的提高,模型会退化多少?

在这里插入图片描述
现在有了 WSD,可以进行一次训练,来分析 chinchilla

方法1:叠加所有学习曲线,取 下包络线,大致遵循幂律
方法3:联合拟合方程2,假设这个双变量缩放定律,然后将它拟合到你拥有的所有数据,以曲线拟合的方式。通过这种拟合,可以求解出最优的 token/数据 比例。

在这里插入图片描述

chinchilla 方法一的结果:
趋势并非完全线性,但是基本可以从计算量推导出 token 比例。
在这里插入图片描述
方法三的结果:
等高线是他们拟合的曲线,每个点是为拟合 chinchilla 参数而进行的小规模实验。
在这里插入图片描述
结论是,token/参数比例非常高,他们认为 Llama 风格的架构都应该有更高的比例,因为数据质量和模型效率都得到了提升。

经过仔细的优化和调优,我们应该能够远远超越“模型大小的20倍”这一经验法则。

在这里插入图片描述
最终,scaling 曲线拟合结果,看起来很不错。

在这里插入图片描述

DeepSeek

在这里插入图片描述

在这里插入图片描述
Deepseek V1 和 MiniCPM、Cerebras-GPT 的区别在于,不使用任何 μP\mu PμP,直接尝试估计最优的 batch size 和最优的学习率。

具体做法是,选取两个较小模型,在不同的batch size上进行网格搜索,以及对不同的学习率网格搜索,并得到在网格上的损失值。这样可以找到最佳的 batch size 和 学习率。

在这里插入图片描述

训练一堆模型,用不同数量的非嵌入层的浮点运算量,在网格上改变batch size和学习率。这样,得到不同 scale 下的最佳 batch size和最佳学习率。

在这里插入图片描述
deepseek做了一个chinchilla的分析,并使用了WSD风格的学习率试图从本质上最小化重复工作的量。

先warm up,然后stable,接着两组衰减(计算量大概是20%),直至衰减到0。
在这里插入图片描述
在不同的计算 scale 下,有不同的二次关系(左图),沿着二次曲线的底部画一条线,就是最优的 flops for token,以及作为训练 flops 函数的最优 token 大小。
在这里插入图片描述

最后,deepseek得到了一个拟合的缩放定律。

在这里插入图片描述

Llama-3 scaling law

最优的比例是,39:1。通过拟合sigmoid函数对困惑度和准确率进行转换。

chinchilla的最优比例是 20:1
在这里插入图片描述

Hunyuan scaling law

token :参数 = 96:1

Q:为什么大家都在复现chinchilla?
A:因为很多人想搞清楚,能把 token 和参数的比例推到多极致,希望能保持在这个比例的上限。比如数据比参数多,这样人们才会真正使用我们的模型。

在这里插入图片描述

MiniMax scaling law

minimax 1是一种长上下文的语言模型,基于线性注意力。

核心思想是,采用softmax注意力机制(平方复杂度),以及 lightening attention(是一种线性注意力),做一个混合版本。

他们想弄清楚,在模型性能方面,从softmax注意力变成线性注意力或混合注意力,需要付出多少代价。

结论是,线性注意力或混合注意力,性能和softmax注意力相同
在这里插入图片描述

总结

CerebrasGPT
• 使用 muP 使超参数保持缩放不变
• 直接使用 Chinchilla 缩放公式
DeepSeek 秘诀
• 假设大多数 Transformer 超参数保持缩放不变
• 对批量/LR 进行缩放分析,以确定最佳缩放比例
• IsoFLOP 分析以确定模型大小

  • 使用分段线性调度,以降低 Chinchilla 缩放成本。

miniCPM 秘诀
• 使用 muP 使 Transformer + LR 保持缩放不变
• 使用分段线性调度获取 Chinchilla 方法 3(曲线拟合)的样本
LLaMA 3 / Hunyuan
近期(2024 年末及以后),但细节较少
• 仅使用 IsoFLOP(无其他缩放细节)Minimax
• 架构选择/决策缩放
在这里插入图片描述

深入理解 μP\mu PμP

三个部分:初始化、学习率、batch size

μP\mu PμP 并不是训练模型必须的,只是一种尝试,让偏移尽可能小。如果找到了合适的学习率,就不需要 μP\mu PμP

在这里插入图片描述

μP\mu PμP 基于以下断言:在训练神经网络时,作为网络宽度 𝑛𝑙𝑛_𝑙nl 的函数……

  • A1:初始化时的激活值应保持为 Θ(1) 的量级
  • A2:经过一个梯度步骤后,激活值的变化应为 Θ(1) 的量级

保持为 Θ(1) 的量级,是指在一个常数范围内,不要太大也不要太小。

如果违反了这些条件,意味着模型变大,要么初始激活值会爆炸式增长或消失,要么在一次梯度更新后,激活值会爆炸式增长或消失。

注意这里说的是单个激活值。

在这里插入图片描述

推导-关于初始化

第一个条件是,希望激活值保持稳定。于是对初始化施加了某种约束。

假设我们有一个简单的深度线性网络 hl=Wlhl−1h_{l}=W_{l} h_{l-1}hl=Wlhl1

hlh_{l}hl:在第 l 层的激活值
WlW_{l}Wl:第 l 层权重矩阵的函数
hl−1h_{l-1}hl1:在第 l-1 层的激活值

初始化选择高斯初始化,Wl∼N(0,σlInl×nl−1)W_{l} \sim N\left(0, \sigma_l I_{n_{l} \times n_{l-1}}\right)WlN(0,σlInl×nl1)

均值为0
Inl×nl−1I_{n_{l} \times n_{l-1}}Inl×nl1:将是矩形大小的,维度取决于激活值的维度
σl\sigma_lσl:超参数,也就是这一层这个矩阵的噪声尺度

让 l 和 l-1 趋于无穷大,W就会集中:
∥Wl∥∗→σ(nl−1+nl)(1)\left\|W_{l}\right\|_{*} \rightarrow \sigma\left(\sqrt{n_{l-1}}+\sqrt{n_{l}}\right) (1)Wlσ(nl1+nl)1

重要的是,这个等价关系是成立的:
∥hl∥2≈∥Wl∥∗∥hl−1∥2(2)\left\|h_{l}\right\|_{2} \approx\left\|W_{l}\right\|_{*}\left\|h_{l-1}\right\|_{2} (2)hl2Wlhl12(2)

层 l 的激活值范数,将近似等于 WlW_{l}Wl 的算子范数 乘以 hl−1h_{l-1}hl1 的激活范数
基于 WlW_{l}Wlhl−1h_{l-1}hl1 是独立的假设

现在,选择一个特定的σ\sigmaσ,如果输入维度远大于输出维度,就会起作用。
σ=nlnl−1(nl+nl−1)−1=Θ(1nl−1min⁡(1,nlnl−1))(3)\sigma=\frac{\sqrt{n_{l}}}{\sqrt{n_{l-1}}}\left(\sqrt{n_{l}}+\sqrt{n_{l-1}}\right)^{-1}=\Theta\left(\frac{1}{\sqrt{n_{l-1}}} \min \left(1, \sqrt{\frac{n_{l}}{n_{l-1}}}\right)\right) (3)σ=nl1nl(nl+nl1)1=Θ(nl11min(1,nl1nl))(3)

  1. 通过归纳证明,每一层都有正确的激活值大小:
    ∥hl−1∥2=Θ(nl−1)(4)\left\|h_{l-1}\right\|_{2}=\Theta\left(\sqrt{n_{l-1}}\right) (4)hl12=Θ(nl1)(4)
  2. σ\sigmaσ 代入公式(2),
    ∥Wl∥∗→σ(nl−1+nl)=nlnl−1(5)\left\|W_{l}\right\|_{*} \rightarrow \sigma\left(\sqrt{n_{l-1}}+\sqrt{n_{l}}\right)=\frac{\sqrt{n_{l}}}{\sqrt{n_{l-1}}} (5)Wlσ(nl1+nl)=nl1nl(5)

将公式(4)和(5)代入公式(2),得到

∥hl∥2=nl+o(nl)\left\|h_{l}\right\|_{2}=\sqrt{n_{l}}+o\left(\sqrt{n_{l}}\right)hl2=nl+o(nl)

在这里插入图片描述

推导-关于学习率

第二个条件:当在初始化后进行一次梯度更新时,需要保持激活值的更新幅度恒定,不能爆炸式增长,也不能消失。

假设我在层 l 的权重上有一个 ΔWl\Delta W_{l}ΔWl 的更新量(batch size为1,秩为1),例如来自SGD。

ΔWl=−ηl∇hlℓhl−1⊤\Delta W_{l}=-\eta_{l} \nabla_{h_{l}} \ell h_{l-1}^{\top}ΔWl=ηlhlhl1

因为秩为1,所以有
∥ΔWlhl−1∥2=∥ΔWl∥∗∥hl−1∥2\left\|\Delta W_{l} h_{l-1}\right\|_{2}=\left\|\Delta W_{l}\right\|_{*}\left\|h_{l-1}\right\|_{2}ΔWlhl12=ΔWlhl12

激活值的更新量为Δhl=WlΔhl−1+ΔWl(hl−1+Δhl−1)\Delta \mathrm{h}_{l}=\mathrm{W}_{l} \Delta h_{l-1}+\Delta W_{l}\left(h_{l-1}+\Delta h_{l-1}\right)Δhl=WlΔhl1+ΔWl(hl1+Δhl1)

查看每一项的量级

  1. WlΔhl−1=Θ(nl)\mathrm{W}_{l} \Delta h_{l-1}=\Theta\left(\sqrt{n_{l}}\right)WlΔhl1=Θ(nl),由归纳证明和 condition A1 论证得到
  2. ΔWlhl−1=∥ΔWl∥∗nl−1\Delta W_{l} h_{l-1}=\left\|\Delta W_{l}\right\|_{*} \sqrt{n_{l-1}}ΔWlhl1=ΔWlnl1, from above, thus ∥ΔWl∥∗=Θ(nlnl−1)\left\|\boldsymbol{\Delta} \boldsymbol{W}_{l}\right\|_{*}=\boldsymbol{\Theta}\left(\frac{\sqrt{\boldsymbol{n}_{\boldsymbol{l}}}}{\sqrt{\boldsymbol{n}_{\boldsymbol{l}-1}}}\right)ΔWl=Θ(nl1nl)
  3. ΔWlΔhl−1=O(∥ΔWl∥∗nl−1)\Delta W_{l} \Delta h_{l-1}=O\left(\left\|\Delta W_{l}\right\|_{*} \sqrt{n_{l-1}}\right)ΔWlΔhl1=O(ΔWlnl1)

关键就在于,∥ΔWl∥∗\left\|\Delta W_{l}\right\|_{*}ΔWl 在更新时,量级是多少

在这里插入图片描述

我们想要 Δh1=W1Δhl−1+ΔWl(hl−1+Δhl−1)\Delta \mathrm{h}_{1}=\mathrm{W}_{1} \Delta h_{l-1}+\Delta W_{l}\left(h_{l-1}+\Delta h_{l-1}\right)Δh1=W1Δhl1+ΔWl(hl1+Δhl1)的量级为Θ(nl)\Theta\left(\sqrt{n_{l}}\right)Θ(nl),所以关键就在于让 ∥ΔWl∥∗nl−1=Θ(nl)\left\|\Delta W_{l}\right\|_{*} \sqrt{n_{l-1}}=\Theta\left(\sqrt{n_{l}}\right)ΔWlnl1=Θ(nl)

如何实现呢?

假设训练过程表现良好,那么在一次梯度更新后,损失的变化(Δℓ\Delta \ellΔ)量级在 O(1)\mathrm{O}(1)O(1)。因为我们不希望损失的更新,会爆炸式增长或趋于零,而是保持大致相同的数量级。

Δℓ=Θ(⟨ΔWl,∇Wlℓ⟩)=Θ(∥ΔWl∥F∥∇Wlℓ∥F)=Θ(∥ΔWl∥∗∥∇Wlℓ∥∗)\Delta \ell=\Theta\left(\left\langle\Delta W_{l}, \nabla_{W_{l}} \ell\right\rangle\right)=\Theta\left(\left\|\Delta W_{l}\right\|_{F}\left\|\nabla_{W_{l}} \ell\right\|_{F}\right)=\Theta\left(\left\|\Delta W_{l}\right\|_{*}\left\|\nabla_{W_{l}} \ell\right\|_{*}\right) Δ=Θ(ΔWl,Wl)=Θ(ΔWlFWlF)=Θ(ΔWlWl)

再加上 Δℓ=O(1)\Delta \ell=\mathrm{O}(1)Δ=O(1)∥ΔWl∥∗=Θ(nlnl−1)\left\|\Delta W_{l}\right\|_{*}=\Theta\left(\frac{\sqrt{n_{l}}}{\sqrt{n_{l-1}}}\right)ΔWl=Θ(nl1nl)

可以得到
∥∇Wlℓ∥∗=Θ(nl−1nl)\left\|\nabla_{W_{l}} \ell\right\|_{*}=\Theta\left(\frac{\sqrt{n_{l-1}}}{\sqrt{n_{l}}}\right)Wl=Θ(nlnl1)

因为 ΔWl=−ηl∇hlℓhl−1⊤\Delta W_{l}=-\eta_{l} \nabla_{h_{l}} \ell h_{l-1}^{\top}ΔWl=ηlhlhl1,所以 ηl=Θ(nlnl−1)\eta_{l}=\Theta\left(\frac{n_{l}}{n_{l-1}}\right)ηl=Θ(nl1nl)

注意,以上推导只对 SGD 有效
[with Adam, ∥ΔWl∥∗nl−1=Θ(1)\left\|\Delta W_{l}\right\|_{*} \sqrt{n_{l-1}}=\Theta(1)ΔWlnl1=Θ(1) ]

在这里插入图片描述
应用 μP\mu PμP 时,如果直接遵循之前的指导原则,会得到蓝色框中的初始化方法;如果用标准化参数的方法,如 kaiming,就是下面的方法,学习率会是一个常数。

对SGD可能差不多,因为学习率的量级 nlnl−1\frac{n_{l}}{n_{l-1}}nl1nl 会接近 1
但是对 Adam,学习率的区别很大

在这里插入图片描述

回到 Cerebras GPT 的论文
μP\mu PμP 中 Embedding output部分,基本没有做缩放,因为embedding层用的是 one-hot 编码,所以范数不会随词表大小线性缩放。

在 MHA、QKV、O、ffn1、ffn2、Output 层都按 1/模型宽度 进行缩放,学习率也按 1/模型宽度 进行缩放。

在这里插入图片描述

https://arxiv.org/pdf/2404.05728v5

缩小方差(Variance)、通过全局宽度 M 来缩小学习率。

一般注意力机制的缩放会用 D\sqrt{D}D,但此处只用了 DDD

此处保持了深度固定,和别的论文在深度和宽度上缩放的研究不同

在这里插入图片描述
他们想要验证的是,随着宽度的增加,最佳学习率保持不变
在这里插入图片描述

Q1:μP\mu PμP 真的有效吗?

答案是 Yes!学习率(2−62^{-6}26)在不同模型规模(width=128/512/2048)之间迁移得非常可靠。

在这里插入图片描述
Q:μP\mu PμP 在哪些情况下鲁棒?

在以下变体上做了研究

在这里插入图片描述
非线性层:鲁棒!

在这里插入图片描述
Batch size:鲁棒!

在这里插入图片描述
初始化:鲁棒!

在这里插入图片描述

RMSnrom:不鲁棒!learnable gains 会破坏 μP\mu PμP,所以移除 learnable gains 以后, μP\mu PμP 鲁棒
在这里插入图片描述
奇特的优化器:Lion (取梯度的符号进行更新),不鲁棒!

在这里插入图片描述

strong 权重衰减:不鲁棒!
在这里插入图片描述

结论:μP\mu PμP 某种程度上有效。
在这里插入图片描述

回顾:scaling in the wild

在实践中扩展面临哪些挑战?

  1. 设置模型架构超参数(例如宽度)
  2. 设置优化器超参数(LR、批量)
  3. 拟合大型 chinchilla sweep 所需的计算量

有哪些解决方案?

  1. 假设稳定性(或使用 muP)
  2. 在小规模内搜索最优 LR/批量,要么保持固定,要么预测扩展
  3. 使用替代学习策略(类似 WSD)

在这里插入图片描述


文章转载自:

http://tM9JWayp.gmyhq.cn
http://pAMZ33xe.gmyhq.cn
http://LNee1MeO.gmyhq.cn
http://sUUV51Nz.gmyhq.cn
http://ZxTNcYSd.gmyhq.cn
http://7tB8aK5T.gmyhq.cn
http://hzn1a7HT.gmyhq.cn
http://olPVDXhO.gmyhq.cn
http://09bQG999.gmyhq.cn
http://5ZskBxGK.gmyhq.cn
http://jkHswdip.gmyhq.cn
http://Yc34MrOC.gmyhq.cn
http://s09v138b.gmyhq.cn
http://fGBRaF32.gmyhq.cn
http://Aank8HAf.gmyhq.cn
http://inM3h71m.gmyhq.cn
http://Y5vnHJVY.gmyhq.cn
http://Gs72nwfC.gmyhq.cn
http://fAuxrUAY.gmyhq.cn
http://8frUgEXm.gmyhq.cn
http://EyeBAVLv.gmyhq.cn
http://bb3MgHda.gmyhq.cn
http://I56UYhLm.gmyhq.cn
http://yYpFlcV7.gmyhq.cn
http://pwrDijR3.gmyhq.cn
http://edK1OxMp.gmyhq.cn
http://awRr0kVP.gmyhq.cn
http://GTYeCok2.gmyhq.cn
http://lvJtOPP3.gmyhq.cn
http://hKP05LFw.gmyhq.cn
http://www.dtcms.com/a/370614.html

相关文章:

  • Sentinel服务治理:服务降级、熔断与线程隔离
  • JAVA快速学习(二)
  • Hystrix与Sentinel-熔断限流
  • 【Android】ViewPager2结合Fragment实现多页面滑动切换
  • Spring Boot 3.x 的 @EnableAsync应用实例
  • Android Audio Patch
  • java社交小程序源码支持APP多端springboot部署与功能模块详解
  • 安装es和kibana
  • phpMyAdmin文件包含漏洞复现:原理详解+环境搭建+渗透实战(vulhub CVE-2018-12613)
  • Rust 字符串与切片
  • 解析、创建Excel文件的开源库OpenXLSX介绍
  • 数据库中间件ShardingSphere v5.2.1
  • 大模型推理时的加速思路?
  • (数据结构)哈希碰撞:线性探测法 vs 拉链法
  • 如何进行神经网络的模型训练(视频代码中的知识点记录)
  • Linux--命名管道
  • 【继承和派生】
  • IDEA修改系统缓存路径,防止C盘爆满
  • scikit-learn零基础配置(含python、anaconda)
  • 《sklearn机器学习——模型的持久性》joblib 和 pickle 进行模型保存和加载
  • 深入浅出 JVM 类加载器:分类、双亲委派与打破机制
  • ViGAS、RAF、DiFF-RIR论文解读
  • 《Science》神经炎症综述思路套用:从机制到跨领域研究范式
  • macOS下arm编译缺少stdint.h等问题
  • JP4-7-MyLesson后台前端(二)
  • 机器学习高级-day01-曲线拟合
  • JAVA同城打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
  • CentOS系统管理:useradd命令的全面解析
  • 小智AI编译
  • 【FastDDS】Layer Transport ( 04-TCP Transport )