自监督论文阅读笔记 Synergistic Self-supervised and Quantization Learning

        随着自监督学习 (SSL) 的成功,从自监督预训练模型进行微调 以提高下游任务的性能已成为主流范式。然而,本文发现当前的 SSL 模型 在执行低位量化(low-bit quantization)时 会遭受严重的精度下降,从而禁止将它们部署在资源受限的应用程序中。本文提出了一种 称为 协同自监督 和 量化学习 (SSQL) 的方法 来预训练 便于下游部署的 量化友好型 自监督模型

        SSQL 以自监督的方式 对比 量化模型 全精度模型的 特征,其中 量化模型的位宽在每一步中随机选择。 SSQL 不仅在量化到 较低位宽 时显著提高了准确性,而且 在大多数情况下 也提高了全精度模型的准确性。通过只训练一次,SSQL 就可以同时使不同位宽的各种下游任务受益。此外,在没有额外内存开销的情况下 实现了位宽灵活性,在训练和推理期间 只需要一份权重的copy。本文从理论上分析了 SSQL 的优化过程,并在各种基准上进行了详尽的实验,以进一步证明本文方法的有效性。

本文的代码位于 https://github.com/megvii-research/SSQL-ECCV2022。


Introduction:

        在过去十年中,深度监督学习取得了巨大成功。然而,传统的监督学习方法 严重依赖于大量带注释的训练数据自监督学习(SSL)由于能够 避免注释大规模数据集的成本,以及能够获得与任务无关的表示[30]而受到欢迎。在对比学习(CL)范式出现[4,18]之后,SSL显然获得了发展势头,最近的几项工作[5,15,6]在转移到下游任务时 取得了与监督预训练相当 甚至更好的准确性。SSL的标准流程是 学习未标记数据集上的表示(即预训练主干网络),然后通过微调 转移到各种下游任务(例如,图像分类[20] 和 目标检测[19])。

        随着自监督学习的快速发展,越来越多的需要部署在下游任务中的模型是从 SSL 预训练模型中微调出来的。当我们想将它们部署在一些资源受限的设备上时,必须 减少神经网络的内存消耗 和 延迟。为了便于部署,已经提出了几种 模型压缩 技术,包括轻量级架构设计 [40,48]、知识蒸馏 [21]、网络剪枝 [16,31] 和量化 [49,11]。其中,量化是最有效的方法之一,目前大多数硬件都直接支持。但是在量化过程中 经常会遇到严重的精度下降,尤其是在 低位宽 的情况下。

        如图 1 所示,尽管当前最先进的自监督学习方法在全精度 (FP) 模型中取得了令人印象深刻的性能,但当位宽低于 5 时,它们都会导致精度严重下降。 受 SSL 启发可以学习各种下游任务共享的良好表示,因此我们有动力提出一个问题:“我们是否可以学习量化友好的表示,以便在转移到不同的下游任务时可以更容易地 量化预训练模型 以促进部署? ”。

        本文通过 对比 量化和全精度模型的特征 作为解决方案,提出了协同自监督和量化学习 (SSQL):SSL 和量化变得协同——它们相互帮助。一方面,对比损失 促进了量化模型和 FP 模型的相似性。另一方面,量化 通过在不同的增强权重/激活下鼓励特征的一致性 来改进 SSL。


Contributions

• 据本文所知,本文是第一个提出对 SSL 进行 量化友好训练。设计了一种称为 SSQL 的有效方法,它不仅在量化到低位宽时 大大提高了性能,而且在大多数情况下也提高了全精度模型的性能。

• 使用 SSQL,模型只需训练一次,然后可以针对不同位宽的各种下游任务进行定制,从而允许在实际部署中 灵活地权衡速度和准确性。无需额外的存储开销 即可实现 位宽灵活性,因为在训练和推理阶段都只需要保留一份权重

SSQL 用途广泛。首先,SSQL 可以 与现有的 基于负样本/free的 CL方法 相结合。其次,SSQL 的预训练模型与现有的量化方法兼容,以进一步提高量化时的性能。

• 本文提供了关于SSL 和SSQL 中 量化之间 协同作用的 理论分析。详尽的实验结果进一步表明,本文的 SSQL 在所有位宽的各种基准测试中都取得了更好的性能。


网络量化:

        量化是一种 将网络中的权重和激活 从全精度(即 32 位浮点)转换为定点整数的方法。根据是否在训练过程中引入量化,网络量化可以分为两类:量化感知训练(QAT)和 训练后量化(PTQ)

        QAT 方法 [49,8,11] 在训练阶段引入了模拟量化操作。虽然与低位量化的 PTQ 相比,它通常缩小了与全精度精度的差距,但它需要 在训练和潜在的超参数调整方面 付出更多努力。相比之下,PTQ 方法 [22,33,27] 采用经过训练的全精度网络,并用很少或没有数据 [34] 对其进行量化,这需要最少的超参数调整且无需端到端训练

        本文将量化引入到自监督学习中,以获得一个量化友好的预训练模型。本文的预训练模型在迁移到下游任务时与现有的 QAT 和 PTQ 方法兼容,因此可以结合起来进一步提高性能。本文通过详尽的实验证明了这个预训练模型的量化友好特性。

        Adabits [23] 支持 权重和激活的自适应位宽,但它是一种监督学习方法。本文的预训练模型可以适应不同的位宽,因此本文的工作也是一种 对所有位 只训练一次的方法,但是 以无监督的方式 进行的。更重要的是,Adabits 专注于当前任务,而本文研究模型的迁移能力 并评估下游任务的量化属性。 OQAT [41] 通过 将网络架构搜索方法与量化 相结合 来探索 极低位的架构搜索。还有一些研究 量化友好特性 的作品。 GDRQ [46] 将权重或激活动态 重塑为均匀分布。 [17]提出了一种bin正则化算法来改进低位网络量化。 [43] 为 MobileNets 提出了一种量化友好的可分离卷积。相比之下,本文从自监督范式下的预训练角度考虑量化友好属性


自监督学习:

        为了避免 耗时且昂贵的数据注释 并探索更好的表示,提出了许多自监督方法来从大规模未标记图像或视频中学习视觉表示。

生成方法 学习 在输入空间中 建模或生成像素 [47,25,10]。

Pretext-based 基于前置的方法 主要探索 图像或视频的 上下文特征,例如上下文相似性 [35,9]、空间结构 [14]、聚类属性 [2]、时间结构 [26] 等

与 生成 和 基于前置的模型 不同,对比学习 是一种判别方法,旨在将相似的样本拉得更近,并将不同的样本推得更远。对比学习方法极大地提高了表示学习的性能,这已成为近年来 SSL 的驱动力 [18,4,45,15,3,6]。

        SimCLR [4] 和 MoCo [18] 都采用 对比损失函数 InfoNCE [36],这需要负样本。 BYOL [15] 做了一个更激进的步骤,它在对比学习中 丢弃了负采样,但在使用动量编码器的情况下获得了更好的结果。最近,[6] 提出了一项后续工作 SimSiam,并报告了令人惊讶的结果,即 即使没有动量编码器,简单的孪生网络也可以学习有意义的表示然而,之前的工作没有考虑预训练模型在转移到下游任务时是否对量化友好

        SEED [13] 对小型模型的 SSL 使用自监督知识蒸馏。 S2-BNN [42] 通过从真实网络中 提取知识 来研究训练自监督二元神经网络 (BNN)。但是,它们都需要一个预训练的模型作为蒸馏的老师,而本文的不需要。此外,[42] 是为 BNN 量身定制的,而本文的方法适用于不同的位宽。更重要的是,本文的方法可以通过量化在不同的增强权重/激活下鼓励特征的一致性,从而提高全精度 (FP) 模型相对于基线模型的性能


        本节将介绍本文的方法,称之为 协同自监督量化学习 (SSQL)

背景和符号:

        让 x1 和 x2 表示来自输入图像 x 的两个随机增强的视图。让 f 表示由主干网络(例如,ResNet [20])和 投影 MLP 头 [4] 组成的编码器网络。默认情况下,本文使用 SimSiam [6] 作为基线来开发本文的算法,如图 2 所示。

        SimSiam 最大化一张图像的两个增强之间的相似性。表示为 h 的预测 MLP 头 [15] 转换一个视图的输出 并将其与另一视图匹配。 x1 的输出向量表示为 z1 ≜ f(x1) 和 p1 ≜ h(f(x1)),z2 和 p2 的定义类似。

        负余弦相似度 定义为 。并且为了简单起见,本文假设 z 和 p 都经过 l2-归一化。SG(·) 表示停止梯度操作。然后,在 SimSiam 中最小化的目标是:


         本文的动机是训练一个量化友好的预训练模型,因此建议将量化引入对比学习。本文将 表示为 f 的量化版本,其中 q 是分配的量化位宽。相应地,结果输出变为 。本文简单地对权重和激活采用 常用的均匀量化器 uniform quantizer

 

