TensorRT × 边缘多模型部署指南:Jetson / Orin / L4 / Android 端高效推理实战

个人简介
在这里插入图片描述
作者简介:全栈研发,具备端到端系统落地能力,专注大模型的压缩部署、多模态理解与 Agent 架构设计。 热爱“结构”与“秩序”,相信复杂系统背后总有简洁可控的可能。
我叫观熵。不是在控熵,就是在观测熵的流动
个人主页:观熵
个人邮箱:privatexxxx@163.com
座右铭:愿科技之光,不止照亮智能,也照亮人心!

专栏导航

观熵系列专栏导航:
AI前沿探索:从大模型进化、多模态交互、AIGC内容生成,到AI在行业中的落地应用,我们将深入剖析最前沿的AI技术,分享实用的开发经验,并探讨AI未来的发展趋势
AI开源框架实战:面向 AI 工程师的大模型框架实战指南,覆盖训练、推理、部署与评估的全链路最佳实践
计算机视觉:聚焦计算机视觉前沿技术,涵盖图像识别、目标检测、自动驾驶、医疗影像等领域的最新进展和应用案例
国产大模型部署实战:持续更新的国产开源大模型部署实战教程,覆盖从 模型选型 → 环境配置 → 本地推理 → API封装 → 高性能部署 → 多模型管理 的完整全流程
TensorFlow 全栈实战:从建模到部署:覆盖模型构建、训练优化、跨平台部署与工程交付,帮助开发者掌握从原型到上线的完整 AI 开发流程
PyTorch 全栈实战专栏: PyTorch 框架的全栈实战应用,涵盖从模型训练、优化、部署到维护的完整流程
深入理解 TensorRT:深入解析 TensorRT 的核心机制与部署实践,助力构建高性能 AI 推理系统
Megatron-LM 实战笔记:聚焦于 Megatron-LM 框架的实战应用,涵盖从预训练、微调到部署的全流程
AI Agent:系统学习并亲手构建一个完整的 AI Agent 系统,从基础理论、算法实战、框架应用,到私有部署、多端集成
DeepSeek 实战与解析:聚焦 DeepSeek 系列模型原理解析与实战应用,涵盖部署、推理、微调与多场景集成,助你高效上手国产大模型
端侧大模型:聚焦大模型在移动设备上的部署与优化,探索端侧智能的实现路径
行业大模型 · 数据全流程指南:大模型预训练数据的设计、采集、清洗与合规治理,聚焦行业场景,从需求定义到数据闭环,帮助您构建专属的智能数据基座
机器人研发全栈进阶指南:从ROS到AI智能控制:机器人系统架构、感知建图、路径规划、控制系统、AI智能决策、系统集成等核心能力模块
人工智能下的网络安全:通过实战案例和系统化方法,帮助开发者和安全工程师识别风险、构建防御机制,确保 AI 系统的稳定与安全
智能 DevOps 工厂:AI 驱动的持续交付实践:构建以 AI 为核心的智能 DevOps 平台,涵盖从 CI/CD 流水线、AIOps、MLOps 到 DevSecOps 的全流程实践。
C++学习笔记?:聚焦于现代 C++ 编程的核心概念与实践,涵盖 STL 源码剖析、内存管理、模板元编程等关键技术
AI × Quant 系统化落地实战:从数据、策略到实盘,打造全栈智能量化交易系统


《TensorRT × 边缘多模型部署指南:Jetson / Orin / L4 / Android 端高效推理实战》


✨ 摘要:

在越来越多的 AI 应用走向终端与边缘侧,构建一个轻量、高效、可控的多模型推理系统变得尤为关键。Jetson、Orin NX、L4、甚至 Android 手机,都有自己的资源约束与优化策略。
本文将系统讲解如何在边缘平台部署多个 TensorRT 模型,进行推理任务调度、显存资源管理、INT8 精度优化、插件替代机制与轻量 API 构建,帮助你构建真正能“跑得动”的本地 AI 系统。


