Back to Docling

Vision Models

docs/usage/vision_models.md

2.92.06.2 KB
Original Source

Vision Models

The VlmPipeline in Docling allows you to convert documents end-to-end using a vision-language model.

Docling supports vision-language models which output:

  • DocTags (e.g. SmolDocling), the preferred choice
  • Markdown
  • HTML

!!! tip "Complete Model Catalog" For a comprehensive overview of all models and stages in Docling (Layout, Table Structure, OCR, VLM, etc.), see the Model Catalog.

Quick Start

For running Docling using local models with the VlmPipeline:

=== "CLI"

```bash
docling --pipeline vlm FILE
```

=== "Python"

See also the example [minimal_vlm_pipeline.py](./../examples/minimal_vlm_pipeline.py).

```python
from docling.datamodel.base_models import InputFormat
from docling.document_converter import DocumentConverter, PdfFormatOption
from docling.pipeline.vlm_pipeline import VlmPipeline

converter = DocumentConverter(
    format_options={
        InputFormat.PDF: PdfFormatOption(
            pipeline_cls=VlmPipeline,
        ),
    }
)

doc = converter.convert(source="FILE").document
```

Available local models

By default, the vision-language models are running locally. Docling allows to choose between the Hugging Face Transformers framework and the MLX (for Apple devices with MPS acceleration) one.

The following table reports the models currently available out-of-the-box.

Model instanceModelFrameworkDeviceNum pagesInference time (sec)
vlm_model_specs.GRANITEDOCLING_TRANSFORMERSibm-granite/granite-docling-258MTransformers/AutoModelForVision2SeqMPS1-
vlm_model_specs.GRANITEDOCLING_MLXibm-granite/granite-docling-258M-mlx-bf16MLXMPS1-
vlm_model_specs.SMOLDOCLING_TRANSFORMERSds4sd/SmolDocling-256M-previewTransformers/AutoModelForVision2SeqMPS1102.212
vlm_model_specs.SMOLDOCLING_MLXds4sd/SmolDocling-256M-preview-mlx-bf16MLXMPS16.15453
vlm_model_specs.QWEN25_VL_3B_MLXmlx-community/Qwen2.5-VL-3B-Instruct-bf16MLXMPS123.4951
vlm_model_specs.NANONETS_OCR2_MLXmlx-community/Nanonets-OCR2-3B-bf16MLXMPS1-
vlm_model_specs.PIXTRAL_12B_MLXmlx-community/pixtral-12b-bf16MLXMPS1308.856
vlm_model_specs.GEMMA3_12B_MLXmlx-community/gemma-3-12b-it-bf16MLXMPS1378.486
vlm_model_specs.GRANITE_VISION_TRANSFORMERSibm-granite/granite-vision-3.2-2bTransformers/AutoModelForVision2SeqMPS1104.75
vlm_model_specs.NANONETS_OCR2_TRANSFORMERSnanonets/Nanonets-OCR2-3BTransformers/AutoModelForImageTextToTextMPS1-
vlm_model_specs.PHI4_TRANSFORMERSmicrosoft/Phi-4-multimodal-instructTransformers/AutoModelForCasualLMCPU11175.67
vlm_model_specs.PIXTRAL_12B_TRANSFORMERSmistral-community/pixtral-12bTransformers/AutoModelForVision2SeqCPU11828.21

Inference time is computed on a Macbook M3 Max using the example page tests/data/pdf/2305.03393v1-pg9.pdf. The comparison is done with the example compare_vlm_models.py.

For choosing the model, the code snippet above can be extended as follow

python
from docling.datamodel.base_models import InputFormat
from docling.document_converter import DocumentConverter, PdfFormatOption
from docling.pipeline.vlm_pipeline import VlmPipeline
from docling.datamodel.pipeline_options import (
    VlmPipelineOptions,
)
from docling.datamodel import vlm_model_specs

pipeline_options = VlmPipelineOptions(
    vlm_options=vlm_model_specs.SMOLDOCLING_MLX,  # <-- change the model here
)

converter = DocumentConverter(
    format_options={
        InputFormat.PDF: PdfFormatOption(
            pipeline_cls=VlmPipeline,
            pipeline_options=pipeline_options,
        ),
    }
)

doc = converter.convert(source="FILE").document

Other models

Other models can be configured by directly providing the Hugging Face repo_id, the prompt and a few more options.

For example:

python
from docling.datamodel.pipeline_options_vlm_model import InlineVlmOptions, InferenceFramework, TransformersModelType

pipeline_options = VlmPipelineOptions(
    vlm_options=InlineVlmOptions(
        repo_id="ibm-granite/granite-vision-3.2-2b",
        prompt="Convert this page to markdown. Do not miss any text and only output the bare markdown!",
        response_format=ResponseFormat.MARKDOWN,
        inference_framework=InferenceFramework.TRANSFORMERS,
        transformers_model_type=TransformersModelType.AUTOMODEL_VISION2SEQ,
        supported_devices=[
            AcceleratorDevice.CPU,
            AcceleratorDevice.CUDA,
            AcceleratorDevice.MPS,
            AcceleratorDevice.XPU,
        ],
        scale=2.0,
        temperature=0.0,
    )
)

Remote models

Additionally to local models, the VlmPipeline allows to offload the inference to a remote service hosting the models. Many remote inference services are provided, the key requirement is to offer an OpenAI-compatible API. This includes vLLM, Ollama, etc.

More examples on how to connect with the remote inference services can be found in the following examples: