16 倍性能提升,成本降低 98%! 解读 SLS 向量索引架构升级改造

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
云原生网关 MSE Higress,422元/月
简介: 大规模数据如何进行语义检索? 当前 SLS 已经支持一站式的语义检索功能,能够用于 RAG、Memory、语义聚类、多模态数据等各种场景的应用。本文分享了 SLS 在语义检索功能上,对模型推理和部署、构建流水线等流程的优化,最终带给用户更高性能和更低成本的针对大规模数据的语义索引功能。

作者:郑前祎(乾以)


在日志场景,向量索引的成本和吞吐挑战


在语义索引中,Embedding 是决定语义召回率的关键因素;在整个语义索引的处理流程中,Embedding 也是整个链路的核心成本所在。Embedding 1GB 数据的成本可能在数百元速度最大只有 100kb/s 左右,索引构建和存储成本与之相比都显得微不足道。Embedding 模型在 GPU 上的推理效率直接决定了语义索引的构建速度和整体成本


对于知识库场景,这个成本也许可以接受,因为知识库是静态,不经常更新的。而对于 SLS 的流数据而言,数据源源不断产生,对成本和速度提出了极大的挑战。数百元的成本和 100kb 的速度,难以投入生产。


为了优化大规模应用场景下的性能和成本压力,我们针对 Embedding 服务的推理瓶颈进行了系统性优化。通过深入分析、方案选择与定制优化,最终实现了吞吐量提升 16 倍同时显著降低了单位请求的资源成本。


技术上的挑战与优化思路

要实现 Embedding 服务的极致性价比,需要解决以下几个关键挑战:


  1. 推理框架:
  • 市场上存在多种推理框架(vLLM, sglang, llama.cpp, TensorRT, sentence-transformers 等),各有侧重(通用/专用,CPU/GPU)。如何选择最适合 Embedding 任务、并能最大化发挥硬件(尤其 GPU)性能的框架是关键。
  • 框架本身的计算效率(连续批处理、Kernel 优化等)也会是 embedding 模型推理性能瓶颈。
  1. 最大化 GPU 利用率:这是降低成本的核心。GPU 是如此的昂贵,如果不能把 GPU 的使用率搞上去,就是浪费,这和 CPU 时代的程序存在明显差别。
  • 批量处理:Embedding 推理对批量处理极其敏感,单条请求处理效率远低于批量。需要高效的请求攒批机制。
  • 并行处理:需将 CPU 预处理(如 Tokenization)、网络 I/O 与 GPU 计算充分解耦并行,避免 GPU 空闲等待。
  • 多模型副本:与大参数量的 Chat 模型不同,常见 Embedding 模型参数量相对较小,单副本在单张 A10 GPU上可能仅占用 15% 的算力13% 的显存。如何在单张 GPU 卡上高效部署多个模型副本,以“填满” GPU 资源是降低成本和提升吞吐量的关键。
  1. 优先级调度:
  • 语义索引包含索引构建(大批量、低优先级)和在线查询(小批量、高实时性)两个阶段。必须确保查询请求的 embedding 任务不被构建任务阻塞。简单的资源池隔离不够灵活,需要精细化的优先级队列调度机制。
  1. E2E链路中的短板:
  • 当 GPU 利用率提升后,其他环节(如 Tokenization)容易成为新的瓶颈点。


方案

最终我们实现了如下优化方案:

1761026315292_B6B9EF74-C306-4054-9FAE-D8D4708F7D27.png

优化点 1:选定 vLLM 作为核心推理引擎 (替换 llama.cpp)

我们最初选择 llama.cpp 主要考虑其 C++ 高性能、CPU 友好性(我们部分任务在 CPU 节点运行)以及易于集成。然而,最近的测试结果表明,在相同硬件上,vLLM 和 sglang 的吞吐量是 llama.cpp 的 2 倍,同时 GPU 平均利用率低 60%我们认为其核心差距可能源于 vLLM 的 Continuous Batching(连续批处理)和高度优化的 CUDA Kernels


最终我们将 Embedding 作为独立服务分离出来。向量构建和查询均通过远程调用获取 Embedding。虽然引入了网络开销和额外的服务运维成本,但获得了显著的基础性能提升为后续优化奠定了基础。


优化点 2:单卡部署多模型副本

为了提供 GPU 利用率,我们需要在单张 A10 GPU 上部署多个模型副本。经过多个方案的对比,最终选择采用 Triton Inference Server 作为服务框架。能够轻松控制单卡上的模型副本数量,并利用其 调度与动态批处理 (Dynamic Batching) 能力,将请求路由到不同副本。(同时我们绕过 vLLM HTTP Server直接在 Triton 的 Python Backend 中调用 vllm 核心库 (LLMEngine),减少一层开销。)