🧭 目录:

  1. 边缘侧部署的典型应用场景与硬件选型建议
  2. Jetson / Orin / L4 平台对 TensorRT 的支持与差异点
  3. 多模型共存策略:Engine 缓存、上下文池、显存复用实战
  4. INT8 精度部署最佳实践(含图像类模型压缩流程)
  5. 多模型执行调度器(轻量级多线程 + 资源隔离机制)设计
  6. Android 端部署方案:ONNX → TensorRT → JNI 调用链整合
  7. 插件支持受限情况下的轻量替代策略(如移除 NMS plugin)
  8. Jetson 平台优化建议(功耗模式切换、显存分区、MaxPerf)
  9. 多任务融合场景实战(如检测 + OCR + 多语言模型)部署案例

1. 边缘侧部署的典型应用场景与硬件选型建议

在大量真实业务场景中,模型不再部署在云端,而是需要就近运行在边缘设备、嵌入式平台、甚至移动终端上,以满足实时性、安全性、网络离线可用等需求。


✅ 常见边缘多模型部署场景:
场景模型组合设备类型说明
智慧工地YOLOv5 + OCR + 头盔识别模型Jetson Orin / AGX实时抓拍与行为识别
医疗检测图像增强 + 病灶检测 + 区域分割L4 / 边缘推理盒低延迟 + 私有部署
安防监控目标检测 + 人脸识别 + 多语音转写Orin NX / 工控机多任务合并推理
车载辅助车道线 + 行人 + 手势识别 + TTSJetson Xavier / TX2多模态本地实时预测
手机端 AR / AI 应用轻量识别 +图像压缩 + 美颜滤波Android NPU / GPU模型需极度压缩,API 需低延迟响应

📦 边缘多模型部署挑战:
资源限制风险描述
显存限制(≤ 4GB)多模型共存易触发 OOM
核心数少 / 共享 GPU无法同时调多个 engine 推理
功耗与热设计紧张一旦满载运行,发热严重可能降频
网络不稳定无法依赖远程 LLM / API,模型必须本地运行
Plugin 支持不全某些插件构建失败(如 GridSampler、NMSPlugin)

🎯 硬件选型建议:
场景推荐平台优势注意事项
高性能边缘推理Jetson AGX Orin / Orin NX支持 INT8 / DLA / TensorRT 全功能JetPack ≥ 5.x 支持更完整插件
移动 AI 应用Android + NPU / Mali / Adreno嵌入式部署,低功耗推荐用 TensorRT Lite / NNAPI
小型边缘盒RTX 3050 / L4性价比高,适合批量部署建议部署 INT8 模型节省显存
云-端混合架构Jetson 前端 + 云 LLM 后端把 CV 感知放端侧,NLP 放云端前后对接协议统一,注意异步响应

2. Jetson / Orin / L4 平台对 TensorRT 的支持与差异点

不同设备在 TensorRT 的支持层面上存在较大差异,尤其在:

  • TensorRT 版本兼容性
  • 支持的 Plugin 插件集合
  • 是否启用 DLA(Deep Learning Accelerator)
  • 可用精度类型(FP16 / INT8 / QAT)

✅ 各平台 TensorRT 支持差异对比表:
项目Jetson OrinRTX L4 / 3050Android NPU云端 A100
最大支持版本TensorRT 8.5(JetPack 5.x)8.6+TensorRT Lite 或 NNAPI最新版本同步支持
FP16 精度支持✅(建议默认启用)部分 NPU 支持
INT8 支持✅(需校准器)✅(QAT + PTQ)❌ / 不稳定
DLA 加速✅(Orin 系列)
官方 Plugin 支持部分插件需手动编译全插件支持很少 / 不支持全插件支持
构建 engine 所需内存≤ 2GB 推荐静态构建≥ 4GB 可动态 batch≤ 512MB 推荐 tiny 模型不受限

📦 构建 Engine 的平台限制说明:
  • Jetson 端建议使用 trtexec 离线构建 engine 文件,避免在线构建占用内存过高;
  • L4 / 3050 可通过 Python API 动态构建并部署,适合中型模型实验;
  • Android 不支持 TensorRT 原生部署,需转化为 TensorRT LiteONNX → TFLite → JNI
  • 注意 Plugin 插件兼容性问题:部分社区插件(如 GridSamplePlugin)在 Jetson 上需重新编译。

