Bỏ qua đến nội dung chính
AI Local
Cửa sổ code nối với hai ảnh hóa đơn, một bản scan và một bản chụp điện thoại, chữ được làm mờ

OCR tiếng Việt chạy local: DeepSeek-OCR, Vintern đo thật

AIDev TeamTham vấn chuyên môn: Nguyễn Việt Chung

Đăng 14 phút đọc1 lượt xem

Mục lục · 22

DeepSeek-OCR 2 đọc chứng từ tiếng Việt sai 2,5% ký tự trên ảnh scan và 4,9% trên ảnh chụp điện thoại, kém bản đầu một chút. Bài dành cho ai cần đọc chữ từ ảnh hóa đơn, công văn, bảng kê mà không gửi file ra ngoài: mình đo 6 model OCR trên RTX 3090 với 12 ảnh tự tạo, DeepSeek-OCR sai 3,1%, Tesseract 31%, mỗi model AI đọc một ảnh mất khoảng 1 giây.

DeepSeek-OCR 2 (tên chính thức viết DeepSeek-OCR-2) đọc chứng từ tiếng Việt khá tốt nhưng chưa bằng bản đầu: trong phép đo của mình, nó sai 2,5% ký tự trên ảnh scan và 4,9% trên ảnh chụp điện thoại, còn DeepSeek-OCR sai 1,7% và 3,1%. OCR (nhận dạng chữ trong ảnh) là việc biến ảnh chụp hay bản scan thành chữ máy tính sửa được. Với tiếng Việt, cái khó nằm ở dấu: chỉ cần đọc "Mây" thành "Mãy" là sai một chữ. Năm 2026 đã có DeepSeek-OCR 2 và vài model OCR mã nguồn mở nhỏ, chạy được trên một card đồ họa bình thường. Ngày 26/10/2026, mình thuê một RTX 3090 trên AIDev Cloud và cho 6 model đọc cùng 12 ảnh chứng từ tiếng Việt để xem model nào đọc đúng nhất trên ảnh scan và ảnh chụp điện thoại.

Những gì mình đo được:

  • DeepSeek-OCR (bản đầu) đọc đúng nhất: sai 1,7% ký tự trên ảnh scan, 3,1% trên ảnh chụp điện thoại, lấy đúng 29 trên 31 thông tin cần tìm từ ảnh chụp.

  • Bản DeepSeek-OCR-2 mới hơn lại sai nhiều hơn một chút trên bộ ảnh này: 2,5% và 4,9%.

  • Vintern-1B, model nhỏ huấn luyện cho tiếng Việt, đọc ảnh scan gần bằng DeepSeek (3,2%) nhưng gặp ảnh chụp bảng lương thì bỏ hết các dòng trong bảng.

  • Tesseract, công cụ OCR cổ điển chạy CPU, sai 31% trên ảnh chụp vì đọc bảng thành từng mảnh rời.

  • Mỗi model AI mất khoảng 1 giây cho một ảnh trên RTX 3090. DeepSeek-OCR cần khoảng 8,5GB VRAM (bộ nhớ của card đồ họa).

OCR tiếng Việt chạy local cần những gì?

OCR bây giờ có hai kiểu. Kiểu cũ như Tesseract (giấy phép Apache-2.0, hơn 77.000 sao GitHub) tìm từng dòng chữ rồi nhận từng ký tự, chạy nhanh trên CPU, cần gói ngôn ngữ vie để đọc tiếng Việt. Kiểu mới dùng VLM (model thị giác ngôn ngữ, đọc được cả ảnh lẫn chữ): bạn đưa ảnh vào, model sinh ra đoạn chữ giống cách một LLM (mô hình ngôn ngữ lớn) trả lời câu hỏi. Kiểu mới hiểu bố cục tốt hơn, trả được cả bảng dạng markdown (chữ thường kèm ký hiệu kẻ bảng, tiêu đề), nhưng cần GPU và có thể viết sai theo kiểu "đoán chữ".

Chạy local nghĩa là ảnh không rời khỏi máy của bạn. Với hóa đơn, hợp đồng hay bảng lương, đó thường là lý do chính để tự chạy thay vì gửi lên dịch vụ ngoài.

