CNCLIP_SERVICE说明文档.md
5.31 KB
CN-CLIP 服务(clip-as-service)说明
本文是本仓库 CN-CLIP(图片向量)专项运行手册。目标是让新同事在新机器上独立完成环境准备、部署、验收与排障。
1. 作用与边界
cnclip是独立 gRPC 服务(默认grpc://127.0.0.1:51000),底层为 Chinese-CLIP:图像与文本在同一向量空间(图文可互检)。- 图片 embedding 服务(默认
6008)在image_backend: clip_as_service时通过 gRPC 调用它完成:POST /embed/image:图片 URL / 本地路径 → 图向量;POST /embed/clip_text:自然语言短语 → 文本塔向量(与上图向量同空间,用于image_embedding检索、以文搜图等)。
- 语义检索用的文本向量(
title_embedding、query 语义召回)仍由 TEI(8080)+POST /embed/text(6005) 负责,与 CN-CLIP 不是同一模型、不是同一向量空间;请勿混淆。
2. 代码与脚本入口
- 环境初始化:
scripts/setup_cnclip_venv.sh - 启动:
scripts/start_cnclip_service.sh - 停止:
scripts/stop_cnclip_service.sh - 统一编排:
scripts/service_ctl.sh
3. 前置条件
3.1 必需软件
- Python 3.12(由仓库脚本创建虚拟环境)
- 可访问模型下载源(Hugging Face / 镜像源)
3.2 GPU 模式额外要求
- NVIDIA 驱动可用(
nvidia-smi可执行) cnclip设备设为cuda
检查命令:
nvidia-smi
4. 环境安装(可复现)
在仓库根目录执行:
cd /data/saas-search
./scripts/setup_cnclip_venv.sh
脚本会创建 .venv-cnclip,并安装 clip-as-service 服务端所需依赖。
start_cnclip_service.sh 只使用这个专用环境,不会污染主 .venv。
5. 启动与停止
5.1 GPU 模式(推荐)
./scripts/start_cnclip_service.sh --device cuda
5.2 CPU 模式(显式)
./scripts/start_cnclip_service.sh --device cpu
5.3 模型配置与覆盖
- 仓库默认模型取自
embeddings/config.py的CLIP_AS_SERVICE_MODEL_NAME。 scripts/start_cnclip_service.sh会自动读取这个配置,因此修改默认模型时不需要再去脚本里找硬编码。- 覆盖优先级:
--model-name>CNCLIP_MODEL_NAME>CLIP_AS_SERVICE_MODEL_NAME/embeddings/config.py。
查看当前默认模型:
python3 -c "from embeddings.config import CONFIG; print(CONFIG.CLIP_AS_SERVICE_MODEL_NAME)"
临时覆盖模型:
./scripts/start_cnclip_service.sh --model-name CN-CLIP/ViT-L-14 # 768 维,需与索引 dims 一致
CNCLIP_MODEL_NAME=CN-CLIP/ViT-H-14 ./scripts/service_ctl.sh start cnclip # 默认 1024 维(与 mappings 中 image_embedding 一致)
5.4 停止服务
./scripts/stop_cnclip_service.sh
6. service_ctl 的行为与约定
6.1 通过统一编排启动
./scripts/service_ctl.sh start cnclip
# 或一次启动可选能力:./scripts/service_ctl.sh start embedding embedding-image tei cnclip
6.2 设备选择优先级
- 显式传入
CNCLIP_DEVICE时,以该值为准:
CNCLIP_DEVICE=cuda ./scripts/service_ctl.sh start cnclip
CNCLIP_DEVICE=cpu ./scripts/service_ctl.sh start cnclip
- 不传
CNCLIP_DEVICE时,默认cuda。
6.3 运行中模式校验(重要)
service_ctl 会在“已运行”场景下检查当前 cnclip 的 device 与期望是否一致。
若不一致会直接报错,防止“服务已启动但模式错了”的静默问题。
例如:当前运行是 CPU,但你期望 CUDA,会提示先 stop 再按 CUDA 重启。
7. 验收步骤(必须做)
7.1 基础状态
./scripts/service_ctl.sh status cnclip
7.2 核对运行配置
cat third-party/clip-as-service/server/torch-flow-temp.yml
应看到:
- GPU 模式:
device: 'cuda' - CPU 模式:
device: 'cpu' - 模型名:
name: '<当前实际模型名>'
7.2.1 日志与 PID 文件
- 日志:
logs/cnclip.log - PID:
logs/cnclip.pid
7.3 发送一次编码请求(触发模型加载)
gRPC 直连(文本或图片 URL 混传时由 client 自动区分):
PYTHONPATH="third-party/clip-as-service/client:${PYTHONPATH}" \
NO_VERSION_CHECK=1 \
.venv-cnclip/bin/python - <<'PY'
from clip_client import Client
c = Client('grpc://127.0.0.1:51000')
r = c.encode(['测试'])
print('shape:', r.shape)
PY
预期 shape 为 (1, 1024)。
HTTP(推荐业务侧):图片走 6008 /embed/image,纯文本走 /embed/clip_text(勿把 http:// 图 URL 发到 clip_text):
curl -sS -X POST "http://127.0.0.1:6008/embed/clip_text?normalize=true&priority=1" \
-H "Content-Type: application/json" \
-d '["纯棉T恤", "芭比娃娃"]'
7.4 GPU 验证
nvidia-smi
GPU 模式下应出现 clip_server 相关 python 进程及显存占用。
7.5 与 embedding 服务联调
./scripts/start_embedding_image_service.sh
curl -sS -X POST "http://127.0.0.1:6008/embed/image" \
-H "Content-Type: application/json" \
-d '["https://oss.essa.cn/98532128-cf8e-456c-9e30-6f2a5ea0c19f.jpg"]'
返回应为向量数组(非空)。
8. 相关文档
- 开发总览:
docs/QUICKSTART.md - TEI 专项:
docs/TEI_SERVICE说明文档.md - 体系规范:
docs/DEVELOPER_GUIDE.md - embedding 模块:
embeddings/README.md