Finetuned on the
ChartQA dataset using
Unsloth on a Google Colab free T4 GPU.
1from transformers import AutoProcessor, Qwen2VLForConditionalGeneration
2from PIL import Image
3import torch
4
5# Load model
6model = Qwen2VLForConditionalGeneration.from_pretrained(
7 "alanjoshua2005/alan-vlm",
8 torch_dtype=torch.float16,
9 device_map="auto",
10)
11processor = AutoProcessor.from_pretrained("alanjoshua2005/alan-vlm")
12
13# Run inference
14def ask(image_path, question):
15 image = Image.open(image_path).convert("RGB")
16
17 messages = [{"role": "user", "content": [
18 {"type": "image"},
19 {"type": "text", "text": question},
20 ]}]
21
22 text_prompt = processor.apply_chat_template(
23 messages,
24 add_generation_prompt=True,
25 tokenize=False,
26 )
27
28 inputs = processor(
29 text=text_prompt,
30 images=image,
31 return_tensors="pt"
32 )
33 inputs = {k: v.to("cuda") for k, v in inputs.items()}
34
35 with torch.no_grad():
36 output = model.generate(**inputs, max_new_tokens=64)
37
38 input_len = inputs["input_ids"].shape[1]
39 return processor.decode(output[0][input_len:], skip_special_tokens=True)
40
41# Example
42answer = ask("chart.png", "What is the value of the highest bar?")
43print(answer)
1import gradio as gr
2from transformers import AutoProcessor, Qwen2VLForConditionalGeneration
3from PIL import Image
4import torch
5
6model = Qwen2VLForConditionalGeneration.from_pretrained(
7 "alanjoshua2005/alan-vlm",
8 torch_dtype=torch.float16,
9 device_map="auto",
10)
11processor = AutoProcessor.from_pretrained("alanjoshua2005/alan-vlm")
12
13def answer_chart_question(image, question):
14 if image is None or not question.strip():
15 return "Please provide both an image and a question."
16 image = image.convert("RGB")
17 messages = [{"role": "user", "content": [
18 {"type": "image"},
19 {"type": "text", "text": question},
20 ]}]
21 text_prompt = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
22 inputs = processor(text=text_prompt, images=image, return_tensors="pt")
23 inputs = {k: v.to("cuda") for k, v in inputs.items()}
24 with torch.no_grad():
25 output = model.generate(**inputs, max_new_tokens=64)
26 input_len = inputs["input_ids"].shape[1]
27 return processor.decode(output[0][input_len:], skip_special_tokens=True)
28
29gr.Interface(
30 fn=answer_chart_question,
31 inputs=[gr.Image(type="pil"), gr.Textbox(label="Question")],
32 outputs=gr.Textbox(label="Answer"),
33 title="📊 ChartQA - alan-vlm"
34).launch()
Trained on
weijiezz/chartqa_split_test — a 2,000 row dataset of chart images paired with questions and answers. Contains two types of questions:
1from unsloth import FastVisionModel
2
3model, tokenizer = FastVisionModel.from_pretrained(
4 "unsloth/Qwen2-VL-2B-Instruct",
5 load_in_4bit=True,
6)
7
8model = FastVisionModel.get_peft_model(
9 model,
10 finetune_vision_layers=True,
11 finetune_language_layers=True,
12 finetune_attention_modules=True,
13 finetune_mlp_modules=True,
14 r=8,
15 lora_alpha=8,
16 lora_dropout=0,
17 bias="none",
18 use_gradient_checkpointing="unsloth",
19 target_modules=["q_proj", "v_proj", "k_proj", "o_proj",
20 "gate_proj", "up_proj", "down_proj"],
21)