Feature Extraction
Transformers
Safetensors
English
Japanese
llmjpvl
custom_code

LLM-jp-4-VL 9B beta

| 🤗 Dataset  | 📄 Blog  | 🧑‍💻 Code  |


LLM-jp-4-VL 9B beta is a vision-language model developed by LLM-jp.

It is built upon llm-jp/llm-jp-4-8b-instruct and demonstrates competitive performance on Japanese benchmarks.

Model Architecture

The model architecture is inspired by InternVL3.0 and consists of a language model, a vision encoder, and a lightweight projector.

Architecture of the LLM-jp-4-VL 9B beta model.

To support high-resolution images, we adopt dynamic tiling, where each image is adaptively split into tiles based on its aspect ratio. By encoding these tiles independently and concatenating them as image tokens, the model can effectively handle fine-grained visual details that would otherwise be lost under fixed-resolution encoding.

Chat Template

We adopt a customized chat template based on an extension of the OpenAI Harmony format.

In this template, a sequence of image tokens is wrapped with special tokens <|image_start|> and <|image_end|>, and inserted into the user message. An example input is shown below:

<|start|>system<|message|>{system_message}<|end|> 
<|start|>user<|message|><|image_start|><|image_pad|>...<|image_pad|><|image_end|>What is the animal shown in this image?<|end|>
<|start|>assistant<|channel|>final<|message|>It is a cat.<|return|>

Training Data

The training data consists of a mixture of two large-scale datasets:

  • FineVision (24.2M samples), an English multimodal dataset.
  • Jagle (9.2M samples), a Japanese multimodal dataset developed by our team (public release coming soon).

Training Details

We train the model using a single-stage training scheme for 90,000 steps (approximately 3 epochs, corresponding to 180B tokens including image tokens).

We use different maximum learning rates for each component, with 2e-5 for both the language model and vision encoder, and 1e-4 for the projector.

The learning rate follows the Warmup–Stable–Decay (WSD) schedule, with a warmup phase of 2,000 steps, followed by stable training, and linear decay starting after 80% of the total training steps.

Evaluation

We evaluate the model using simple-evals-mm, our evaluation framework for VLMs.

For English evaluation, we use 10 widely adopted benchmarks, including AI2D, BLINK, ChartQA, DocVQA, InfoVQA, MMMU, OKVQA, RealWorldQA, ScienceQA, and TextVQA.

For Japanese evaluation, we use another 10 benchmarks, including JAMMEval collection (CC-OCR-JA-Refined, CVQA-JA-Refined, Heron-Bench-Refined, JA-Multi-Image-VQA-Refined, JA-VLM-Bench-Refined, JDocQA-Refined, and JGraphQA-Refined), as well as BusinessSlideVQA, JMMMU, and MECHA-ja.

We compare our model against the following baselines: Qwen3-VL-8B-Instruct, InternVL3.5-8B, and Sarashina-2.2-Vision-3B.

Results

Our model achieves performance on par with Qwen3-VL-8B-Instruct on average across 10 Japanese tasks, while using significantly fewer multimodal post-training tokens (180B vs. over 2T for Qwen3-VL).

Training curve on Avg, JA Avg, and EN Avg

Japanese benchmark results

English benchmark results

Usage

Install requirements.

uv add "torch==2.8.0" "transformers==4.57.0" "flash-attn==2.8.3" "pillow==11.3.0"

Below is the sample code to run the model.

import torch
from transformers import AutoProcessor, AutoModel

model_id = "llm-jp/llm-jp-4-vl-9B-beta"

# load model
model = (
    AutoModel.from_pretrained(
        model_id,
        torch_dtype=torch.bfloat16,
        trust_remote_code=True,
        use_flash_attn=True,
    )
    .eval()
    .cuda()
)

processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)


