仅通过修改一个文件,实现 31.8 倍加速
我测试了一个 RAG 数据摄取流水线,并遇到了瓶颈:处理一个文档需要 50 秒。
我的 CPU 处于闲置状态。应用程序并没有在进行数学运算或逻辑处理;它只是在等待一个 HTTP 请求完成后,才启动下一个请求。
我重写了嵌入模块,使其异步运行。运行时间从 49.61 秒降至 1.56 秒——且没有进行任何基础设施的更改。
测试详情
- 模型:Amazon Titan Text Embeddings V2 (AWS Bedrock)
- 数据集:33 个文本块
- 区域:us-east-1
结果
- 串行:49.61 s
- 并发:1.56 s
- 加速比:31.8×
原理 串行代码发送一个请求并阻塞等待其返回,然后对每个数据块重复此过程。如果有 33 个数据块,每个耗时 1.5 秒,你就会浪费约 50 秒。
异步代码会同时发出所有请求;总耗时等于最慢的单个请求的时间。
扩展影响
- 31 个数据块:49.61 s → 1.56 s
- 100 个数据块:~160 s → ~3 s
- 500 个数据块:~800 s → ~5 s
- 1,000 个数据块:~1,600 s → ~10 s
针对您的流水线的建议
- 寻找闲置时间。如果你的代码只是在等待网络响应,不要盲目增加硬件。
- 遵守 AWS Bedrock 的速率限制。使用
asyncio.Semaphore来限制并发请求的数量。 - 优先使用非阻塞库。从
boto3切换到aioboto3,或者使用asyncio.to_thread()来封装调用。
修改单个文件就消除了瓶颈。低投入,高回报。
来源:https://dev.to/edwardyun/318x-speedup-by-changing-one-file-async-embedding-calls-on-aws-bedrock-4l61
可选学习社区:https://t.me/GyaanSetuAi
