BAAI/bge-m3 ๋ชจ๋ธ ๊ธฐ๋ฐ ํ ์คํธ ์๋ฒ ๋ฉ API์ ๋๋ค. ํ ์คํธ๋ฅผ 1024์ฐจ์ ์ซ์ ๋ฒกํฐ๋ก ๋ณํํ๋ฉฐ, ์๋ฏธ์ ์ผ๋ก ์ ์ฌํ ํ ์คํธ๋ ๊ฐ๊น์ด ๋ฒกํฐ๋ฅผ ๊ฐ์ง๋๋ค. ๋จ๊ฑด ๋ฐ ๋ฐฐ์น(์ต๋ 100๊ฐ) ๋ชจ๋ ์ง์ํ๋ฉฐ, ๋์ผ ์ ๋ ฅ์ ๋ฐ๋ณต ์์ฒญ์ ์บ์์์ ์ฆ์ ๋ฐํ๋ฉ๋๋ค.
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ๋ชจ๋ธ | BAAI/bge-m3 |
| VRAM | ~2 GB (FP16) |
| ์ถ๋ ฅ ์ฐจ์ | 1024 dim |
| ์ง์ ์ธ์ด | 100๊ฐ ์ธ์ด (ํ๊ตญ์ด ํฌํจ) |
| ํน์ง | Dense + Sparse + ColBERT ๋ฉํฐ ๋ฒกํฐ ์ง์ (Dense ์ฌ์ฉ) |
request_idโ Worker๊ฐ bge-m3 ๋ชจ๋ธ๋ก ์ถ๋ก
GET /api/v1/ns/{ns}/gpu/embed/{request_id} โ 200 + ๋ฒกํฐ ๊ฒฐ๊ณผ
DEL /api/v1/ns/{ns}/gpu/embed/{request_id} โ ๊ฒฐ๊ณผ ์ญ์ (์ ํ)
REDGX_GPU_EMBEDDING_ENABLED=true ํ๊ฒฝ๋ณ์ ๋ฐ ๋ชจ๋ธ(BAAI/bge-m3) ๋ก๋ ์ํ๋ฅผ ์๋จ ์ค์ ๋ฐ์์ ํ์ธํ์ธ์.
write)์ด ์๋ ํค๊ฐ ํ์ํฉ๋๋ค.
Namespace๋ HRM๋ก ๊ธฐ๋ณธ ์ค์ ๋์ด ์์ต๋๋ค.
ํ ์คํธ 1๊ฐ๋ฅผ ์ ์ถํ๊ณ ๋ฒกํฐ ๊ฒฐ๊ณผ๋ฅผ ์กฐํํฉ๋๋ค.
curl ๋ช ๋ น ๋ณด๊ธฐ
์ฌ๋ฌ ํ ์คํธ๋ฅผ ํ ๋ฒ์ ์ ์ถํฉ๋๋ค. ์์๊ฐ ๋ณด์ฅ๋ฉ๋๋ค.
curl ๋ช ๋ น ๋ณด๊ธฐ
vectors[i].index๊ฐ ์
๋ ฅ ์์์ ์ผ์นํ๋๋ก ๋ณด์ฅ๋ฉ๋๋ค.
๋ชจ๋ ํ
์คํธ๊ฐ ํ๋์ request_id๋ก ๋ฌถ์ฌ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋์ผํ ํ ์คํธ๋ฅผ ๋ ๋ฒ ์์ฒญํ๋ฉด ๋ ๋ฒ์งธ๋ GPU ์์ด ์บ์์์ ๋ฐํ๋ฉ๋๋ค.
curl ๋ช ๋ น ๋ณด๊ธฐ
cached: true)
๋ ํ ์คํธ๋ฅผ ์๋ฒ ๋ฉํ๊ณ ์๋ฏธ์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
curl ๋ช ๋ น ๋ณด๊ธฐ
normalize: true๋ก ์๋ฒ ๋ฉ ์ ๋ด์ (dot product)์ด ๊ณง ์ฝ์ฌ์ธ ์ ์ฌ๋์
๋๋ค.
๊ฒฐ๊ณผ ๋ช ์ ์ญ์ , auto_clear ์ต์ , ๋๊ธฐ ์ค ์ทจ์๋ฅผ ํ ์คํธํฉ๋๋ค.
curl ๋ช ๋ น ๋ณด๊ธฐ
| status | ์๋ฏธ |
|---|---|
| queued | ํ ๋๊ธฐ ์ค (HTTP 202) |
| processing | GPU ์ถ๋ก ์ค (HTTP 202) |
| completed | ์๋ฃ โ ๊ฒฐ๊ณผ ํฌํจ (HTTP 200) |
| failed | ์ถ๋ก ์คํจ (HTTP 200) |
| not_found | ๊ฒฐ๊ณผ ์์ / ๋ง๋ฃ / ์ญ์ ๋จ (HTTP 404) |
์ฌ๋ฌ request_id์ ์ฒ๋ฆฌ ์ํ๋ฅผ ํ ๋ฒ์ ์กฐํํฉ๋๋ค.
curl ๋ช ๋ น ๋ณด๊ธฐ
์ธ์ฆ ์คํจ, ์๋ชป๋ ํ๋ผ๋ฏธํฐ, ๋นํ์ฑ ํ์คํฌ ๋ฑ ๋ค์ํ ์๋ฌ ์ํฉ์ ํ ์คํธํฉ๋๋ค.
| ์ฝ๋ | HTTP | ์ค๋ช |
|---|---|---|
UNAUTHORIZED | 401 | API Key ๋๋ฝ ๋๋ ์๋ชป๋จ |
NAMESPACE_DENIED | 403 | Namespace ์ ๊ทผ ๊ถํ ์์ |
| โ | 422 | texts ๋น ๋ฐฐ์ด ๋ฑ Pydantic ์ ํจ์ฑ ์ค๋ฅ (FastAPI ๊ธฐ๋ณธ ํ์: {"detail":[...]}, error.code ์์) |
GPU_INVALID_INPUT | 400 | texts 100๊ฐ ์ด๊ณผ (max_texts_per_request) |
GPU_NOT_FOUND | 404 | request_id ์์ ๋๋ ๋ง๋ฃ (outbox TTL 3600s) |
GPU_PROCESSING | 409 | ์ทจ์ ๋ถ๊ฐ โ ์ด๋ฏธ ์ฒ๋ฆฌ ์ค (cancel ์๋ํฌ์ธํธ) |
GPU_TASK_DISABLED | 503 | embedding ํ์คํฌ ๋นํ์ฑ (REDGX_GPU_EMBEDDING_ENABLED=false) |
GPU_UNAVAILABLE | 503 | Worker ์๋ฐ์ ์ค ๋๋ drain ๋ชจ๋ |
GPU_QUEUE_FULL | 503 | ํ ์ฉ๋ ์ด๊ณผ (max_inflight ๋๋ max_requests ๋๋ฌ) |
GPU_CIRCUIT_OPEN | 200 (failed) | Worker ๊ฒฐ๊ณผ โ ์ถ๋ก ์๋ฒ Circuit Breaker OPEN ์ํ๋ก ํธ์ถ ์ฐจ๋จ |
GPU_INFERENCE_FAILED | 200 (failed) | Worker ๊ฒฐ๊ณผ โ ์ถ๋ก ์๋ฒ ํธ์ถ ์คํจ / ์์ธ |
GPU_TIMEOUT | WS 4008 | WebSocket /wait ๊ฒฐ๊ณผ ๋๊ธฐ timeout ์ด๊ณผ |
| โ | 429 | nginx Rate Limit ์ด๊ณผ (IP๋น 10 r/s, burst 20). ์๋ต์ plain HTML, JSON ์ฝ๋ ์์ |
์ ์ฒด ์๋ํฌ์ธํธ์ ์์ฒญ/์๋ต ์คํค๋ง์ ๋๋ค.
์๋ต: 202 Accepted
{
"texts": ["ํ
์คํธ1", "ํ
์คํธ2"], // ํ์, 1~100๊ฐ
"model": null, // ์ ํ, null์ด๋ฉด ์๋ฒ ๊ธฐ๋ณธ๊ฐ (BAAI/bge-m3)
"normalize": true // ์ ํ, L2 ์ ๊ทํ ์ฌ๋ถ (๊ธฐ๋ณธ true)
}{
"ok": true,
"data": {
"request_id": "emb-1710000000000-a1b2c3d4",
"task_type": "embedding",
"chunk_count": 1
}
}์๋ฃ: 200 OK | ๋๊ธฐ/์ฒ๋ฆฌ์ค: 202 Accepted | ์์/๋ง๋ฃ: 404
// ์๋ฃ โ HTTP 200, status: "completed"
// ๊ฒฐ๊ณผ ํ๋๊ฐ data ๋ฐ๋ก ์๋ ํผ์ณ์ง (์ค์ฒฉ ์์)
{
"ok": true,
"data": {
"request_id": "emb-...",
"status": "completed",
"model": "BAAI/bge-m3",
"vectors": [
{
"index": 0,
"text": "์๋ณธ ํ
์คํธ",
"embedding": "base64_encoded_float32_vector...",
"dim": 1024
}
],
"cached": false,
"elapsed_ms": 42.5
}
}
// ๋๊ธฐ ์ค โ HTTP 202, status: "queued"
{ "ok": true, "data": { "request_id": "emb-...", "status": "queued" } }
// GPU ์ฒ๋ฆฌ ์ค โ HTTP 202, status: "processing"
{ "ok": true, "data": { "request_id": "emb-...", "status": "processing" } }
// ์ถ๋ก ์คํจ โ HTTP 200, status: "failed"
{ "ok": true, "data": { "request_id": "emb-...", "status": "failed", "error": {...} } }
// ์์/๋ง๋ฃ/์ญ์ ๋จ โ HTTP 404
{ "ok": false, "error": { "code": "GPU_NOT_FOUND", "message": "..." } }Redis Pub/Sub์ผ๋ก ์๋ฃ ์๋ฆผ์ ์์ ํ ์ฆ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์กํฉ๋๋ค. GET ํด๋ง๋ณด๋ค ์ง์ฐ์ด ์ ์ต๋๋ค.
// ์ธ์ฆ: Sec-WebSocket-Protocol ํค๋๋ก API ํค ์ ๋ฌ (URL ์ฟผ๋ฆฌ ๋ฏธ์ง์)
// ๋ธ๋ผ์ฐ์ : new WebSocket(url, ["redgx_ak_hrm_..."])
wss://<host>/api/v1/ns/HRM/gpu/embed/emb-xxx/wait?timeout=10 // timeout: ์ต๋ ๋๊ธฐ ์๊ฐ(์ด), ๊ธฐ๋ณธ 10, ์ต๋ 300
// ์๋ฃ โ status: "completed" (REST GET๊ณผ ๋์ผ ๊ตฌ์กฐ)
{ "ok": true, "data": { "request_id": "emb-...", "status": "completed",
"model": "BAAI/bge-m3", "vectors": [...], "cached": false, "elapsed_ms": 42.5 } }
// ์คํจ โ status: "failed"
{ "ok": true, "data": { "request_id": "emb-...", "status": "failed", "error": {...} } }
// ์ธ์ฆ ์คํจ (API key ๋๋ฝ/์ค๋ฅ, ns ๊ถํ ์์) โ HTTP 403 (WebSocket upgrade ๊ฑฐ๋ถ, accept ์ )
// Not Found โ { "ok": false, "error": { "code": "GPU_NOT_FOUND" } } + close(4004)
// Timeout โ { "ok": false, "error": { "code": "GPU_TIMEOUT" } } + close(4008)
| ํค๋ | ์ค๋ช |
|---|---|
X-API-Key | ํ์. ํด๋ผ์ด์ธํธ API ํค |
Content-Type: application/json | POST ์์ฒญ ์ ํ์ |