s
stella4528/compressionkit-ppg-4x-npu
模型介绍
文件和版本
Pull Requests
讨论
分析

compressionkit-ppg-4x(昇腾 NPU 适配版)

compressionkit-ppg-4x 是基于 Residual Vector Quantization(RVQ) 的 PPG (光电容积脉搏波)信号压缩编解码器,针对边缘可穿戴设备优化:Encoder 将 320 采样点 /帧(64 Hz,5s)PPG 信号压缩为 4 级 RVQ 索引码流(4x 压缩率),Decoder 重建原始 信号,支持 INT8 量化部署。原始权重为 Keras .keras / TFLite 格式,本仓库提供 Keras→PyTorch 重建版(纯 PyTorch 算子),可在昇腾 NPU 上直接推理。

本仓库为昇腾 Model-Agent 模型适配大赛交付物,已将模型完整适配到 Ascend NPU (Ascend-910 系列)推理,交付 inference.py 推理脚本、readme.md 部署说明与 requirements.txt 依赖清单。

模型信息

项目值
模型Ambiq/compressionkit-ppg-4x(compressionkit-ppg-4x-v1.0)
任务PPG 信号压缩编解码(RVQ 4x 压缩,边到端重建)
模态/采样率PPG,64 Hz,帧长 320 采样点(5s)
架构Encoder(Conv2D 1→48→64 stride2 + BN + ReLU + to_vq 16)+ RVQ 4 级码本(256×16D)+ Decoder(Upsample2x + Conv2D + SeparableConv2D + LayerNorm + out)
参数量encoder 23,216 + decoder 36,001(合计约 59K)+ 码本 4×256×16
输入/输出输入 [B,1,320,1] float32;latent [B,16,1,80];RVQ 索引 [B,80,4];输出 [B,1,320,1]
许可证Apache-2.0(模型权重另见 LICENSE-MODEL-WEIGHTS.md)
原始仓库https://huggingface.co/Ambiq/compressionkit-ppg-4x

环境依赖

  • Python 3.10/3.11,PyTorch 与 torch_npu 版本匹配(本环境为 PyTorch 2.9.0 + torch_npu 2.9.0)
  • 推理仅需 PyTorch + NumPy(模型为纯 PyTorch 重建版,无 Keras/TFLite 运行时依赖)
  • 依赖安装(华为云 PyPI 镜像加速):
pip install -r requirements.txt -i https://repo.huaweicloud.com/repository/pypi/simple/

NPU 适配说明

原始权重为 Keras .keras / TFLite 格式,经两阶段转换重建为纯 PyTorch:

  1. 纯 TensorFlow 进程导出 Keras 层权重为 npz(避免 TF+torch 同进程段错误);
  2. 纯 PyTorch 进程构建 compressionkit_ppg4x.pt(encoder/decoder state_dict + codebooks),关键点:
    • BatchNorm2d / LayerNorm 的 eps=1e-5(与 Keras 一致,实测是 RVQ 索引 一致性的关键,误用 1e-3 会导致索引翻转);
    • SeparableConv2D depthwise 权重转置 (kh,kw,in,1) → (in,1,kh,kw);
    • Conv2D padding='same' 用显式 F.pad 等价实现(kernel 7 stride 2 → pad 2/3)。

推理路径全部为标准 PyTorch 算子(Conv2d / BatchNorm2d / LayerNorm / F.interpolate), device 透传 npu:0 即可全量运行在 NPU,无 CUDA 硬编码、无 CPU fallback。

推理用法

# 默认用例:官方 sample_stimulus 前 4 条 PPG 信号压缩+重建(NPU 推理)
python3 inference.py --device npu:0

# CPU 推理(对比基线)
python3 inference.py --device cpu

# 自定义 PPG 信号(320 点帧,64 Hz)
python3 inference.py --device npu:0 --signal "0.6*sin(2*pi*1.2*t)" --samples 2

# 指定输出 JSON
python3 inference.py --device npu:0 --output result.json

实测结果(默认用例:sample_stimulus 前 4 条,本机 Ascend NPU)

项目CPUNPU (npu:0)
输入(4,1,320,1) float32(4,1,320,1) float32
latent(4,16,1,80)(4,16,1,80)
RVQ 索引(4,80,4) int(4,80,4) int
输出(4,1,320,1)(4,1,320,1)
有限性 finite_allTrueTrue
推理耗时0.0149s0.1492s
与官方参考重建 max_abs_diff0.1518630.152360

说明:

  1. 本机 NPU 单次前向耗时高于 CPU,是因为模型极小(约 59K 参数)而 NPU 存在 算子下发/设备通信开销,批处理或实际边缘部署可摊薄;CPU/NPU 输出数值一致 (逐条 max_abs_diff 与官方 TFLite float32 全链路完全相同:0.017/0.024/0.152/0.058), 差异来源于官方 sample_stimulus 参考重建本身,非 NPU 引入;
  2. 与官方 TFLite float32 全链路逐条对比完全一致(sample 0-3: max_abs_diff=0.017/0.024/0.152/0.058,逐位吻合),证明 PyTorch 重建正确。

输入输出说明

  • 输入:[B,1,320,1] float32 PPG 信号(64 Hz,每帧 320 点 = 5s),默认使用官方 sample_stimulus.npz(10 条参考样本),或 --signal 自定义正弦表达式
  • 输出:重建 PPG 信号 [B,1,320,1](float32)+ RVQ 压缩索引 [B,80,4](int32, 即压缩码流,4 级 × 80 帧位置);与官方参考重建对比报告 max/mean 绝对差
  • 限制:输入帧长固定 320 点(64 Hz × 5s);压缩率固定 4x

目录结构

├── inference.py               # 推理脚本(必选,PyTorch 重建 + NPU device 透传)
├── readme.md                  # 部署说明文档(必选)
├── requirements.txt           # 环境依赖清单
├── compressionkit_ppg4x.pt    # PyTorch 重建权重(encoder/decoder + 码本)
└── sample_stimulus.npz        # 官方参考样本(inputs/targets/reconstructions)

引用

@misc{compressionkit,
  title  = {compressionKIT: Ambiq Compression Toolkit},
  author = {Ambiq AI},
  year   = {2025},
  note   = {https://ambiqai.github.io/compressionkit/}
}