Instructions to use microsoft/kosmos-2.5 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use microsoft/kosmos-2.5 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="microsoft/kosmos-2.5")# Load model directly from transformers import AutoImageProcessor, AutoModelForMultimodalLM processor = AutoImageProcessor.from_pretrained("microsoft/kosmos-2.5") model = AutoModelForMultimodalLM.from_pretrained("microsoft/kosmos-2.5", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use microsoft/kosmos-2.5 with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "microsoft/kosmos-2.5" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "microsoft/kosmos-2.5", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/microsoft/kosmos-2.5
- SGLang
How to use microsoft/kosmos-2.5 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 "microsoft/kosmos-2.5" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "microsoft/kosmos-2.5", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'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 "microsoft/kosmos-2.5" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "microsoft/kosmos-2.5", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use microsoft/kosmos-2.5 with Docker Model Runner:
docker model run hf.co/microsoft/kosmos-2.5
| import re | |
| import torch | |
| import requests | |
| from PIL import Image, ImageDraw | |
| from transformers import AutoProcessor, Kosmos2_5ForConditionalGeneration | |
| repo = "microsoft/kosmos-2.5" | |
| device = "cuda:0" | |
| dtype = torch.bfloat16 | |
| model = Kosmos2_5ForConditionalGeneration.from_pretrained(repo, device_map=device, torch_dtype=dtype) | |
| processor = AutoProcessor.from_pretrained(repo) | |
| # sample image | |
| url = "https://huggingface.co/microsoft/kosmos-2.5/resolve/main/receipt_00008.png" | |
| image = Image.open(requests.get(url, stream=True).raw) | |
| # bs = 1 | |
| prompt = "<ocr>" | |
| inputs = processor(text=prompt, images=image, return_tensors="pt") | |
| height, width = inputs.pop("height"), inputs.pop("width") | |
| raw_width, raw_height = image.size | |
| scale_height = raw_height / height | |
| scale_width = raw_width / width | |
| # bs > 1, batch generation | |
| # inputs = processor(text=[prompt, prompt], images=[image,image], return_tensors="pt") | |
| # height, width = inputs.pop("height"), inputs.pop("width") | |
| # raw_width, raw_height = image.size | |
| # scale_height = raw_height / height[0] | |
| # scale_width = raw_width / width[0] | |
| inputs = {k: v.to(device) if v is not None else None for k, v in inputs.items()} | |
| inputs["flattened_patches"] = inputs["flattened_patches"].to(dtype) | |
| generated_ids = model.generate( | |
| **inputs, | |
| max_new_tokens=1024, | |
| ) | |
| generated_text = processor.batch_decode(generated_ids, skip_special_tokens=True) | |
| def post_process(y, scale_height, scale_width): | |
| y = y.replace(prompt, "") | |
| if "<md>" in prompt: | |
| return y | |
| pattern = r"<bbox><x_\d+><y_\d+><x_\d+><y_\d+></bbox>" | |
| bboxs_raw = re.findall(pattern, y) | |
| lines = re.split(pattern, y)[1:] | |
| bboxs = [re.findall(r"\d+", i) for i in bboxs_raw] | |
| bboxs = [[int(j) for j in i] for i in bboxs] | |
| info = "" | |
| for i in range(len(lines)): | |
| box = bboxs[i] | |
| x0, y0, x1, y1 = box | |
| if not (x0 >= x1 or y0 >= y1): | |
| x0 = int(x0 * scale_width) | |
| y0 = int(y0 * scale_height) | |
| x1 = int(x1 * scale_width) | |
| y1 = int(y1 * scale_height) | |
| info += f"{x0},{y0},{x1},{y0},{x1},{y1},{x0},{y1},{lines[i]}" | |
| return info | |
| output_text = post_process(generated_text[0], scale_height, scale_width) | |
| print(output_text) | |
| draw = ImageDraw.Draw(image) | |
| lines = output_text.split("\n") | |
| for line in lines: | |
| # draw the bounding box | |
| line = list(line.split(",")) | |
| if len(line) < 8: | |
| continue | |
| line = list(map(int, line[:8])) | |
| draw.polygon(line, outline="red") | |
| image.save("output.png") | |