Mình đo 5 model AI và Tesseract làm mốc. Cột trọng số là dung lượng model chiếm trong VRAM, đọc từ log của vLLM (thư viện chạy model trên GPU, cách cài ở phần sau):

Model

Nhà phát triển

Giấy phép

Trọng số trong VRAM

DeepSeek-OCR

DeepSeek

MIT

6,23 GiB

DeepSeek-OCR-2

DeepSeek

Apache-2.0

6,33 GiB

Vintern-1B-v3_5

5CD-AI

MIT

1,76 GiB

PaddleOCR-VL-1.5

Baidu

Apache-2.0

1,82 GiB

GLM-OCR

Z.ai

MIT

2,21 GiB

Tesseract 5.3.4

cộng đồng

Apache-2.0

chạy CPU

Cả 6 đều cho dùng thương mại. Vintern là model của nhóm Việt Nam, dựng trên InternVL2.5-1B và tinh chỉnh bằng dữ liệu tiếng Việt, theo bài báo Vintern-1B.

DeepSeek-OCR 2 khác bản đầu thế nào?

DeepSeek-OCR ra tháng 10/2025. Ý tưởng chính là nén cả trang tài liệu thành ít token hình ảnh (mẩu dữ liệu model xử lý) rồi để phần sinh chữ dựng lại nội dung từ những token đó. DeepSeek-OCR-2 ra ngày 27/01/2026 kèm bài báo DeepSeek-OCR 2: Visual Causal Flow. Theo mô tả trong bài báo, bản 2 đổi phần mã hóa ảnh để model tự sắp thứ tự đọc các vùng ảnh theo nội dung, gần với cách người đọc một trang có nhiều cột, bảng và chú thích.

Trong vLLM, hai bản được gọi giống nhau với cùng prompt (câu yêu cầu gửi kèm ảnh) Free OCR., và trọng số xấp xỉ nhau. Trên 12 ảnh của mình, bản 2 không đọc tốt hơn: thực đơn chụp điện thoại bị đọc "Hàng Mành" thành "Hàng Mảnh", "nếp cẩm" thành "nếp cắm". Bộ ảnh của mình nhỏ, toàn chứng từ một cột. Trang nhiều cột phức tạp, loại tài liệu bản 2 nhắm tới, thì mình chưa đo. Nếu tài liệu của bạn giống bài báo khoa học hay tạp chí, nên thử cả hai.

Mình đo bằng ảnh gì, chấm thế nào?

Mình tự tạo 6 chứng từ hư cấu của một tiệm bánh tên "Tiệm Mây" bằng Python: hóa đơn bán lẻ, công văn, phiếu giao hàng, bảng kê lương, thực đơn và một trang điều khoản chữ nhỏ. Toàn bộ tên người, mã số thuế, địa chỉ đều bịa, nên không vướng dữ liệu cá nhân hay bản quyền. Mỗi chứng từ có hai bản:

  • Bản scan: thẳng, sạch, nền trắng.

  • Bản chụp điện thoại: nghiêng, hơi mờ, có nhiễu, sáng không đều, nén JPEG.

Hai bản của cùng hóa đơn Tiệm Mây: bên trái bản scan thẳng nền trắng, bên phải bản chụp nghiêng, tối dần về một góc

Mình chấm bằng hai con số:

  • CER (character error rate, tỷ lệ lỗi ký tự): số ký tự phải sửa để kết quả khớp đáp án, chia cho tổng số ký tự. Trước khi chấm, mình bỏ ký hiệu markdown và khoảng trắng thừa để model trả bảng dạng markdown không bị phạt oan.

  • Số trường đúng: 31 thông tin cần lấy trên 6 chứng từ (tên khách, tổng tiền, mã số thuế, email, tên món…). Một trường chỉ tính là đúng khi xuất hiện nguyên văn, sai một dấu cũng tính là sai.

