尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
SkyPilot 大规模图片语义搜索实战:CLIP + ChromaDB 全链路构建图像向量数据库
SkyPilot 大规模图片语义搜索实战CLIP ChromaDB 全链路构建图像向量数据库【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot导读本文以 SkyPilot 仓库中的 Image Vector Database 应用示例 为主线完整讲解如何在云端构建大规模图片语义搜索系统从 OpenAI CLIP 生成图片向量到用 ChromaDB 构建向量数据库再到通过 Sky Serve 发布可供调用的搜索 API。读者完成后将掌握一套可直接运行的三阶段流水线向量计算 → 建库 → 服务并理解 SkyPilot 如何通过管理任务、存储挂载和自动扩缩容把百万级图片的向量化与检索变成一条简单的命令行操作。一、为什么需要向量数据库做图片搜索1.1 传统搜索的局限与语义搜索的优势随着图片数据量增长传统基于关键词或元数据的搜索方式难以捕捉图片的真实语义。例如用户想找一朵云的图片如果图片没有预设标签文本检索就会失效。而向量数据库支持语义搜索将图片和文本映射到同一个向量空间通过计算余弦相似度直接检索概念上匹配的图片。该示例 README 明确指出三个关键价值点可扩展性Scalability现代应用需要处理数百万乃至数十亿张图片传统数据库方案会变慢且难以管理灵活性Flexibility把图片嵌入向量后可灵活适配多种检索场景从找相似商品到找特定物体或风格的图片性能Performance向量数据库针对高维空间的最近邻查询做了专门优化能在大规模数据集上实现实时或近实时检索。1.2 SkyPilot 在本方案中的角色SkyPilot 将上述大规模云上作业的运维复杂度抽象掉通过managed jobs管理任务帮助用户高效、低成本地运行计算密集型任务自动完成机器选择、调度与容错无需手动管理任何云资源。整套方案在仓库中的代码结构如下examples/vector_database/ ├── README.md # 完整的分步指南 ├── batch_compute_vectors.py # 分区并批量提交向量计算任务SDK 用法 ├── compute_vectors.yaml # 向量计算任务定义 ├── build_vectordb.yaml # 向量入库任务定义 ├── serve_vectordb.py # 服务发布SDK 用法 ├── serve_vectordb.yaml # 服务任务定义 └── scripts/ ├── compute_vectors.py # CLIP 向量计算实现 ├── build_vectordb.py # ChromaDB 建库实现 └── serve_vectordb.py # FastAPI 搜索服务实现二、Step 0环境准备与配置2.1 前提条件开始前需要满足两项前提安装 SkyPilot确保已安装 SkyPilot并运行sky check验证各云平台配置可用若尚未配置可参考仓库根目录的安装与云配置文档如 README.md 中的安装说明Hugging Face Token示例使用 ImageNet-1k 数据集ILSVRC/imagenet-1k需要从 Hugging Face Hub 下载数据因此必须配置 token。2.2 配置 HF_TOKEN将 token 写入~/.env文件HF_TOKENhf_xxxxx或者直接设置环境变量HF_TOKEN。批量提交脚本 的解析逻辑印证了这两种方式它先读取os.environ.get(HF_TOKEN)若不存在则解析~/.env文件中以HF_TOKEN开头的行。三、Step 1用 OpenAI CLIP 计算图片向量3.1 为什么用 CLIP图片必须被转换为向量表示embedding才能存入向量数据库。OpenAI 的 CLIP 模型学习了把图片和文本映射到同一向量空间的表示这使得语义相似度计算成为可能——例如查询一朵云的图片a photo of a cloud可以匹配到概念上相关的图片。在 scripts/compute_vectors.py 中默认模型配置为ViT-bigG-14预训练权重使用laion2b_s39b_b160k数据集默认为ILSVRC/imagenet-1k。该脚本按流水线处理 ImageNet 图片先初始化模型setup_model再迭代数据集get_dataset_iterator加载并预处理单张图片do_data_loading最后批量交给do_batch_processing完成向量计算并通过tqdm输出进度。3.2 一键提交批量计算入口python3 batch_compute_vectors.py该脚本会自动为图片数据集分区并为每个分区提交一个 SkyPilot managed job实现数据并行。核心机制见 batch_compute_vectors.py通过calculate_job_range()把全局索引区间[start_idx, end_idx)均匀切分到多个 job余数分配给前面的 job加载任务模板sky.Task.from_yaml(compute_vectors.yaml)对每个分区调用task.update_envs({START_IDX: ..., END_IDX: ...})注入该 job 的数据范围通过task.update_secrets({HF_TOKEN: hf_token})安全传递令牌最后调用sky.jobs.launch(task_copy, namefvector-compute-{job_start}-{job_end})逐个提交。脚本默认参数为--start-idx 0、--end-idx 1000000不包含、--num-jobs 100。运行后终端会输出每个分区任务的日志例如(clip-batch-compute-vectors, pid2523) 2025-01-27 23:57:27,387 - root - INFO - Saved partition 2 to /output/embeddings_90000_100000.parquet_part_2/data.parquet (clip-batch-compute-vectors, pid2523) 2025-01-27 23:59:39,720 - root - INFO - Saved partition 3 to /output/embeddings_90000_100000.parquet_part_3/data.parquet也可通过sky jobs queue和sky dashboard查看任务状态与跨区域分布情况。3.3 计算任务的任务定义compute_vectors.yaml任务定义文件 compute_vectors.yaml 是理解整个流程的关键逐段拆解name: clip-batch-compute-vectors workdir: . resources: accelerators: # 按价格排序最便宜到最贵 T4: 1 L4: 1 A10G: 1 A10: 1 V100: 1 memory: 32 any_of: - use_spot: true - use_spot: false num_nodes: 1 file_mounts: /output: name: sky-demo-embedding # 必须与 build_vectordb.yaml 中的 source 一致 mode: MOUNT /images: name: sky-demo-image # 必须与 build_vectordb.yaml 中的 source 一致 mode: MOUNT envs: # 这些环境变量是必需的但在启动时传入 START_IDX: END_IDX: secrets: HF_TOKEN: null # 在 CLI 中用 --secret HF_TOKEN 传入 setup: | pip install numpy1.26.4 pip install torch2.5.1 torchvision0.20.1 ftfy regex tqdm pip install datasets webdataset requests Pillow open_clip_torch pip install fastapi uvicorn aiohttp pandas pyarrow tenacity run: | python scripts/compute_vectors.py \ --output-path /output/embeddings_${START_IDX}_${END_IDX}.parquet \ --start-idx ${START_IDX} \ --end-idx ${END_IDX} \ --batch-size 64 \ --checkpoint-size 1000 echo Processing complete. Results saved in node-specific files under /output/关键设计点多加速器回退列出 T4/L4/A10G/A10/V100 五种 GPUSkyPilot 会按价格从便宜到贵依次尝试优先选用当前云上最便宜的可用加速器Spot 回退any_of块声明了优先抢占式实例失败则回退按需实例的策略有助于降低成本存储即状态/output挂载名为sky-demo-embedding的 Sky Storage/images挂载sky-demo-image。向量结果直接写入云存储天然成为跨任务、跨集群共享的中间产物环境变量注入START_IDX/END_IDX由batch_compute_vectors.py在提交时逐个 job 覆盖写入实现数据分片模型与依赖固化setup阶段精确锁定 numpy/torch/torchvision 版本保证各分区任务环境一致运行参数--batch-size 64控制每次推理的图片批量大小--checkpoint-size 1000控制每处理 1000 张即落盘一次避免任务中断造成大量重复计算。四、Step 2用 ChromaDB 构建向量数据库4.1 建库任务定义build_vectordb.yaml得到图片向量后需要一个专门的引擎在海量向量上进行快速相似度检索本示例选用ChromaDB存储与查询向量。建库任务定义见 build_vectordb.yamlname: vectordb-build workdir: . file_mounts: /clip_embeddings: name: sky-demo-embedding # 必须与 compute_vectors.yaml 中的 source 一致 mode: MOUNT /vectordb: name: sky-vectordb # 必须与 serve_vectordb.yaml 中的 source 一致 mode: MOUNT /images: name: sky-demo-image # 必须与 compute_vectors.yaml 中的 source 一致 mode: MOUNT setup: | pip install chromadb pandas tqdm pyarrow run: | python scripts/build_vectordb.py \ --collection-name clip_embeddings \ --persist-dir /vectordb/chroma \ --embeddings-dir /clip_embeddings \ --batch-size 1000执行建库命令sky jobs launch build_vectordb.yaml该任务会批量读取上一步生成的 CLIP 向量parquet 分片逐批写入 ChromaDB日志形如(vectordb-build, pid2457) INFO:__main__:Processing /clip_embeddings/embeddings_0_500.parquet_part_0/data.parquet Processing batches: 100%|██████████| 1/1 [00:0000:00, 1.19it/s]4.2 建库实现要点scripts/build_vectordb.py从 scripts/build_vectordb.py 源码可以看到几个值得注意的实现细节临时目录策略代码明确注释挂载的存储桶不支持追加操作因此先在 tmpdir 中构建再拷贝到最终位置即with tempfile.TemporaryDirectory() as temp_dir中初始化chromadb.PersistentClient(pathtemp_dir)建库完成后整体拷贝到/vectordb挂载点。这规避了对象存储随机写的限制集合去重创建先尝试create_collection若抛ValueError已存在则改用get_collection实现幂等重跑并行处理每个 parquet 文件由process_parquet_file独立处理通过ProcessPoolExecutor并行执行worker 数为max(1, cpu_count() - 1)留一个 CPU 给调度文件内再按--batch-size默认 1000分批解包 pickled 数据images_base64embeddings以str(idx)作为 ChromaDB 的文档 ID命令行参数--collection-name默认clip_embeddings、--persist-dir默认/vectordb/chroma、--embeddings-dir默认/clip_embeddings、--prefix挂载桶内搜索 parquet 的前缀路径默认空字符串即全桶扫描。五、Step 3对外服务向量数据库建库完成后需要暴露一个 API 端点供其他应用或本地客户端调用语义搜索并可验证数据库是否正常工作。SkyPilot 提供 CLI 与 SDK 两种方式。5.1 Option 1CLI 方式方式 A——以交互式集群运行sky launch -c vecdb_serve serve_vectordb.yaml该命令在名为vecdb_serve的集群上常驻运行向量数据库服务。查询服务地址sky status --ip vecdb_serve方式 B——以 Sky Serve 服务发布推荐用于生产sky serve up serve_vectordb.yaml -n vectordbSky Serve 会把向量数据库部署为云上的托管服务提供公开端点并自动执行健康检查与扩缩容。获取端点地址sky serve status vectordb --endpoint5.2 Option 2SDK 方式通过 Python SDK 也能完成同样的部署python3 serve_vectordb.py运行后脚本会打印服务端点地址可直接用于查询。若想以 Sky Serve 托管服务方式发布python3 serve_vectordb.py --serve5.3 服务任务定义serve_vectordb.yamlserve_vectordb.yaml 定义服务所需资源与探针name: vectordb-serve workdir: . resources: accelerators: # 按价格排序最便宜到最贵 # SkyPilot 会尝试使用最便宜的可用加速器 # 服务需要 GPU 来计算嵌入向量 T4: 1 L4: 1 A10G: 1 A10: 1 V100: 1 memory: 32 ports: 8000 use_spot: true file_mounts: /vectordb: name: sky-vectordb # 必须与 build_vectordb.yaml 中的 source 一致 mode: MOUNT /images: name: sky-demo-image # 必须与 build_vectordb.yaml 中的 source 一致 mode: MOUNT setup: | pip install numpy1.26.4 pip install torch2.5.1 torchvision0.20.1 ftfy regex tqdm pip install open_clip_torch chromadb pandas pip install fastapi uvicorn pydantic run: | python scripts/serve_vectordb.py \ --collection-name clip_embeddings \ --persist-dir /vectordb/chroma \ --images-dir /images \ --host 0.0.0.0 \ --port 8000 service: replicas: 1 readiness_probe: path: /health要点说明服务端必须使用 GPU 重新加载 CLIP 模型以实时编码查询文本因此同样配置了多加速器回退与use_spot: trueports: 8000声明对外服务端口run命令绑定0.0.0.0:8000service.readiness_probe.path: /health让 Sky Serve 通过/health端点判断实例是否就绪未就绪的副本不会被路由流量/vectordbsky-vectordb与/imagessky-demo-image分别挂载建库产物与原始图片实现建库集群写、服务集群读的存储解耦。5.4 服务实现要点scripts/serve_vectordb.pyscripts/serve_vectordb.py 基于 FastAPI 实现核心端点与逻辑如下GET /health返回{status: healthy, collection_size: collection.count()}作为 Sky Serve 的就绪探针同时暴露当前集合规模POST /search接收 JSON 请求体text查询文本、可选n_results默认 5流程为用 CLIP 将文本编码为向量open_clip.create_model_and_transforms(ViT-bigG-14, pretrainedlaion2b_s39b_b160k)加载模型encode_text()在torch.no_grad()下编码并对特征做 L2 归一化调用collection.query(query_embeddings..., n_results..., include[metadatas, distances, documents])检索最近邻将 ChromaDB 的距离转换为余弦相似度similarity 1 - distance / 2返回结构为[{image_path, similarity}]的SearchResult列表GET /image/{subpath:path}从挂载的/images目录读取并返回对应图片FileResponse媒体类型image/jpeg供前端直接展示检索结果GET /内置一个带样式的搜索页面HTML提供搜索输入框与结果网格展示方便快速验证检索效果。六、数据流转与存储约定三段任务的连接线三个任务通过Sky Storage 命名约定紧密衔接这是整个方案最需要理解的全局设计。下表汇总了各任务挂载的存储桶及其必须一致的关系存储桶Sky Storage name挂载点写入方读取方一致性要求sky-demo-image/images用户预置的原始图片计算、建库、服务三个任务的 source 必须一致sky-demo-embedding/output计算、/clip_embeddings建库计算任务建库任务compute_vectors.yaml 与 build_vectordb.yaml 一致sky-vectordb/vectordb建库任务服务任务build_vectordb.yaml 与 serve_vectordb.yaml 一致各 YAML 文件中的注释反复强调this needs to be the same as the source in ...原因在于Sky Storage 是跨集群、跨任务共享的持久化数据层只有名称完全一致后一阶段才能读到前一阶段的产物。这一约定让计算、建库、服务三个阶段可以在不同时刻、不同集群、甚至不同云区域独立运行彼此仅通过存储解耦。七、进阶将方案推广到自己的数据集将本示例迁移到自有数据主要改动集中在 scripts/compute_vectors.py 的几个参数与数据源更换数据集--dataset-name参数默认ILSVRC/imagenet-1k替换为 Hugging Face 上的任意图片数据集并相应调整get_dataset_iterator的解析逻辑调整计算预算batch_compute_vectors.py的--num-jobs默认 100、--start-idx/--end-idx默认[0, 1000000)决定分区粒度分区越细并行度越高但每个 job 的调度开销也越大更换向量模型--model-name默认ViT-bigG-14与--pretrained默认laion2b_s39b_b160k可替换为open_clip支持的其他 CLIP 变体注意tokenizer与模型必须配套更换向量库如需替换 ChromaDB如 Milvus、Qdrant只需改写 scripts/build_vectordb.py 的写入端与 scripts/serve_vectordb.py 的查询端SkyPilot 侧的任务编排、存储挂载与弹性调度完全不需要改动成本控制compute_vectors.yaml与serve_vectordb.yaml中的accelerators列表与any_of/use_spot策略可直接复用——SkyPilot 会尝试从列表中最便宜的 GPU 开始分配抢不到再依次回退。八、总结本示例演示了一条完整的大规模图片语义搜索流水线其技术要点可归纳为数据并行通过 batch_compute_vectors.py 的calculate_job_range把百万级图片切成 100 个独立区间每个区间一个 managed job互不阻塞中间产物存储化向量结果、建库产物与原始图片全部落在 Sky Storagesky-demo-embedding、sky-vectordb、sky-demo-image三个阶段只靠存储名称衔接天然支持跨集群、跨区域运行弹性且省成本多 GPU 回退 Spot/按需回退的组合让昂贵的大规模向量计算任务自动跑在当下最便宜可用的机器上生产级服务Sky Serve 的readiness_probe/health与自动扩缩容能力让向量检索服务一键具备对外可用的高可用形态。读者可以按README.md的 Step 0 → Step 3 顺序自行复现先配置 HF_TOKEN 与 SkyPilot 环境执行python3 batch_compute_vectors.py计算向量再sky jobs launch build_vectordb.yaml建库最后用sky serve up serve_vectordb.yaml -n vectordb发布服务并用POST /search或内置 Web 页面验证一朵云的图片这类语义查询的检索效果。相关实现细节可继续研读 compute_vectors.yaml、build_vectordb.yaml、serve_vectordb.yaml 及scripts/目录下的三个 Python 文件。【免费下载链接】skypilotThe AI Compute Platform for frontier teams. SkyPilot turns fragmented AI compute into one AI supercomputer, so frontier AI teams build custom intelligence faster.项目地址: https://gitcode.com/GitHub_Trending/sk/skypilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

