Text Generation
Transformers
Safetensors
English
qwen3
math
reasoning
chain-of-thought
sft
conversational
text-generation-inference
Instructions to use jepetolee/Qwen3-4B-AMQ3-Math-SFT with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use jepetolee/Qwen3-4B-AMQ3-Math-SFT with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="jepetolee/Qwen3-4B-AMQ3-Math-SFT") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("jepetolee/Qwen3-4B-AMQ3-Math-SFT") model = AutoModelForCausalLM.from_pretrained("jepetolee/Qwen3-4B-AMQ3-Math-SFT", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.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(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use jepetolee/Qwen3-4B-AMQ3-Math-SFT with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "jepetolee/Qwen3-4B-AMQ3-Math-SFT" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "jepetolee/Qwen3-4B-AMQ3-Math-SFT", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/jepetolee/Qwen3-4B-AMQ3-Math-SFT
- SGLang
How to use jepetolee/Qwen3-4B-AMQ3-Math-SFT 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 "jepetolee/Qwen3-4B-AMQ3-Math-SFT" \ --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": "jepetolee/Qwen3-4B-AMQ3-Math-SFT", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'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 "jepetolee/Qwen3-4B-AMQ3-Math-SFT" \ --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": "jepetolee/Qwen3-4B-AMQ3-Math-SFT", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use jepetolee/Qwen3-4B-AMQ3-Math-SFT with Docker Model Runner:
docker model run hf.co/jepetolee/Qwen3-4B-AMQ3-Math-SFT
| """think ํ๊ทธ ๋ฌธ๋ฒ ๊ฐ์ vLLM V1 ๋ก์ง ํ๋ก์ธ์ (2026-07-16). | |
| ๊ทผ๊ฑฐ (temp0.75 1Kร64 ์ ์ ์ค์ธก): ์์ฑ์ 40.1%๊ฐ think๋ฅผ ์ ๋๋ก ๋ชป ์ด๊ณ (34.3%๋ | |
| </think>๋ถํฐ ์์), ์ ์ ์์์กฐ์ฐจ ํ๊ทธ๋ฅผ ํ๊ท 2.6๊ฐ ์ฌ์ฉ(์ฌ๊ฐ๋ฐฉยท์ ์ฌ ๋ฉํฐํด). ํ๊ทธ | |
| ๋ฐฉํฅ ์๋ฏธ๋ก ์ด ํ์ต๋์ง ์์ ์ฑ๋ฅ๊ณผ ๋ฌด๊ดํ๊ฒ ํ์์ด ๋ถ๊ดดํจ โ RL์ด ์ด๋ฅผ ๊ทธ๋๋ก ๊ฐํ | |
| ํ๊ธฐ ์ ์ ๋ฌธ๋ฒ์ ์์ฑ ๋จ๊ณ์์ ๊ฐ์ ํ๋ค. | |
| ๊ท์น (ํ ํฐ id ์ํ๋จธ์ โ ๋์ฝ๋ ๋ถํ์): | |
| 1) think๊ฐ ์ด๋ ค ์์ผ๋ฉด <think> ์ฌํธ์ถ ๊ธ์ง (์ค์ฒฉ/์ฌ๊ฐ๋ฐฉ ๋ฐฉ์ง) | |
| 2) </think>๊ฐ 1ํ ๋ฑ์ฅํ ์๊ฐ๋ถํฐ <think>ยท</think> ๋ชจ๋ ์๊ตฌ ๊ธ์ง | |
| 3) (์ต์ ) <|im_start|> ๊ธ์ง โ ์ ํด ํ๊ฐ ์ฐจ๋จ | |
| <think>\n ํ๋ฆฌํ(ralo.custom_prompts.official_chat_think_prefill_prompt_fn)๊ณผ ๊ฒฐํฉ ์ | |
| ๋ฌธ๋ฒ์ด ์์ ํ์๋๋ค: ์ด๋ฆผ 1ํ(ํ๋ฆฌํ ๋ณด์ฅ) + ๋ซํ ์ ํํ 1ํ + ์ดํ ๋ต๋ณ๋ถ. | |
| ์ฌ์ฉ๋ฒ (boxed_eos/repetition_abort์ ๋ณํ ๋ฑ๋ก ๊ฐ๋ฅ): | |
| 1) ์์ง: vllm_kwargs.logits_processors: ["ralo.vllm_think_format:ThinkFormatLogitsProcessor"] | |
| 2) ์์ฒญ: SamplingParams.extra_args = {"think_format": { | |
| "think_open_id": <int>, # <think> ํ ํฐ id | |
| "think_close_id": <int>, # </think> ํ ํฐ id | |
| "prefilled_open": true, # ํ๋กฌํํธ๊ฐ <think>๋ก ๋๋๋ ๊ฒฝ์ฐ (ํ๋ฆฌํ) | |
| "ban_im_start": true, # <|im_start|> ์ฌํธ์ถ ๊ธ์ง (์ต์ ) | |
| "im_start_id": <int>, | |
| }} | |
| extra_args์ think_format์ด ์๋ ์์ฒญ์ ์์ ํ ๋ฌด์๋๋ค. | |
| ์ฃผ์ โ async scheduling ๋นํธํ (2026-07-16 ์ค์ธก): vLLM V1์ async scheduling์ ๊ธฐ๋ณธ | |
| ์๋ ํ์ฑํํ๋๋ฐ, ์ด๋ ์์ปค๊ฐ output_tok_ids์ ์ค์ ํ ํฐ ๋์ -1 ํ๋ ์ด์คํ๋๋ฅผ | |
| ์ฑ์ด๋ค(gpu_model_runner์ use_async_scheduling ๊ฒฝ๋ก). ์ถ๋ ฅ ํ ํฐ ๊ฐ์ ์ฝ๋ ์ปค์คํ | |
| ํ๋ก์ธ์(์ด ํ์ผ + vllm_boxed_eos + vllm_repetition_abort)๋ ์ ๋ถ ๋ฌด๋ ฅํ๋๋ค. | |
| ๋ฐ๋์ ์์ง์ `async_scheduling=False`๋ฅผ ํจ๊ป ์ค์ผ ํ๋ค. ํ๋ ์ด์คํ๋๊ฐ ๊ฐ์ง๋๋ฉด | |
| ์๋ ์ํ๋จธ์ ์ด 1ํ ๊ฒฝ๊ณ ๋ฅผ ๋จ๊ธด๋ค. | |
| """ | |
| import logging | |
| from typing import Optional | |
| import torch | |
| try: | |
| from vllm.sampling_params import SamplingParams | |
| from vllm.v1.sample.logits_processor import BatchUpdate, LogitsProcessor | |
| from vllm.v1.sample.logits_processor.builtin import process_dict_updates | |
| _VLLM_OK = True | |
| except ImportError: | |
| _VLLM_OK = False | |
| LogitsProcessor = object # type: ignore | |
| BatchUpdate = None # type: ignore | |
| logger = logging.getLogger(__name__) | |
| _warned_placeholder = False | |
| class ThinkFormatState: | |
| """ํ ํฐ id๋ง์ผ๋ก ๊ธ์ง ๋ชฉ๋ก์ ๊ฒฐ์ ํ๋ ์ํ๋จธ์ (HF/vLLM ๊ณต์ฉ ์ฝ์ด).""" | |
| __slots__ = ("open_id", "close_id", "im_start_id", "opened", "closed", "consumed", | |
| "out", "max_think_tokens", "think_len", "force_prefill", | |
| "force_whitelist", "_force_start") | |
| def __init__(self, out, open_id, close_id, prefilled_open=False, im_start_id=None, | |
| prefilled_closed=False, max_think_tokens=None, | |
| force_prefill=None, force_whitelist=None): | |
| self.out = out # ์์ฑ ํ ํฐ ๋ฆฌ์คํธ (vLLM ๋ผ์ด๋ธ ์ฐธ์กฐ / HF์์ ์๋ feed) | |
| self.open_id = int(open_id) | |
| self.close_id = int(close_id) | |
| self.im_start_id = int(im_start_id) if im_start_id is not None else None | |
| # prefilled_closed: ํ๋กฌํํธ(ํ๋ฆฌํฝ์ค)์ ์ด๋ฏธ <think>โฆ</think>๊ฐ ์๊ฒฐ๋์ด ์๋ ๊ฒฝ์ฐ | |
| # (์: lrs/MCMC ์ฒญํฌ ์ฌ๊ฐ โ ๋์ ํ ์คํธ๋ฅผ ํ๋กฌํํธ๋ก ๋๊ธฐ๋ ํ์ ์์ฒญ). ์ด๊ฑธ ์ ์ฃผ๋ฉด | |
| # ์์ฒญ๋ง๋ค ์ํ๊ฐ ๋ฆฌ์ ๋์ด ๋ซํ ๋ค์๋ </think> ์ฌ๋ฐฉ์ถ์ด ํ์ฉ๋๋ค (2026-07-21 ์ค์ธก). | |
| self.opened = bool(prefilled_open) or bool(prefilled_closed) | |
| self.closed = bool(prefilled_closed) | |
| self.consumed = 0 | |
| # max_think_tokens: <think> ์์์ ์ด ํ ํฐ ์๋ฅผ ๋์ผ๋ฉด ๊ฐ์ ๋ดํฉ | |
| # (non-convergent ์ถ๋ก ๋ฃจํ ํ์ถ โ ๋ต๋ณ ๋จ๊ณ๋ก ๋ฐ์ด๋). None์ด๋ฉด ๋นํ์ฑ. | |
| self.max_think_tokens = int(max_think_tokens) if max_think_tokens else None | |
| self.think_len = 0 # <think> ์ด๋ฆฐ ๋ค ์์ฑ๋ ํ ํฐ ์ | |
| # ๊ฐ์ ๋ดํฉ ํ๋ฆฌํ ์ํ์ค(์: [</think>, "\n\n"])๋ฅผ ์์๋๋ก ๊ฐ์ ํ ๋ค, | |
| # ์ฒซ ๋ต๋ณ ํ ํฐ์ force_whitelist(ํ์ต๋ฐ์ดํฐ top-N ๋ต๋ณ์์ ํ ํฐ)๋ก๋ง ํ์ฉ โ | |
| # ๋ชจ๋ธ์ด ๊ทธ์ค ์ต๊ณ ๋ฅผ ์ค์ค๋ก ๊ณ ๋ฅด๊ฒ. ๋ ๋ค ์์ผ๋ฉด </think> ํ๋๋ง ๊ฐ์ (๊ตฌ ๋์). | |
| self.force_prefill = [int(x) for x in force_prefill] if force_prefill else [self.close_id] | |
| self.force_whitelist = [int(x) for x in force_whitelist] if force_whitelist else None | |
| self._force_start = None # ๊ฐ์ ๋ดํฉ ์์ ์์ ์ out ๊ธธ์ด | |
| def advance(self): | |
| """์ ํ ํฐ ์๋น ํ ํ์ฌ ์์ ์ ๊ธ์ง ํ ํฐ id ๋ฆฌ์คํธ ๋ฐํ.""" | |
| global _warned_placeholder | |
| while self.consumed < len(self.out): | |
| t = self.out[self.consumed] | |
| self.consumed += 1 | |
| if t == -1 and not _warned_placeholder: | |
| _warned_placeholder = True | |
| logger.warning( | |
| "[ThinkFormat] output_tok_ids์ -1 ํ๋ ์ด์คํ๋ ๊ฐ์ง โ vLLM async " | |
| "scheduling์ด ์ผ์ ธ ์์ด ๋ซํ ๊ฐ์ง๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์์ง์ " | |
| "async_scheduling=False๋ฅผ ์ ๋ฌํ์ธ์.") | |
| if self.opened and not self.closed: | |
| self.think_len += 1 | |
| if t == self.open_id: | |
| self.opened = True | |
| elif t == self.close_id and self.opened: | |
| self.closed = True | |
| return self.banned_ids() | |
| def force_allowed_ids(self): | |
| """๊ฐ์ ๋ดํฉ ์งํ ์ค์ด๋ฉด ์ด๋ฒ ์คํ ํ์ฉ ํ ํฐ id ๋ฆฌ์คํธ, ์๋๋ฉด None. | |
| ํ๋ฆฌํ ์ํ์ค๋ฅผ ์์๋๋ก 1๊ฐ์ฉ ๊ฐ์ โ ๋๋๋ฉด ๋ต๋ณ ์ฒซ ํ ํฐ์ ํ์ดํธ๋ฆฌ์คํธ๋ก | |
| 1์คํ ์ ํ โ ๊ทธ ๋ค ํด์ (None). ์ง์ ํ self.closed๊ฐ True๊ฐ ๋ผ๋ _force_start | |
| ๊ธฐ์ค์ผ๋ก ๊ณ์ ์งํํ๋ค.""" | |
| if self.max_think_tokens is None: | |
| return None | |
| if self._force_start is None: | |
| if (self.opened and not self.closed | |
| and self.think_len >= self.max_think_tokens): | |
| self._force_start = len(self.out) # ๊ฐ์ ๋ดํฉ ๊ฐ์ | |
| else: | |
| return None | |
| progress = len(self.out) - self._force_start | |
| seq = self.force_prefill | |
| if progress < len(seq): | |
| return [seq[progress]] # ํ๋ฆฌํ: ๊ทธ ์๋ฆฌ ํ ํฐ๋ง ํ์ฉ | |
| if self.force_whitelist and progress == len(seq): | |
| return list(self.force_whitelist) # ๋ต๋ณ ์ฒซ ํ ํฐ: top-N๋ง ํ์ฉ | |
| return None # ํ๋ฆฌํ+ํ์ดํธ๋ฆฌ์คํธ ๋ โ ํด์ | |
| def banned_ids(self): | |
| banned = [] | |
| if self.closed: | |
| banned = [self.open_id, self.close_id] # ๋ซํ ํ์ ๋ ๋ค ์๊ตฌ ๊ธ์ง | |
| elif self.opened: | |
| banned = [self.open_id] # ์ด๋ ค ์๋ ๋์ ์ฌ๊ฐ๋ฐฉ ๊ธ์ง | |
| if self.im_start_id is not None: | |
| banned.append(self.im_start_id) | |
| return banned | |
| class ThinkFormatLogitsProcessor(LogitsProcessor): | |
| """think ํ๊ทธ ๋ฌธ๋ฒ ๊ฐ์ โ ๊ธ์ง ํ ํฐ ๋ก์ง๋ง -inf, ๊ทธ ์ธ ๋ฌด๋ณ๊ฒฝ.""" | |
| def __init__(self, vllm_config, device: torch.device, is_pin_memory: bool): | |
| if not _VLLM_OK: | |
| raise RuntimeError("vLLM V1 logits processor API๋ฅผ ์ฐพ์ ์ ์์") | |
| self.device = device | |
| self.pin_memory = is_pin_memory | |
| self.states: dict[int, ThinkFormatState] = {} | |
| self._rows: list[int] = [] | |
| self._cols: list[int] = [] | |
| self._rows_t = None | |
| self._cols_t = None | |
| # ๊ฐ์ ๋ดํฉ: force_rows๋ ์ ์ฒด -inf, (allow_rows, allow_cols)๋ง 0์ผ๋ก ์ด๋ฆผ | |
| self._force_rows_t = None | |
| self._allow_rows_t = None | |
| self._allow_cols_t = None | |
| def is_argmax_invariant(self) -> bool: | |
| return False | |
| def add_request(params: "SamplingParams", _prompt, output_tok_ids) -> Optional[ThinkFormatState]: | |
| cfg = (getattr(params, "extra_args", None) or {}).get("think_format") | |
| if not cfg or cfg.get("think_open_id") is None or cfg.get("think_close_id") is None: | |
| return None | |
| return ThinkFormatState( | |
| out=output_tok_ids, | |
| open_id=cfg["think_open_id"], | |
| close_id=cfg["think_close_id"], | |
| prefilled_open=bool(cfg.get("prefilled_open", False)), | |
| prefilled_closed=bool(cfg.get("prefilled_closed", False)), | |
| im_start_id=cfg.get("im_start_id") if cfg.get("ban_im_start", False) else None, | |
| max_think_tokens=cfg.get("max_think_tokens"), | |
| force_prefill=cfg.get("force_prefill"), | |
| force_whitelist=cfg.get("force_whitelist"), | |
| ) | |
| def update_state(self, batch_update: "BatchUpdate | None") -> None: | |
| process_dict_updates(self.states, batch_update, self.add_request) | |
| rows, cols = [], [] # ์ผ๋ฐ ๊ธ์ง(-inf) | |
| force_rows, allow_rows, allow_cols = [], [], [] # ๊ฐ์ : ํ ์ ์ฒด -inf ํ allow๋ง 0 | |
| for idx, st in self.states.items(): | |
| banned = st.advance() | |
| allowed = st.force_allowed_ids() | |
| if allowed is not None: | |
| force_rows.append(idx) | |
| for tid in allowed: | |
| allow_rows.append(idx) | |
| allow_cols.append(tid) | |
| else: | |
| for tid in banned: | |
| rows.append(idx) | |
| cols.append(tid) | |
| def _t(vals): | |
| return torch.tensor(vals, device="cpu", dtype=torch.int64, | |
| pin_memory=self.pin_memory).to(self.device, non_blocking=True) | |
| self._rows_t, self._cols_t = (_t(rows), _t(cols)) if rows else (None, None) | |
| if force_rows: | |
| self._force_rows_t = _t(force_rows) | |
| self._allow_rows_t = _t(allow_rows) | |
| self._allow_cols_t = _t(allow_cols) | |
| else: | |
| self._force_rows_t = self._allow_rows_t = self._allow_cols_t = None | |
| def apply(self, logits: torch.Tensor) -> torch.Tensor: | |
| if self._rows_t is not None: | |
| logits[self._rows_t, self._cols_t] = float("-inf") | |
| if self._force_rows_t is not None: | |
| # ๊ฐ์ ๋ดํฉ: ํด๋น ํ ์ ์ฒด -inf ํ ํ์ฉ ํ ํฐ๋ง 0 (ํ๋ฆฌํ=1๊ฐ, ํ์ดํธ๋ฆฌ์คํธ=N๊ฐ) | |
| logits[self._force_rows_t] = float("-inf") | |
| logits[self._allow_rows_t, self._allow_cols_t] = 0.0 | |
| return logits | |
| def build_think_format_extra_args(algo_cfg: dict, tokenizer, | |
| prefilled_open: bool = False) -> Optional[dict]: | |
| """dapo_kwargs/lrs_kwargs์ think_format ๋ธ๋ก โ SamplingParams.extra_args.""" | |
| cfg = (algo_cfg or {}).get("think_format") or {} | |
| if not cfg.get("enabled", False): | |
| return None | |
| open_id = tokenizer.convert_tokens_to_ids("<think>") | |
| close_id = tokenizer.convert_tokens_to_ids("</think>") | |
| im_start_id = tokenizer.convert_tokens_to_ids("<|im_start|>") | |
| if open_id is None or close_id is None: | |
| return None | |
| # ๊ฐ์ ๋ดํฉ ํ๋ฆฌํ: </think> + "\n\n" ์ํ์ค ํ, ๋ต๋ณ ์ฒซ ํ ํฐ์ ํ์ต๋ฐ์ดํฐ | |
| # top-N ๋ต๋ณ์์ ํ ํฐ(ํ์ดํธ๋ฆฌ์คํธ)์ผ๋ก๋ง ํ์ฉํด ๋ชจ๋ธ์ด ์ค์ค๋ก ๊ณ ๋ฅด๊ฒ ํ๋ค. | |
| # (2026-07-21 amq3 clean 292K ์ค์ธก: </think> ๋ค 100% "\n\n", ์ฒซ ์คํ ํฐ top20์ด 97%) | |
| force_prefill = force_whitelist = None | |
| if cfg.get("force_close_prefill"): | |
| nn = tokenizer("\n\n", add_special_tokens=False)["input_ids"] | |
| force_prefill = [int(close_id)] + [int(x) for x in nn] | |
| # config์์ ์ง์ ์ค ํ์ดํธ๋ฆฌ์คํธ(id ๋ฆฌ์คํธ) ์ฐ์ , ์์ผ๋ฉด ํ์ต๋ฐ์ดํฐ ๊ธฐ๋ฐ ๊ธฐ๋ณธ๊ฐ. | |
| # ์ฌ๋์ด๋ฆ(John/Mary/James/Maria)ยท๋จ์ผ๋ฌธ์๋ ์ ์ธ โ ๋ต๋ณ ์์ฝ์ด ์๋๋ผ ์คํ ๋ฆฌ | |
| # ๋ฌธ์ ์ฌ์์ ๋ก ๋น ์ง ์ ์์ด์. ์ผ๋ฐ ๋ต๋ณ์์ ํ ํฐ๋ง (์ปค๋ฒ๋ฆฌ์ง ~96%): | |
| # To/We/Let/The/Given/###/(/First/In | |
| force_whitelist = cfg.get("force_close_whitelist") or [ | |
| 1249, 1654, 10061, 785, 22043, 14374, 7, 5338, 641, | |
| ] | |
| force_whitelist = [int(x) for x in force_whitelist] | |
| return { | |
| "think_format": { | |
| "think_open_id": int(open_id), | |
| "think_close_id": int(close_id), | |
| "prefilled_open": bool(cfg.get("prefilled_open", prefilled_open)), | |
| "prefilled_closed": bool(cfg.get("prefilled_closed", False)), | |
| "ban_im_start": bool(cfg.get("ban_im_start", True)), | |
| "im_start_id": int(im_start_id) if im_start_id is not None else None, | |
| "max_think_tokens": (int(cfg["max_think_tokens"]) | |
| if cfg.get("max_think_tokens") else None), | |
| "force_prefill": force_prefill, | |
| "force_whitelist": force_whitelist, | |
| } | |
| } | |