FunASR模型推理性能测试:JMeter压测脚本编写

【免费下载链接】FunASR A Fundamental End-to-End Speech Recognition Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Recognition, Voice Activity Detection, Text Post-processing etc. 【免费下载链接】FunASR 项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR

1. 痛点与解决方案

你是否在部署FunASR模型后,面临以下挑战:生产环境并发请求下识别延迟飙升、服务稳定性未知、资源配置缺乏依据?本文将通过JMeter压测脚本编写,系统化测试FunASR推理性能,提供从环境搭建到瓶颈分析的完整解决方案。读完本文你将获得:

  • 3类FunASR服务部署验证方案
  • 5种压测场景设计模板
  • 10+性能指标监控方法
  • 基于实测数据的优化指南

2. 环境准备与服务部署

2.1 FunASR服务部署(Docker方式)

# 1. 安装Docker
curl -O https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/shell/install_docker.sh
sudo bash install_docker.sh

# 2. 拉取镜像
sudo docker pull registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.5

# 3. 启动容器
sudo docker run -p 10095:10095 -it --privileged=true \
  -v $PWD/funasr-runtime-resources/models:/workspace/models \
  registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-cpu-0.4.5

# 4. 启动服务
nohup bash run_server.sh \
  --download-model-dir /workspace/models \
  --vad-dir damo/speech_fsmn_vad_zh-cn-16k-common-onnx \
  --model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx \
  --punc-dir damo/punc_ct-transformer_cn-en-common-vocab471067-large-onnx \
  --certfile 0 > log.txt 2>&1 &

2.2 服务可用性验证

# 安装依赖
pip install websockets

# 客户端测试
python3 funasr_wss_client.py --host "127.0.0.1" --port 10095 \
  --mode offline --audio_in "../audio/asr_example.wav"

2.3 JMeter环境配置

# 下载JMeter(国内镜像)
wget https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/apache-jmeter-5.6.tgz
tar -zxvf apache-jmeter-5.6.tgz

# 安装WebSocket插件
cd apache-jmeter-5.6/lib/ext
wget https://repo1.maven.org/maven2/org/apache/jmeter/jmeter-websocket/5.6/jmeter-websocket-5.6.jar

3. 压测脚本设计与实现

3.1 测试计划架构

mermaid

3.2 关键组件配置

3.2.1 线程组设置
参数 取值 说明
线程数 10-200 模拟并发用户数
Ramp-Up时间 60秒 梯度加压避免瞬时冲击
循环次数 10 每个用户发送请求次数
3.2.2 WebSocket连接配置
<WebSocketConfig guiclass="WebSocketConfigGui" testclass="WebSocketConfig" testname="FunASR连接配置" enabled="true">
  <stringProp name="WebSocketConfig.server_url">ws://127.0.0.1:10095</stringProp>
  <boolProp name="WebSocketConfig.use_ssl">false</boolProp>
  <stringProp name="WebSocketConfig.connection_timeout">30000</stringProp>
</WebSocketConfig>
3.2.3 请求参数化(CSV数据文件)

audio_files.csv

../audio/test1.wav,offline,阿里巴巴 20
../audio/test2.wav,offline,淘宝 15
../audio/test3.wav,online,支付宝 30
3.2.4 WebSocket请求采样器
// 发送初始化消息
ws.sendText('{"mode":"${mode}","hotword":"${hotword}","wav_name":"${__threadNum}"}');

// 读取音频文件并发送二进制数据
File audioFile = new File("${audio_path}");
byte[] audioData = Files.readAllBytes(audioFile.toPath());
ws.sendBinary(audioData);

3.3 完整脚本示例(JMX片段)

<hashTree>
  <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="FunASR压测线程组" enabled="true">
    <stringProp name="ThreadGroup.num_threads">50</stringProp>
    <stringProp name="ThreadGroup.ramp_time">60</stringProp>
    <stringProp name="ThreadGroup.continue_forever">false</stringProp>
    <stringProp name="ThreadGroup.num_iterations">10</stringProp>
  </ThreadGroup>
  
  <hashTree>
    <CSVDataSet guiclass="CSVDataSetGui" testclass="CSVDataSet" testname="音频文件参数化" enabled="true">
      <stringProp name="filename">audio_files.csv</stringProp>
      <stringProp name="fileEncoding">UTF-8</stringProp>
      <stringProp name="variableNames">audio_path,mode,hotword</stringProp>
      <boolProp name="ignoreFirstLine">true</boolProp>
      <stringProp name="delimiter">,</stringProp>
    </CSVDataSet>
    
    <WebSocketSampler guiclass="WebSocketSamplerGui" testclass="WebSocketSampler" testname="FunASR推理请求" enabled="true">
      <stringProp name="WebSocketSampler.webSocketConfig">FunASR连接配置</stringProp>
      <stringProp name="WebSocketSampler.request_type">TEXT</stringProp>
      <stringProp name="WebSocketSampler.request_data">{"mode":"${mode}","hotword":"${hotword}"}</stringProp>
      <boolProp name="WebSocketSampler.binary_data">true</boolProp>
      <stringProp name="WebSocketSampler.binary_file_path">${audio_path}</stringProp>
    </WebSocketSampler>
    
    <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="响应断言" enabled="true">
      <collectionProp name="Asserion.test_strings">
        <stringProp name="-1303521838">result</stringProp>
      </collectionProp>
      <stringProp name="Assertion.custom_message">识别结果验证失败</stringProp>
      <stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
      <boolProp name="Assertion.assume_success">false</boolProp>
    </ResponseAssertion>
    
    <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="查看结果树" enabled="true">
      <stringProp name="filename">results/funasr_perf_${__time(yyyyMMddHHmmss)}.jtl</stringProp>
    </ResultCollector>
  </hashTree>
</hashTree>

4. 性能指标监控与分析

4.1 核心监控指标

指标 阈值 采集方式
平均响应时间 <500ms 聚合报告
吞吐量 >20 QPS 汇总报告
错误率 <1% 断言结果
CPU利用率 <80% 服务器监控
内存使用 <70% 容器stats

4.2 性能瓶颈分析流程

mermaid

4.3 优化建议

  1. 线程配置优化

    # 调整服务线程数(run_server.sh)
    --decoder-thread-num 16 --io-thread-num 4
    
  2. 模型优化

    • 使用量化ONNX模型:--model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx
    • 禁用不必要组件:--lm-dir "" --itn-dir ""
  3. 系统调优

    net.core.somaxconn=1024
    net.ipv4.tcp_max_tw_buckets=5000
    

5. 高级场景设计

5.1 混合负载测试

mermaid

5.2 分布式压测配置

# 主控机启动
jmeter -n -t funasr_test.jmx -r -l results/distributed.jtl \
  -Jremote_hosts=192.168.1.10:1099,192.168.1.11:1099

6. 总结与展望

通过本文的JMeter脚本,可系统化评估FunASR在不同并发场景下的性能表现。建议按以下步骤实施:

  1. 基础功能验证(单用户测试)
  2. 逐步加压(20/50/100用户)
  3. 极限测试(资源饱和点探索)
  4. 稳定性测试(持续8小时运行)

未来可结合Grafana+Prometheus构建实时监控看板,实现性能问题的提前预警。

收藏与关注

  • 点赞本文获取最新性能测试模板
  • 关注项目仓库获取JMeter脚本更新
  • 下期预告:FunASR模型量化对性能的影响分析

【免费下载链接】FunASR A Fundamental End-to-End Speech Recognition Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Recognition, Voice Activity Detection, Text Post-processing etc. 【免费下载链接】FunASR 项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