基于Arm平台的端到端int8 Conformer模型部署

描述

作者:Arm 工程部主任软件工程师 Alexey Vilkin 等

在边缘侧运行高质量的语音与音频模型颇具挑战,需满足时延、内存、功耗和模型大小等多方面的严苛约束。不同于云端部署,边缘侧系统通常离线运行,需兼顾用户隐私与可预测的实时性能。这些落地场景涵盖端侧语音转文本、语音助手、语音控制的物联网设备、工业人机界面,以及常开式音频应用等诸多用例。

Conformer 模型结合卷积层与基于 Transformer 的自注意力机制,具备出色的语音识别精度。若要在嵌入式硬件上实现高效执行,需对量化与部署环节进行精细处理。

本文将展示一个涵盖训练、量化及在基于 Arm 架构的嵌入式平台上部署 int8 Conformer 模型的端到端的工作流。通过使用 ExecuTorch 为模型进行量化,最终得以高效地部署到 Arm Ethos-U85 NPU 上。该演示表明基于 Transformer 架构的现代语音识别模型可以在 Arm 软硬件生态系统中高效运行。

开发者可通过 Arm 固定虚拟平台 (Fixed Virtual Platform, FVP) 仿真平台来使用 Arm 机器学习嵌入式评估套件 (Machine Learning Embedded Evaluation Kit, MLEK)[1] 体验部署本演示。

[1] Arm MLEK: https://gitlab.arm.com/artificial-intelligence/ethos-u/ml-embedded-evaluation-kit

模型训练

本演示选用了一个主流的开源 Conformer 模型。该模型是一个基于 Transformer 架构的语音识别网络,适用于嵌入式设备。由于原模型未提供预训练权重,我们首先训练了一个性能良好的 FP32 基准模型,作为后续量化与部署到 Ethos-U85 的基础。经过推理速度测试,我们最终选定 Conformer-S 架构,其采用 144 维编码器、16 层网络结构与 4 个注意力头,并使用 CTC 损失函数完成语音转文本的序列对齐。训练所用的数据集为 LibriSpeech 标准训练与评估子集。

我们采用了一个直接在 LibriSpeech 数据集上训练的 SentencePiece 分词器。它生成了一个包含 128 个词元 (token) 的精简词表,使整个流程简单、独立运行、无需外部依赖。该分词器采用 Unigram 模型实现,且在训练与评估阶段保持配置完全一致。

早期实验中,我们曾采用仅包含英文字母的基础字符级词表训练模型。该方案虽可正常运行,但模型收敛速度较慢,词错误率 (WER) 也显著增高。Subword 单元通过合并高频词素与短词汇来缩短目标序列,既能引入适度的弱语言先验,又能稳定 CTC 任务中声学特征到词元的映射关系,进而有效提升模型收敛速度与识别准确度。

在预处理阶段,本流程以 16kHz 采样率提取 80 维的对数梅尔频谱图。我们尝试了多种数据增强方法,其中频率遮挡、时间遮挡以及随机语速扰动,在训练过程中带来了稳定的 WER 改进,使得模型识别结果更准确。

在初期实验中,我们遇到了收敛问题,这类问题在 Conformer 类模型中较为常见。我们通过将批次大小与学习率调度方案对齐、并引入权重衰减以约束权重取值,成功地解决了该问题;同时权重衰减通常也能有效提升后续 int8 量化的精度。

在该配置下,模型在 test‑clean 测试子集上取得了 6.43% 的词错误率,我们将这一结果作为量化环节的 FP32 基准。经内部评估确认,该精度水平已满足演示场景的需求,因此我们在此阶段完成模型训练。

Conformer-S 架构本身仍具备进一步优化的潜力。在后续迭代中,我们计划将数据集拓展至 LibriSpeech 之外,并尝试更丰富的数据增强方法。因为我们在训练后期观察到模型出现过拟合的早期迹象。为简化实现,当前系统直接采用了 Conformer 的原始输出。根据多项相关研究表明,引入一个轻量级语言模型(例如 N‑gram 或小型 LSTM 等),可进一步降低词错误率。

模型训练过程中我们采用了动态长度的语音样本,而端侧推理时却必须处理固定长度的音频片段。我们对多种音频切片的策略进行了评估验证,结果表明:对重叠片段的预测结果进行聚合,能在精度与时延之间取得最优平衡。该方案使得系统能够使用更短的音频片段来实现实时推理,同时保持较高的识别水准。

训练后量化 (PTQ)

我们采用 ExecuTorch 来进行模型的训练后量化及后续部署。ExecuTorch 中的 Arm 后端已支持包括 Conformer 在内的数百种模型。模型部署流程如下:

第一步:通过 torch.export.export API 将模型导出至 ATen 算子集。

