Configuration
OpenArc uses a YAML based configuration system! Models are added to config.yaml with openarc add, which writes the config blocks documented below. Configuration options set here override hardcoded defaults, but can be overridden at request time. For example, if you are in openwebui but need higher max_tokens than what you set in the config, you can raise that value in openwebui and that value will override the config saved in config.yaml for that request.
Config Blocks
There are a few different blocks in a models config that accept different parameters. Some will be common across implementations while others are specific. openarc add writes to these blocks; openarc add --help shows one help panel per key.
load_config
- engine: ovgenai, openvino, optimum
- model_type: llm, vlm, whisper, kokoro, emb, rerank, qwen3_tts_*
- device: device for this model
- tool_call_parser: gemma4, qwen35, hermes
scheduler_config
These are knobs to directly control performance. you can read more in the documentation upstream here
- max_num_batched_tokens:
- num_kv_blocks:
- cache_size:
- num_linear_attention_blocks:
- cache_interval_multiplier:
- dynamic_split_fuse:
- enable_prefix_caching:
- use_cache_eviction:
- use_sparse_attention:
Openvino genai does a graph transformation in the pipeline, which adapts the model graph in place to choose a different codepath at runtime. The long load time on first load
runtime_config
runtime_config is an OpenArc entrypoint to the properties way of configuring openvino runtime. These settings allow users to tune the behavior of openivno runtime without needing to change application logic and are meant to be "portable", requring no code changes. Since OpenArc
OpenArc does not validate these, and OpenVINO upstream does not provide a way to check the behvaior of these settings in all cases. They can help you access hardware features not available to all devices like SCHEDULING_CORE_TYPE for more recent Intel CPUs, debug numerical precision issues with INFERENCE_PRECISION_HINT or control KV_CACHE_PRECISION.
properties have the worst documentation in all of OpenVINO ecosystem, yet they are used everywhere in the openvino_notebooks, PRs and sometimes are even hardcoded depending on the needs of OpenVINO team. In that way, poking at these settings can drastically change performance but have less knobs than users of projects like llama.cpp, vllm, sglang are used to tinkering with. Additionally, some setting like NUM_STREAMS or ``
| Property | Values | Notes |
|---|---|---|
OFFLOAD_RATIO |
0-100 |
CPU offload |
ATTENTION_BACKEND |
SDPA, PA |
|
KV_CACHE_PRECISION |
u4, u8, f16, f32 |
|
PERFORMANCE_HINT |
LATENCY, THROUGHPUT |
|
EXECUTION_MODE_HINT |
ACCURACY, PERFORMANCE |
|
INFERENCE_PRECISION_HINT |
f16, f32 |
|
MODEL_DISTRIBUTION_POLICY |
TENSOR_PARALLEL, PIPELINE_PARALLEL |
|
ACTIVATIONS_SCALING_FACTOR |
||
DYNAMIC_QUANTIZATION_GROUP_SIZE |
integer | |
ENABLE_HYPER_THREADING |
bool | defaults to true |
SCHEDULING_CORE_TYPE |
ANY_CORE, ECORE_ONLY, PCORE_ONLY |
|
LOG_LEVEL |
ERR, WARN, INFO, DEBUG, TRACE |
requires building openvino with DEBUG_CAPS=ON |
sampler_config
Request defaults for sampling, applied to llm and vlm models only. Anything set here can be overridden per request.
| Field | Default | Description |
|---|---|---|
temperature |
1.0 |
Sampling temperature; higher values increase randomness |
top_k |
50 |
Top-k sampling cutoff |
top_p |
1.0 |
Nucleus sampling probability cutoff |
repetition_penalty |
1.0 |
Penalty for repeating sequences of tokens |
frequency_penalty |
none | Penalty for repeated tokens |
presence_penalty |
none | Flat penalty for tokens which appeared at least once |
max_tokens |
16384 |
Maximum number of tokens to generate |
seed |
none | Fix the RNG seed; same prompt returns the same text |
chat_template_kwargs |
empty | Additional arguments to apply to the chat template (e.g. enable_thinking: true) |
Example Configs
openarc add writes a model entry to config.yaml. Each help panel in openarc add --help is one config.yaml key: a flag is written to the key that backs it for the chosen --model-type, and a flag that does not apply to that model type is rejected. Only flags you actually pass are written, so everything else keeps its built-in default. Boolean options are plain flags (pass them to enable); options that take an object, like --runtime-config and --chat-template-kwargs, accept a JSON string.
LLM
openarc add \
--model-name qwen35-08b \
--model-path /mnt/models/Qwen3.5-0.8B-int8-asym-ov \
--engine ovgenai \
--model-type llm \
--device CPU \
--tool-call-parser qwen35 \
--runtime-config '{"PERFORMANCE_HINT": "LATENCY"}' \
--max-num-batched-tokens 2048 \
--temperature 0.7 \
--top-k 40 \
--top-p 0.95 \
--repetition-penalty 1.05 \
--max-tokens 1024 \
--chat-template-kwargs '{"enable_thinking": true}'
VLM
openarc add \
--model-name qwen35-08b \
--model-path /mnt/models/Qwen3.5-0.8B-int8-asym-ov \
--engine ovgenai \
--model-type vlm \
--device CPU \
--tool-call-parser qwen35 \
--runtime-config '{"PERFORMANCE_HINT": "LATENCY"}' \
--temperature 0.7 \
--top-k 40 \
--top-p 0.95 \
--repetition-penalty 1.05 \
--max-tokens 1024
Kokoro
OpenArc supports kokoro! Support in openvino has improved since I first implemented this model, so its possible we should look into review.
openarc add \
--model-name kokoro-82m \
--model-path /mnt/models/Kokoro-82M-ov \
--engine ovgenai \
--model-type kokoro \
--device CPU \
--voice af_sarah \
--voice-blend af_heart:0.7,af_nicole:0.3 \
--lang-code a \
--speed 1.0 \
--character-count-chunk 400 \
--response-format wav
Qwen3-ASR
Another great model for ASR task. THe below settings around chunking have model-specific audio chunking logic which adapt and improve on what Qwen-Team released at launch- we study the energy of audio to choose when to slice up to max_chunk_sec, so you rarely hit 30 seconds. Therefore max_chunk_sec is a unit of inference, and performance should be judged by how long it takes to process a window.
Reference Implementation lives at SearchSavior/Qwen3-ASR-OpenVINO
openarc add \
--model-name qwen3-asr \
--model-path /mnt/models/Qwen3-ASR-ov \
--engine ovgenai \
--model-type qwen3_asr \
--device GPU.0 \
--max-tokens 1024 \
--max-chunk-sec 30.0 \
--search-expand-sec 5.0 \
--min-window-ms 100.0
Whisper
Whisper has no config block; audio arrives per request, so only load-time options apply.
openarc add \
--model-name whisper-large-v3 \
--model-path /mnt/models/whisper-large-v3-int8-ov \
--engine ovgenai \
--model-type whisper \
--device GPU.0 \
--runtime-config '{"PERFORMANCE_HINT": "LATENCY"}'
Qwen3-TTS
All 3 flavors of qwen3-tts are supported, with a rich set of configuration options. PRs to improve performance or other enhancements are welcome
Qwen3-TTS family models process audio and text in an interleaved way, leveraging the reasoning of the Qwen3-0.6b language model backbone to augment the latents produced up to that point; then, Qwen team trains a streaming audio codec decoder with multi-token prediction heads that spit audio into a tokenizer.
If you want to learn more or contribute improvements, check out my reference implementation SearchSavior/Qwen3-TTS-OpenVINO.
Custom Voice
openarc add \
--model-name qwen3-tts-custom \
--model-path /mnt/models/Qwen3-TTS-CustomVoice-ov \
--engine ovgenai \
--model-type qwen3_tts_custom_voice \
--device GPU.0 \
--max-new-tokens 2048 \
--do-sample \
--top-k 50 \
--top-p 1.0 \
--temperature 0.9 \
--repetition-penalty 1.05 \
--non-streaming-mode \
--subtalker-do-sample \
--subtalker-top-k 50 \
--subtalker-top-p 1.0 \
--subtalker-temperature 0.9 \
--stream \
--stream-chunk-frames 300 \
--stream-left-context 25 \
--speaker chelsie \
--instruct "Sound cheerful."
Voice Clone
Use --model-type qwen3_tts_voice_clone and add these flags to the shared set above:
--ref-text "Transcript of the reference clip." \
--instruct "Speak slowly."
Passing --x-vector-only skips ICL even when --ref-text is set.
Voice Design
Use --model-type qwen3_tts_voice_design and add:
--voice-description "A red furry muppet with an orange nose."