Cả 5 model AI chạy qua vLLM 0.32.0 với temperature (độ ngẫu nhiên khi model chọn chữ) bằng 0, tức luôn chọn chữ có xác suất cao nhất, mỗi lần một ảnh. Mỗi model chạy một lượt khởi động trước khi bấm giờ.

Model nào đọc tiếng Việt đúng nhất?

Biểu đồ CER trên ảnh chụp điện thoại: DeepSeek-OCR 3,1%, DeepSeek-OCR-2 4,9%, GLM-OCR 12,9%, PaddleOCR-VL 16,8%, Vintern-1B 19,1%, Tesseract 31,0%

Bảng đầy đủ, CER tính bằng phần trăm, trường đúng tính trên 31:

Model

CER scan

CER chụp

Trường đúng (scan)

Trường đúng (chụp)

DeepSeek-OCR

1,68

3,12

30

29

DeepSeek-OCR-2

2,51

4,91

29

26

Vintern-1B-v3_5

3,21

19,07

30

26

PaddleOCR-VL-1.5

6,24

16,78

27

23

Tesseract 5.3.4

11,04

30,95

31

23

GLM-OCR

11,92

12,85

18

15

Biểu đồ số trường đọc đúng nguyên văn trên ảnh chụp: DeepSeek-OCR 29, DeepSeek-OCR-2 26, Vintern-1B 26, PaddleOCR-VL 23, Tesseract 23, GLM-OCR 15 trên 31

Đọc kỹ kết quả từng ảnh, mình thấy mỗi model sai theo một kiểu riêng:

  • DeepSeek-OCR giữ được bảng trên cả ảnh chụp, trả về dạng markdown đủ cột. Lỗi còn lại là lỗi dấu lẻ tẻ như "Trà sữa trân châu" thành "trần châu".

  • Vintern đọc ảnh scan rất tốt, cả trang điều khoản chữ nhỏ cũng không sai ký tự nào. Gặp ảnh chụp bảng kê lương, model chỉ trả về tiêu đề, tên cột và dòng tổng, bỏ hết 5 dòng nhân viên. CER của ảnh đó là 61%, kéo trung bình lên.

  • PaddleOCR-VL đọc chữ đúng dấu nhưng hay bỏ cột số trong bảng. Ở hóa đơn scan, nó giữ tên món mà mất hết số lượng, đơn giá, thành tiền.

  • GLM-OCR hỏng dấu tiếng Việt khá nặng, kiểu "Tổng cộng" thành "Tông cổng", "đồng" thành "dổng". Trang giới thiệu model (model card) của GLM-OCR không liệt kê tiếng Việt trong các ngôn ngữ hỗ trợ.

  • Tesseract đọc ảnh scan đủ cả 31 trường vì chữ rõ. CER vẫn 11% vì nó đọc bảng theo cột, các con số tách khỏi tên món. Ảnh chụp nghiêng làm nó mất gần hết bảng.

So cùng tấm hóa đơn chụp điện thoại, Tesseract trả về thế này:

bash
tesseract anh/hoa-don-chup.png - -l vie
Terminal chạy Tesseract trên ảnh hóa đơn chụp: phần đầu và dòng tổng đọc đúng, bảng món thành các mảnh rời như EEOMES- và các ký hiệu ngoặc vuông

Một lưu ý về con số: ở thực đơn, CER của mọi model đều cao (từ 4,8% đến 37,8%) một phần vì dòng chấm nối tên món với giá. Model nào cũng in số dấu chấm khác đáp án, và mỗi dấu chấm thiếu tính là một lỗi ký tự. Tên món và giá thì DeepSeek-OCR vẫn đọc đúng gần hết.

Prompt cho model ảnh hưởng nhiều không?

Với Vintern thì rất nhiều. Mình chạy cùng model với hai prompt:

text
Trích xuất toàn bộ chữ trong ảnh, giữ đúng thứ tự dòng.
Trích xuất thông tin chính trong ảnh và trả về dạng markdown.

Câu đầu cho CER scan 3,21%. Câu sau (theo kiểu ví dụ trên model card) cho 26,54%, vì model bắt đầu tóm tắt và viết lại: công văn ghi "18 giờ 30" bị đổi thành "18h30", đoạn văn bị rút gọn, thêm cả tiêu đề "Phụ trách" mà bản gốc không có. Muốn giữ đúng từng chữ thì prompt phải nói rõ điều đó. Lỗi viết lại kiểu này nguy hiểm hơn lỗi dấu, vì kết quả đọc lên vẫn trôi chảy, rất khó phát hiện.

Cài DeepSeek-OCR chạy local thế nào?

Mình chạy bằng vLLM, thư viện phục vụ model trên GPU. Bản 0.32.0 có sẵn DeepSeek-OCR và DeepSeek-OCR-2. Cài trên Ubuntu 24.04, Python 3.12, dùng uv để tạo môi trường ảo:

bash
uv venv -p 3.12 ~/venv-ocr && source ~/venv-ocr/bin/activate
uv pip install vllm==0.32.0 pillow

Với vLLM 0.32.0 và triton 3.7.1 (Triton là ngôn ngữ viết hàm chạy trên GPU), cả hai bản DeepSeek-OCR đều không nạp được vì lỗi LOG2E (kể ở mục lỗi cuối bài). Mình sửa bằng một lệnh, thay tên biến bằng giá trị số của nó trong file của vLLM:

bash
F=$(python -c "import vllm, os; print(os.path.dirname(vllm.__file__))")/model_executor/models/deepencoder.py
sed -i "s/\* LOG2E/* 1.4426950408889634/g" "$F"

