Image-Text-to-Text
Transformers
Safetensors
qwen3_5
vllm
video
multimodal
reinforcement-learning
temporal-grounding
object-tracking
video-segmentation
visual-question-answering
spatial-reasoning
qwen3.5
conversational
Instructions to use OraRL/Video-ORA-9B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use OraRL/Video-ORA-9B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="OraRL/Video-ORA-9B") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("OraRL/Video-ORA-9B") model = AutoModelForMultimodalLM.from_pretrained("OraRL/Video-ORA-9B", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use OraRL/Video-ORA-9B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "OraRL/Video-ORA-9B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "OraRL/Video-ORA-9B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/OraRL/Video-ORA-9B
- SGLang
How to use OraRL/Video-ORA-9B 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 "OraRL/Video-ORA-9B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "OraRL/Video-ORA-9B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'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 "OraRL/Video-ORA-9B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "OraRL/Video-ORA-9B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use OraRL/Video-ORA-9B with Docker Model Runner:
docker model run hf.co/OraRL/Video-ORA-9B
| # Copyright 2024 Bytedance Ltd. and/or its affiliates | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """ | |
| Actor config | |
| """ | |
| import os | |
| from dataclasses import dataclass, field | |
| from typing import Any, Optional | |
| class ModelConfig: | |
| model_path: Optional[str] = None | |
| tokenizer_path: Optional[str] = None | |
| override_config: dict[str, Any] = field(default_factory=dict) | |
| enable_gradient_checkpointing: bool = True | |
| trust_remote_code: bool = True | |
| freeze_vision_tower: bool = False | |
| train_vision_merger: bool = False | |
| """When the vision tower is frozen, re-enable its merger/projector only.""" | |
| def post_init(self): | |
| if self.tokenizer_path is None: | |
| self.tokenizer_path = self.model_path | |
| if self.model_path is not None and os.path.exists(self.model_path): # ray job uses absolute path | |
| self.model_path = os.path.abspath(self.model_path) | |
| if self.tokenizer_path is not None and os.path.exists(self.tokenizer_path): | |
| self.tokenizer_path = os.path.abspath(self.tokenizer_path) | |
| class OptimConfig: | |
| lr: float = 1e-6 | |
| betas: tuple[float, float] = (0.9, 0.999) | |
| weight_decay: float = 1e-2 | |
| strategy: str = "adamw" | |
| lr_warmup_ratio: float = 0.0 | |
| lr_warmup_steps: Optional[int] = None | |
| min_lr_ratio: Optional[float] = None | |
| lr_scheduler_type: str = "constant" | |
| # below are auto keys | |
| training_steps: int = field(default=-1, init=False) | |
| class FSDPConfig: | |
| enable_full_shard: bool = True | |
| enable_cpu_offload: bool = False | |
| enable_rank0_init: bool = True | |
| use_orig_params: bool = False | |
| torch_dtype: Optional[str] = None | |
| fsdp_size: int = -1 | |
| mp_param_dtype: str = "bf16" | |
| mp_reduce_dtype: str = "fp32" | |
| mp_buffer_dtype: str = "fp32" | |
| class OffloadConfig: | |
| offload_params: bool = False | |
| offload_optimizer: bool = False | |
| class ActorConfig: | |
| strategy: str = "fsdp" | |
| global_batch_size: int = 256 | |
| """number of samples per minibatch for updating actor""" | |
| micro_batch_size_per_device_for_update: int = 4 | |
| """number of samples per forward pass for updating actor""" | |
| micro_batch_size_per_device_for_experience: int = 16 | |
| """number of samples per forward pass for computing log probs""" | |
| max_grad_norm: float = 1.0 | |
| """number to clip grad norm""" | |
| clip_ratio_low: float = 0.2 | |
| """clip ratio in PPO & DAPO""" | |
| clip_ratio_high: float = 0.3 | |
| """clip ratio in PPO & DAPO""" | |
| clip_ratio_dual: float = 3.0 | |
| """constant C in dual-clip PPO, clips when advantage < -C""" | |
| loss_avg_mode: str = "token" | |
| """loss average mode: `token`, `seq`""" | |
| loss_type: str = "default" | |
| """loss type: `default`, `gspo`, `cispo`""" | |
| ppo_epochs: int = 1 | |
| """number of ppo epochs for each rollout batch""" | |
| padding_free: bool = True | |
| """use padding-free training""" | |
| dynamic_batching: bool = True | |
| """enable dynamic batching""" | |
| max_token_len_per_gpu: Optional[int] = None | |
| """max token length per GPU for dynamic batching. If None, use micro_batch_size * max_seq_len""" | |
| ulysses_size: int = 1 | |
| """ulysses sequence parallel size""" | |
| use_torch_compile: bool = True | |
| """enable torch compile""" | |
| model: ModelConfig = field(default_factory=ModelConfig) | |
| optim: OptimConfig = field(default_factory=OptimConfig) | |
| fsdp: FSDPConfig = field(default_factory=FSDPConfig) | |
| offload: OffloadConfig = field(default_factory=OffloadConfig) | |
| # below are auto keys | |
| global_batch_size_per_device: int = field(default=-1, init=False) | |
| disable_kl: bool = field(default=False, init=False) | |
| use_kl_loss: bool = field(default=False, init=False) | |
| kl_penalty: str = field(default="kl", init=False) | |
| kl_coef: float = field(default=0.0, init=False) | |
| selection_prune_ratio: float = field(default=0.0, init=False) | |
| """Auto-propagated from algorithm.selection_prune_ratio. The FSDP worker uses | |
| it to scale global_batch_size by k=floor(n*(1-P)) instead of n, so the | |
| per-rank mini-batch matches the post-selection batch size.""" | |
| class RefConfig: | |
| strategy: str = "fsdp" | |
| fsdp: FSDPConfig = field(default_factory=FSDPConfig) | |
| offload: OffloadConfig = field(default_factory=OffloadConfig) | |
| # below are auto keys | |
| micro_batch_size_per_device_for_experience: int = field(default=-1, init=False) | |
| padding_free: bool = field(default=False, init=False) | |
| dynamic_batching: bool = field(default=False, init=False) | |
| max_token_len_per_gpu: Optional[int] = field(default=None, init=False) | |
| ulysses_size: int = field(default=1, init=False) | |
| use_torch_compile: bool = field(default=True, init=False) | |