🎯 工程实践建议:
情况推荐做法
Jetson 上部署多个模型离线构建 engine + 控制 Context 数量 + 显存复用
小模型批量部署(如 OCR 多语言)使用 INT8 静态量化 + Engine 缓存池
插件不支持情况替换 Plugin(如 NMS → Python 实现),或降精度版本
L4 平台服务化Triton Server + 多模型 GPU 分发策略
Android 部署使用 TensorRT Lite + JNI 调用封装,或 TFLite API 转 TensorRT 部署(需转化工具链)

3. 多模型共存策略:Engine 缓存、上下文池、显存复用实战

在 Jetson / L4 / 小型 GPU 等资源受限平台上,模型之间的共存能力决定系统是否能落地。如果每次都加载、释放、重建 Context,系统将严重抖动甚至 OOM。

我们需要构建一套 可复用、高性能、低内存占用的模型部署机制


✅ 关键策略一:Engine 缓存机制(避免重复构建)

构建思路:

  • 每个模型构建一次 .engine 文件,存储本地;
  • 启动时读取并 deserialize
  • 构建统一的模型池,按需加载、复用。
engine_cache = {}

def load_engine(model_key, path):
    if model_key in engine_cache:
        return engine_cache[model_key]
    with open(path, "rb") as f, trt.Runtime(logger) as rt:
        engine = rt.deserialize_cuda_engine(f.read())
        engine_cache[model_key] = engine
        return engine

✅ 关键策略二:上下文池(Context Pool)

Context 是推理的运行时状态,不宜频繁创建和释放。构建固定数量的 ExecutionContext 实例池,支持并发调度。

context_pool = {
    "yolo": [engine.create_execution_context() for _ in range(2)],
    "ocr":  [engine.create_execution_context() for _ in range(4)]
}

推荐做法:

  • 每个模型 2~4 个 Context,按线程绑定;
  • 推理前从池中借出,用完放回;
  • 结合 asyncio.Queue() 实现协程级调度。

✅ 关键策略三:输入输出 buffer 显存复用

若模型输入输出 shape 相似,可复用同一段 CUDA buffer,减少反复 malloc/free 造成的碎片。

# 使用 pagelocked 方式分配输入缓冲区
input_buffer = cuda.pagelocked_empty((1, 3, 640, 640), dtype=np.float32)
output_buffer = cuda.pagelocked_empty((1, 84), dtype=np.float32)

✅ 推荐构建 BufferManager 类,支持复用与重用策略。


🎯 显存复用实践建议:
技术点实施建议
engine + context 分离engine 可全局复用,context 每线程私有
bindings 复用显存 buffer 结构相同的模型可共用绑定
Stream 隔离多模型使用独立 Stream,避免 GPU 操作重叠
资源释放机制定期释放低频使用的 context,控制总占用量
打开 TensorRT profile使用 workspace size + layer profile 控制资源分配上限

4. INT8 精度部署最佳实践(含图像类模型压缩流程)

在边缘设备中,INT8 是提升推理速度、节省显存的第一生产力。但部署并不简单,需要配套的量化策略、数据校准、精度评估与构建技巧。


✅ 部署前准备:
项目内容
模型格式ONNX(静态图),不建议动态控制流
校准数据真实输入图像集,100~1000 张
构建工具trtexec / TensorRT Python API
校准器IInt8EntropyCalibrator2 或自定义 IInt8MinMaxCalibrator

📦 使用 trtexec 静态量化部署 YOLO 示例:
trtexec \
  --onnx=yolov5n.onnx \
  --int8 \
  --calib=calib.cache \
  --saveEngine=yolov5n_int8.engine \
  --shapes=input:1x3x640x640 \
  --useCudaGraph

💡 建议打开 --useCudaGraph,进一步降低推理开销。


✅ 精度评估建议流程:
  1. 构建 INT8 与 FP32 engine;
  2. 使用固定验证集,运行 Top-1 / IoU / mAP 等指标;
  3. 允许最大精度损失(分类:<1%,检测:<2%,分割:<2%);
  4. 生成视觉对比图 / 误差图辅助人工验证。

