Unsloth AI, 자사의 Unsloth 프레임워크를 사용하여 Google Colab에서 DeepSeek-OCR 실행 및 파인튜닝하는 문서 공개

DeepSeek-OCR 파인튜닝 가이드 소개

DeepSeek-OCR 파인튜닝 가이드 문서는 30억 파라미터 규모의 비전 기반 OCR 모델인 DeepSeek-OCR을 로컬 환경에서 실행하고, 자신만의 데이터셋으로 효율적인 파인튜닝을 수행하는 방법에 대해 다룹니다. 특히 unsloth 프레임워크를 활용하여 더 적은 자원으로 더 빠르게 학습할 수 있도록 구성되어 있으며, 파인튜닝 이후에는 특정 언어, 손글씨, 도메인 특화 문서 등 다양한 상황에서 성능을 극대화할 수 있습니다.

예를 들어, 본 문서에서 다룰 페르시아어 데이터셋 기반의 실험에서는 60 스텝만으로 CER을 57% 이상 줄이는 성능 향상을 달성했습니다. 해당 방식은 사용자 데이터에 맞게 손쉽게 확장 가능하며, OCR 프로젝트를 실제 프로덕션에 적용하고자 하는 개발자들에게 큰 도움이 될 것으로 보여 소개합니다. :smiley:

unsloth 프레임워크 소개

Unsloth AI가 개발 및 공개한 unsloth 프레임워크는 Hugging Face 기반의 LLM을 대상으로 학습 속도와 메모리 사용량을 크게 개선할 수 있도록 고안된 경량화/최적화 프레임워크입니다. unsloth 프레임워크의 주요 기능 및 장점은 다음과 같습니다:

  • LoRA, QLoRA, 4bit/8bit 양자화 지원
  • 2배 빠른 학습 속도
  • 최대 50% 적은 VRAM 사용
  • 긴 컨텍스트 입력(최대 128k tokens) 처리 지원
  • 멀티모달 모델 지원 (OCR, 이미지 설명, 비전-텍스트 통합 등)

특히, DeepSeek-OCR과 같은 고용량 비전 모델을 학습하거나 추론할 때 유용하며, 최신 transformers 버전에서 호환되지 않는 기능도 직접 구현하여 안정적인 운영이 가능합니다.

DeepSeek-OCR 모델 소개

DeepSeek-OCR은 DeepSeek AI가 공개한, 긴 문서 처리의 문맥 길이 한계를 극복하기 위해 개발된 시각-언어 모델(VLM)입니다. DeepSeek-OCR 모델은 기존 텍스트 기반 LLM이 가진 토큰 비용 문제를 혁신적인 방식으로 해결합니다. 핵심 아이디어는 긴 문서를 직접 텍스트 토큰으로 넣는 대신 이미지로 변환하여 시각적으로 인식하고, 이를 다시 텍스트로 복원하는 구조를 채택한 것입니다. 이 접근 방식은 LLM이 직접 읽기엔 너무 길거나 복잡한 문서를 효과적으로 요약하고 압축하는 데 탁월한 효율성을 발휘합니다.

즉, DeepSeek-OCR의 가장 독창적인 점은 문맥 압축을 이미지 기반으로 해결한다는 접근입니다. 이는 단순 요약이나 요약 기반 스킵이 아니라, 오래된 정보를 이미지로 렌더링하고 이를 다시 필요할 때 불러오는 방식으로, LLM의 장기 기억 처리에도 새로운 해석을 가능하게 합니다. 연구진은 이를 일종의 인공적 망각(Artificial Forgetting) 으로 설명하며, 인간이 오래된 기억은 흐리게 간직하는 것과 유사하다고 설명합니다.

