Views
No views yet
acul3/qwen3.5-2b-id-meeting-summarizer for on-device inference on Apple Silicon (Mac, iPad, iPhone via mlx-swift-lm).| Task | Format pass | Notes |
|---|---|---|
paragraph | 100% | single-paragraph Indonesian summary |
title_generator | 100% | takes a summary as input, returns ≤7-word title |
rich_summary | 50% (raw) / 85–95% (with guards) | full markdown breakdown with Overview / Conclusion / Action Items |
repetition_penalty=1.1do_sample=False, temp=0) falls into local repetition loops after the first few sentences. The source model at bf16/fp16 doesn't have this problem.1from mlx_lm import load, generate
2from mlx_lm.sample_utils import make_sampler, make_logits_processors
3
4model, tokenizer = load("acul3/qwen3.5-2b-id-meeting-summarizer-mlx-q4")
5
6PROMPT = """You are a helpful assistant expert in writing.
7You answer only with the result without explanation or pretext.
8Please follow the instructions word by word obediently.
9<transcript>
10Audio Transcript:
11{transcript}
12</transcript>
13
14Analyze and generate a summary based on the audio transcript above written in 1 paragraph.
15... [see source README for the full verbatim prompt]
16"""
17
18# Qwen3.5's chat template emits <think></think> by default — fine-tune was
19# trained on non-thinking outputs.
20prompt = tokenizer.apply_chat_template(
21 [{"role": "user", "content": PROMPT.format(transcript=my_transcript)}],
22 add_generation_prompt=True,
23 tokenize=False,
24 enable_thinking=False,
25)
26
27out = generate(
28 model, tokenizer,
29 prompt=prompt,
30 max_tokens=2048,
31 sampler=make_sampler(temp=0.0),
32 logits_processors=make_logits_processors(repetition_penalty=1.1), # required
33)
34print(out)1import MLXLLM
2import MLXLMCommon
3
4let config = ModelConfiguration(
5 id: "acul3/qwen3.5-2b-id-meeting-summarizer-mlx-q4",
6 defaultPrompt: "Ringkas teks berikut."
7)
8let container = try await #huggingFaceLoadModelContainer(configuration: config)
9
10let session = ChatSession(
11 container,
12 generateParameters: .init(
13 maxTokens: 2048,
14 temperature: 0.0,
15 repetitionPenalty: 1.1, // required, see above
16 repetitionContextSize: 64
17 )
18)
19let summary = try await session.respond(to: prompt)mlx-lm from converting directly:model.language_model.language_model.language_model.X instead of model.X. Mlx-lm's loader can't map these.qwen3_5 text config, sets tie_word_embeddings: true (no lm_head in source), then runs mlx_lm.convert:1# Step 1: remap (see tools/convert-summarizer/remap_weights.py in the transkrip repo)
2python remap_weights.py \
3 --src ~/.cache/huggingface/hub/models--acul3--qwen3.5-2b-id-meeting-summarizer/snapshots/<hash> \
4 --dst ./qwen35-2b-id-text-only-bf16
5
6# Step 2: quantize with mainline mlx-lm
7mlx_lm.convert \
8 --hf-path ./qwen35-2b-id-text-only-bf16 \
9 --mlx-path ./qwen35-2b-id-meeting-mlx-q4 \
10 -q --q-bits 4 --q-group-size 64acul3/qwen3.5-2b-id-meeting-summarizerunsloth/Qwen3.5-2B → upstream Qwen/Qwen3.5-2Bmlx-lm