🎯 INT8 部署实战经验总结:
问题建议解决方案
校准精度差异大扩大样本覆盖面 + 加强 normalize 一致性
Plugin 不支持 INT8手动 fallback 到 FP16 或 FP32
输入 shape 不支持动态改为静态 shape 构建,或预设 profile 多种尺寸
后处理失效将 NMS 移出 engine,改为 Python 后处理
构建失败降低 workspace size,检查 Plugin 序列化结构

5. 多模型执行调度器(轻量级多线程 + 资源隔离机制)设计

在边缘端尤其是 Jetson / L4 这类设备上,资源极为有限 —— 核心数不多、显存不大、任务易拥堵。因此我们需要一个轻量级调度器,保障:

  • 并发安全:多个任务不会抢占 context、stream;
  • 延迟最小:不做不必要的线程切换和等待;
  • 资源可控:支持上下文/stream/显存复用与回收;
  • 架构简洁:可嵌入嵌入式系统或轻量边缘服务框架中。

✅ 推荐架构图(轻量调度器)
┌──────────────────────┐
│ 请求入口(FastAPI / MQTT / 内部接口) │
└────────────┬─────────────┘
             ▼
      ┌────────────┐
      │ 请求队列    │ ← 控制最大并发
      └────┬───────┘
           ▼
   ┌────────────────────┐
   │ 调度器 Dispatcher   │ ← 任务路由 + 绑定上下文 + 调用推理
   └────┬───────────────┘
        ▼
   ┌────────────┐
   │ Context 池 │ ← 每模型绑定 2~4 个 context
   └────────────┘

📦 Python 简化实现(基于 asyncio + context pool):
from asyncio import Queue

class LightweightDispatcher:
    def __init__(self, model_pool, context_pool):
        self.q = Queue(maxsize=8)
        self.models = model_pool
        self.contexts = context_pool

    async def run(self):
        while True:
            task = await self.q.get()
            await self.handle(task)

    async def handle(self, task):
        ctx = self.contexts[task.model].get()
        result = await run_in_executor(task.fn, ctx, task.input)
        self.contexts[task.model].put(ctx)
        return result

🎯 实践建议:
目标建议方案
控制最大并发请求队列限流 + 每模型 context 数量上限
多模型切换延迟高将模型常驻内存,切换仅替换 context/binding
模型负载不均设置优先级权重(如 LLM 低频 / CV 高频)
任务阻塞影响整体性能超时剔除机制 + fallback 执行策略

6. Android 端部署方案:ONNX → TensorRT → JNI 调用链整合

在移动端(特别是 Android 设备)部署 TensorRT 模型,一直是难点。因为标准 TensorRT 并不直接支持 Android 平台。以下是完整部署策略与推荐路径。


✅ 典型 Android AI 模型部署目标:
任务模型类型建议精度推荐结构
人脸识别MobileFaceNet / ArcFaceFP16 / INT8ONNX 转 TensorRT Lite
图像检测YOLOv5n / NanoDetINT8 / FP16构建 JNI + native engine 加载
文本分类TinyBERT / FastTextFP16推荐 ONNX → NNAPI 部署
多任务轻量识别多头共享 backboneINT8ONNX 模型多输出设计

📦 ONNX → TensorRT Lite 转化建议流程(Android NPU 适配):
  1. 使用 onnx-simplifier 简化模型图结构;
  2. 转换为 TFLite 格式(若走 NNAPI);
  3. 转为 TensorRT Lite 或通过 nvidia-jetpack 构建 .engine(嵌入式适配);
  4. 编译 JNI 调用逻辑,封装接口给 Java/Kotlin 层调用。

✅ JNI 接口调用链推荐:
public class InferenceEngine {
    static {
        System.loadLibrary("trt_infer");
    }

    public native float[] infer(byte[] inputData);
}
extern "C"
JNIEXPORT jfloatArray JNICALL
Java_com_example_InferenceEngine_infer(JNIEnv *env, jobject obj, jbyteArray inputData) {
    // 1. 转换输入 → 绑定 TensorRT 输入
    // 2. 调用 execute_async / execute
    // 3. 拿到输出 → 转为 jfloatArray 返回
}

