Text Generation
Transformers
Safetensors
qwen3
feature-extraction
speculative-decoding
dspark
dflash
specforge
sglang
custom_code
text-generation-inference
Instructions to use RadixArk/Kimi-K3-DSpark with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use RadixArk/Kimi-K3-DSpark with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="RadixArk/Kimi-K3-DSpark", trust_remote_code=True)# Load model directly from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained("RadixArk/Kimi-K3-DSpark", trust_remote_code=True) model = AutoModel.from_pretrained("RadixArk/Kimi-K3-DSpark", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use RadixArk/Kimi-K3-DSpark with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "RadixArk/Kimi-K3-DSpark" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "RadixArk/Kimi-K3-DSpark", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/RadixArk/Kimi-K3-DSpark
- SGLang
How to use RadixArk/Kimi-K3-DSpark 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 "RadixArk/Kimi-K3-DSpark" \ --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": "RadixArk/Kimi-K3-DSpark", "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 "RadixArk/Kimi-K3-DSpark" \ --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": "RadixArk/Kimi-K3-DSpark", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use RadixArk/Kimi-K3-DSpark with Docker Model Runner:
docker model run hf.co/RadixArk/Kimi-K3-DSpark
File size: 6,346 Bytes
049288a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | # coding=utf-8
"""DSpark draft model: DFlash backbone + EAGLE-style Markov and confidence heads.
DSpark shares SpecForge's DFlash block-diffusion drafter (dual-source KV
injection via :class:`DFlashDraftModel`, anchor sampling, MASK-token noise
stream) and adds two heads on top:
- Markov head: a low-rank learned bigram bias added to the draft logits,
conditioned on the (teacher-forced) previous token. Improves the per-token
distribution without touching the backbone.
- Confidence head (AcceptRatePredictor): predicts a per-draft-position
acceptance probability, trained against the empirical draft-vs-target
accept rate (used at inference time for adaptive block length).
Ported from TorchSpec PR #129 (``torchspec/models/draft/dspark.py``). The Markov
/ confidence modeling code is adapted from DeepSeek's DeepSpec
(``deepspec/modeling/dspark/{markov_head,common}.py``, MIT License).
SpecForge differences vs TorchSpec (load-bearing):
- There is no ``DFlashConfig``; SpecForge's :class:`DFlashDraftModel` uses a
plain ``Qwen3Config`` plus a ``config.dflash_config`` dict. So
:class:`DSparkConfig` subclasses ``Qwen3Config`` and declares the DSpark
fields as top-level attributes; DFlash-carried fields (``block_size``,
``num_target_layers``, ``dflash_config``) stay as before.
- The draft model has no ``embed_tokens`` of its own (the embedding lives on
the target and is passed into the online wrapper), and the context
projection is ``self.fc`` (not ``context_proj``). The heads only depend on
``config.hidden_size`` / ``config.vocab_size``, so this does not matter for
construction.
"""
from typing import Optional
import torch
import torch.nn as nn
from transformers.models.qwen3.modeling_qwen3 import Qwen3Config
from specforge.modeling.draft.dflash import DFlashDraftModel
class DSparkConfig(Qwen3Config):
"""Configuration for the DSpark draft model.
Extends ``Qwen3Config`` (SpecForge's DFlash draft is config-light and reads a
plain ``Qwen3Config``). DSpark-specific fields are declared here; the
DFlash-carried fields (``block_size``, ``num_target_layers``, and the nested
``dflash_config`` dict holding ``target_layer_ids`` / ``mask_token_id``) are
consumed by the :class:`DFlashDraftModel` base ``__init__`` and must be
present on the config object before constructing the model.
"""
model_type = "dspark"
def __init__(
self,
markov_rank: int = 256,
markov_head_type: str = "vanilla",
enable_confidence_head: bool = True,
confidence_head_with_markov: bool = True,
**kwargs,
):
super().__init__(**kwargs)
self.markov_rank = markov_rank
self.markov_head_type = markov_head_type
self.enable_confidence_head = enable_confidence_head
self.confidence_head_with_markov = confidence_head_with_markov
class VanillaMarkov(nn.Module):
"""Low-rank learned bigram bias added to the draft logits.
Adapted from DeepSpec's ``deepspec/modeling/dspark/markov_head.py``.
"""
def __init__(self, *, vocab_size: int, markov_rank: int):
super().__init__()
self.vocab_size = int(vocab_size)
self.markov_rank = int(markov_rank)
self.markov_head_type = "vanilla"
assert (
self.markov_rank > 0
), f"VanillaMarkov requires markov_rank > 0, got {self.markov_rank}."
self.markov_w1 = nn.Embedding(self.vocab_size, self.markov_rank)
self.markov_w2 = nn.Linear(self.markov_rank, self.vocab_size, bias=False)
def get_prev_embeddings(self, token_ids: torch.Tensor) -> torch.Tensor:
return self.markov_w1(token_ids.long())
def project_bias(self, latent_states: torch.Tensor) -> torch.Tensor:
return self.markov_w2(latent_states)
def compute_step_bias(self, token_ids: torch.Tensor) -> torch.Tensor:
return self.project_bias(self.get_prev_embeddings(token_ids))
def apply_block_logits(
self,
base_logits: torch.Tensor,
*,
token_ids: torch.Tensor,
) -> torch.Tensor:
if base_logits.size(2) == 0:
return base_logits
return base_logits + self.compute_step_bias(token_ids)
class AcceptRatePredictor(nn.Module):
"""Per-position acceptance-probability predictor (a single linear head).
Adapted from DeepSpec's ``deepspec/modeling/dspark/common.py``.
"""
def __init__(self, input_dim: int):
super().__init__()
self.proj = nn.Linear(int(input_dim), 1)
def forward(self, features: torch.Tensor) -> torch.Tensor:
return self.proj(features).squeeze(-1)
def build_markov_head(config) -> Optional[nn.Module]:
markov_rank = int(getattr(config, "markov_rank", 0))
assert markov_rank >= 0, f"markov_rank must be >= 0, got {markov_rank}"
if markov_rank == 0:
return None
markov_head_type = str(getattr(config, "markov_head_type", "vanilla")).lower()
if markov_head_type == "vanilla":
return VanillaMarkov(vocab_size=config.vocab_size, markov_rank=markov_rank)
raise NotImplementedError(
f"markov_head_type={markov_head_type!r} is not supported yet; only 'vanilla' "
"is implemented as it is recommended by the authors."
)
class DSparkDraftModel(DFlashDraftModel):
"""DSpark draft network: DFlash backbone + Markov / confidence heads."""
config_class = DSparkConfig
def __init__(self, config) -> None:
super().__init__(config)
self.markov_rank = int(getattr(config, "markov_rank", 0))
self.confidence_head_with_markov = bool(
getattr(config, "confidence_head_with_markov", True)
)
self.markov_head = build_markov_head(config)
self.confidence_head: Optional[nn.Module] = None
if getattr(config, "enable_confidence_head", False):
conf_input_dim = config.hidden_size
if self.confidence_head_with_markov:
if self.markov_head is None:
raise ValueError(
"confidence_head_with_markov=True requires a Markov head "
"(markov_rank > 0)."
)
conf_input_dim += self.markov_rank
self.confidence_head = AcceptRatePredictor(conf_input_dim)
|