第二步:为实现在 Ethos-U85 NPU 上部署,使用 ExecuTorch 中的 Ethos-U 量化器对模型执行量化操作。Ethos-U 量化器的定义方式如下:

compile_spec = EthosUCompileSpec(

         target="ethos-u85-256",  

         system_config="Ethos_U85_SYS_Flash_High",  

         memory_mode="Shared_Sram",

         extra_flags=["--output-format=raw", "--debug-force-regor"],

)

quantizer = EthosUQuantizer(compile_spec)

config = get_symmetric_quantization_config(is_per_channel=True)

quantizer.set_global(config)

第三步:采用逐通道量化,以保证优异的 int8 精度。

quantized_graph_module = prepare_pt2e(graph_module, quantizer) # Annotate the graph with observers

print("Calibrating...")

for feats, feat_lens, *_ in calibration_loader:

     quantized_graph_module(feats, feat_lens) # Pass true data, similar to what the model will see when running inference

quantized_graph_module = convert_pt2e(quantized_graph_module)

第四步:对模型进行校准。校准过程会在数据类型从 FP32 转换为 int8 时,为每一层选取最优的量化参数。在 ExecuTorch 中,可按照以下步骤对模型进行校准:

partitioner = EthosUPartitioner(compile_spec)

edge_program_manager = to_edge_transform_and_lower(

        quant_exported_program,

        partitioner=[partitioner],

        compile_config=EdgeCompileConfig(

                 _check_ir_validity=False,

         ),

)

第五步:调用 to_edge_transform_and_lower 函数,将神经网络转换下沉至 TOSA 格式,并完成模型编译。

第六步:将程序转换至 ExecuTorch 后端,并保存为 .pte 模型文件。

executorch_program_manager = edge_program_manager.to_executorch(

        config=ExecutorchBackendConfig(extract_delegate_segments=False)

)

save_pte_program(

        executorch_program_manager, f"conformer_quantized_{npu_variant}_{memory_mode}.pte"

)

借助 ExecuTorch 进行训练后量化的完整代码可在此[2]获取。若不想自行执行训练后量化操作,可在 Hugging Face 上获取该模型的量化版本[3]。

[2] https://github.com/Arm-Examples/ML-examples/tree/main/pytorch-conformer-train-quantize/post_training_quantization

[3] https://huggingface.co/Arm/stt_en_conformer_executorch_small

将上述操作所生成的 .pte 文件保存至系统级芯片 (SoC) 的外部存储器中。该文件包含模型权重、偏置以及供 NPU 使用的指令流。Ethos-U 会读取此文件并自主完成推理。

在 Arm 平台上部署

Arm MLEK 是部署与评估 Ethos-U85 的主要工具。通过与 ExecuTorch 集成,可实现在嵌入式目标平台上高效地执行 PyTorch 模型。下图展示了更新后的软件栈,支持在 MLEK 中启用 ExecuTorch 运行时。

嵌入式

图:更新后的 MLEK 软件架构:在共享抽象层下,实现 ExecuTorch 与 TensorFlow Lite Micro 的集成;可复用的平台无关 API 支持各类示例用例跨框架、跨目标平台运行。

MLEK 25.12 版本新增了对 ExecuTorch 1.0.0 的支持。在本次 Conformer 模型部署中,我们复用了现有的自动语音识别示例并完成适配,实现量化后的 Conformer 模型在 Ethos-U85 上的端到端运行。

在 Corstone‑320 FVP 上运行演示

Arm 提供了一款示例应用,可借助 Arm Corstone-320 FVP,在 Ethos-U85 上运行预训练的 Conformer 模型。请参照以下步骤:

第一步:确保已安装前置依赖项:

Arm Corstone-320 FVP:

https://developer.arm.com/Tools%20and%20Software/Fixed%20Virtual%20Platforms/IoT%20FVPs

适用 AArch32 裸机环境的 Arm GNU 工具链:

https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

第二步:克隆并初始化 Arm MLEK 项目:

git clone https://gitlab.arm.com/artificial-intelligence/ethos-u/ml-embedded-evaluation-kit.git

cd ml-embedded-evaluation-kit

git checkout 9e9957c6

git submodule update --init --recursive

第三步:构建 Ethos-U85 项目:

python set_up_default_resources.py --parallel $(nproc) --ml-framework executorch --use-case asr

cmake -B build --preset mps4-320-gcc -DML_FRAMEWORK="ExecuTorch" -DUSE_CASE_BUILD="asr" -DETHOS_U_NPU_TIMING_ADAPTER_ENABLED="OFF"

cmake --build build -j $(nproc)

第四步:在 Corstone-320 FVP 上运行自动语音识别应用:

