Instructions to use furkankucuk/ResuVL-L with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use furkankucuk/ResuVL-L with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="furkankucuk/ResuVL-L") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("furkankucuk/ResuVL-L") model = AutoModelForMultimodalLM.from_pretrained("furkankucuk/ResuVL-L", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use furkankucuk/ResuVL-L with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "furkankucuk/ResuVL-L" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "furkankucuk/ResuVL-L", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/furkankucuk/ResuVL-L
- SGLang
How to use furkankucuk/ResuVL-L with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "furkankucuk/ResuVL-L" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "furkankucuk/ResuVL-L", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "furkankucuk/ResuVL-L" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "furkankucuk/ResuVL-L", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use furkankucuk/ResuVL-L with Docker Model Runner:
docker model run hf.co/furkankucuk/ResuVL-L
ResuVL-L
ResuVL-L is the large model of ResuVL, three models that read CV page images into JSON: ResuVL-S (0.26B parameters), ResuVL-M (0.51B) and ResuVL-L (0.87B), from the tiny-resume-parser project.
It reads one CV page image and writes its content as JSON (name, contact details, work, education, skills, languages,
projects and more; schema in schema.py). 0.87B parameters: the 0.85B model, every weight fine-tuned (base model and its licence: see Licence below), and a 0.02B
multi-token prediction head that makes decoding on a GPU faster. The model is the average of the weights of 3
fine-tuned runs. Code, training recipe and full evaluation: https://github.com/iamkucuk/tiny-resume-parser.
In short: on 204 held-out CV pages, 86 % of the values ResuVL-L writes match the human-reviewed labels and it finds 83 % of the values in those labels (field F1 0.845). The model that made the training labels, run a second time on 50 reviewed pages, scores 0.912, which is the practical ceiling for models trained on its labels. ResuVL-L reads one page in about a minute on a laptop CPU, with no GPU and no PDF text layer; on an H100 GPU, in about 5.5 seconds with drafted decoding (13.5 seconds without).
Use
pip install git+https://github.com/iamkucuk/tiny-resume-parser
tiny-resume-parser parse cv.pdf --model furkankucuk/ResuVL-L
tiny-resume-parser parse cv.pdf --model furkankucuk/ResuVL-L --drafts 3 # on a GPU: about 2.4x faster
PDF pages are rendered at 120 dpi and read one page at a time; the PDF text layer is not used. The command applies
the settings the model was trained with: the whole page at up to 12 × 448 × 448 pixels. It needs transformers 5.2 or later. ResuVL-L v0.1 (0.94B, 0.735 lenient F1 on the test pages) stays available as revision v0.1.0 of this repository, and the weight file without the drafting head as revision v0.2.0. A CPU reads one page in about 55 seconds (Apple M2 Max, bf16 language model, float32 vision encoder).
Faster decoding on a GPU
Qwen3.5 models carry a multi-token prediction (MTP) head: one extra decoder layer that predicts the token after next.
It is stored in this repository's weight file under Qwen's own tensor names (mtp.*), retrained for 16 minutes on the
frozen ResuVL-L: it now predicts the token after next correctly for 97.6 % of the tokens in ResuVL-L's own answers
(20 validation pages; 87.6 % before retraining). With --drafts K, the head proposes up
to K tokens and the model checks them in one pass, keeping its own choice wherever they differ. On an H100, 30
validation pages, one page at a time:
| Drafted tokens per step | Seconds per page, plain / drafted | Faster | Lenient field F1, plain / drafted |
|---|---|---|---|
| 1 | 17.7 / 9.3 | 1.91× | 0.841 / 0.854 |
| 2 | 13.5 / 5.9 | 2.28× | 0.852 / 0.855 |
| 3 | 13.5 / 5.5 | 2.46× | 0.852 / 0.851 |
Each pair of times was measured in one job; plain decoding of the same pages took 13.5 to 17.7 seconds per page in
different jobs, so compare within a row.
The F1 differences are within run-to-run variation. In float32 the drafted answers are identical to plain decoding;
in bf16 about one answer in four differs somewhere, because a pass over several tokens rounds differently. On a CPU
drafting gives no speed-up. transformers ignores the mtp.* tensors when loading, so plain use is unchanged.
Details: findings.
Results
Field F1 compares each (field, value) pair of the answer with a human-reviewed label. Lenient ignores case, spacing and punctuation; content also accepts correct text placed under another field of the same section.
| Score | |
|---|---|
| Test, 204 reviewed pages, lenient field F1 | 0.845 (0.845 repaired) |
| Test, strict field F1 | 0.835 |
| Test, content F1 | 0.916 |
| Test pages with no parseable answer | 2 of 204 |
| Development lenient F1, 50 reviewed / 79 validation pages | 0.858 / 0.822 |
| Development content F1 | 0.952 / 0.917 |
The labelling model itself, run a second time on 50 reviewed pages, scores 0.912 lenient field F1 against them; its run-to-run variation limits what models trained on its labels can reach. Test scores are with transformers 5.5.4. Definitions: evaluation.md.
Training data
1,393 CV page images from the Cv Parsing Dataset (invoiceModelisation, Roboflow Universe, CC BY 4.0), labelled by GLM-5.3-Flash. Mostly French and English CVs. Recipe: training.md.
Limits of the training data
The labels come from a model that was not made for French. Every label was written by GLM-5.3-Flash, whose model card lists English and Chinese as its languages, while 80 % of the CVs are French. Its errors on French text become part of the training labels, and the students learn them. The 254 test and development pages were reviewed by hand starting from those labels, and the review changed fewer than 1 % of values, so the test measures agreement with reviewed model labels, not with labels written independently by people. Run a second time, the labelling model scores 0.912 against the reviewed labels, which limits what models trained on its labels can reach.
English-trained base models, a small and narrow sample of French. The base models that ResuVL was fine-tuned from learned to read mostly on English text. Those of ResuVL-S and ResuVL-M list English as their only language; those of ResuVL-L and ResuVL-L v0.1 are listed as multilingual, but neither model card gives a share per language, and French is likely a small part of their training data next to English. The training set here gives about 330,000 words of French from 1,116 CV pages, and it is narrow French: names, job titles, school names, dates and short skill lists, with half of all values one word long and few full sentences. Fine-tuning therefore asks models that read English well to learn to read French from a small and narrow sample, which covers little of French spelling, accents and vocabulary, while long training on it may weaken the English reading they started with. This makes training harder; how much of the remaining error it causes has not been measured.
Intended use and limits
For drafting a structured record of a CV page, to be checked by a person or by an applicant-tracking system. Not for ranking or rejecting candidates: the model leaves out values and misreads some, and its output must not decide anything about a person without review. One page at a time; other languages, scripts and very unusual layouts are untested; text written on the page is read like any other text.
Licence
The fine-tuned weights are licensed CC BY-NC 4.0: free for research and open-source use, not for commercial use. They were made by changing every weight of Qwen3.5-0.8B through fine-tuning. Qwen3.5-0.8B is licensed Apache 2.0; the licence texts are in LICENSE-base-model.txt and applies to the parts that come from it.
Citation
@software{kucuk2026tinyresumeparser,
author = {Kucuk, Furkan},
title = {tiny-resume-parser: small vision-language models that read CV page images into JSON},
year = {2026},
url = {https://github.com/iamkucuk/tiny-resume-parser}
}
- Downloads last month
- 212