Instructions to use moondream/moondream-2b-2025-04-14-4bit with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- llama-cpp-python
How to use moondream/moondream-2b-2025-04-14-4bit with llama-cpp-python:
# !pip install llama-cpp-python from llama_cpp import Llama llm = Llama.from_pretrained( repo_id="moondream/moondream-2b-2025-04-14-4bit", filename="moondream2-mmproj-f16.gguf", )
output = llm( "Once upon a time,", max_tokens=512, echo=True ) print(output)
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use moondream/moondream-2b-2025-04-14-4bit with llama.cpp:
Install from brew
brew install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama-server -hf moondream/moondream-2b-2025-04-14-4bit:F16 # Run inference directly in the terminal: llama-cli -hf moondream/moondream-2b-2025-04-14-4bit:F16
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama-server -hf moondream/moondream-2b-2025-04-14-4bit:F16 # Run inference directly in the terminal: llama-cli -hf moondream/moondream-2b-2025-04-14-4bit:F16
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf moondream/moondream-2b-2025-04-14-4bit:F16 # Run inference directly in the terminal: ./llama-cli -hf moondream/moondream-2b-2025-04-14-4bit:F16
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf moondream/moondream-2b-2025-04-14-4bit:F16 # Run inference directly in the terminal: ./build/bin/llama-cli -hf moondream/moondream-2b-2025-04-14-4bit:F16
Use Docker
docker model run hf.co/moondream/moondream-2b-2025-04-14-4bit:F16
- LM Studio
- Jan
- vLLM
How to use moondream/moondream-2b-2025-04-14-4bit with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "moondream/moondream-2b-2025-04-14-4bit" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "moondream/moondream-2b-2025-04-14-4bit", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/moondream/moondream-2b-2025-04-14-4bit:F16
- Ollama
How to use moondream/moondream-2b-2025-04-14-4bit with Ollama:
ollama run hf.co/moondream/moondream-2b-2025-04-14-4bit:F16
- Unsloth Studio
How to use moondream/moondream-2b-2025-04-14-4bit with Unsloth Studio:
Install Unsloth Studio (macOS, Linux, WSL)
curl -fsSL https://unsloth.ai/install.sh | sh # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for moondream/moondream-2b-2025-04-14-4bit to start chatting
Install Unsloth Studio (Windows)
irm https://unsloth.ai/install.ps1 | iex # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for moondream/moondream-2b-2025-04-14-4bit to start chatting
Using HuggingFace Spaces for Unsloth
# No setup required # Open https://huggingface.co/spaces/unsloth/studio in your browser # Search for moondream/moondream-2b-2025-04-14-4bit to start chatting
- Docker Model Runner
How to use moondream/moondream-2b-2025-04-14-4bit with Docker Model Runner:
docker model run hf.co/moondream/moondream-2b-2025-04-14-4bit:F16
- Lemonade
How to use moondream/moondream-2b-2025-04-14-4bit with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull moondream/moondream-2b-2025-04-14-4bit:F16
Run and chat with the model
lemonade run user.moondream-2b-2025-04-14-4bit-F16
List all available models
lemonade list
| from transformers import PreTrainedModel, PretrainedConfig | |
| from .config import MoondreamConfig | |
| from .moondream import MoondreamModel | |
| # Files sometimes don't get loaded without these... | |
| from .image_crops import * | |
| from .vision import * | |
| from .text import * | |
| from .region import * | |
| from .utils import * | |
| def extract_question(text): | |
| prefix = "<image>\n\nQuestion: " | |
| suffix = "\n\nAnswer:" | |
| if text.startswith(prefix) and text.endswith(suffix): | |
| return text[len(prefix) : -len(suffix)] | |
| else: | |
| return None | |
| class HfConfig(PretrainedConfig): | |
| _auto_class = "AutoConfig" | |
| model_type = "moondream1" | |
| def __init__(self, **kwargs): | |
| super().__init__(**kwargs) | |
| self.config = {} | |
| class HfMoondream(PreTrainedModel): | |
| _auto_class = "AutoModelForCausalLM" | |
| config_class = HfConfig | |
| def __init__(self, config): | |
| super().__init__(config) | |
| self.model = MoondreamModel( | |
| MoondreamConfig.from_dict(config.config), setup_caches=False | |
| ) | |
| self._is_kv_cache_setup = False | |
| def _setup_caches(self): | |
| if not self._is_kv_cache_setup: | |
| self.model._setup_caches() | |
| self._is_kv_cache_setup = True | |
| def encode_image(self): | |
| self._setup_caches() | |
| return self.model.encode_image | |
| def query(self): | |
| self._setup_caches() | |
| return self.model.query | |
| def caption(self): | |
| self._setup_caches() | |
| return self.model.caption | |
| def detect(self): | |
| self._setup_caches() | |
| return self.model.detect | |
| def point(self): | |
| self._setup_caches() | |
| return self.model.point | |
| def detect_gaze(self): | |
| self._setup_caches() | |
| return self.model.detect_gaze | |
| def answer_question( | |
| self, | |
| image_embeds, | |
| question, | |
| tokenizer=None, | |
| chat_history="", | |
| result_queue=None, | |
| max_new_tokens=256, | |
| **kwargs | |
| ): | |
| answer = self.query(image_embeds, question)["answer"].strip() | |
| if result_queue is not None: | |
| result_queue.put(answer) | |
| return answer | |
| def batch_answer(self, images, prompts, tokenizer=None, **kwargs): | |
| answers = [] | |
| for image, prompt in zip(images, prompts): | |
| answers.append(self.query(image, prompt)["answer"].strip()) | |
| return answers | |
| def _unsupported_exception(self): | |
| raise NotImplementedError( | |
| "This method is not supported in the latest version of moondream. " | |
| "Consider upgrading to the updated API spec, or alternately pin " | |
| "to 'revision=2024-08-26'." | |
| ) | |
| def generate(self, image_embeds, prompt, tokenizer, max_new_tokens=128, **kwargs): | |
| """ | |
| Function definition remains unchanged for backwards compatibility. | |
| Be aware that tokenizer, max_new_takens, and kwargs are ignored. | |
| """ | |
| prompt_extracted = extract_question(prompt) | |
| if prompt_extracted is not None: | |
| answer = self.model.query( | |
| image=image_embeds, question=prompt_extracted, stream=False | |
| )["answer"] | |
| else: | |
| image_embeds = self.encode_image(image_embeds) | |
| prompt_tokens = torch.tensor( | |
| [self.model.tokenizer.encode(prompt).ids], | |
| device=self.device, | |
| ) | |
| def generator(): | |
| for token in self.model._generate_text( | |
| prompt_tokens, | |
| image_embeds.kv_cache, | |
| image_embeds.pos, | |
| max_new_tokens, | |
| ): | |
| yield token | |
| answer = "".join(list(generator())) | |
| return [answer] | |
| def get_input_embeddings(self): | |
| return super().get_input_embeddings() | |
| def input_embeds(self, *args, **kwargs): | |
| self._unsupported_exception() | |