~/FVP_Corstone_SSE-320/models/Linux64_GCC-9.3/FVP_Corstone_SSE-320

   -a build/bin/ethos-u-asr.axf

   -C mps4_board.subsystem.ethosu.extra_args="--fast"

应用将对一组示例音频片段开展语音检测。推理运行期间,可视化界面会显示输入音频的波形与生成的梅尔频谱图。系统会将梅尔频谱图数据填充至 15 秒时长,并作为输入送入 Conformer 模型。

嵌入式

通过 Conformer 模型对应用内置的示例音频片段进行语音检测。在控制台中,可查看模型当前使用的具体输入音频文件,以及输入/输出张量的形状与内存占用等信息:

INFO - Number of input tensors: 2

INFO - Tensor: 480000 bytes; 120000 elements

INFO - Shape:[1, 1500, 80]

INFO - Type:fp32

INFO - Tensor: 4 bytes; 1 elements

INFO - Shape:[1]

INFO - Type:int32

INFO - Number of output tensors: 2

INFO - Tensor: 192984 bytes; 48246 elements

INFO - Shape:[1, 374, 129]

INFO - Type:fp32

INFO - Tensor: 4 bytes; 1 elements

INFO - Shape:[1]

INFO - Type:int32

INFO - Total memory usage:

INFO - Method memory: Used: 1080898; Peak: 1080898; Available: 2097152

INFO - Temp memory: Used: 0; Peak: 117; Available: 33554432

INFO - Model initialisation complete

INFO - Initialising audio interface: Static sample audio files

INFO - Using sample audio: another_door.wav

稍等片刻后,即可在控制台中看到解码后的输出结果。

INFO - Decoded output: and he walked immediately out of the apartment by another door

源音频文件位于 resources/asr/samples 目录下,你可以播放这些音频,并与控制台输出的解码文本进行对比。界面中同样会显示性能相关数据。

性能评估

在前面章节中,我们在 FVP 的快速模式下运行了该应用。该模式有助于验证功能,但其显示的性能数据并不准确。若要获取准确的性能指标,需关闭快速模式,重新构建并运行该应用。这个过程耗时较长,可能超过 1 小时。具体步骤如下:

# Build

rm -rf build

python set_up_default_resources.py --parallel $(nproc) --ml-framework executorch --use-case asr

cmake -B build --preset mps4-320-gcc -DML_FRAMEWORK="ExecuTorch" -DUSE_CASE_BUILD="asr"

cmake --build build -j $(nproc)

# Run

~/FVP_Corstone_SSE-320/models/Linux64_GCC-9.3/FVP_Corstone_SSE-320

   -a build/bin/ethos-u-asr.axf

若按照上述步骤正确构建并运行应用,将看到类似于如下所示的性能指标:

INFO - NPU ACTIVE: 206370332 cycles

INFO - NPU ETHOSU_PMU_SRAM_RD_DATA_BEAT_RECEIVED: 13858306 beats

INFO - NPU ETHOSU_PMU_SRAM_WR_DATA_BEAT_WRITTEN: 7968438 beats

INFO - NPU ETHOSU_PMU_EXT_RD_DATA_BEAT_RECEIVED: 26978241 beats

INFO - NPU ETHOSU_PMU_EXT_WR_DATA_BEAT_WRITTEN: 18985466 beats

INFO - NPU IDLE: 724 cycles

INFO - NPU TOTAL: 206371056 cycles

控制台输出将展示多项性能指标。例如,NPU ACTIVE 指标用于统计 Ethos-U85 完成 Conformer 模型推理所消耗的时钟周期数。我们所使用的 Conformer 模型,采用 15 秒音频的固定输入规格;当硬件系统主频为 1.0 GHz 时,该性能数据表明,模型推理可在 0.206 秒内完成。MLEK 项目文档中,详细说明了各类性能计数器的具体含义,包括内存带宽及时延配置相关指标。

结论与后续工作

本文展示了在 Arm 嵌入式平台上,训练、量化并部署 int8 Conformer 语音识别模型的端到端工作流。借助 ExecuTorch 与 Ethos-U85 NPU,我们验证了基于 Transformer 架构的语音模型可在边缘侧高效运行,同时满足严格的性能与功耗约束。这充分体现了 Arm 软硬件生态系统赋能开发者,将性能卓越的语音与音频模型落地到嵌入式设备中,且无需牺牲能效与识别精度。

欢迎各位开发者们点击阅读原文,进一步了解如何在 Arm 平台上使用 ExecuTorch 部署优化后的 AI 工作负载,也可以使用 Arm MLEK 探索 Ethos-U 系列 NPU,优化边缘侧 AI 部署!

* 本文为 Arm 原创文章,转载请留言联系获得授权并注明出处。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分