PyTorch量化感知训练实战:从FP32到INT8的模型瘦身指南(附避坑技巧)

Pytorch量化(torch.quantization) 在深度学习中,量化指的是使用更少的bit来存储原本以浮点数存储的tensor,以及使用更少的bit来完成原本以浮点数完成的计算。这么做的好处主要有如下几点: 更少的模型体积,接近4倍的减少; 可以更快的计算,由于更少的内存访问和更快的int8计算,可以快2~4倍。 一个量化后的模型,其部分或者全部的tensor操作会使用int类型来计算,而不是使用量化之前的float类型。当然,量化还需要底层硬件支持,x86 CPU(支持AVX2)、ARM CPU、Google TPU、Nvi... 阅读详情

PyTorch量化感知训练实战:从FP32到INT8的模型瘦身指南(附避坑技巧)

1. 边缘计算时代的模型瘦身需求

当我们将深度学习模型部署到树莓派或Jetson Nano这类边缘设备时,常常会面临一个尴尬局面:精心训练的模型在服务器上运行流畅,但在资源受限的设备上却举步维艰。以CIFAR-10分类任务为例,一个标准的ResNet-18模型(FP32精度)需要约44MB存储空间和约1.8亿次浮点运算(FLOPs)处理单张图像。这种资源消耗对边缘设备来说显然过高。

量化技术通过降低数值精度来压缩模型,主要带来三方面收益:

  • 内存占用减少75%:FP32(32位浮点)转换为INT8(8位整数)后,模型大小直接缩减为1/4
  • 计算速度提升2-4倍:整数运算在多数硬件上比浮点运算更快
  • 功耗降低:减少数据搬运和计算所需的能量
# 典型模型大小对比
import torch
model_fp32 = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)
torch.save(model_fp32.state_dict(), 'resnet18_fp32.pth')  # 约44MB

model_int8 = torch.quantization.quantize_dynamic(
    model_fp32, {torch.nn.Linear}, dtype=torch.qint8
)
torch.save(model_int8.state_dict(), 'resnet18_int8.pth')  # 约11MB

2. 量化方法全景图:PTQ vs QAT

2.1 训练后量化(PTQ)的局限性

PTQ(Post-Training Quantization)是简单的量化方案,其流程为:

  1. 训练FP32模型
  2. 收集激活值统计信息(校准)
  3. 直接转换为INT8格式

虽然PTQ操作简单,但在精度敏感场景存在明显缺陷。我们在CIFAR-10上的测试数据显示:

模型FP32精度PTQ-INT8精度精度下降
ResNet-1894.7%92.1%2.6%
MobileNetV291.3%86.4%4.9%

提示:卷积层较多的模型(如MobileNet)对量化更敏感,因为深度可分离卷积中少量通道的数值分布差异较大

2.2 量化感知训练(QAT)的核心优势

QAT通过在训练过程中模拟量化误差,让模型主动适应低精度表示。其关键改进点包括:

  • 伪量化节点:在前向传播中插入FakeQuantize模块
  • BN折叠:将BatchNorm参数合并到卷积权重中
  • 直通估计器(STE):解决量化操作的梯度不可导问题
# QAT典型配置示例
model = torchvision.models.resnet18(pretrained=True)
model.qconfig = torch.ao.quantization.get_default_qat_qconfig('fbgemm')
model = torch.ao.quantization.prepare_qat(model, inplace=True)

# 训练阶段
for epoch in range(epochs):
    for data, target in train_loader:
        output = model(data)  # 自动插入伪量化
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

# 转换为真正的量化模型
model = torch.ao.quantization.convert(model.eval(), inplace=True)

3. QAT实战全流程详解

3.1 环境准备与模型改造

首先需要配置支持量化的PyTorch环境:

# 推荐环境
pip install torch==2.0.0+cu117 torchvision==0.15.1+cu117 -f https://download.pytorch.org/whl/torch_stable.html

关键改造步骤:

  1. 指定量化配置:根据硬件选择'fbgemm'(x86)或'qnnpack'(ARM)
  2. 替换可量化模块:
    • 将nn.Conv2d替换为nn.quantized.Conv2d
    • 将nn.Linear替换为nn.quantized.Linear
  3. 处理特殊算子:
    • 合并ReLU等激活函数
    • 处理Add/Concat等张量操作
# 典型量化配置
qconfig = torch.ao.quantization.QConfig(
    activation=torch.ao.quantization.HistogramObserver.with_args(
        dtype=torch.quint8,
        reduce_range=True
    ),
    weight=torch.ao.quantization.PerChannelMinMaxObserver.with_args(
        dtype=torch.qint8,
        qscheme=torch.per_channel_symmetric
    )
)

3.2 训练技巧与参数调优

经过数十次实验验证,我们总结出以下关键技巧:

学习率策略:

  • 初始学习率设为原始训练的1/10
  • 使用余弦退火调度器
  • 避免使用Adam优化器(SGD with momentum效果更好)

训练时长控制:

  • 微调epoch数约为原始训练的10%
  • 早停策略很关键(监控验证集精度)

关键参数配置:

optimizer = torch.optim.SGD(
    model.parameters(),
    lr=0.001,  # 原始学习率的1/10
    momentum=0.9,
    weight_decay=1e-4
)

scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
    optimizer, 
    T_max=len(train_loader)*5  # 5个epoch
)

3.3 BN折叠的工程实现

批量归一化层是量化中的关键难点。正确的折叠顺序应该是:

  1. 训练时保持BN层独立
  2. 在模型转换阶段执行折叠
  3. 对折叠后的权重重新量化
# 手动实现BN折叠
def fold_bn(conv, bn):
    # 计算折叠后的权重和偏置
    folded_weight = conv.weight * (bn.weight / torch.sqrt(bn.running_var + bn.eps))
    folded_bias = bn.bias + (conv.bias - bn.running_mean) * (bn.weight / torch.sqrt(bn.running_var + bn.eps))
    
    # 创建新的折叠卷积层
    folded_conv = nn.Conv2d(
        conv.in_channels, conv.out_channels, conv.kernel_size,
        stride=conv.stride, padding=conv.padding, dilation=conv.dilation
    )
    folded_conv.weight.data = folded_weight
    folded_conv.bias.data = folded_bias
    return folded_conv

4. 部署优化与性能对比

4.1 TensorRT部署实战

将QAT模型部署到TensorRT需要经过ONNX转换:

# 导出ONNX模型
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
    model, 
    dummy_input, 
    "qat_model.onnx",
    opset_version=13,
    input_names=['input'],
    output_names=['output'],
    dynamic_axes={'input': {0: 'batch'}, 'output': {0: 'batch'}}
)

使用TensorRT优化:

trtexec --onnx=qat_model.onnx \
        --int8 \
        --saveEngine=qat_model.engine \
        --workspace=2048

4.2 实测性能数据

我们在Jetson Xavier NX上的测试结果:

指标FP32模型QAT-INT8模型提升幅度
模型大小44.3MB11.2MB74.7%↓
推理延迟23.4ms6.2ms3.77x↑
内存占用158MB42MB73.4%↓
能耗3.2J1.1J65.6%↓

4.3 常见问题排查指南

精度异常问题:

  1. 检查校准集是否具有代表性
  2. 验证BN层的running_mean/variance是否正确更新
  3. 检查量化范围是否包含异常值

部署失败问题:

  1. 确认TensorRT版本支持QAT(需8.0+)
  2. 检查ONNX导出时是否保留了量化节点
  3. 验证输入/输出张量的量化参数
# 量化范围检查工具
def check_quant_ranges(model):
    for name, module in model.named_modules():
        if isinstance(module, torch.quantization.FakeQuantize):
            print(f"{name}: min={module.scale * (module.quant_min - module.zero_point)}, "
                  f"max={module.scale * (module.quant_max - module.zero_point)}")