1.4426950408889634 chính là giá trị của LOG2E (log cơ số 2 của e), nên kết quả tính không đổi. vLLM đã sửa lỗi này trên nhánh phát triển ngày 04/11/2026 (pull request #64016), nhưng bản 0.33.0 ra ngày 02/11/2026 vẫn chưa có; dùng bản phát hành sau 0.33.0 thì bỏ bước trên.

Đoạn code đọc một ảnh, mình đặt tên doc_anh.py:

python
import sys
from PIL import Image
from vllm import LLM, SamplingParams

llm = LLM(model="deepseek-ai/DeepSeek-OCR", max_model_len=4096,
          gpu_memory_utilization=0.33, enable_prefix_caching=False, mm_processor_cache_gb=0)
anh = Image.open(sys.argv[1]).convert("RGB")
out = llm.generate([{"prompt": "<image>\nFree OCR.", "multi_modal_data": {"image": anh}}],
                   SamplingParams(temperature=0, max_tokens=4096))
print(out[0].outputs[0].text)

gpu_memory_utilization=0.33 giới hạn vLLM dùng khoảng một phần ba VRAM của card 24GB, để thử xem DeepSeek-OCR có vừa một card 8GB không. Đổi model thành deepseek-ai/DeepSeek-OCR-2 là chạy bản 2, phần còn lại giữ nguyên. Lần đầu chạy, model tự tải từ Hugging Face (kho model trên mạng), khoảng 6,3GB mỗi bản.

bash
python doc_anh.py anh/hoa-don-chup.png
Terminal chạy doc_anh.py: DeepSeek-OCR trả về hóa đơn đủ dòng, bảng 5 món dạng markdown, chỉ đọc sai Tiệm Mây thành Tiệm Mãy

Lần chạy này mất 82,8 giây tính cả nạp model và biên dịch, trong đó phần đọc ảnh chỉ khoảng 1 giây. VRAM cả card lên đỉnh 8.504MiB. Mình để max_model_len=4096 vì với 8192, vLLM báo không đủ chỗ cho bộ nhớ đệm (lỗi cuối bài). Trang A4 dày chữ hơn hóa đơn sẽ cần nhiều token hơn cho phần chữ trả về. Khi đó nên nâng gpu_memory_utilization để tăng được max_model_len.

Mỗi model đọc nhanh cỡ nào, tốn bao nhiêu tiền?

Model

Giây mỗi ảnh

Thời gian nạp model

Tesseract (CPU)

0,45

không đáng kể

Vintern-1B-v3_5

0,78

79,5 giây

PaddleOCR-VL-1.5

0,95

70,8 giây

GLM-OCR

1,04

73,9 giây

DeepSeek-OCR

1,12

68,1 giây

DeepSeek-OCR-2

1,12

68,5 giây

Thời gian nạp gồm cả bước vLLM biên dịch và chuẩn bị bộ nhớ, chỉ tốn một lần cho mỗi lần khởi động. Mình cho model đọc từng ảnh một. Gửi nhiều ảnh cùng lúc thì vLLM chạy theo lô và có thể nhanh hơn, phần này mình chưa đo.

Quy ra từ số đo: 1.000 trang với DeepSeek-OCR mất khoảng 19 phút trên RTX 3090. Thuê RTX 3090 giá 15.000đ/giờ thì chi phí khoảng 4.700đ cho 1.000 trang, chưa tính thời gian cài đặt.

Khi nào không nên tự chạy OCR bằng model AI?

Tự chạy DeepSeek-OCR hợp khi bạn có nhiều chứng từ, cần giữ file trong máy mình, hoặc muốn gắn vào quy trình nhập liệu tự động. Nó không hợp khi:

  • Bạn chỉ có vài trang mỗi tháng. Cài vLLM và sửa lỗi mất công hơn gõ lại tay.

  • Máy không có GPU. Cả 5 model AI trong bài đều cần GPU, riêng DeepSeek-OCR cần khoảng 8,5GB VRAM; với máy chỉ có CPU, Tesseract vẫn là lựa chọn thực tế cho bản scan sạch.

  • Bạn cần số liệu đúng tuyệt đối, như kế toán hay hồ sơ pháp lý. Model AI có thể đọc sai một chữ số mà câu vẫn trôi chảy. Vẫn phải có bước đối chiếu, ví dụ cộng lại các dòng xem có khớp tổng không.

  • Tài liệu là chữ viết tay. Bộ ảnh của mình toàn chữ in, mình chưa đo chữ viết tay.

Lỗi mình đã gặp khi chạy

ImportError: cannot import name 'NGramPerReqLogitsProcessor'

Mẫu code cũ của DeepSeek dùng một bộ chặn lặp chữ tên NGramPerReqLogitsProcessor. Với DeepSeek-OCR-2 trên vLLM 0.32.0, dòng import báo lỗi:

text
ImportError: cannot import name 'NGramPerReqLogitsProcessor' from 'vllm.model_executor.models.deepseek_ocr2'

Với DeepSeek-OCR bản đầu, import được nhưng vLLM từ chối khi khởi động:

text
ValueError: NGramPerReqLogitsProcessor is not a subclass of vllm.v1.worker.gpu.sample.logits_processor.LogitsProcessor

Mình bỏ bộ chặn này cho cả hai bản. Trên 12 ảnh, không model DeepSeek nào bị lặp chữ vô hạn.

NameError: Cannot access global variable LOG2E

Terminal báo lỗi Triton: NameError Cannot access global variable LOG2E trong deepencoder.py, rồi RuntimeError Engine core initialization failed

Phần mã hóa ảnh của DeepSeek-OCR có một kernel Triton (hàm viết bằng Triton, chạy trên GPU) dùng biến LOG2E khai báo bên ngoài hàm. triton 3.7.1 không cho kernel đọc biến toàn cục kiểu này, nên vLLM dừng ngay lúc nạp model. Cả hai bản DeepSeek đều dính. Cách sửa là lệnh sed ở phần cài đặt.

CUDNN_STATUS_SUBLIBRARY_VERSION_MISMATCH

Sau khi qua lỗi trên, DeepSeek-OCR dừng ở bước tiếp theo:

text
RuntimeError: CUDNN_BACKEND_TENSOR_DESCRIPTOR cudnnFinalize failedptrDesc->finalize() cudnn_status: CUDNN_STATUS_SUBLIBRARY_VERSION_MISMATCH

Đây là lỗi lệch hai bản cuDNN (thư viện tăng tốc mạng nơ-ron của NVIDIA) mà mình đã gặp và giải thích trong bài Whisper: máy có cuDNN 9.24 cài sẵn, torch kéo theo bản 9.20. Cài uv pip install nvidia-cudnn-cu13==9.24.0.43 cho trùng bản hệ thống là hết. Vintern, PaddleOCR-VL và GLM-OCR không gặp lỗi này.

KV cache is needed, which is larger than the available KV cache memory

Lần đầu chạy doc_anh.py, mình để max_model_len=8192:

text
ValueError: To serve at least one request with the model's max seq len (8192), (0.47 GiB KV cache is needed, which is larger than the available KV cache memory (0.39 GiB). Based on the available memory, the estimated maximum model length is 6784.

KV cache là vùng nhớ vLLM giữ lại để sinh chữ tiếp. Khi đã giới hạn VRAM ở 0,33, phần còn lại sau trọng số không đủ cho 8192 token. Hạ max_model_len xuống 4096 hoặc nâng gpu_memory_utilization là chạy được.

Câu hỏi thường gặp

DeepSeek-OCR có đọc được file PDF không?

vLLM nhận ảnh, nên bạn cần đổi từng trang PDF thành ảnh trước, ví dụ bằng lệnh pdftoppm trong gói poppler-utils của Ubuntu. Mình chỉ đo trên ảnh PNG, chưa đo PDF nhiều trang.

Card 8GB có chạy được DeepSeek-OCR không?

Trọng số đã chiếm 6,23 GiB, và lần chạy giới hạn của mình lên đỉnh 8.504MiB VRAM cả card. Card 8GB sẽ rất sát, mình chưa có card 8GB để thử. Vintern-1B và PaddleOCR-VL nhẹ hơn nhiều (dưới 2 GiB trọng số), phù hợp hơn cho card nhỏ nếu tài liệu của bạn chủ yếu là bản scan.

Có model OCR tiếng Việt nào chạy không cần GPU không?

Tesseract với gói vie chạy CPU, mất 0,45 giây mỗi ảnh trong phép đo của mình. Trên bản scan sạch nó lấy đủ 31 trường, nhưng bảng biểu và ảnh chụp nghiêng thì đọc kém hơn hẳn các model AI.

Nên chọn DeepSeek-OCR hay DeepSeek-OCR 2?

Trên bộ chứng từ một cột của mình, bản đầu đúng hơn ở cả ảnh scan lẫn ảnh chụp, tốc độ như nhau. Hai bản cài và gọi giống hệt nhau, chỉ đổi tên model, nên cách chắc nhất là cho cả hai đọc 20 đến 30 trang tài liệu thật của bạn rồi so.

Model AI có tự sửa chữ sai trong ảnh không?

Có thể, và đó là rủi ro. Vintern với prompt "trích xuất thông tin chính" đã tự viết lại câu và đổi cách ghi giờ. Nếu cần giữ đúng từng chữ, hãy viết prompt yêu cầu đúng như vậy và kiểm tra lại những chỗ quan trọng như số tiền.

Đọc tiếp

Có cả thư mục chứng từ cần đọc mà máy không có GPU? Bạn có thể thuê RTX 3090 trên AIDev Cloud, cài vLLM theo các lệnh ở trên, đọc xong cả thư mục rồi trả máy.

Đo ngày 26/10/2026 trên máy AIDev Cloud RTX 3090 24GB gói Standard (25 vCPU Xeon E5-2680 v4, 53GB RAM, Ubuntu 24.04, driver 610.43.02, CUDA 13.3). vLLM 0.32.0, torch 2.13.0+cu130, transformers 5.19.0, triton 3.7.1, Python 3.12.3, Tesseract 5.3.4 (gói tesseract-ocr-vie của Ubuntu). 12 ảnh chứng từ tự tạo, nội dung hư cấu.

Tham vấn chuyên môn

Nguyễn Việt Chung

Nhà sáng lập AIDev và VietPlatform · Thạc sĩ AI MSE

  • Tốt nghiệp thủ khoa xuất sắc Thạc sĩ AI MSE.
  • Đồng sáng lập, CTO E-University, SVOnline: số hóa 10+ đại học, 40.000+ sinh viên.
  • Xây hệ thống AI cho doanh nghiệp tại VietPlatform.
Biên soạn: AIDev Team · Rà soát · Quy trình biên tập