주요 아키텍처 구성: DeepEncoder + MoE Decoder

  • DeepEncoder (시각 인코더): DeepSeek-OCR 모델의 전반부는 DeepEncoder라 불리는 시각 인코더로, 이미지를 고도로 압축된 비전 토큰 시퀀스로 변환합니다. 내부적으로는 다음과 같은 세 가지 처리 단계로 구성됩니다:

    • 세밀한 시각 정보 추출: Meta의 SAM(Segment Anything Model)에서 영감을 받은 비전 트랜스포머를 사용해 이미지의 디테일을 세분화합니다.
    • 비전 토큰 압축: 기존의 4096개 비전 토큰을 약 1/16 수준인 256개로 다운샘플링합니다.
    • 시각적 의미 통합: OpenAI의 CLIP 비전 트랜스포머를 활용해 압축된 정보를 문맥적으로 통합합니다.

    이러한 구조를 통해 DeepEncoder는 고해상도 이미지를 매우 적은 토큰 수로 표현할 수 있으며, GPU 메모리 부담을 크게 줄입니다.

  • MoE Decoder (언어 디코더): DeepSeek-OCR의 후반부는 DeepSeek-3B-MoE라는 약 30억 파라미터 규모의 Mixture-of-Experts 구조의 언어 디코더입니다. MoE는 입력에 따라 소수의 전문가 네트워크만 활성화되므로 효율성이 뛰어나며, 비전 토큰으로 압축된 정보를 다시 자연어 텍스트로 재구성합니다. 이 디코더는 GPT 스타일의 언어 모델로 동작하므로, 프롬프트 추가 및 다양한 언어 생성 태스크에도 유연하게 대응 가능합니다.

DeepSeek-OCR 모델의 성능 특성 및 벤치마크 결과

  • 시각 압축 기반 효율성: DeepSeek-OCR은 텍스트 대비 10배 이상의 압축률에서도 높은 정확도를 유지합니다. Fox 벤치마크에 따르면, 텍스트 토큰 수 대비 비전 토큰 수 비율이 10:1일 때 96% 이상의 OCR 정확도를 기록하며, 심지어 20:1까지 압축했을 때도 60% 수준의 유의미한 복원력을 보였습니다.

  • 문서 이해 능력: OmniDocBench 기준으로, DeepSeek-OCR은 기존 SOTA 모델인 GOT-OCR 2.0보다 더 적은 토큰 수로 더 높은 정확도를 달성했습니다. 특히 MinerU 2.0처럼 수천 개의 토큰이 필요한 구조와 비교하면, DeepSeek-OCR은 800개 미만의 토큰으로도 더 나은 결과를 생성해냅니다. 이는 추론 속도, 비용, 메모리 효율성 면에서 실질적인 우위를 보여줍니다.

  • 범용 인식 성능: 텍스트 외에도 표, 그래프, 수식, 로고 등 다양한 시각 요소를 정밀하게 인식할 수 있으며, PDF 논문에서 그래프의 숫자나 화학식, 금융 리포트의 도장이나 차트 텍스트까지 구조적으로 추출할 수 있습니다. 단순 OCR을 넘어서 복합 문서 이해(Multi-modal Document Understanding) 작업에도 적합합니다.


DeepSeek-OCR 모델에 대한 소개는 다음 링크를 참고해주세요:

DeepSeek-OCR 실행 방법

문서에서는 vLLMUnsloth 프레임워크를 사용하여 실행하는 방법을 소개하고 있습니다.

먼저, DeepSeek AI가 제안하는 최적의 모델 실행 설정은 다음과 같습니다:

  • Temperature = 0.0

  • max_tokens = 8192

  • ngram_size = 30

  • window_size = 90

vLLM 환경에서 DeepSeek-OCR 모델 실행

최신 vLLM을 설치 또는 업그레이드합니다. 만약 v0.11.1 이전 버전이 설치된다면, 가장 최근 빌드한 vLLM Nightly 버전을 설치하여 사용합니다:

# 가상환경 생성 및 실행
uv venv
source .venv/bin/activate

# vLLM 설치 또는 업그레이드 - 버전이 v0.11.1 이상인지 확인
uv pip install -U vllm
# v0.11.1 이전 버전이 설치된다면 Nightly 버전을 직접 설치
uv pip install -U vllm --pre --extra-index-url https://wheels.vllm.ai/nightly

이후, 다음과 같은 방식으로 코드 내에서 호출하여 사용할 수 있습니다:

from vllm import LLM, SamplingParams
from vllm.model_executor.models.deepseek_ocr import NGramPerReqLogitsProcessor
from PIL import Image

llm = LLM(
    model="unsloth/DeepSeek-OCR",
    enable_prefix_caching=False,
    mm_processor_cache_gb=0,
    logits_processors=[NGramPerReqLogitsProcessor]
)

image = Image.open("your_image.png").convert("RGB")
prompt = "<image>\nFree OCR."
inputs = [{"prompt": prompt, "multi_modal_data": {"image": image}}]
sampling = SamplingParams(max_tokens=8192, temperature=0.0)