其中 S(scale)和 Z(zero-point)是由 X 的下限 l  和 上限 u 确定的量化参数,而 X 可以是模型的权重或激活值。(numpy的clip函数:clip(a, min, max) )本文将最小值和最大值赋值给l和x:

 

        本文的 SSQL 解决方案是 让量化编码器预测全精度(FP)编码器 f 的输出(即使用 FP 输出作为目标):

        值得注意的是,SSQL只需要一份模型权重,即 f可以使用 (2) 和 (3) 直接从 f 获得。此外,本文可以通过结合 (1) 和 (6) 来添加辅助 SimSiam 损失以提高性能: 

        为了使模型量化对不同的位宽友好,本文在每个步骤中 从一组候选位宽中 随机选择值来分配 q。此外,本文还发现 这种 随机选择 操作 作为一种增强,带来了性能提升。在本文所有的实验中,分别使用 2 ∼ 8 和 4 ∼ 8 位来表示权重和激活。

        此外,本文 在每一步之后 量化 f 来获得以确保一致性,本文将其命名为 post step quantization (PSQ)。请注意,本文在 f 的前向传递期间 计算 S 和 Z,因此 PSQ 带来的开销可以忽略不计。在反向传播过程中,本文采用 直通估计器 (STE)  [1] 进行量化步骤。请注意,量化网络和 浮点网络 共享权重,因此当我们使用 STE 对量化网络 进行反向传播时,梯度将直接在浮点网络 W 上操作。本文将在 4.4 节讨论 损失函数的选择 和 候选位宽设置的影响。


SSL和量化之间的协同作用:

         按照 [6] 中的符号和分析,优化过程可以看作是 期望最大化 (EM) 类算法 的实现。 SSQL的损失函数可以组织成以下形式:

其中 Fθ 是由 θ 参数化的网络,是通过量化 Fθ 获得的,T 是增强,x 是图像。期望 E[·] 在图像、增强和位宽的分布之上。 ηx 是图像 x 的表示。

        通过公式(8)的公式,本文考虑解决:

 

(9)中的问题可以通过 交替两个子问题 来解决:

其中 t 是交替的索引,“←”表示分配。 ηt 的优化步骤与 [6] 相同,本文分析 θt 的优化步骤

这里T' 指的是另一种视图,(11)的详细推导包含在附录中。此外,本文有:

        假设 量化误差 和 对比学习误差 至多是弱相关 是合理的,因此我们可以去除交叉项 并在 θ 的优化步骤中留下两个目标。 Q 项最小化了量化网络 和 FP 网络 之间的距离,这自然会导致所需的 量化友好属性。 CL 项是 SimSiam 中用于学习图像表示的原始优化项。另请注意,本文对 3 个项进行了期望,其中额外的 q 项可以看作是 对权重/激活的一种增强

        众所周知,强大的图像增强在 SSL [4] 中是必不可少的。因此,通过量化在不同的增强权重/激活下鼓励特征的一致性,量化可以潜在地帮助 SSL 的学习。总之,本文的损失函数的设计 使量化和 SSL 以协同方式工作,即它们相互帮助。 


        本文在 Sec. 4.1中介绍了实现细节。在4.2节中对 CIFAR10 和 CIFAR-100 [24] 、在 4.3节中对 ImageNet [39] (IN) 进行了实验。 然后, 4.3.中评估 ImageNet 预训练模型在下游分类和目标检测基准上的传输性能。最后,在第 4.4 节的算法中研究了不同组件和超参数的影响。本文所有的实验都是使用 PyTorch [37] 进行的。代码将可用。

        数据集:主要实验在三个基准数据集上进行,即 CIFAR-10、CIFAR-100 [29] 和 ImageNet [39]。大规模 ImageNet 包含来自 1000 个类别的 128 万张用于训练的图像。本文还对 7 个识别基准(详见附录)以及 2 个检测基准 Pascal VOC 07&12 [12] 和 COCO2017 [29] 进行了迁移实验。

        骨干:除了最近 SSL 论文中常用的 ResNet-50 [20] 外,本文还采用了 2 个较小的网络,即 ResNet-18 [20] 和 ResNet-34 [20] 进行实验。本文使用与 [6] 相同的设置进行预测和投影 MLP。有时将 ResNet-18/50 缩写为 R-18/50。

        训练细节:本文的方法 遵循 SimSiam [6] 中的训练设置。更具体地说,本文使用 SGD 进行预训练,批量大小为 256,基础 lr=0.05。学习率有一个余弦衰减时间表。权重衰减为 0.0001,SGD 动量为 0.9。除非另有说明,否则在 CIFAR-10 和 CIFAR-100 上预训练 400 个 epoch,在 ImageNet 上预训练 100 个 epoch。

对于 ImageNet 线性评估,本文遵循 [6] 中的相同设置。对于其他数据集的线性评估,训练了 100 个 epoch,lr 初始化为 30.0,在第 60 和第 80 个 epoch 除以 10。为了进行微调,训练了 50 个 epoch,lr 初始化为 0.001,在第 30 和第 40 个 epoch 除以 10。线性评估的权重衰减为 0,微调的权重衰减为 1e-4。

        Evaluation protocols 评估协议:继之前的工作 [18] 之后,本文采用线性评估和微调来评估预训练的表示。此外,本文希望评估 量化后表示的性能。因此,本文在量化和 SSL 结合时进行了相应的调整 并提出了一种新的评估协议,如图 3 所示。

更具体地说,对于线性评估,本文 冻结和量化主干,只更新线性评估的分类头(即 冻结主干权重)。对于微调,本文首先像正常一样 训练主干和分类头(即 更新主干权重)。然后,基于微调的 FP 模型,进行 PTQ 或 QAT 以评估量化后的性能。本文在实验中 默认采用微调后的 PTQ。在本文中,使用“nwma”来表示 将权重量化为 n 位,并将激活量化为 m 位(例如,4w4a)。


        将本文的方法 与流行的 SSL 方法 BYOL [15]、SimSiam [6]、SimCLR [4] 和 MoCov2 [5] 进行比较。本文 评估 量化后 不同位宽下的 线性评估精度,如 4.1 节所述。请注意,本文只预训练了一个全精度 (FP) 模型,然后将其用于不同位宽的评估。为了更好地说明本文方法的有效性,还通过 在预训练期间 结合 PACT [8] (Pact:Parameterized clipping activation for quantized neural networks)和 SimSiam 创建了一个强大的基线 SimSiam-PACT。请注意,它与其他方法的比较并不公平,因为它需要为不同的位宽预训练不同的模型(即,需要 7 个预训练的模型 来处理 7 个位宽)。换句话说,它不灵活,训练开销对于大数据量是难以承受的。 CIFAR-10和CIFAR-100的实验结果分别见表1和表2。

        如表 1 所示,以 ResNet-18 为例,本文的 SSQL 在 CIFAR-10 上的全精度线性评估下实现了与基准对应的 SimSiam 相当的性能。但是,当降低位宽(从 8w8a 到 2w4a)时,本文相对于基线 SimSiam 的优势将变得越来越明显。例如,本文的 SSQL 在 3w3a 和 2w4a 的准确率分别比 SimSiam 高 19.6% 和 22.7%。与 SimSima-PACT 相比,可以发现 SSQL 在 4w4a 及以上达到了更高的准确度。然而,SimSiam-PACT 在 3w3a 及以下的精度比本文的方法略高,但差距在 3% 以内。此外,本文在 FP 的 ResNet-50 下实现了比 SimSiam 更高的精度,并且在减少位宽时的优势是一致的。最后,SSQL 还可以 与基于 InfoNCE [36] 的方法相结合,例如 SimCLR,本文将其命名为 SSQL-NCE。可以观察到与上述类似的趋势,这表明 SSQL 与 基于负样本和不使用负样本的 CL 方法兼容

        如表 2 所示,SSQL 在所有情况下都在 CIFAR100 上实现了最高准确度。例如,在比较第一列 (FP) 时,SSQL 明显优于基线对应的 SimSiam:ResNet-18 和 ResNet-50 的准确度分别高达 +1.4% 和 +3.7%。当进一步降低位宽时,SSQL的优势变得更大:ResNet-50 在 4w4a、3w3a 和 2w4a 的准确度分别高达 +6.5%、+15% 和 +28.9%。

        为了以更直观的方式证明所提出方法的有效性,在图 4 中可视化了通过不同方法学习的特征空间。首先,分别使用 SimCLR、SimSiam 和 SSQL 在 CIFAR-10 数据集上训练了三个模型之后,CIFAR-10 中的 5,000 个样本被相应地表示,然后 通过 t-SNE [32] 简化为二维空间。可以看出,样本在 SSQL 学习的特征空间中 比 SimCLR 和 SimSiam 都 更可分离(尤其是在 2w8a 和 2w4a),这表明 SSQL 在量化后可以学习更好的特征表示


ImageNet 和迁移学习结果:

        在本节中,在不使用标签的情况下 对大规模 ImageNet 训练集 [39] 进行无监督预训练。 ImageNet 上的线性评估结果如表 3 所示。此外,稍后评估学习表示 在 ImageNet 上的迁移能力。本文在 ImageNet 上训练 SSQL、SimSiam 和 BYOL 100 个 epoch,并直接使用 MoCov2 的官方checkpoint。

        如表 3 所示,在比较第一列 (FP) 时,SSQL 在 ResNet-18 下实现了比基线对应的 SimSiam(57.6 与 55.0)更高的准确度。在比较第四列 (4w4a) 时,SSQL 对 ResNet-18 和 ResNet-50 分别实现了 16.1% 和 10.6% 的增益。简而言之,SSQL 在全精度下实现了相当或更好的准确度,并且 在较低位宽下更加量化友好。与 SimSiam-PACT 相比,SSQL 在 4 位或更高位上 实现了更好的结果,并且只有一份权重

        如图 1 所示,ImageNet 线性评估性能 可以 以某种方式 表明下游任务 在不同位宽下的性能(即 趋势是一致的)。在图 5 中绘制了不同预训练模型的权重分布。如图所示,与两个基线相比,本文的模型的权重(第三行)在 3 个方面更易于量化:分布更均匀,范围更小,以及 异常值少得多 (对下游任务进行微调后也有类似的现象,见附录)。


使用部分标签进行微调:

        按照之前的做法,还使用随机初始化的线性分类器 在具有 1% 和 10% 标记数据的 ImageNet 上 微调预训练模型。如表 4 所示,SSQL 在所有情况下都达到了最佳性能。还报告了 PTQ 性能,可以看到 随着位宽的减小,SSQL 的优势变得更大。例如,当在 R-50 下使用 10% 的标签进行微调时,本文的方法在 FP 和 4w4a 上的准确度 分别比 SimSiam 高 0.5% 和 8.8%。


结合QAT方法:

        为了进一步说明 本文方法的有效性,将不同的预训练模型 与 最先进的 QAT 方法 LSQ [11] 相结合。本文使用 ImageNet 线性评估的 FP 模型(即表 3 中的 FP 列)初始化 LSQ,其中通过 SSL 方法学习主干权重,并使用标签对线性分类器进行微调。

学习曲线如图 6 所示,可以看到 SSQL 为低位 QAT 训练 提供了更好的起点。以 R-50 4w4a 为例,在第一个 epoch 之后,SSQL 的准确率比 SimSiam 高 7%(54.2 vs 47.2),而 FP 模型的初始准确率大致相同(67.9 vs 68.1)。因此, SSQL 实现了更高的最终准确度,这表明 本文的预训练模型 在与 QAT 方法结合 以提高性能时 可以作为更好的初始化。在 COCO2017 上微调不同的预训练模型后,本文还结合 LSQ,并在附录中观察到类似的改进。


