Commit 6d71d8e05fb6db7766552e2793e19b900c8c8196
1 parent
24edc208
多模态模型配置
Showing
9 changed files
with
19 additions
and
16 deletions
Show diff stats
config/config.yaml
| ... | ... | @@ -364,16 +364,18 @@ services: |
| 364 | 364 | device: "cuda" |
| 365 | 365 | batch_size: 32 |
| 366 | 366 | normalize_embeddings: true |
| 367 | - # 服务内图片后端(embedding 进程启动时读取) | |
| 367 | + # 服务内图片后端(embedding 进程启动时读取;cnclip gRPC 与 6008 须同一 model_name) | |
| 368 | + # Chinese-CLIP:ViT-H-14 → 1024 维,ViT-L-14 → 768 维。须与 mappings/search_products.json 中 | |
| 369 | + # image_embedding.vector.dims 一致(当前索引为 1024 → 默认 ViT-H-14)。 | |
| 368 | 370 | image_backend: "clip_as_service" # clip_as_service | local_cnclip |
| 369 | 371 | image_backends: |
| 370 | 372 | clip_as_service: |
| 371 | 373 | server: "grpc://127.0.0.1:51000" |
| 372 | - model_name: "CN-CLIP/ViT-L-14" | |
| 374 | + model_name: "CN-CLIP/ViT-H-14" | |
| 373 | 375 | batch_size: 8 |
| 374 | 376 | normalize_embeddings: true |
| 375 | 377 | local_cnclip: |
| 376 | - model_name: "ViT-L-14" | |
| 378 | + model_name: "ViT-H-14" | |
| 377 | 379 | device: null |
| 378 | 380 | batch_size: 8 |
| 379 | 381 | normalize_embeddings: true | ... | ... |
config/loader.py
| ... | ... | @@ -532,12 +532,12 @@ class AppConfigLoader: |
| 532 | 532 | image_backends = { |
| 533 | 533 | "clip_as_service": { |
| 534 | 534 | "server": "grpc://127.0.0.1:51000", |
| 535 | - "model_name": "CN-CLIP/ViT-L-14", | |
| 535 | + "model_name": "CN-CLIP/ViT-H-14", | |
| 536 | 536 | "batch_size": 8, |
| 537 | 537 | "normalize_embeddings": True, |
| 538 | 538 | }, |
| 539 | 539 | "local_cnclip": { |
| 540 | - "model_name": "ViT-L-14", | |
| 540 | + "model_name": "ViT-H-14", | |
| 541 | 541 | "device": None, |
| 542 | 542 | "batch_size": 8, |
| 543 | 543 | "normalize_embeddings": True, | ... | ... |
docs/CNCLIP_SERVICE说明文档.md
| ... | ... | @@ -76,8 +76,8 @@ python3 -c "from embeddings.config import CONFIG; print(CONFIG.CLIP_AS_SERVICE_M |
| 76 | 76 | 临时覆盖模型: |
| 77 | 77 | |
| 78 | 78 | ```bash |
| 79 | -./scripts/start_cnclip_service.sh --model-name CN-CLIP/ViT-L-14 | |
| 80 | -CNCLIP_MODEL_NAME=CN-CLIP/ViT-H-14 ./scripts/service_ctl.sh start cnclip | |
| 79 | +./scripts/start_cnclip_service.sh --model-name CN-CLIP/ViT-L-14 # 768 维,需与索引 dims 一致 | |
| 80 | +CNCLIP_MODEL_NAME=CN-CLIP/ViT-H-14 ./scripts/service_ctl.sh start cnclip # 默认 1024 维(与 mappings 中 image_embedding 一致) | |
| 81 | 81 | ``` |
| 82 | 82 | |
| 83 | 83 | ### 5.4 停止服务 | ... | ... |
docs/搜索API对接指南-07-微服务接口(Embedding-Reranker-Translation).md
| ... | ... | @@ -102,7 +102,7 @@ curl -X POST "http://localhost:6008/embed/image?normalize=true&priority=1" \ |
| 102 | 102 | |
| 103 | 103 | #### 7.1.3 `POST /embed/clip_text` — CN-CLIP 文本多模态向量(与图片同空间) |
| 104 | 104 | |
| 105 | -将**自然语言短语**编码为向量,与 `POST /embed/image` 输出的图向量**处于同一向量空间**(Chinese-CLIP 文本塔 / 图塔),用于 **以文搜图**、与 ES `image_embedding` 对齐的 KNN 等。 | |
| 105 | +将**自然语言短语**编码为向量,与 `POST /embed/image` 输出的图向量**处于同一向量空间**(Chinese-CLIP 文本塔 / 图塔),用于 **以文搜图**、与 ES `image_embedding` 对齐的 KNN 等。默认配置为 **ViT-H-14**,向量长度 **1024**(与 `mappings/search_products.json` 中 `image_embedding.vector.dims` 一致);若改为 ViT-L-14 则为 768 维,须同步索引映射与全量重索引。 | |
| 106 | 106 | |
| 107 | 107 | 与 **7.1.1** 的 `POST /embed/text`(TEI/BGE,语义检索)**不是同一模型、不是同一空间**,请勿混用。 |
| 108 | 108 | ... | ... |
embeddings/README.md
| ... | ... | @@ -92,7 +92,7 @@ |
| 92 | 92 | 3. **配置**(`embeddings/config.py` 或环境变量): |
| 93 | 93 | - `USE_CLIP_AS_SERVICE=true`(默认) |
| 94 | 94 | - `CLIP_AS_SERVICE_SERVER=grpc://127.0.0.1:51000` |
| 95 | - - `CLIP_AS_SERVICE_MODEL_NAME=CN-CLIP/ViT-L-14` | |
| 95 | + - `CLIP_AS_SERVICE_MODEL_NAME=CN-CLIP/ViT-H-14`(与 `config/config.yaml` 中 `services.embedding.image_backends` 一致;换 ViT-L 时为 768 维,须同步改 ES 映射) | |
| 96 | 96 | - `scripts/start_cnclip_service.sh` 默认会读取同一个 `CLIP_AS_SERVICE_MODEL_NAME`,也可用 `CNCLIP_MODEL_NAME` 或 `--model-name` 临时覆盖 |
| 97 | 97 | |
| 98 | 98 | ### 性能与压测(沿用仓库脚本) | ... | ... |
embeddings/clip_as_service_encoder.py
| ... | ... | @@ -38,7 +38,8 @@ def _normalize_image_url(url: str) -> str: |
| 38 | 38 | class ClipAsServiceImageEncoder: |
| 39 | 39 | """ |
| 40 | 40 | Image embedding encoder using clip-as-service Client. |
| 41 | - Encodes image URLs in batch; returns 1024-dim vectors (server model must match). | |
| 41 | + Vector length follows the loaded Chinese-CLIP model (e.g. 1024 for ViT-H-14, 768 for ViT-L-14); | |
| 42 | + must match ``services.embedding.image_backends.*.model_name`` and ES ``image_embedding.vector.dims``. | |
| 42 | 43 | """ |
| 43 | 44 | |
| 44 | 45 | def __init__( |
| ... | ... | @@ -122,7 +123,7 @@ class ClipAsServiceImageEncoder: |
| 122 | 123 | return out |
| 123 | 124 | |
| 124 | 125 | def encode_image_from_url(self, url: str, normalize_embeddings: bool = True) -> np.ndarray: |
| 125 | - """Encode a single image URL and return one 1024-dim vector.""" | |
| 126 | + """Encode a single image URL and return one float32 vector (length = model embedding dim).""" | |
| 126 | 127 | results = self.encode_image_urls([url], batch_size=1, normalize_embeddings=normalize_embeddings) |
| 127 | 128 | if not results: |
| 128 | 129 | raise RuntimeError("clip-as-service returned empty result for single image URL") | ... | ... |
embeddings/clip_model.py
| ... | ... | @@ -16,7 +16,7 @@ from cn_clip.clip import load_from_name |
| 16 | 16 | import cn_clip.clip as clip |
| 17 | 17 | |
| 18 | 18 | |
| 19 | -DEFAULT_MODEL_NAME = "ViT-L-14" # "ViT-H-14", "ViT-L-14-336" | |
| 19 | +DEFAULT_MODEL_NAME = "ViT-H-14" # ViT-H-14: 1024-dim; ViT-L-14: 768-dim — 须与 config 与 ES image_embedding.dims 一致 | |
| 20 | 20 | MODEL_DOWNLOAD_DIR = "/data/" |
| 21 | 21 | |
| 22 | 22 | ... | ... |
embeddings/config.py
| ... | ... | @@ -34,9 +34,9 @@ class EmbeddingConfig(object): |
| 34 | 34 | |
| 35 | 35 | self.USE_CLIP_AS_SERVICE = services.image_backend == "clip_as_service" |
| 36 | 36 | self.CLIP_AS_SERVICE_SERVER = str(image_backend.get("server") or "grpc://127.0.0.1:51000") |
| 37 | - self.CLIP_AS_SERVICE_MODEL_NAME = str(image_backend.get("model_name") or "CN-CLIP/ViT-L-14") | |
| 37 | + self.CLIP_AS_SERVICE_MODEL_NAME = str(image_backend.get("model_name") or "CN-CLIP/ViT-H-14") | |
| 38 | 38 | |
| 39 | - self.IMAGE_MODEL_NAME = str(image_backend.get("model_name") or "ViT-L-14") | |
| 39 | + self.IMAGE_MODEL_NAME = str(image_backend.get("model_name") or "ViT-H-14") | |
| 40 | 40 | self.IMAGE_DEVICE = image_backend.get("device") # type: Optional[str] |
| 41 | 41 | self.IMAGE_BATCH_SIZE = int(image_backend.get("batch_size", 8)) |
| 42 | 42 | self.IMAGE_NORMALIZE_EMBEDDINGS = bool(image_backend.get("normalize_embeddings", True)) | ... | ... |
scripts/start_cnclip_service.sh
| ... | ... | @@ -47,7 +47,7 @@ resolve_default_model_name() { |
| 47 | 47 | fi |
| 48 | 48 | fi |
| 49 | 49 | done |
| 50 | - echo "CN-CLIP/ViT-L-14" | |
| 50 | + echo "CN-CLIP/ViT-H-14" | |
| 51 | 51 | } |
| 52 | 52 | |
| 53 | 53 | # 默认配置 |
| ... | ... | @@ -80,7 +80,7 @@ show_help() { |
| 80 | 80 | echo " $0 # 使用默认配置启动" |
| 81 | 81 | echo " $0 --port 52000 --device cuda # 指定 CUDA 模式,端口 52000" |
| 82 | 82 | echo " $0 --port 52000 --device cpu # 显式使用 CPU 模式" |
| 83 | - echo " $0 --model-name CN-CLIP/ViT-L-14 # 临时覆盖模型" | |
| 83 | + echo " $0 --model-name CN-CLIP/ViT-H-14 # 临时覆盖模型" | |
| 84 | 84 | echo " $0 --replicas 2 # 启动2个副本(需8-10GB显存)" |
| 85 | 85 | echo "" |
| 86 | 86 | echo "说明:" | ... | ... |