Chroma 教程

num_threads 线程数调优

🎉摘要:详解 HNSW num_threads 参数作用:控制建图与 query 向量检索的并行线程池,默认等于 CPU 核数。容器 CPU 受限时需显式设置。调大提升批量建索引与批量 query 吞吐,调小可限制 CPU 占用。

参数 num_threads 是用来控制 HNSW 内部计算(后台建图 + query 向量检索)使用的线程数,是 HNSW 算法本身的并行线程池,不是 Python 客户端并发请求线程、不是 SQLite 线程、不是 embedding 推理线程。

默认等于 CPU 核数,一般不用动。只有在容器里被限制了 CPU、但 cpu_count() 拿到的是宿主机核数时,才会开太多线程,这时候显式设一下:

col.modify(configuration={
    "hnsw": {
        "num_threads": 4
    }
})

注意,下面两个场景都会吃这个线程池:

  1. 写入侧:后台消费 embeddings_queue、逐条执行 ef_construction HNSW 插入建图(距离计算、邻居搜索)

  2. 查询侧:执行 query(),HNSW 搜索、距离计算(多 query 向量批量检索时并行收益最明显)

参数调优

调大 num_threads

收益:

  • 大批量建索引、批量 query(一次 query 传入很多 embedding)时,CPU 并行拉高,吞吐提升。

  • 高维向量(1024/1536)距离计算开销大,并行收益非常明显。

代价:

  • CPU 争抢;如果机器同时跑 Ollama、LLM、其他服务,直接把 CPU 打满,全体延迟飙升。

  • 超配(设置远超物理核心):线程上下文切换开销变大,性能反而下跌,没有收益。

调小 num_threads

收益:

  • 限制 Chroma HNSW 的 CPU 占用,给同机的 embedding/LLM 预留 CPU 资源。

  • 在线服务、少量 query、低并发写入场景,CPU 更平稳,不会毛刺 。

代价:

  • 批量导入、大批量检索速度变慢,并行能力受限。

说说我的看法
全部评论()
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号