FunASR模型推理性能测试:JMeter压测脚本编写
你是否在部署FunASR模型后,面临以下挑战:生产环境并发请求下识别延迟飙升、服务稳定性未知、资源配置缺乏依据?本文将通过JMeter压测脚本编写,系统化测试FunASR推理性能,提供从环境搭建到瓶颈分析的完整解决方案。读完本文你将获得:- 3类FunASR服务部署验证方案- 5种压测场景设计模板- 10+性能指标监控方法- 基于实测数据的优化指南## 2. 环境准备与服务部署##...
·
FunASR模型推理性能测试:JMeter压测脚本编写
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 测试计划架构
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 性能瓶颈分析流程
4.3 优化建议
-
线程配置优化:
# 调整服务线程数(run_server.sh) --decoder-thread-num 16 --io-thread-num 4 -
模型优化:
- 使用量化ONNX模型:
--model-dir damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-onnx - 禁用不必要组件:
--lm-dir "" --itn-dir ""
- 使用量化ONNX模型:
-
系统调优:
net.core.somaxconn=1024 net.ipv4.tcp_max_tw_buckets=5000
5. 高级场景设计
5.1 混合负载测试
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在不同并发场景下的性能表现。建议按以下步骤实施:
- 基础功能验证(单用户测试)
- 逐步加压(20/50/100用户)
- 极限测试(资源饱和点探索)
- 稳定性测试(持续8小时运行)
未来可结合Grafana+Prometheus构建实时监控看板,实现性能问题的提前预警。
收藏与关注
- 点赞本文获取最新性能测试模板
- 关注项目仓库获取JMeter脚本更新
- 下期预告:FunASR模型量化对性能的影响分析
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)