Transferring to recognition benchmarks 迁移到识别基准:

        本文将 R-50 的 ImageNet 学习表示 迁移到表 5 中的下游识别任务。训练细节和评估协议包含在第 4.1节中。 R-18的结果包含在附录中。如表 5 所示,本文的方法在所有识别基准上都有很大改进,尤其是在线性评估下。在考虑 线性评估(冻结骨干权重)时,可以看到 SSQL 比 SimSiam 具有更好的迁移能力,并且在传输到下游数据集时 也很好地保留了量化友好的属性

        在比较 FP 的微调结果时,可以看到 SSQL 在 R-50 下取得了可比较的结果。当进一步进行 PTQ 时,随着位宽的减小,可以观察到更大的改进,这与上游预训练中 观察到的属性一致。以 CIFAR-10 上的 R-50 为例,SSQL 在 FP 上略好于 SimSiam,但在 4w4a 和 3w3a 提高到 37.5% 和 54.7%。本文还将结果绘制在图 7 中,可以更清楚地看到 SSQL 的优势(实线与虚线)。总之,当在迁移过程中微调权重时,SSQL 也很好地保留了量化友好的属性。这再次证实了本文的动机,即 量化友好的预训练 既重要又可行


迁移到物体检测

        本文研究了表 6 中的 Pascal VOC07&12 [12] 和表 7 中的 COCO2017 [29] 的下游目标检测性能。检测器是 Faster R-CNN [38],主干为 R18-C4 [19],用于 VOC 和 Mask R -CNN [19] 与 R50-FPN [28] 主干用于 COCO,在 [44] 中实现。本文遵循 [5] 中的相同设置,并评估 训练后量化模型(即微调 + PTQ 流程)的性能。

        如表 6 所示, SSQL 在 FP 的 Pascal VOC 上表现优于 SimSiam 和 BYOL。此外,随着降低位宽,SSQL 比基线要好得多:在 5w5a 和 4w4a 的其他方法中分别达到 +1.9 和 +7.5 AP50 的最佳结果。可以从表 7 中对 COCO2017 得出类似的结论。虽然SSQL 在 COCO 上的 FP 上实现的准确度 略低于 SimSiam,但在 5w5a 和 4w4a 上分别实现了 +2.2 和 +8.3 APbb 点。总之,结果表明,即使在对下游检测任务 进行微调之后,本文的预训练模型的量化友好特性也可以得到很好的保留


Ablation:

         本文在 ResNet-34 下对 CIFAR-10 进行消融研究,并保持训练设置与第 4.2 节中的相同,如表 8 所示。“Q Pred”表示是否量化预测分支,“Q Target” 表示是否量化目标分支。 ‘Aux’ 表示是否添加 辅助 SimSiam 损失。 “W/A Bit”表示为 权重/激活设置的候选位宽。从表 8 中可以得出以下结论

量化目标分支只会降低性能。 (b) 行是前四行中最差的,这表明 仅使用量化输出 作为目标 会使训练更加困难(学习噪声目标)。换句话说,必须用梯度 更新量化分支(行(c)和(d)都比基线行(a)表现更好)。

随机选择位宽 进行训练 优于 使用单个位宽 进行训练。可以观察到行 (d) 在所有位宽上 都超过了行 (e) 和 (f),其中后两者使用单个位宽进行训练。它表明,本文方法中的随机选择操作通过 提供更强的随机性 和 增强,有利于提高性能

使用合理的位扰动范围 可进一步 提高较低位宽的性能。在比较行 (d) 和 (h) 时,可以观察到 2w4a(81.5 对 65.2)的大幅提升,但代价​​是 FP 准确度。比较行 (c) 和 (g) 时,可以发现 同时量化两个分支会导致 FP 准确度下降较大

• 第 (i) 行在所有设置中实现了最佳权衡,这也是本文所有实验的默认设置。比较行 (i) 和 (h) 时,可以看到 添加辅助损失 使全精度模型产生更好的目标,从而提高所有位宽的精度


Conclusion:

        在本文中,提出了一种称为 SSQL 的方法,用于 预训练量化友好模型,以便在资源受限的应用中实现灵活的部署。本文对提出的方法进行了理论分析,在各种基准上的实验结果表明,本文的方法不仅在量化到较低比特时 大大提高了性能,而且还提高了全精度模型的性能。本文还验证了本文的方法与PTQ或QAT方法兼容,并且在迁移到下游任务时 可以很好地保持量化友好特性。未来,本文将探索SSQL在其他架构中的应用,尤其是Transformers。此外,本文还将探索微调方法,以更好地保持模型的量化友好特性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值