CNCLIP_SERVICE说明文档.md 4.85 KB

CN-CLIP 服务(clip-as-service)说明

本文是本仓库的 CN-CLIP 运行手册与约束说明。主流程仍是 embedding 服务(6005);当 embeddings/config.pyUSE_CLIP_AS_SERVICE=true 时,embedding 会调用本 gRPC 服务(默认 grpc://127.0.0.1:51000)生成图片向量。

1. 设计目标与官方对齐

  • 采用 clip-as-service 的标准拆分:clip-server(服务端)与 clip-client(客户端)可独立安装。
  • 服务协议使用 gRPC,符合官方推荐与本项目现有调用链。
  • 保持“主项目环境”和“CN-CLIP 专用环境”解耦,避免 grpcio/jina/docarray 与主项目依赖互相污染。

官方仓库(安装方式、server/client 分离、基本使用示例): jina-ai/clip-as-service

2. 当前架构(本仓库)

  • 服务启动脚本scripts/start_cnclip_service.sh
  • 服务停止脚本scripts/stop_cnclip_service.sh
  • 环境初始化脚本scripts/setup_cnclip_venv.sh
  • 统一编排入口scripts/service_ctl.shrestart.sh 调用它)
  • 默认端口51000
  • 默认模型CN-CLIP/ViT-H-14
  • 默认协议:gRPC

3. 环境准备策略(推荐做法)

3.1 推荐:专用 venv(.venv-cnclip

./scripts/setup_cnclip_venv.sh

脚本会创建 .venv-cnclip,并处理已知兼容性问题(grpciojinadocarraypkg_resources 等),避免在主 .venv 中反复冲突。

3.2 启动时的环境选择

start_cnclip_service.sh 的优先级:

  1. 若存在 .venv-cnclip,优先使用;
  2. 否则回退到项目统一环境(source activate.sh);
  3. 若两者都不可用,启动失败并提示修复动作。

4. 服务管理方式(推荐)

4.1 单独启动/停止

./scripts/start_cnclip_service.sh --device cuda
./scripts/stop_cnclip_service.sh

4.2 统一编排(推荐日常用法)

./scripts/service_ctl.sh restart
# 或
./restart.sh

service_ctl.sh 在启动 cnclip 时默认注入 CNCLIP_DEVICE=cuda
若机器无 GPU 或希望改用 CPU,可在 .env 设置:

CNCLIP_DEVICE=cpu

5. GPU 使用与验证

5.1 必须点

  • 启动日志显示 device: cuda 仅代表配置传入成功;
  • 只有在首次编码请求触发模型加载后nvidia-smi 才一定能看到显存占用。

5.2 推荐验证步骤

1) 启动服务:

./scripts/start_cnclip_service.sh --port 51000 --device cuda

2) 发送一次请求(触发模型加载):

PYTHONPATH="third-party/clip-as-service/client:${PYTHONPATH}" NO_VERSION_CHECK=1 .venv-cnclip/bin/python -c "
from clip_client import Client
c = Client('grpc://localhost:51000')
r = c.encode(['测试'])
print('shape:', r.shape)
"

3) 观察 GPU:

nvidia-smi

预期:

  • shape(1, 1024)
  • nvidia-smi 出现对应 python/clip_server 进程并有显存占用。

6. 使用方式(客户端)

6.1 在本仓库中(推荐)

  • 服务消费者一般是 embedding 服务,不建议业务侧直接连 cnclip
  • 若需手动调试,可在主 .venv 安装 client,或通过 PYTHONPATH 使用 vendored client。

示例:

from clip_client import Client

c = Client("grpc://127.0.0.1:51000")
vec = c.encode(["https://example.com/a.jpg", "测试文本"])
print(vec.shape)  # (2, 1024)

6.2 常见误区

  • ❌ 用 http://localhost:51000 当成 HTTP 服务访问;
  • ❌ 只看“启动成功”就判断已用 GPU,不发请求不看 nvidia-smi
  • ❌ 在主 .venv 直接安装 server 依赖导致依赖树污染。

7. 已知兼容性说明(关键信息)

  • clip-as-service 在本项目场景下依赖链较老,grpcio/jina/docarray 组合在 Python 3.12 上易触发源码构建问题。
  • setuptools>=82 移除了 pkg_resources;而部分依赖链仍会导入它,因此专用脚本固定了兼容范围。
  • setup_cnclip_venv.sh 中存在“为可运行性而做的约束收敛”,这是有意行为,不建议手动放开。

8. 排障速查

8.1 启动失败

  • 查看日志:tail -f logs/cnclip_service.log
  • 检查端口占用:lsof -i :51000
  • 重新构建环境:rm -rf .venv-cnclip && ./scripts/setup_cnclip_venv.sh

8.2 连接失败

  • 确认客户端使用 grpc:// 协议;
  • 确认端口与服务端一致(默认 51000)。

8.3 看不到 GPU 进程

  • 先发一次编码请求,再看 nvidia-smi
  • 确认启动参数或环境变量为 cuda--device cudaCNCLIP_DEVICE=cuda);
  • 确认日志中无模型加载异常。

9. 与其他文档的关系

  • 开发总览:docs/QUICKSTART.md
  • 系统架构:docs/DEVELOPER_GUIDE.md
  • 向量服务说明:embeddings/README.md

本文件聚焦 CN-CLIP(clip-as-service)专项,不重复解释项目通用内容。