# CN-CLIP 服务(clip-as-service)说明 > 本文是本仓库 CN-CLIP(图片向量)专项运行手册。目标是让新同事在新机器上独立完成环境准备、部署、验收与排障。 ## 1. 作用与边界 - `cnclip` 是独立 gRPC 服务(默认 `grpc://127.0.0.1:51000`)。 - `embedding` 服务(6005)在 `USE_CLIP_AS_SERVICE=true` 时调用它完成 `/embed/image`。 - `cnclip` 不负责文本向量;文本向量由 TEI(8080)负责。 ## 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` 检查命令: ```bash nvidia-smi ``` ## 4. 环境安装(可复现) 在仓库根目录执行: ```bash cd /data/saas-search ./scripts/setup_cnclip_venv.sh ``` 脚本会创建 `.venv-cnclip`,并安装 `clip-as-service` 服务端所需依赖。 `start_cnclip_service.sh` 只使用这个专用环境,不会污染主 `.venv`。 ## 5. 启动与停止 ### 5.1 GPU 模式(推荐) ```bash ./scripts/start_cnclip_service.sh --device cuda ``` ### 5.2 CPU 模式(显式) ```bash ./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`。 查看当前默认模型: ```bash python3 -c "from embeddings.config import CONFIG; print(CONFIG.CLIP_AS_SERVICE_MODEL_NAME)" ``` 临时覆盖模型: ```bash ./scripts/start_cnclip_service.sh --model-name CN-CLIP/ViT-L-14 CNCLIP_MODEL_NAME=CN-CLIP/ViT-H-14 ./scripts/service_ctl.sh start cnclip ``` ### 5.4 停止服务 ```bash ./scripts/stop_cnclip_service.sh ``` ## 6. service_ctl 的行为与约定 ### 6.1 通过统一编排启动 ```bash ./scripts/service_ctl.sh start cnclip # 或一次启动可选能力:./scripts/service_ctl.sh start embedding tei cnclip ``` ### 6.2 设备选择优先级 - 显式传入 `CNCLIP_DEVICE` 时,以该值为准: ```bash 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 基础状态 ```bash ./scripts/service_ctl.sh status cnclip ``` ### 7.2 核对运行配置 ```bash 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 发送一次编码请求(触发模型加载) ```bash 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)`。 ### 7.4 GPU 验证 ```bash nvidia-smi ``` GPU 模式下应出现 `clip_server` 相关 `python` 进程及显存占用。 ### 7.5 与 embedding 服务联调 ```bash ./scripts/start_embedding_service.sh curl -sS -X POST "http://127.0.0.1:6005/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`