def generate(messages, max_new_tokens=256, temperature=0.0):
    inputs = processor.apply_chat_template(
        messages,
        tokenize=True,
        add_generation_prompt=True,
        return_dict=True,
        return_tensors="pt",
    ).to(model.device)

    if "pixel_values" in inputs:
        inputs["pixel_values"] = inputs["pixel_values"].to(dtype=model.dtype)

    outputs = model.generate(
        **inputs,
        max_new_tokens=max_new_tokens,
        do_sample=temperature > 0,
        temperature=temperature if temperature > 0 else None,
    )

    text = processor.decode(outputs[0], skip_special_tokens=False)
    text = text.replace("<|channel|>final<|message|>", "")
    text = text.replace("<|return|>", "")
    text = text.replace(processor.tokenizer.eos_token, "")
    return text.strip()


# -----------------------
# 1. Text-only
# -----------------------
messages = [
    {
        "role": "user",
        "content": [{"type": "text", "text": "富士山について簡潔に説明してください。"}],
    }
]
print(generate(messages))
# 富士山は、日本最高峰の山で、標高3,776メートルです。静岡県と山梨県にまたがっており、世界遺産にも登録されています。

# -----------------------
# 2. Single image
# -----------------------
messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": "assets/kaonashi.jpg"},
            {"type": "text", "text": "このキャラクターの名前は何ですか?"},
        ],
    }
]
print(generate(messages))
# カオナシ

# -----------------------
# 3. Multi-image
# -----------------------
messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": "assets/Shiba_inu.jpg"},
            {"type": "image", "image": "assets/yesoensis.jpg"},
            {"type": "text", "text": "それぞれの動物の名前を教えてください。"},
        ],
    }
]
print(generate(messages))
# 柴犬と鹿です。

# -----------------------
# 4. Multi-turn example
# -----------------------
messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": "assets/kaonashi.jpg"},
            {
                "type": "text",
                "text": "このキャラクターが登場する映画のタイトルは何ですか?",
            },
        ],
    },
    {
        "role": "assistant",
        "content": [{"type": "text", "text": "千と千尋の神隠し"}],
    },
    {
        "role": "user",
        "content": [{"type": "text", "text": "監督は誰ですか?"}],
    },
]

print(generate(messages))
# 宮崎駿

For more details, please refer to the official GitHub repository: https://github.com/llm-jp/llm-jp-4-vl

LICENSE

Apache License 2.0

FineVision, which is used to train this model, is a curated dataset aggregated from multiple existing datasets.
Some portions include data derived from outputs generated by proprietary models (e.g., OpenAI, Anthropic, and other closed-source systems). Users must comply with the applicable terms of use of those models when using this model.

Citation

If you find our work useful, please consider citing the following papers:

@misc{sugiura2026jaglebuildinglargescalejapanese,
      title={Jagle: Building a Large-Scale Japanese Multimodal Post-Training Dataset for Vision-Language Models}, 
      author={Issa Sugiura and Keito Sasagawa and Keisuke Nakao and Koki Maeda and Ziqi Yin and Zhishen Yang and Shuhei Kurita and Yusuke Oda and Ryoko Tokuhisa and Daisuke Kawahara and Naoaki Okazaki},
      year={2026},
      eprint={2604.02048},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2604.02048}, 
}

@misc{sugiura2026jammevalrefinedcollectionjapanese,
      title={JAMMEval: A Refined Collection of Japanese Benchmarks for Reliable VLM Evaluation}, 
      author={Issa Sugiura and Koki Maeda and Shuhei Kurita and Yusuke Oda and Daisuke Kawahara and Naoaki Okazaki},
      year={2026},
      eprint={2604.00909},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2604.00909}, 
}
Downloads last month
1,022
Safetensors
Model size
9B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for llm-jp/llm-jp-4-vl-9b-beta

Finetuned
(2)
this model

Dataset used to train llm-jp/llm-jp-4-vl-9b-beta

Space using llm-jp/llm-jp-4-vl-9b-beta 1

Collection including llm-jp/llm-jp-4-vl-9b-beta

Papers for llm-jp/llm-jp-4-vl-9b-beta