仅通过修改一个文件,实现 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