outputs = llm.generate(inputs, sampling)
print(outputs[0].outputs.text)

Unsloth 환경에서 실행

vLLM 외에도 Unsloth 환경에서 실행할 수 있습니다. vLLM과 마찬가지로 최신의 unsloth 버전을 설치 또는 업데이트합니다:

# unsloth를 새로 설치한다면:
pip install --upgrade unsloth

# 이미 사용 중인 unsloth를 업데이트 한다면:
pip install --upgrade --force-reinstall --no-deps --no-cache-dir unsloth unsloth_zoo

이후, 다음 코드과 같은 예시 코드로 DeepSeek-OCR 모델을 사용할 수 있습니다:

from unsloth import FastVisionModel
from transformers import AutoModel
from huggingface_hub import snapshot_download
import os

os.environ["UNSLOTH_WARN_UNINITIALIZED"] = '0'
snapshot_download("unsloth/DeepSeek-OCR", local_dir = "deepseek_ocr")

model, tokenizer = FastVisionModel.from_pretrained(
    "./deepseek_ocr",
    load_in_4bit = False,
    auto_model = AutoModel,
    trust_remote_code = True,
    unsloth_force_compile = True,
    use_gradient_checkpointing = "unsloth"
)

result = model.infer(
    tokenizer,
    prompt="<image>\nFree OCR.",
    image_file="your_image.jpg",
    output_path="your/output",
    base_size=1024,
    image_size=640,
    crop_mode=True,
    save_results=True
)

DeepSeek-OCR 파인튜닝 가이드

데이터셋 준비 및 예시 Colab 노트북 소개

먼저, DeepSeek-OCR 모델의 파인튜닝을 위한 데이터셋을 준비합니다. 이 때, 데이터셋은 image_file과 해당 이미지 파일의 정답 텍스트인 text_label로 구성되어야 합니다. 데이터셋이 준비되었다면 다음과 같은 csv 형태로 데이터셋을 정리합니다:

image_file,text_label
invoice_01.png,"Total amount: $4,240"
handwritten_note.jpg,"회의는 금요일 오후 3시에 시작합니다."

이제 다음과 같은 단계를 거쳐 DeepSeek-OCR 모델을 파인튜닝할 수 있습니다:

  1. 파인튜닝을 위한 학습용 데이터 불러오기
  2. model.train() 메서드를 사용하여 파인튜닝
  3. 주요 하이퍼파라미터 조정:
    • batch_size: 8~16
    • learning_rate: 2e-5
    • max_steps: 60~300

전체 코드는 Unsloth가 제공하는 예시 Google Colab 노트북 파일을 통해 확인할 수 있습니다:

앞에서 설명한 것과 같이, 위 파인튜닝 예시 노트북은 20만개 규모의 페르시아어 데이터셋을 사용하여 DeepSeek-OCR 모델을 파인튜닝합니다. 예시 노트북에는 상세한 주석 및 참고 링크 등이 포함되어 있으며, 가장 중요한 model.train() 부분의 예시를 다음과 같습니다:

model.train(
    tokenizer=tokenizer,
    dataset=train_dataset,  # 이미지+텍스트 쌍으로 구성
    eval_dataset=val_dataset,
    output_dir="./finetuned_deepseek",
    epochs=1,
    per_device_train_batch_size=8,
    gradient_accumulation_steps=2
)

파인튜닝의 성능 평가

파인튜닝의 결과를 Character Error Rate (CER) 기준으로 평가하며, 20만건의 페르시아어 데이터셋으로 파인튜닝한 성능 변화는 다음과 같습니다:

  • DeepSeek-OCR 기본 모델의 성능: 149.07% CER
  • 20만건의 데이터셋으로 파인튜닝 후: 60.43% CER
  • 파인튜닝 전/후의 성능 향상 정도 : 약 89% CER 감소

즉, 20만건의 데이터셋을 60스텝만 학습한 것만으로도 모델이 57% 더 정확한 예측을 하게 되었으며, 이는 극소량의 학습만으로도 성능 향상이 가능함을 보여줍니다.

:scroll: Unsloth 프레임워크를 활용한 DeepSeek-OCR 실행 및 파인튜닝 가이드 문서

:notebook: Unsloth 프레임워크를 활용한 DeepSeek-OCR 파인튜닝 예시 Colab 노트북

DeepSeek-OCR 모델 더 알아보기

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요