A-Vision — Visual-Language модель, адаптированная под русский язык и домен Авито. Она понимает изображение и текст вместе: описывает фото, отвечает на вопросы по картинке, сверяет соответствие описания и фото, извлекает бренды/надписи/произвольный текст (OCR).
В токенизаторе A-vision плотность токенизации выше, чем у Qwen2.5-VL-7B-Instruct, поэтому число токенов в контексте и при генерации стало меньше для одинаковых примеров. Кроме того, размер самой модели сократился до 7.4B, при 8.3B у Qwen2.5-VL-7B-Instruct. За счет этого одинаковые русскоязычные примеры адаптированной моделью обрабатываются быстрее в среднем на 50% в сравнении с исходной Qwen2.5-VL-7B-Instruct.
Ниже — минимальный пример инференса VLM (текст+картинка).
1import torch
2from PIL import Image
3from transformers import AutoProcessor, AutoModelForImageTextToText
4from qwen_vl_utils import process_vision_info
5
6model_id = "AvitoTech/a-vision"
7
8# Модель и процессор
9model = AutoModelForImageTextToText.from_pretrained(
10 model_id,
11 torch_dtype="auto",
12 device_map="auto",
13)
14processor = AutoProcessor.from_pretrained(model_id)
15
16img = Image.open("assets/hoodie.jpg") # выберите локально загруженное изображение
17
18messages = [
19 {
20 "role": "user",
21 "content": [
22 {
23 "type": "image",
24 "image": img,
25 "min_pixels": 4 * 28 * 28,
26 "max_pixels": 1024 * 28 * 28,
27 },
28 {
29 "type": "text",
30 "text": "Опиши изображение."
31 }
32 ],
33 }
34]
35
36# Подготовка входа
37chat_text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
38image_inputs, video_inputs = process_vision_info(messages)
39inputs = processor(
40 text=[chat_text],
41 images=image_inputs,
42 videos=video_inputs,
43 padding=True,
44 return_tensors="pt",
45)
46
47inputs = inputs.to("cuda")
48
49# Генерация
50generated_ids = model.generate(**inputs, max_new_tokens=256)
51generated_ids_trimmed = [
52 out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
53]
54response = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
55print(response)