5. 进阶技巧与未来方向

5.1 混合精度量化策略

不同层对量化的敏感度不同,可采用分层量化策略:

  1. 识别敏感层:通过梯度分析或逐层量化测试
  2. 配置混合精度:
qconfig_dict = {
    "object_type": [
        (torch.nn.Conv2d, torch.quantization.default_qconfig),
        (torch.nn.Linear, torch.quantization.float16_static_qconfig)
    ]
}

5.2 最新研究趋势

  1. FP8量化:NVIDIA H100开始支持FP8格式
  2. 稀疏+量化:结合两种压缩技术
  3. 自动量化:基于NAS的量化参数搜索

实际项目中,我们发现将QAT与剪枝结合可以获得更好的压缩效果。例如在ResNet-50上,先进行30%的通道剪枝再进行QAT,模型大小可缩减到原始FP32模型的1/10,同时保持94%的原始精度。

Pytorch训练常用方法总结 文章目录写在前面训练过程可视化Pytorch中自动求导和反向传播pytorch中钩子的使用 保存中间变量 写在前面 该篇博客用来记录深度学习训练过程中的小trick 以及常用的容易犯错的内容 持续更新 训练过程可视化 TensorBoardX 记录训练过程 以及训练过程的分析 Pytorch中自动求导和反向传播 1.生成tensor torch.tensor 由于在pytorch 0.4.0 版本... 阅读详情

相关推荐

模型量化 | Pytorch的模型量化基础

量化简介量化是指执行计算和存储的技术 位宽低于浮点精度的张量。量化模型 在张量上执行部分或全部操作,精度降低,而不是 全精度(浮点)值。这允许更紧凑的模型表示和 在许多硬件平台上使用高性能矢量化操作。与典型的 FP32 模型相比,PyTorch 支持 INT8 量化,模型大小减少 4 倍内存带宽减少 4 倍INT8 计算的硬件支持通常为 2 到 4 个 与 FP32 计算相比,速度快几倍量化主要是一种技术 加速推理,量化仅支持前向传递 运营商。PyTorch 支持多种量化深度学习模型的方法。

weixin_44649780的博客 3195

Pytorch模型训练后静态量化并加载int8量化模型推理(详细图文教程)

Pytorch模型训练后静态量化并加载int8量化模型推理

qq_40280673的博客 6078

PyTorch模型部署实战:FP16 vs FP32 vs TF32 vs INT8性能对比与选择指南

本文深入探讨PyTorch模型部署中FP16、FP32、TF32和INT8四种精度的性能对比与选择策略。通过详细的代码示例和硬件性能测试数据,帮助开发者根据业务场景(如实时视频分析、NLP服务等)选择最佳精度方案,平衡计算速度、显存占用和模型精度。特别解析了NVIDIA TF32这一深度学习专用格式的优势及实践方法,为模型部署提供全面指导。

weixin_29056781的博客 432

Pytorch【60天修炼计划】之第二阶段——进阶:量化