AutoMQ(Apache Kafka Docker 镜像)使用指南:默认配置、文件输入与环境变量三种启动方式全解

AutoMQ(Apache Kafka Docker 镜像)使用指南:默认配置、文件输入与环境变量三种启动方式全解

AutoMQ(Apache Kafka Docker 镜像)使用指南:默认配置、文件输入与环境变量三种启动方式全解 【免费下载链接】automq Diskless Kafka on S3. 10x Cost-Effective. No Cross-AZ Traffic Cost. Autoscale in seconds. Single-digit ms latency.…

📅 2026/9/15 18:05:29
Flutter iOS混合开发安全防护与混淆实战

Flutter iOS混合开发安全防护与混淆实战

1. Flutter iOS混合开发的安全挑战在Flutter与iOS混合开发的项目中,我们常常会遇到一个尴尬的现实:虽然Flutter提供了跨平台开发的便利性,但在安全防护方面却存在明显的短板。最近接手的一个电商类App项目就遇到了典型问题——上线三个月后&a…

📅 2026/9/15 18:05:29
一条命令分享开发服务器:portless Tailscale Funnel 与 ngrok 公网分享实战

一条命令分享开发服务器:portless Tailscale Funnel 与 ngrok 公网分享实战

一条命令分享开发服务器:portless Tailscale Funnel 与 ngrok 公网分享实战 【免费下载链接】portless Replace port numbers with stable, named local URLs. For humans and agents. 项目地址: https://gitcode.com/GitHub_Trending/por/portless portless…