🎯 Android 端部署技巧建议:
问题建议方案
Plugin 不兼容用纯算子构建 ONNX 模型,或手动去 Plugin
TensorRT 不支持 ARM64 原生编译用交叉编译工具链构建 native so
模型体积过大使用 TensorRT INT8 压缩版本,或使用剪枝模型结构
TFLite 性能不足使用 NNAPI delegate 或自行移植 TensorRT Lite fork 版本
数据输入效率低采用 AImageReader + BufferQueue 构建 Zero-Copy 输入方案

7. 插件支持受限情况下的轻量替代策略(如移除 NMS Plugin)

在 Jetson Orin、Android、Tegra X1 等边缘平台部署时,你可能会遇到:

  • 模型构建失败(缺 Plugin)
  • 插件注册冲突(版本不兼容)
  • Plugin 不支持 INT8(如某些自定义激活函数)

这时必须考虑:**是否可以“降级替换”、“推理后处理”、“插件逻辑转 Python”**等兼容性方案。


✅ 插件替代常见类型及策略
插件替代方案说明
NMSPlugin(YOLO 系列)Python NMS 后处理(torchvision.ops.nms构建 engine 时不包含 NMS 部分,推理后处理
GridSamplerPlugin(OCR、图像增强类)自定义 grid_sampler Python 实现可参考 Kornia / OpenCV 重写逻辑
SwishPlugin / SiLUPlugin模型中直接换为等价 x * sigmoid(x) 算子组合支持原生算子构建,无需 plugin
CustomLayerPlugin静态替换为已支持算子组合 / ONNX 转换时 flatten用 Netron 查看图结构后人工重构
DeformableConvPlugin替换为常规卷积+残差组合 / 提前处理为特征图多用于 ViT / Transformer-CNN 融合结构中

📦 YOLOv5 移除 NMS Plugin 示例(使用 Python 后处理)
# 推理输出:[batch, num_anchors, 85]
boxes = decode_boxes(output[:, :, :4])
scores = output[:, :, 4:5] * output[:, :, 5:]  # obj_conf × class_conf

# 应用 NMS
keep = torchvision.ops.nms(boxes, scores.max(dim=-1)[0], iou_threshold=0.5)
final_boxes = boxes[keep]

✅ 精度误差可控制在 ±1%,速度略有下降但兼容性极佳。


🎯 插件兼容处理实践建议:
情况建议方案
Plugin 编译失败(Jetson)手动编译 TensorRT OSS 插件:git clone TensorRT/onnx-tensorrt
Plugin 不支持 INT8使用 FP16 fallback 部署,INT8 仅用于 backbone
插件动态库未找到确认 LD_LIBRARY_PATH 包含插件 .so 路径
多模型插件冲突改为唯一命名插件(如 SwishPlugin_YOLO / SwishPlugin_OCR

8. Jetson 平台优化建议(功耗模式切换、显存分区、MaxPerf)

Jetson 平台部署最大痛点在于 —— 功耗有限、发热严重、默认节能模式极不利于推理性能释放。你需要主动调优其 功耗 / 频率 / 资源分区策略,释放硬件全部潜力。


✅ 启用 Jetson 性能模式
sudo nvpmodel -m 0    # 切换至 Max Performance 模式
sudo jetson_clocks    # 锁定 CPU/GPU 频率不波动

查看当前模式:

sudo nvpmodel -q

✅ 显存分区控制建议(Jetson Xavier / Orin)

Jetson 默认使用 共享内存架构(CPU/GPU 共用 DRAM),可通过以下方式控制内存可用比例:

  • 使用 tegrastats 实时监控 GPU 使用;
  • 修改启动参数设置 GPU 可用内存上限;
  • 控制 TensorRT max_workspace_size 避免爆掉可用 buffer;
  • 启用 SWAP 临时缓解 OOM(非高并发推荐):
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

✅ DLA(Deep Learning Accelerator)部署建议

Jetson Xavier / Orin 系列支持 DLA 部署,可进一步降低功耗,释放主 GPU:

trtexec --useDLACore=0 --int8 --onnx=model.onnx

注意:

  • 模型必须使用支持 DLA 的算子;
  • 不支持 Plugin、自定义层;
  • 通常推荐用于 small backbone、辅助模型部署。

✅ 温控策略建议:
问题建议方案
推理时频繁降频加装主动散热风扇,必要时换用铝壳散热
CPU 温度长时间 > 75°C封装代码中加入 sleep() 控制循环频率
模型太大系统重启使用 swap + 降 batch size + INT8 优化
GPU 使用率低于 40%检查是否未使用 jetson_clocks,或是否未启用 async pipeline

9. 多任务融合场景实战(如检测 + OCR + 多语言模型)部署案例

🎯 场景设定:

智能巡检终端设备部署任务:目标是让一个 Jetson Orin NX 上同时运行:

  • YOLOv5n:检测设备编号区域(多类目标)
  • CRNN:进行图像文本识别(OCR)
  • 多语言 Transformer 模型(TinyBERT):识别文本语言 & 分类问题类型

要求: 实时响应 ≤ 300ms,显存占用 ≤ 2GB,离线可运行、稳定不崩。


✅ 系统结构设计图:
图像输入
   ↓
[YOLOv5n 检测]
   ↓        └────▶ 检测框坐标输出
[裁剪区域]
   ↓
[CRNN OCR 识别]
   ↓
[文本识别结果]
   ↓
[TinyBERT 分类]
   ↓
[输出:识别内容 + 类别标签]

📦 各模型部署参数设定:
模型精度Batch输入尺寸Workspace Size特殊优化
YOLOv5nINT81640×640256MB移除 NMS Plugin,后处理用 Python
CRNNINT811×32×128128MB仅用卷积 + BiGRU 结构
TinyBERTFP161128 token512MB改用 ONNX 静态图,Transformer 优化

🧠 系统调度机制说明:
  • 所有模型使用 trt.engine 文件 + 启动时一次性加载;
  • 每个模型分配 2 个 ExecutionContext + 独立 CUDA stream;
  • OCR 模型复用 YOLO 的 crop tensor,走 BufferManager
  • 调用流程通过 asyncio + lightweight task graph 实现异步化;
  • 输出通过 FastAPI 返回结构化 JSON:
{
  "detected_boxes": [...],
  "ocr_texts": ["高压柜B3-04", "配电室"],
  "classification": ["电力设备", "场所名称"]
}

📊 性能结果(Jetson Orin NX 实测):
项目耗时(ms)备注
YOLOv5n 推理57.8含前处理
CRNN 推理(2 区域)81.2图像预处理并发
TinyBERT 推理62.5使用 FP16 ONNX 版本
全流程总耗时197.4 ms多模型异步调度并发执行
显存占用峰值1.79 GB启用上下文复用与 INT8
GPU 利用率84%达到边缘部署的最佳资源利用率

✅ 实践结论:只要策略得当,三模型协同完全可在 2GB 显存边缘设备上稳定跑通,并满足业务级性能需求。


10. 如果你觉得这篇内容对你有帮助……

🎉 恭喜你读完本篇!

你已经掌握了边缘平台多模型部署的完整路径:


✅ 能力小结:
模块能力
部署平台选型Jetson / Orin / L4 / Android 的差异与场景匹配
多模型共存策略Engine 缓存、上下文池、显存复用
INT8 精度部署trtexec 实战 + 精度压缩 + 误差控制
Android 调用链ONNX → TensorRT Lite → JNI 整合实践
插件兼容常见 Plugin 替代、降级策略与重构技巧
Jetson 调优nvpmodeljetson_clocks、MaxPerf 模式
多任务融合实战检测 + OCR + NLP 完整部署样例

📌 如果这篇文章对你有启发、有帮助:

请一定 点赞 👍、收藏 ⭐、关注 🔔 本专栏
你的一次鼓励,是我持续输出的最大动力。


📦 边缘部署 Starter Template 推荐合集:

名称内容地址
TensorRT Plugin 支持列表查看当前平台支持的插件状态官方文档
trtexec 命令参考Engine 构建推荐命令合集官方手册
TensorRT Python API 示例适用于 Jetson / PC 构建工具参考GitHub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

观熵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值