Aws lambda 音频特征提取(存储层不足)
Aws lambda audio features extraction ( Not enough storage -Layers )
我们有将 wav 文件上传到 S3 存储桶的物联网传感器。
我们希望能够使用 aws lambda
从每个上传的文件中提取声音特征(创建 obj 事件)
为此我们需要:
- python librosa 或 pyAudio 分析包 + numpy 和 scipy。 (~ 240mb 解压缩)
- ffmpeg(~ 70mb 解压缩)
如您所见,无法将它们放在同一个 lambda 包中(最大 250mb 未压缩)。当收集 wav 文件时不在层中包含 ffmpeg 时出现错误:
[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'ffprobe': 'ffprobe'
与ffmpeg相关
我们正在寻找实施建议,我们考虑过:
将 ffmpeg 文件放入 s3 并在每次调用时获取它(不必将其放入图层中。(如果可能的话)
链接两个 lambdas: 1 用于通过 ffmpeg 处理输入文件并将输出文件放入另一个存储桶 > 2 调用函数并从处理后的文件中提取特征数据。 (使用 SNS / 链接机制)(如果可能的话)
- 移动到 EC2 那里,当两个文件同时上传时,我们会遇到并发调用问题。
必须有更简单的方法,我很高兴在开始实施之前听取其他意见,
谢谢大家!
场景似乎是:
- 文件随机进入
- 文件需要处理,但不是实时的
- 所需的库对于 AWS Lambda 函数来说太大
建议的架构:
- 配置 Amazon S3 事件 以在文件到达时向 Amazon SQS 队列 发送消息
- 配置 Amazon CloudWatch 事件 以定期(例如 1 小时)触发 AWS Lambda 函数
- Lambda 函数检查队列中是否有条消息
- 如果有消息,它会启动 Amazon EC2 实例,其中包含用于安装和启动处理系统的用户数据脚本
- 处理系统将:
- 从队列
中抓取一条消息
- 处理 消息(没有 Lambda 的限制)
- 删除 留言
- 如果队列中没有剩余消息,它将终止 EC2 实例
这可能非常具有成本效益,因为 Amazon EC2 Linux 实例是按秒收费的。可以运行几个worker并行处理消息(但是在写终止代码的时候要小心,确保所有worker都处理完消息)。或者,如果事情不是时间紧迫的,只需选择最小的可用实例类型并将其单线程,因为无论如何,更大的实例成本更高(因此从成本效益的角度来看它们并不更好)。
确保将 监控 放置到位,以确保消息得到处理。在 Amazon SQS 中实施 Dead Letter Queue 以捕获无法处理的消息,并在 DLQ 上放置 CloudWatch Alarm 以在出现问题时通知您会出错的。
我们有将 wav 文件上传到 S3 存储桶的物联网传感器。
我们希望能够使用 aws lambda
从每个上传的文件中提取声音特征(创建 obj 事件)为此我们需要:
- python librosa 或 pyAudio 分析包 + numpy 和 scipy。 (~ 240mb 解压缩)
- ffmpeg(~ 70mb 解压缩)
如您所见,无法将它们放在同一个 lambda 包中(最大 250mb 未压缩)。当收集 wav 文件时不在层中包含 ffmpeg 时出现错误:
[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'ffprobe': 'ffprobe'
与ffmpeg相关
我们正在寻找实施建议,我们考虑过:
将 ffmpeg 文件放入 s3 并在每次调用时获取它(不必将其放入图层中。(如果可能的话)
链接两个 lambdas: 1 用于通过 ffmpeg 处理输入文件并将输出文件放入另一个存储桶 > 2 调用函数并从处理后的文件中提取特征数据。 (使用 SNS / 链接机制)(如果可能的话)
- 移动到 EC2 那里,当两个文件同时上传时,我们会遇到并发调用问题。
必须有更简单的方法,我很高兴在开始实施之前听取其他意见, 谢谢大家!
场景似乎是:
- 文件随机进入
- 文件需要处理,但不是实时的
- 所需的库对于 AWS Lambda 函数来说太大
建议的架构:
- 配置 Amazon S3 事件 以在文件到达时向 Amazon SQS 队列 发送消息
- 配置 Amazon CloudWatch 事件 以定期(例如 1 小时)触发 AWS Lambda 函数
- Lambda 函数检查队列中是否有条消息
- 如果有消息,它会启动 Amazon EC2 实例,其中包含用于安装和启动处理系统的用户数据脚本
- 处理系统将:
- 从队列 中抓取一条消息
- 处理 消息(没有 Lambda 的限制)
- 删除 留言
- 如果队列中没有剩余消息,它将终止 EC2 实例
这可能非常具有成本效益,因为 Amazon EC2 Linux 实例是按秒收费的。可以运行几个worker并行处理消息(但是在写终止代码的时候要小心,确保所有worker都处理完消息)。或者,如果事情不是时间紧迫的,只需选择最小的可用实例类型并将其单线程,因为无论如何,更大的实例成本更高(因此从成本效益的角度来看它们并不更好)。
确保将 监控 放置到位,以确保消息得到处理。在 Amazon SQS 中实施 Dead Letter Queue 以捕获无法处理的消息,并在 DLQ 上放置 CloudWatch Alarm 以在出现问题时通知您会出错的。