Chandra OCR 2 β μ¬λ΄ Document Intelligence μλΉμ€ κΈ°μ λ¬Έμ
μμ±μΌ: 2026-04-15
μμ±μ: AI Engineering Team
μλΉμ€ μλ²: DGX H200 (10.150.6.159)
μν: μ΄μ μ€
1. κ°μ
Chandra OCR 2λ Datalabμμ κ°λ°ν μ΅μ OCR(Optical Character Recognition) λͺ¨λΈλ‘, λ¬Έμ μ΄λ―Έμ§λ₯Ό ꡬ쑰νλ HTML/Markdown/JSONμΌλ‘ λ³ννλ©΄μ λ μ΄μμ μ 보λ₯Ό 보쑴ν©λλ€. olmOCR λ²€μΉλ§ν¬μμ 85.9% μ μλ‘ μ€νμμ€ OCR λͺ¨λΈ μ€ μ΅κ³ μ±λ₯(SOTA)μ κΈ°λ‘νκ³ μμΌλ©°, 90κ° μ΄μμ μΈμ΄λ₯Ό μ§μν©λλ€.
μ¬λ΄μμλ κΈ°μ‘΄ DotsOCR(Qwen3-VL-235B κΈ°λ°) νμ΄νλΌμΈμ Chandra OCR 2λ‘ κ΅μ²΄νμ¬, λμΌν FastAPI μΈν°νμ΄μ€(POST /process-file/)λ₯Ό μ μ§νλ©΄μ λ λμ μ νλμ ν¨μ¨μ μΈ λ¦¬μμ€ μ¬μ©μ μ€ννκ³ μμ΅λλ€.
1.1 κΈ°μ‘΄ μμ€ν λλΉ κ°μ μ
| νλͺ© | κΈ°μ‘΄ (DotsOCR) | νμ¬ (Chandra OCR 2) |
|---|---|---|
| μΆλ‘ λͺ¨λΈ | Qwen3-VL-235B (MoE, ~235B params) | Chandra OCR 2 (5B params) |
| λͺ¨λΈ ν¬κΈ° | ~130GB+ | ~10.6GB |
| GPU μꡬμ¬ν | λ©ν° GPU νμ | λ¨μΌ GPU (24GB+) |
| μΆλ ₯ νμ | λ μ΄μμ JSON (컀μ€ν ν둬ννΈ) | HTML β Markdown/JSON (λ€μ΄ν°λΈ) |
| olmOCR λ²€μΉλ§ν¬ | 64.6% (Qwen3-VL-8B κΈ°μ€) | 85.9% |
| λ€κ΅μ΄ μ§μ | 40+ μΈμ΄ | 90+ μΈμ΄ |
| νκ΅μ΄ μ νλ | 82.3% | 88.7% |
2. λͺ¨λΈ μκ°
2.1 Chandra OCR 2λ?
Chandra OCR 2λ 볡μ‘ν λ¬Έμ β μκΈμ¨, ν μ΄λΈ, μμ, μμ λ± β μ λμ μ νλλ‘ μΈμνμ¬ κ΅¬μ‘°νλ λμ§νΈ ν¬λ§·μΌλ‘ λ³ννλ OCR λͺ¨λΈμ λλ€. λ¨μν ν μ€νΈ μΆμΆμ΄ μλλΌ, λ¬Έμμ 곡κ°μ λ μ΄μμ(λ°μ΄λ© λ°μ€), μμ μ ν(ν μ€νΈ, ν μ΄λΈ, μμ λ±), μ½κΈ° μμλ₯Ό ν¨κ» 보쑴ν©λλ€.
2.2 λͺ¨λΈ μν€ν μ²
Chandra OCR 2λ Alibabaμ Qwen 3.5 λΉμ -μΈμ΄ λͺ¨λΈμ κΈ°λ°(base model)μΌλ‘ νμ¬, λ¬Έμ νΉν νμ€ν¬μ νμΈνλν λͺ¨λΈμ λλ€.
βββββββββββββββββββββββββββββββββββββββββββββββ
β Chandra OCR 2 (5B) β
β β
β βββββββββββββββ ββββββββββββββββββββββ β
β β Vision β β Language Model β β
β β Encoder βββββΆβ (Qwen 3.5 κΈ°λ°) β β
β β β β β β
β β μ΄λ―Έμ§ μ
λ ₯ β β HTML/Markdown μΆλ ₯ β β
β βββββββββββββββ ββββββββββββββββββββββ β
β β
β Fine-tuned on document-specific tasks β
βββββββββββββββββββββββββββββββββββββββββββββββ
μ£Όμ κ΅¬μ± μμ:
- Vision Encoder: λ¬Έμ μ΄λ―Έμ§λ₯Ό μκ° ν ν°μΌλ‘ μΈμ½λ©νλ λΉμ μΈμ½λ
- Language Model: Qwen 3.5 μν€ν μ² κΈ°λ° ν μ€νΈ μμ± λͺ¨λΈ (5B νλΌλ―Έν°)
- Projection Layer: λΉμ ν ν°μ μΈμ΄ λͺ¨λΈ μ λ ₯μΌλ‘ λ³ννλ ν¬μ¬ λ μ΄μ΄
2.3 νμ΅ λ°©μ
Chandra OCR 2μ νμ΅μ βκ°λ ₯ν λ²μ© κΈ°λ° λͺ¨λΈμμ μμνμ¬, νμ€ν¬ νΉν λ°μ΄ν°λ‘ μ§μ€ νμΈνλβνλ λ°©μμ λ°λ¦ λλ€.
κΈ°λ° λͺ¨λΈ (Base Model)
Qwen 3.5λ Alibabaμ Qwen νμ΄ κ°λ°ν λΉμ -μΈμ΄ λͺ¨λΈλ‘, μ΄λ―Έμ§μ ν μ€νΈλ₯Ό ν¨κ» μ΄ν΄νκ³ μΆλ‘ ν μ μλ λͺ¨λΈμ λλ€. μ΄ λͺ¨λΈμ΄ Chandra OCR 2μ βμΈμ λ°±λ³Έ(perception backbone)βμ μ 곡ν©λλ€.
νμΈνλ (Fine-tuning)
Datalabμ μ΄ κΈ°λ° λͺ¨λΈμ λ€μν μΉ΄ν κ³ λ¦¬μ λκ·λͺ¨ λ¬Έμ λ°μ΄ν°μ μΌλ‘ νμΈνλνμ΅λλ€:
- νμ λ Όλ¬Έ, κΈ°μ λ³΄κ³ μ
- μκΈμ¨ μμ λ° λ©λͺ¨
- 볡μ‘ν ν μ΄λΈ (λ³ν© μ , λ€μ€ ν€λ)
- μν μμ (μΈλΌμΈ/λΈλ‘)
- λ€κ΅μ΄ λ¬Έμ (90+ μΈμ΄)
- μ€μΊλ λ¬Έμ λ° ν©μ€
- λ€λ¨ λ μ΄μμ (μ λ¬Έ, κ΅κ³Όμ)
- μμ (체ν¬λ°μ€, λΌλμ€ λ²νΌ)
- μ°¨νΈ, λ€μ΄μ΄κ·Έλ¨
νμΈνλμ ν΅μ¬μ λ¨μ λ¬Έμ μΈμμ΄ μλλΌ λ μ΄μμ μΈμ(layout-aware) OCRμ μ΄μ μ λ§μΆ κ²μ λλ€. λͺ¨λΈμ΄ βλ¬Έμκ° μ΄λ»κ² μκ²Όλμ§βλ₯Ό λ΄μ¬ννμ¬, μ½ν μΈ μ μ‘΄μ¬λΏ μλλΌ μμΉμ 곡κ°μ κ΄κ³κΉμ§ μ΄ν΄ν©λλ€.
2.4 λͺ¨λΈ μ€ν
| νλͺ© | κ° |
|---|---|
| λͺ¨λΈλͺ | datalab-to/chandra-ocr-2 |
| νλΌλ―Έν° μ | 5B (BF16) |
| λͺ¨λΈ ν¬κΈ° | ~10.6GB |
| κΈ°λ° λͺ¨λΈ | Qwen 3.5 (Vision-Language Model) |
| μν€ν μ² | qwen3_5 (Transformers) |
| μ΅λ μΆλ ₯ ν ν° | 12,384 |
| μ κ·ν μ’ν | 0-1000 (bbox) |
| λΌμ΄μ μ€ | OpenRAIL-M (μ°κ΅¬/κ°μΈ/μ€ννΈμ 무λ£) |
2.5 λ²€μΉλ§ν¬ μ±λ₯
olmOCR Benchmark (μλ¬Έ λ¬Έμ)
| λͺ¨λΈ | ArXiv | Tables | Multi-column | Overall |
|---|---|---|---|---|
| Chandra 2 | 90.2 | 89.9 | 83.5 | 85.9 |
| dots.ocr 1.5 | 85.9 | 90.7 | 85.3 | 83.9 |
| Chandra 1 | 82.2 | 88.0 | 81.2 | 83.1 |
| olmOCR 2 | 83.0 | 84.9 | 83.7 | 82.4 |
| GPT-4o | 53.5 | 70.0 | 69.3 | 69.9 |
| Qwen 3 VL 8B | 70.2 | 45.6 | 62.1 | 64.6 |
λ€κ΅μ΄ λ²€μΉλ§ν¬ (μ£Όμ μΈμ΄)
| μΈμ΄ | Chandra 2 | Gemini 2.5 Flash | GPT-5 Mini |
|---|---|---|---|
| νκ΅μ΄ (ko) | 81.5% | 84.8% | 78.4% |
| μΌλ³Έμ΄ (ja) | 86.9% | 80.0% | 76.1% |
| μ€κ΅μ΄ (zh) | 88.7% | 70.0% | 70.4% |
| μμ΄ (en) | 94.8% | 88.3% | 93.8% |
| νκ· (43κ° μΈμ΄) | 77.8% | 67.6% | 60.5% |
2.6 μ§μ λ¬Έμ μ ν
| μ ν | μ€λͺ |
|---|---|
| μκΈμ¨ | ν기체, λ©λͺ¨, μμ¬ μ²λ°©μ λ± |
| ν μ΄λΈ | λ³ν© μ , λ€μ€ ν€λ, μ¬λ¬΄μ ν |
| μμ | μΈλΌμΈ/λΈλ‘ μμ β LaTeX λ³ν |
| μμ | 체ν¬λ°μ€, λΌλμ€ λ²νΌ, μ λ ₯ νλ |
| λ€λ¨ λ μ΄μμ | μ λ¬Έ, κ΅κ³Όμ, νμ λ Όλ¬Έ |
| μ°¨νΈ/λ€μ΄μ΄κ·Έλ¨ | λ°μ΄ν° μΆμΆ, Mermaid λ³ν |
| ννμ | SMILES νκΈ° λ³ν |
3. μμ€ν μν€ν μ²
3.1 μ 체 ꡬμ±λ
μΈλΆ ν΄λΌμ΄μΈνΈ
β
POST /process-file/
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DGX H200 μλ² (10.150.6.159) β
β β
β ββββββββββββββββββββββββ β
β β FastAPI μλΉμ€ β β νΈμ€νΈ μ€ν (uvicorn :10001) β
β β - νμΌ μ
λ‘λ/κ²μ¦ β β
β β - 볡νΈν μμ² ββββ 볡νΈν μλ² (10.150.6.47:9001) β
β β - OfficeβPDF λ³ν ββββ LibreOffice (libre1~4) β
β β - μ΄λ―Έμ§ μ μ²λ¦¬ β β
β β - Chandra OCR μμ² β β
β β - κ²°κ³Ό νμ±/λ³ν β β
β ββββββββββββ¬ββββββββββββ β
β β http://localhost:10002 β
β βΌ β
β ββββββββββββββββββββββββ β
β β vLLM μλ² (Docker) β β GPU #3 (H200 141GB) β
β β - chandra-ocr-2 λͺ¨λΈ β β
β β - OpenAI-compatible β β
β β - 컨ν
μ΄λ λ΄λΆ :8000 β β
β β - νΈμ€νΈ :10002 β β
β ββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
3.2 μ²λ¦¬ νμ΄νλΌμΈ
1. νμΌ μ
λ‘λ
ββ MIME νμ
κ²μ¦, ν¬κΈ° μ ν (10MB)
2. 볡νΈν
ββ 10.150.6.47:9001 볡νΈν μλ² νΈμΆ
ββ μ΄λ―Έμ§ νμΌμ 볡νΈν μλ΅
3. νμΌ λ³ν
ββ Office νμΌ (docx, pptx λ±) β LibreOffice 컨ν
μ΄λλ‘ PDF λ³ν
ββ PDF β PyMuPDFλ‘ νμ΄μ§λ³ μ΄λ―Έμ§ μΆμΆ
4. μ΄λ―Έμ§ μ μ²λ¦¬
ββ ν΄μλ 리μ¬μ΄μ§ (min: 100,352px / max: 1,003,520px)
5. Chandra OCR μΆλ‘
ββ vLLM μλ²μ OCR Layout ν둬ννΈ + μ΄λ―Έμ§ μ μ‘
ββ HTML νμ μλ΅ μμ (data-bbox, data-label ν¬ν¨)
6. μΆλ ₯ νμ±
ββ HTML β Markdown λ³ν (μμ, ν
μ΄λΈ 보쑴)
ββ HTML β JSON λ μ΄μμ λΈλ‘ μΆμΆ (bbox, category, text)
ββ HTML β λ μ΄μμ μκ°ν μ΄λ―Έμ§ μμ±
7. μλ΅ λ°ν
ββ full_markdown, filtered_markdown, page_markdowns,
page_processed_images, json, total_pages
3.3 κ΅¬μ± μμλ³ μμΈ
| κ΅¬μ± μμ | κΈ°μ μ€ν | ν¬νΈ | μν |
|---|---|---|---|
| FastAPI | Python 3.12, uvicorn, aiohttp | 10001 | API μλ², νμΌ μ²λ¦¬ μ€μΌμ€νΈλ μ΄μ |
| vLLM | vllm-openai:v0.17.0, Docker | 10002 (μΈλΆ) / 8000 (λ΄λΆ) | Chandra OCR 2 λͺ¨λΈ μλΉ |
| LibreOffice | libre1~4 Docker 컨ν μ΄λ | - | Office β PDF λ³ν |
| 볡νΈν μλ² | λ³λ μλ² (10.150.6.47) | 9001 | μνΈν λ¬Έμ 볡νΈν |
4. Chandra OCR 2μ μΆλ‘ λ°©μ
4.1 ν둬ννΈ κ΅¬μ‘°
Chandra OCR 2λ μ체 λ€μ΄ν°λΈ ν둬ννΈλ₯Ό μ¬μ©νμ¬ HTML νμμ λ μ΄μμ μΆλ ₯μ μμ±ν©λλ€. κΈ°μ‘΄ DotsOCRμ λ μ΄μμ JSON ν둬ννΈμλ κ·Όλ³Έμ μΌλ‘ λ€λ₯Έ λ°©μμ λλ€.
OCR Layout ν둬ννΈ (ν΅μ¬)
λͺ¨λΈμκ² μ΄λ―Έμ§λ₯Ό HTML λ μ΄μμ λΈλ‘μΌλ‘ OCRνλλ‘ μ§μν©λλ€. κ° λΈλ‘μ <div> νκ·Έμ data-bbox(λ°μ΄λ© λ°μ€, 0-1000 μ κ·ν)μ data-label(λ μ΄λΈ)μ ν¬ν¨ν©λλ€.
μ§μ λ μ΄λΈ λͺ©λ‘:
| λ μ΄λΈ | μ€λͺ |
|---|---|
| Text | μΌλ° ν μ€νΈ λ¨λ½ |
| Section-Header | μΉμ /μ±ν° μ λͺ© |
| Table | ν μ΄λΈ (HTML ꡬ쑰 보쑴) |
| Image / Figure | μ΄λ―Έμ§, λν, μ°¨νΈ |
| Caption | μ΄λ―Έμ§/ν μ΄λΈ μΊ‘μ |
| Footnote | κ°μ£Ό |
| Equation-Block | μμ λΈλ‘ (LaTeX) |
| List-Group | λͺ©λ‘ (μμ/λΉμμ) |
| Form | μμ (체ν¬λ°μ€, λΌλμ€ λ²νΌ) |
| Code-Block | μ½λ λΈλ‘ |
| Page-Header / Page-Footer | 머리κΈ/λ°λ₯κΈ |
| Table-Of-Contents | λͺ©μ°¨ |
| Complex-Block | λ³΅ν© λ μ΄μμ |
| Chemical-Block | ννμ (SMILES) |
| Diagram | λ€μ΄μ΄κ·Έλ¨ (Mermaid) |
| Bibliography | μ°Έκ³ λ¬Έν |
4.2 λͺ¨λΈ μΆλ ₯ νμ
Chandra OCR 2λ HTMLμ μΆλ ₯νλ©°, κ° λ μ΄μμ λΈλ‘μ΄ <div> νκ·Έλ‘ κ΅¬λΆλ©λλ€:
<div data-bbox="64 66 850 105" data-label="Page-Header">
<p>λ°λ체 μμ₯ λΆμ λ³΄κ³ μ</p>
</div>
<div data-bbox="64 120 850 180" data-label="Section-Header">
<h2>HBM μκΈ μ λ§</h2>
</div>
<div data-bbox="64 200 850 500" data-label="Text">
<p>κΈλ‘λ² λ°λ체 μμ₯μ 2024λ
κΈ°μ€...</p>
</div>
<div data-bbox="64 520 850 900" data-label="Table">
<table><thead>...</thead><tbody>...</tbody></table>
</div>
4.3 μΆλ ₯ νμ± νμ΄νλΌμΈ
λͺ¨λΈμ HTML μΆλ ₯μ μΈ κ°μ§ ννλ‘ λ³νλ©λλ€:
Chandra HTML μΆλ ₯
β
βββ parse_markdown() β Markdown ν
μ€νΈ
β - μμ: $...$ / $$...$$
β - ν
μ΄λΈ: HTML μ μ§
β - μ΄λ―Έμ§: μ€λͺ
ν
μ€νΈ
β
βββ parse_chunks() β JSON λ°°μ΄
β - bbox: μ€μ μ΄λ―Έμ§ μ’ν (0-1000 β ν½μ
)
β - category: λ μ΄λΈ
β - text: HTML λ΄μ©
β
βββ draw_layout() β μκ°ν μ΄λ―Έμ§
- λ μ΄λΈλ³ μμ ꡬλΆ
- λ°μ΄λ© λ°μ€ μ€λ²λ μ΄
5. λ°°ν¬ κ΅¬μ±
5.1 μλ² νκ²½
| νλͺ© | κ° |
|---|---|
| μλ² | DGX H200 |
| IP | 10.150.6.159 |
| GPU | NVIDIA H200 Γ 8 (141GB VRAM κ°) |
| Chandra ν λΉ GPU | #3 |
| OS | Ubuntu |
| Docker | 24.0+ |
| Docker Compose | v2 |
5.2 λͺ¨λΈ κ°μ€μΉ
κ²½λ‘: ~/projects/models/chandra-ocr-2/
νμΌ:
βββ config.json
βββ generation_config.json
βββ model.safetensors # ~10.6GB
βββ preprocessor_config.json
βββ processor_config.json
βββ tokenizer.json
βββ tokenizer_config.json
βββ chat_template.jinja
βββ video_preprocessor_config.json
5.3 Docker Compose ꡬμ±
vLLM μλ² (GPU)
vllm-server:
image: vllm/vllm-openai:v0.17.0
container_name: chandra-vllm
environment:
- NVIDIA_VISIBLE_DEVICES=3
- CUDA_VISIBLE_DEVICES=3
- HF_HUB_OFFLINE=1
- TRANSFORMERS_OFFLINE=1
command: >
--model /models/chandra-ocr-2
--served-model-name chandra
--dtype bfloat16
--max-model-len 32768
--max-num-seqs 64
--max-num-batched-tokens 8192
--enable-prefix-caching
--gpu-memory-utilization 0.90
--trust-remote-code
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ["3"]
capabilities: [gpu]
μ£Όμ νλΌλ―Έν° μ€λͺ :
| νλΌλ―Έν° | κ° | μ€λͺ |
|---|---|---|
max-model-len |
32768 | μ λ ₯+μΆλ ₯ ν©μ° μ΅λ ν ν° μ |
max-num-seqs |
64 | λμ μ²λ¦¬ κ°λ₯ν μνμ€ μ |
max-num-batched-tokens |
8192 | λ°°μΉλΉ μ΅λ ν ν° μ |
gpu-memory-utilization |
0.90 | GPU λ©λͺ¨λ¦¬ μ¬μ©λ₯ (90%) |
enable-prefix-caching |
true | OCR ν둬ννΈκ° λμΌνλ―λ‘ μΊμ±μΌλ‘ μ±λ₯ ν₯μ |
5.4 FastAPI μλΉμ€
νμ¬ νΈμ€νΈμ κ°μνκ²½μμ μ§μ μ€ν μ€:
nohup bash -c 'uvicorn main:app --host 0.0.0.0 --port 10001 \
--workers 20 --log-level info | tee -a uvicorn.log' > nohup.out 2>&1 &
컨ν
μ΄λν λ²μ λ μ€λΉλμ΄ μμΌλ©°, chandra-fastapi:latest μ΄λ―Έμ§λ‘ μ ν κ°λ₯ν©λλ€.
6. API μ¬μ© κ°μ΄λ
6.1 μλν¬μΈνΈ
POST http://10.150.6.159:10001/process-file/
6.2 μμ² νλΌλ―Έν°
| νλΌλ―Έν° | νμ | κΈ°λ³Έκ° | μ€λͺ |
|---|---|---|---|
file |
File | (νμ) | μ λ‘λν λ¬Έμ νμΌ |
highqual |
bool | false | κ³ ν΄μλ μ²λ¦¬ λͺ¨λ |
6.3 μ§μ νμΌ νμ
| κ΅¬λΆ | νμ₯μ |
|---|---|
| Word | .doc, .docx |
| PowerPoint | .ppt, .pptx |
| Excel | .xls, .xlsx |
| μ΄λ―Έμ§ | .jpg, .jpeg, .png, .bmp |
6.4 νΈμΆ μμ
Python:
import requests
import json
API_URL = "http://10.150.6.159:10001/process-file/"
with open("document.pdf", "rb") as f:
response = requests.post(API_URL, files={"file": f})
result = response.json()
# μ 체 λ§ν¬λ€μ΄
print(result["full_markdown"])
# νμ΄μ§λ³ λ§ν¬λ€μ΄
for i, page_md in enumerate(result["page_markdowns"]):
print(f"=== Page {i+1} ===")
print(page_md)
# λ μ΄μμ JSON
print(json.dumps(result["json"], indent=2, ensure_ascii=False))
curl:
curl -X POST http://10.150.6.159:10001/process-file/ \
-F "file=@document.pdf"
κ³ ν΄μλ λͺ¨λ:
curl -X POST "http://10.150.6.159:10001/process-file/?highqual=true" \
-F "file=@document.pdf"
6.5 μλ΅ νλ
| νλ | νμ | μ€λͺ |
|---|---|---|
job_id |
string | μμ²λ³ κ³ μ μλ³μ (UUID) |
filename |
string | μ λ‘λλ μλ³Έ νμΌλͺ |
status |
string | μ²λ¦¬ μν ("processed") |
total_pages |
int | μ΄ νμ΄μ§ μ |
full_markdown |
string | Base64 μ΄λ―Έμ§ ν¬ν¨ μ 체 λ§ν¬λ€μ΄. λ¬Έμ μλ³Έ μ¬νμ© |
filtered_markdown |
string | μ΄λ―Έμ§ μ μΈ ν μ€νΈ μ μ© λ§ν¬λ€μ΄. RAG/LLM μ λ ₯μ μ ν© |
page_markdowns |
list[string] | νμ΄μ§λ³ λΆλ¦¬λ λ§ν¬λ€μ΄ λ°°μ΄ |
page_processed_images |
list[string] | λ μ΄μμ μκ°ν μ΄λ―Έμ§ (Base64 PNG). OCR νμ§ κ²μ¦μ© |
json |
list[dict] / dict | ꡬ쑰νλ λ μ΄μμ λ°μ΄ν° (bbox + category + text) |
JSON νλ μμΈ:
{
"bbox": [64, 66, 850, 105],
"category": "Section-Header",
"text": "<h2>HBM μκΈ μ λ§</h2>"
}
bbox: λ°μ΄λ© λ°μ€[x1, y1, x2, y2](ν½μ λ¨μ)category: λ μ΄μμ λΈλ‘ μ νtext: ν΄λΉ λΈλ‘μ HTML λ΄μ©
6.6 μλ¬ μλ΅
| HTTP μ½λ | μν© |
|---|---|
| 400 | μ§μνμ§ μλ νμΌ νμ |
| 413 | νμΌ ν¬κΈ° μ΄κ³Ό (10MB μ ν) |
| 500 | λ΄λΆ μλ² μ€λ₯ |
7. μ΄μ κ°μ΄λ
7.1 μλΉμ€ μν νμΈ
# API μλ² μν
curl http://10.150.6.159:10001/
# vLLM μλ² μν
curl http://localhost:10002/health
# λͺ¨λΈ μ 보
curl http://localhost:10002/v1/models
# Docker μν
docker ps | grep chandra
# GPU μ¬μ©λ
nvidia-smi
7.2 λ‘κ·Έ νμΈ
# vLLM λ‘κ·Έ
docker compose logs -f vllm-server
docker compose logs --tail 100 vllm-server
# FastAPI λ‘κ·Έ (νΈμ€νΈ μ€ν μ)
tail -f uvicorn.log
# FastAPI λ‘κ·Έ (컨ν
μ΄λ μ€ν μ)
docker compose logs -f fastapi
7.3 μλΉμ€ μ¬μμ
# vLLM μλ² μ¬μμ
docker compose down vllm-server
docker compose up -d vllm-server
# FastAPI μ¬μμ (νΈμ€νΈ μ€ν μ)
kill $(lsof -t -i :10001)
nohup bash -c 'uvicorn main:app --host 0.0.0.0 --port 10001 \
--workers 20 --log-level info | tee -a uvicorn.log' > nohup.out 2>&1 &
7.4 νΈλ¬λΈμν
| μ¦μ | μμΈ | ν΄κ²° |
|---|---|---|
context length is only N |
max-model-len λΆμ‘± |
docker-compose.ymlμμ κ° μ¦κ° ν μ¬κΈ°λ |
'category' KeyError |
DotsOCR ν둬ννΈ μ¬μ© μ€ | Chandra λ€μ΄ν°λΈ ν둬ννΈλ‘ κ΅μ²΄ νμΈ |
Connection refused (10002) |
vLLM λͺ¨λΈ λ‘λ© μ€ | λ‘κ·Έ νμΈ, λ‘λ© μλ£ λκΈ° (1~3λΆ) |
| GPU OOM | λμ μμ² κ³Όλ€ | max-num-seqs, gpu-memory-utilization μ‘°μ |
| νκΈ κΉ¨μ§ | μ΄λ―Έμ§ ν΄μλ λΆμ‘± | highqual=true λλ max_pixels μ¦κ° |
| Office λ³ν μ€ν¨ | LibreOffice 컨ν μ΄λ λ¬Έμ | docker psλ‘ libre1~4 μν νμΈ |
8. νμλ§ λ°°ν¬ μ μ°¨
μ¬λ΄ νμλ§ νκ²½μμμ λ°°ν¬λ μΈλΆ PCμμ λΉλ ν μ μ‘νλ λ°©μμΌλ‘ μνν©λλ€.
8.1 μ μ‘ νμΌ λͺ©λ‘
| νμΌ | μ©λ | μ€λͺ |
|---|---|---|
vllm-openai-v0.17.0.tar.gz |
~4-5GB | vLLM μλ² Docker μ΄λ―Έμ§ |
chandra-fastapi.tar.gz |
~1GB | FastAPI μλΉμ€ Docker μ΄λ―Έμ§ (μ ν) |
chandra-ocr-2-model/ |
~10.6GB | λͺ¨λΈ κ°μ€μΉ |
docker-compose.yml |
- | μλΉμ€ κ΅¬μ± νμΌ |
| μμ€ μ½λ (*.py) | - | FastAPI μ ν리μΌμ΄μ μ½λ |
8.2 λ°°ν¬ μμ
[μΈλΆ PC (μΈν°λ· κ°λ₯)]
1. λͺ¨λΈ κ°μ€μΉ λ€μ΄λ‘λ (huggingface_hub)
2. Docker μ΄λ―Έμ§ Pull/Build
3. docker save | gzip β tar.gz
4. USB/μΈμ₯HDDλ‘ μ μ‘
[νμλ§ μλ²]
5. docker load < *.tar.gz
6. λͺ¨λΈ νμΌ λ°°μΉ
7. docker-compose.yml λ°°μΉ
8. docker compose up -d
9. λμ νμΈ
8.3 νμλ§ νμ νκ²½λ³μ
HF_HUB_OFFLINE=1 # HuggingFace Hub μΈλΆ μ μ μ°¨λ¨
TRANSFORMERS_OFFLINE=1 # Transformers μΈλΆ μ μ μ°¨λ¨
9. μμ€ μ½λ ꡬ쑰
~/projects/chandra/scripts/
βββ main.py # FastAPI μ± (μλν¬μΈνΈ μ μ)
βββ config_chandra.py # μ€μ (vLLM μ£Όμ, ν둬ννΈ, νμ© νμ
λ±)
βββ tool_chandra.py # λ¬Έμ μ²λ¦¬ ν΅μ¬ λ‘μ§ (ν둬ννΈ, νμ±, μκ°ν)
βββ utils_chandra.py # μ νΈλ¦¬ν° (μ΄λ―Έμ§ μ²λ¦¬, PDF λ³ν, LibreOffice μ°λ)
βββ inference_chandra.py # vLLM λΉλκΈ° μΆλ‘ λͺ¨λ
βββ docker-compose.yml # Docker μλΉμ€ ꡬμ±
βββ Dockerfile # FastAPI 컨ν
μ΄λ λΉλμ©
βββ requirements.txt # Python μμ‘΄μ±
| νμΌ | μν |
|---|---|
main.py |
FastAPI μ±. POST /process-file/ μλν¬μΈνΈ μ μ. κΈ°μ‘΄ DotsOCRκ³Ό λμΌν μΈν°νμ΄μ€ μ μ§ |
config_chandra.py |
vLLM μλ² μ£Όμ, λͺ¨λΈλͺ , ν ν° μ ν, μ΄λ―Έμ§ 리μ¬μ΄μ§ μ€μ , 볡νΈν μλ² μ£Όμ λ± |
tool_chandra.py |
Chandra λ€μ΄ν°λΈ ν둬ννΈ μ μ, HTMLβMarkdown/JSON νμ±, λ μ΄μμ μκ°ν, 볡νΈν, μ¬μλ λ‘μ§ |
utils_chandra.py |
μ΄λ―Έμ§ 리μ¬μ΄μ§, PDFβμ΄λ―Έμ§ λ³ν, LibreOffice μ°λ, λ§ν¬λ€μ΄ λ¬Έλ² μ μ |
inference_chandra.py |
vLLM OpenAI-compatible API λΉλκΈ° νΈμΆ |
10. μ°Έκ³ μλ£
| νλͺ© | λ§ν¬ |
|---|---|
| Chandra GitHub | https://github.com/datalab-to/chandra |
| Chandra OCR 2 (HuggingFace) | https://huggingface.co/datalab-to/chandra-ocr-2 |
| vLLM 곡μ λ¬Έμ | https://docs.vllm.ai |
| Qwen 3.5 λͺ¨λΈ | https://github.com/QwenLM/Qwen3 |
| olmOCR Benchmark | https://github.com/allenai/olmocr |
| Datalab Playground | https://www.datalab.to/playground |