74cca190
tangwang
cnclip
|
1
|
# CN-CLIP 编码服务
|
40f1e391
tangwang
cnclip
|
2
|
|
74cca190
tangwang
cnclip
|
3
|
## 模块说明
|
40f1e391
tangwang
cnclip
|
4
|
|
74cca190
tangwang
cnclip
|
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
CN-CLIP 编码服务基于 [clip-as-service](https://github.com/jina-ai/clip-as-service) 提供中文 CLIP 模型的文本和图像编码功能。服务使用 gRPC 协议,支持批量编码,返回固定维度的向量表示。
### 功能特性
- 文本编码:将中文文本编码为向量
- 图像编码:将图像(本地文件或远程 URL)编码为向量
- 混合编码:同时编码文本和图像
- 批量处理:支持批量编码,提高效率
### 技术架构
- **框架**: clip-as-service (基于 Jina)
- **模型**: CN-CLIP/ViT-L-14-336(默认)
- **协议**: gRPC(默认,官方推荐)
- **运行时**: PyTorch
|
40f1e391
tangwang
cnclip
|
20
21
22
|
## 启动服务
|
74cca190
tangwang
cnclip
|
23
24
|
### 基本用法
|
40f1e391
tangwang
cnclip
|
25
26
27
28
29
30
|
```bash
./scripts/start_cnclip_service.sh
```
### 启动参数
|
74cca190
tangwang
cnclip
|
31
32
33
34
35
36
37
38
39
|
| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--port PORT` | 服务端口 | 51000 |
| `--device DEVICE` | 设备类型:cuda 或 cpu | 自动检测 |
| `--batch-size SIZE` | 批处理大小 | 32 |
| `--num-workers NUM` | 预处理线程数 | 4 |
| `--dtype TYPE` | 数据类型:float16 或 float32 | float16 |
| `--model-name NAME` | 模型名称 | CN-CLIP/ViT-L-14-336 |
| `--replicas NUM` | 副本数 | 1 |
|
40f1e391
tangwang
cnclip
|
40
41
42
43
44
45
46
47
48
49
|
### 示例
```bash
# 使用默认配置启动
./scripts/start_cnclip_service.sh
# 指定端口和设备
./scripts/start_cnclip_service.sh --port 52000 --device cpu
|
74cca190
tangwang
cnclip
|
50
51
|
# 使用其他模型
./scripts/start_cnclip_service.sh --model-name CN-CLIP/ViT-H-14
|
40f1e391
tangwang
cnclip
|
52
53
|
```
|
74cca190
tangwang
cnclip
|
54
|
### 停止服务
|
40f1e391
tangwang
cnclip
|
55
56
57
58
59
|
```bash
./scripts/stop_cnclip_service.sh
```
|
74cca190
tangwang
cnclip
|
60
|
## API 接口说明
|
40f1e391
tangwang
cnclip
|
61
|
|
74cca190
tangwang
cnclip
|
62
|
### Python 客户端
|
40f1e391
tangwang
cnclip
|
63
|
|
74cca190
tangwang
cnclip
|
64
|
服务使用 gRPC 协议,必须使用 Python 客户端:
|
40f1e391
tangwang
cnclip
|
65
|
|
74cca190
tangwang
cnclip
|
66
67
|
```python
from clip_client import Client
|
40f1e391
tangwang
cnclip
|
68
|
|
74cca190
tangwang
cnclip
|
69
70
|
# 创建客户端(使用 grpc:// 协议)
c = Client('grpc://localhost:51000')
|
40f1e391
tangwang
cnclip
|
71
72
|
```
|
74cca190
tangwang
cnclip
|
73
|
### 编码接口
|
40f1e391
tangwang
cnclip
|
74
|
|
74cca190
tangwang
cnclip
|
75
|
#### 1. 文本编码
|
40f1e391
tangwang
cnclip
|
76
|
|
74cca190
tangwang
cnclip
|
77
78
|
```python
from clip_client import Client
|
40f1e391
tangwang
cnclip
|
79
|
|
74cca190
tangwang
cnclip
|
80
81
82
83
84
|
c = Client('grpc://localhost:51000')
# 编码单个文本
result = c.encode(['这是测试文本'])
print(result.shape) # (1, 1024)
|
40f1e391
tangwang
cnclip
|
85
|
|
74cca190
tangwang
cnclip
|
86
87
88
|
# 编码多个文本
result = c.encode(['文本1', '文本2', '文本3'])
print(result.shape) # (3, 1024)
|
40f1e391
tangwang
cnclip
|
89
90
|
```
|
74cca190
tangwang
cnclip
|
91
|
#### 2. 图像编码
|
40f1e391
tangwang
cnclip
|
92
|
|
74cca190
tangwang
cnclip
|
93
94
95
96
|
```python
# 编码远程图像 URL
result = c.encode(['https://oss.essa.cn/98532128-cf8e-456c-9e30-6f2a5ea0c19f.jpg'])
print(result.shape) # (1, 1024)
|
40f1e391
tangwang
cnclip
|
97
|
|
74cca190
tangwang
cnclip
|
98
99
100
|
# 编码本地图像文件
result = c.encode(['/path/to/image.jpg'])
print(result.shape) # (1, 1024)
|
40f1e391
tangwang
cnclip
|
101
102
|
```
|
74cca190
tangwang
cnclip
|
103
|
#### 3. 混合编码
|
40f1e391
tangwang
cnclip
|
104
105
|
```python
|
74cca190
tangwang
cnclip
|
106
107
108
109
110
111
112
113
|
# 同时编码文本和图像
result = c.encode([
'这是文本',
'https://oss.essa.cn/98532128-cf8e-456c-9e30-6f2a5ea0c19f.jpg',
'另一个文本'
])
print(result.shape) # (3, 1024)
```
|
40f1e391
tangwang
cnclip
|
114
|
|
74cca190
tangwang
cnclip
|
115
|
### 返回格式
|
40f1e391
tangwang
cnclip
|
116
|
|
74cca190
tangwang
cnclip
|
117
118
119
120
|
- **类型**: `numpy.ndarray`
- **形状**: `(N, 1024)`,其中 N 是输入数量
- **数据类型**: `float32`
- **维度**: 1024(CN-CLIP 模型的 embedding 维度)
|
40f1e391
tangwang
cnclip
|
121
|
|
74cca190
tangwang
cnclip
|
122
|
### 支持的模型
|
40f1e391
tangwang
cnclip
|
123
|
|
74cca190
tangwang
cnclip
|
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
| 模型名称 | 说明 | 推荐场景 |
|---------|------|---------|
| `CN-CLIP/ViT-B-16` | 基础版本,速度快 | 对速度要求高的场景 |
| `CN-CLIP/ViT-L-14` | 平衡版本 | 通用场景 |
| `CN-CLIP/ViT-L-14-336` | 高分辨率版本(默认) | 需要处理高分辨率图像 |
| `CN-CLIP/ViT-H-14` | 大型版本,精度高 | 对精度要求高的场景 |
| `CN-CLIP/RN50` | ResNet-50 版本 | 兼容性场景 |
## 测试
运行测试脚本:
```bash
./scripts/test_cnclip_service.sh
|
40f1e391
tangwang
cnclip
|
138
139
|
```
|
74cca190
tangwang
cnclip
|
140
141
142
143
|
测试脚本会验证:
- 文本编码功能
- 图像编码功能(远程 URL)
- 混合编码功能
|
40f1e391
tangwang
cnclip
|
144
|
|
74cca190
tangwang
cnclip
|
145
|
每个测试会显示 embedding 的维度和前 20 个数字。
|
40f1e391
tangwang
cnclip
|
146
147
148
149
150
151
152
153
154
|
## 查看日志
```bash
tail -f /data/tw/SearchEngine/logs/cnclip_service.log
```
## 常见问题
|
74cca190
tangwang
cnclip
|
155
|
### 1. 服务启动失败
|
40f1e391
tangwang
cnclip
|
156
|
|
74cca190
tangwang
cnclip
|
157
158
159
|
- 检查端口是否被占用:`lsof -i :51000`
- 检查 conda 环境是否正确激活
- 查看日志文件获取详细错误信息
|
40f1e391
tangwang
cnclip
|
160
|
|
74cca190
tangwang
cnclip
|
161
|
### 2. 客户端连接失败
|
40f1e391
tangwang
cnclip
|
162
|
|
74cca190
tangwang
cnclip
|
163
|
确保使用正确的协议:
|
40f1e391
tangwang
cnclip
|
164
165
|
```python
|
74cca190
tangwang
cnclip
|
166
|
# 正确:使用 grpc://
|
40f1e391
tangwang
cnclip
|
167
|
c = Client('grpc://localhost:51000')
|
74cca190
tangwang
cnclip
|
168
169
170
|
# 错误:不要使用 http://
# c = Client('http://localhost:51000') # 会失败
|
40f1e391
tangwang
cnclip
|
171
172
|
```
|
74cca190
tangwang
cnclip
|
173
174
175
176
177
178
179
|
### 3. 编码失败
- 检查服务是否正常运行
- 检查输入格式是否正确
- 查看服务日志排查错误
### 4. 依赖安装
|
40f1e391
tangwang
cnclip
|
180
|
|
74cca190
tangwang
cnclip
|
181
|
确保已安装必要的依赖:
|
40f1e391
tangwang
cnclip
|
182
|
|
74cca190
tangwang
cnclip
|
183
184
185
|
```bash
pip install clip-client
```
|
40f1e391
tangwang
cnclip
|
186
|
|
74cca190
tangwang
cnclip
|
187
|
服务端依赖会在启动脚本中自动检查。
|