📅 2026/9/15 18:05:29
MORE NEWS

更多资讯

📰

OpenCreator:视频翻译配音一键出片的本地开源AI工作台

OpenCreator:视频翻译配音一键出片的本地开源AI工作台 【免费下载链接】OpenCreator Formerly KrillinAI. Open-source AI workspace for creators, powered by Codex. Create videos, images, voice, avatars, translations, and edits with Agents in one place. …

📰

Gemini 结构化输出实战:使用 Instructor 与 Google GenAI SDK 构建类型安全的数据提取

Gemini 结构化输出实战:使用 Instructor 与 Google GenAI SDK 构建类型安全的数据提取 【免费下载链接】instructor structured outputs for llms 项目地址: https://gitcode.com/GitHub_Trending/in/instructor 本指南以 Instructor 的 Google 集成为主线&…

📰

React 进阶概念实战指南:PropTypes、Styled Components、Redux、Context API 与自定义 Hooks(cu/curriculum 课程精讲)

React 进阶概念实战指南:PropTypes、Styled Components、Redux、Context API 与自定义 Hooks(cu/curriculum 课程精讲) 【免费下载链接】curriculum The open curriculum for learning web development 项目地址: https://gitcode.com/GitH…

📰

LangChain4j 集成 Tavily Web Search Engine:配置、API 与源码级原理详解

LangChain4j 集成 Tavily Web Search Engine:配置、API 与源码级原理详解 【免费下载链接】langchain4j LangChain4j is an idiomatic, open-source Java library for building LLM-powered applications on the JVM. It offers a unified API over popular LLM pro…

📰

使用 AWS CLI 的 associate-external-connection 命令为 CodeArtifact 仓库添加外部连接

使用 AWS CLI 的 associate-external-connection 命令为 CodeArtifact 仓库添加外部连接 【免费下载链接】aws-cli Universal Command Line Interface for Amazon Web Services 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli 本指南以 associate-external-…

📰

Lighttools 8.4.0光学仿真入门:建模、光度学与实战要点

1. 从零开始认识Lighttools:它到底解决什么问题搞照明设计、光学系统开发的朋友,应该都听过Lighttools这个软件。我第一次接触Lighttools 8.4.0的时候,其实是有点懵的——界面功能密密麻麻,菜单层层叠叠,跟平时用的机械…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