优化点 3:解耦 Tokenization 与模型推理

我们发现在多副本 vLLM 下,GPU 吞吐提升后,Tokenization 阶段成为了新的性能瓶颈。同时我们的测试表明 llama.cpp 的 Tokenization 吞吐量是 vLLM 的 6 倍。所以我们的将 Tokenization 阶段和推理阶段分离使用 llama.cpp 进行高性能 Tokenization,然后将 Token IDs 输入给 vLLM 。成功规避了 vLLM Tokenizer 的性能瓶颈,进一步提升端到端吞吐。当我们做完这个优化后,也看到 snowflake 发了一篇文章做了同样的优化,说明这是一个普遍性的问题,我们也在积极推动 vLLM 社区版能够解决这个问题。


优化点 4:优先级队列与动态批处理

Triton Inference Server 内置了优先级队列(Priority Queuing) 机制和动态批处理机制,非常契合embedding 服务的需求。查询时的 embedding 请求,使用更高的优先级,降低查询延迟同时也使用动态批处理策略,对请求进行攒批,提升整体吞吐效率


最终架构设计


在突破 embedding 的性能瓶颈之后,对整个语义索引框架进行改造也是非常必要的。需要转为调用远程 embedding 服务,并实现数据读取、chunking、Embedding 请求、结果处理/存储等环节的充分异步和并行


embedding 调用

在之前的架构中,直接调用嵌入的 llama cpp 引擎进行 embedding。而在新架构中,通过发起远程调用来进行 embedding。

1761026393740_6A344616-A34A-47b5-96F5-3B9331BA36FA.png

充分异步和并行

在旧的架构中,数据解析 -> chunking -> embedding 是完全串行的,无法将 GPU 上的 embedding 服务负载打满。我们设计了充分异步和并行的新的代码架构,将网络 IO/CPU/GPU 高效利用起来。


1. 流水线任务编排

我们将语义索引的构建流程切分为多个 Task,并且将这些 Task 构建为 DAG 执行。不同的 Task 之间可以异步和并行执行,一个 Task 内部也可以并行执行:

DeserializeDataTask → ChunkingTask(并行 → GenerateBatchTask → EmbeddingTask(并行→ CollectEmbeddingResultTask → BuildIndexTask → SerializeTask → FinishTask


2. Pipeline 调度框架

为了高效执行流水线 Task,我们还实现了以数据和事件驱动的调度框架。

1761026418680_8509F46A-8D69-40c3-9D18-851AA5AE1D81.png

3. 全新的构建流程

通过全面的代码改造,我们实现了架构设计上的飞跃,实现了高性能的语义索引构建。

1761026439433_F020E37A-DF46-41b5-9426-DA0027B9CD08.png

结语:吞吐升,成本降

在充分的流水线化改造后,经过测试:


  1. 吞吐从 170kb/s 提升到了 3M/s
  2. 最终,SLS 提供的向量索引,定价在 0.01/百万 token,相比业界的解决方案有两个数量级的费用优势。

最后,欢迎使用 SLS 的向量索引,请参考使用文档:https://help.aliyun.com/zh/sls/vector-index

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
230 0
|
2月前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
34_GPT系列:从1到5的架构升级_深度解析
大型语言模型(LLM)的发展历程中,OpenAI的GPT系列无疑扮演着至关重要的角色。自2018年GPT-1问世以来,每一代GPT模型都在架构设计、预训练策略和性能表现上实现了质的飞跃。本专题将深入剖析GPT系列从1.17亿参数到能够处理百万级token上下文的技术演进,特别关注2025年8月8日发布的GPT-5如何引领大模型技术迈向通用人工智能(AGI)的重要一步。
|
3月前
|
存储 JSON 数据处理
ClkLog埋点与用户行为分析系统:架构升级与性能全面提升
随着越来越多企业在实际业务中使用 ClkLog,数据规模和分析需求也不断提升,部分用户日活已经超过10万,为了顺应这一趋势,ClkLog 秉持 “开放透明、持续演进”的理念,推出了迄今为止最重要的一次性能优化升级。新版本在大规模数据处理与复杂查询场景中,性能表现实现了跨越式提升。经过多轮研发与严格测试,新版本现已正式上线:在原有付费版 1.0 的基础上架构全面升级,并同步发布全新的 2.0 版本。为用户带来更强的性能与更广的适用场景。
|
2月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
5月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
255 0
|
12月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
340 3

热门文章

最新文章