| # 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>` ํ๊ทธ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค: |
|
|
| ```html |
| <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)** |
|
|
| ```yaml |
| 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 ์๋น์ค |
|
|
| ํ์ฌ ํธ์คํธ์ ๊ฐ์ํ๊ฒฝ์์ ์ง์ ์คํ ์ค: |
|
|
| ```bash |
| 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 ์ง์ ํ์ผ ํ์ |
|
|
| |๊ตฌ๋ถ |ํ์ฅ์ | |
| |----------|-----------------------| |
| |PDF |.pdf | |
| |Word |.doc, .docx | |
| |PowerPoint|.ppt, .pptx | |
| |Excel |.xls, .xlsx | |
| |์ด๋ฏธ์ง |.jpg, .jpeg, .png, .bmp| |
|
|
| ### 6.4 ํธ์ถ ์์ |
|
|
| **Python:** |
|
|
| ```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:** |
|
|
| ```bash |
| curl -X POST http://10.150.6.159:10001/process-file/ \ |
| -F "file=@document.pdf" |
| ``` |
|
|
| **๊ณ ํด์๋ ๋ชจ๋:** |
|
|
| ```bash |
| 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 ํ๋ ์์ธ:** |
|
|
| ```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 ์๋น์ค ์ํ ํ์ธ |
|
|
| ```bash |
| # 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 ๋ก๊ทธ ํ์ธ |
|
|
| ```bash |
| # 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 ์๋น์ค ์ฌ์์ |
|
|
| ```bash |
| # 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 ํ์๋ง ํ์ ํ๊ฒฝ๋ณ์ |
| |
| ```bash |
| 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 | |