以下内容主要来自于Pytorch官网Pytorch量化,特此记录学习过程。(其实更像直接翻译了一下,逃~ Quantization 量化 1、什么是量化? 量化是一种近来深度学习加速中快速发展的技术,它指的是以比浮点精度更低的比特宽度来执行计算并存储 Tensors 的技术。 一个量化的模型便采用的是 整数 来对 Tensors 执行部分或全部操作。 2、量化的意义? 因为量化精度低,则它使得在许...

karry_zzj的博客 6993

FP16 vs FP32 vs TF32 vs INT8:模型精度选择实战指南(附PyTorch代码示例)

本文深入解析了FP16、FP32、TF32和INT8四种模型精度的核心差异与应用场景,并提供了PyTorch实战代码。通过对比分析,指导开发者在训练阶段如何利用混合精度训练与TF32加速,在推理阶段如何权衡精度与性能,并实施从动态量化到静态量化的INT8优化策略,以实现模型效率与精度的最佳平衡。

weixin_29032337的博客 211

深度学习技巧应用17-pytorch框架下模型int8,fp32量化技巧

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用17-pytorch框架下模型int8,fp32量化技巧,Int8和fp32量化都是一种模型优化方法,Int8和fp32量化的主要目的是减少神经网络模型的计算量和内存占用,从而提高模型的推断速度和效率,尤其是在移动设备等资源有限的环境下。Int8量化可以将神经网络中所有的权重和激活值转换成8位整数进行表示,从而实现内存占用的大幅减少;fp32量化可以将权重和激活值转换成32位浮点数的固定点表示,也能减少内存占用和计算量,同时更加精确地表示数值。通过对神

微学AI的博客 1642

量化感知训练:从 FP32 到 INT8 的精度保持与伪量化机制

量化感知训练通过伪量化操作在前向传播中模拟量化效应,通过直通估计器在反向传播中近似传递梯度,使模型在训练阶段就适应低精度表示。按通道量化权重和按张量量化激活值是当前最主流的配置,在 Transformer 模型上通常可以在 INT8 精度下保持 1% 以内的精度损失。落地路线建议:第一步,先使用 PTQ(训练后量化)评估量化精度损失,如果损失在可接受范围内则无需 QAT;第二步,若 PTQ 精度不达标,使用将模型转换为 QAT 版本,跳过第一层和最后一层等敏感层;

lady_mumu的博客 2018

神经网络量化感知训练:从FP32到INT8的精度保持——校准、伪量化与嵌入式部署实战

高精度、低延迟、低功耗三者难以兼得。以ResNet-50为例,其FP32全精度模型体积约100MB,在ARM Cortex-M7微控制器上推理延迟高达245ms,功耗超过500mW——这对于电池供电的IoT设备而言完全不可接受。模型量化(Model Quantization)技术通过将FP32(32位浮点)权重和激活值映射到INT8(8位整型),可将模型体积压缩75%,推理延迟降低2.54倍,功耗下降60%75%。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 1万+

PyTorch模型量化入门:FP32→FP16/INT8,推理速度提升200%的量化实战

模型量化的本质是将神经网络中的权重、激活值从高精度浮点数(如FP32)转换为低精度格式(如FP16、INT8),从而减少计算量、内存占用和数据传输带宽。精度格式数据位数取值范围内存占用(相对FP32)适用场景FP3232100%训练阶段、高精度推理FP161650%GPU推理、混合精度训练INT88-128~12725%CPU/GPU推理、边缘设备部署INT44-8~712.5%极端资源受限场景(如单片机)核心优势速度提升。

2501_91798322的博客 2642

PX4飞控参数详解-Multicopter Position Control​多旋翼位置控制

Maximum horizontal velocity for which position hold is enabled (use 0 to disable check)//启用悬停时的最大水平速度(使用 0 可禁用此检查)(仅适用MPC_POS_MODE 0 或 MPC_ALT_MODE 2)Maximum horizontal and vertical jerk in Position/Altitude mode//位置/高度模式下的最大水平和垂直加加速度。

u013096791的博客 1817

大疆 DJI Mobile SDK实战指南——从零构建Android示例开发环境

本文提供了一份详尽的DJI Mobile SDK Android开发环境搭建实战指南。文章手把手教你从注册开发者账号、获取App Key,到配置Android Studio、下载官方示例代码,最终成功运行DJI官方Android示例程序,帮助开发者快速入门无人机应用开发,避开常见编译与依赖问题。

weixin_29188043的博客 275

大模型量化技术大揭秘:INT4、INT8、FP32、FP16的差异与应用解析

FP16格式,即16位浮点数(float16),相比于32位浮点数(float32),内存占用减少了一半,这在大规模深度学习应用中具有显著优势。然而,FP16格式也有其固有的缺点,即较低的精度,可能导致在某些情况下出现数值不稳定或精度损失的情况。在INT8量化中,模型的权重和激活值会经过一个量化过程,包括缩放和偏移,以尽可能保留原始浮点数的信息。量化通过减少每个参数的位数,可以显著减小模型的大小,从而减少存储需求。:在训练过程中考虑量化的影响,通过模拟低精度计算来调整模型参数,从而在量化后保持较高的精度。

顺其自然~专栏 1万+

用Python+PyTorch实现DQN无人机避障:从环境搭建到实战训练(附完整代码)

本文详细介绍了如何使用Python和PyTorch框架,基于深度强化学习中的DQN算法,实现一个无人机自主避障系统。内容涵盖从自定义环境搭建、DQN智能体核心算法实现,到完整的训练流程与超参数调优,并提供了可视化演示与进阶优化方向,为开发者提供了从理论到实践的完整指南。

kubernetes8ctl的博客 640

从PyTorch到ONNX:量化感知训练避坑指南(8个关键步骤全公开)

掌握量化感知训练的ONNX转换全流程,解决模型部署中的精度丢失难题。覆盖PyTorch到ONNX的8个关键步骤,适用于边缘设备高效推理。详解QAT配置、算子支持与导出陷阱,提升性能与兼容性。值得收藏

LiteProceed的博客 813

ADC学习(3)——采样电路

第三章 采样电路

夏风喃喃的博客 3万+

实战解析:利用Wireshark解密QQ通信协议

本文提供了一份利用Wireshark工具分析QQ通信协议的实战指南。文章详细介绍了从环境准备、捕获数据包到解析协议层的完整流程,重点演示了如何识别QQ号码字段、观察加密数据特征以及区分不同通信类型(如文本、文件传输)。通过此实践,读者可以深入理解网络分层模型和现代应用加密通信机制,提升网络协议分析与安全诊断能力。

weixin_29210727的博客 409

从FP32到INT8:pytorch-image-models量化部署全指南

pytorch-image-models是一个由Hugging Face开发维护的PyTorch视觉模型库,包含多个高性能的预训练模型,适用于图像识别、分类等视觉任务。本指南将详细介绍如何在pytorch-image-models中实现从FP32到INT8的量化部署,帮助开发者在保持模型精度的同时,显著提升推理速度并降低资源消耗。 ## 为什么选择模型量化? 在深度学习模型部署过程中,量化是一

gitblog_00902的博客 862

格拉姆角场实战:东南大学轴承故障诊断数据集深度剖析与代码实现

本文深入剖析了东南大学轴承故障诊断数据集,并提供了完整的格拉姆角场实战应用指南。通过将一维振动信号转换为二维图像,结合卷积神经网络,构建了端到端的故障诊断流程。文章详细解读了数据集的工况、通道含义与故障类型,并附有可运行的代码实现,为工业设备智能运维提供了有效解决方案。

night的博客 510

TensorRT量化感知训练工具:PyTorch Quantization全面实战指南

你是否在部署深度学习模型时面临两难选择?要么忍受高精度模型带来的计算资源消耗,要么接受低精度推理导致的精度损失。NVIDIA TensorRT™ 提供的PyTorch Quantization工具包正是为解决这一痛点而生——它允许你在训练过程中模拟量化效果,在几乎不损失精度的前提下,将模型压缩4倍并提升推理速度2-3倍。本文将带你从零开始掌握量化感知训练的完整流程,通过ResNet50实战案例,实...

gitblog_00391的博客 1377

[GXYCTF2019]BabyUpload1 -- .htaccess文件解析与蚁剑实战指南

本文深入解析了[GXYCTF2019]BabyUpload1文件上传漏洞的实战利用。通过绕过后缀名与内容检测,上传包含PHP代码的.jpg文件,并利用.htaccess文件强制服务器将其解析为PHP脚本。文章详细介绍了.htaccess的原理、构造方法、Content-Type绕过技巧,并演示了如何使用中国蚁剑连接Webshell获取Flag,为Web安全学习提供了完整实战指南。

weixin_29016315的博客 512

第六节 LLaVA模型数据处理源码解读(input_ids/labels/attention_mask/image,上篇)

本篇文章直接介绍llava模型数据加工部分,整体结构说明llava多模态模型输入数据格式,其中包含input_ids/labels/attention_mask与image格式,并给出对应代码位置与整个数据加工流程。最重要,通过debug给出数据解释与代码解读,也通过一个真实数据给出模型输入格式说明。当你阅读完此篇文章,绝对透彻理解llava数据加工过程与内容。显然,一篇博客是无法呈现整个数据细节,我将继续下篇博客呈现数据细节处理。result = input.ne(3) # torch.ne函数调用。

weixin_38252409的博客 3196

深度学习模型量化实战:如何用INT8加速推理同时保持精度(附PyTorch代码)

本文深入探讨了深度学习模型INT8量化的实战技巧,重点解析了对称量化和非对称量化两种核心策略的差异与应用场景。通过详细的PyTorch代码示例,指导开发者如何实施后训练量化与量化感知训练,在显著提升模型推理速度、减少存储占用的同时,有效控制精度损失,适用于移动端和边缘设备的模型部署。

e4f5g6h7的博客 772

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

PyTorch FP16模型转换

在使用 MNN 进行 INT8 量化推理时,你不需要在预处理阶段将图像转换为 INT8 格式。相反,你应该按照常规的图像预处理步骤,将图像转换为浮点数格式,然后将其输入到量化模型中。MNN 推理引擎会自动处理输入数据的量化。PyTorch:需要手动将输入数据转换为相应的推理格式(如 FP16 或 INT8)。MNN:不需要手动将输入数据转换为 INT8 格式,MNN 推理引擎会自动处理输入数据的量化。你只需按照常规的图像预处理步骤,将图像转换为浮点数格式即可。

weixin_67051070的博客 3680

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Transformer模型量化实战:从FP32到INT8的性能跃迁

你是否在部署Transformer模型时遇到过这些痛点?推理速度慢如蜗牛,GPU显存占用居高不下,嵌入式设备根本无法运行?随着模型参数量从千万级增长到千亿级,"大模型"带来的不仅是性能提升,还有资源消耗的爆炸式增长。以BERT-Base为例,其FP32精度下的模型大小约410MB,单次推理需占用1.5GB+显存,这让许多边缘设备望而却步。 本文将系统讲解Transformer模型的量化技术(Qu...

gitblog_00452的博客 972

万物识别模型量化实战:FP32到INT8的精度权衡

通过本文的实践,我们完成了从FP32到INT8的模型量化全流程。实测下来,合理的量化可以在保持较高精度的同时显著提升推理速度,这对边缘设备和实时应用场景特别有价值。尝试不同后量化方法(如TensorRT的量化)研究量化感知训练技术探索针对特定硬件的量化优化量化是一门需要反复实验的技术,现在就可以拉取镜像开始你的量化实验之旅了。记住,好的量化方案往往需要在精度和速度之间找到最佳平衡点,这需要耐心和系统的实验设计。

FrostfireStag78的博客 886

模型压缩新范式:pytorch-image-models量化感知训练实战指南

pytorch-image-models是由Hugging Face开发维护的PyTorch视觉模型库,包含多个高性能的预训练模型,适用于图像识别、分类等视觉任务。本文将详细介绍如何利用该库进行量化感知训练,帮助开发者在保持模型性能的同时显著减小模型体积和计算资源消耗。 ## 什么是量化感知训练? 量化感知训练(Quantization-Aware Training,QAT)是一种在模型训练过

gitblog_00785的博客 695
上一篇: ICCV-2025 | 自进化世界模型NavMorph:如何让机器人在未知环境中实现智能避障与路径规划?
下一篇: 别再用Excel了!n8n+企业微信打造智能客服工单系统(含免开发配置)
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值