CantoneseLLM v2: Reasoning in a Low-Resource Language
Organizations: Kyushu University · hon9kon9ize · The Education University of Hong Kong · Votee AI ·
Abstract
Cantonese is widely spoken but remains low-resource in written data, with no large corpus of native Cantonese reasoning traces available for model training. We develop and release CantoneseLLM v2, comprising models based on Qwen3 8B and 30B-A3B. The models are trained through CPT on 784 million Cantonese and Hong Kong-related tokens, chat-vector merging, SFT, DPO, and RLVR. Evaluation across the training stages shows that chat-vector merging transfers instruction following but preserves the donor model's reasoning language, while SFT with limited Cantonese reasoning data substantially shortens or removes reasoning traces and reduces benchmark performance. DPO restores the reasoning-block format, particularly for the 8B model, but recovers only part of the lost performance. The RLVR training with Cantonese language and Traditional Chinese scripts as multiplicative constraints introduced Cantonese language alignment and restored the lost performance. The 30B-A3B model reaches 73.16 on HKCanto-Eval, within 1.20 points of its merged checkpoint, while retaining the Cantonese reasoning behaviour absent from that checkpoint. We release the model checkpoints, the training environments, and a thirteen-year Traditional Chinese Common Crawl dataset. The models can be accessed at https://huggingface.co/collections/hon9kon9ize/cantonesellm-v20
Figures & tables
| Dimension | Assumed by the established recipe | Available for Cantonese |
|---|---|---|
| Corpus scale | 35.1B Taiwan-LLM, 200B Swallow, 200B SEA-LION | 784M tokens, of which 5.4% is Cantonese Common Crawl |
| Teacher availability | A teacher model already fluent in the target language | None. No open-weight model produces colloquial Cantonese |
| Reasoning traces | Abundant native chain-of-thought data | Zero. Traces must be machine translated |
| Verifiable-constraint data | Available and reusable across languages | Untranslatable, as constraints might be defined against the orthography. |
| Evaluation | Generation benchmarks | Multiple-choice benchmarks only, and they may miss generation failures |
| Stage | Installs | Cannot supply | Diagnostic | Cost, 8B / 30B-A3B (device-hours) |
|---|---|---|---|---|
| Continuous pre-training (CPT) | Local knowledge and Cantonese lexis | Instruction following, and reasoning | Benchmark average against final training loss (Table 4 ) | 103 / 199 TPU |
| Chat-vector merging | Instruction following and alignment | The language of the reasoning trace | Reasoning-span script and language (Table 26 , Figure 7 ) | 0 |
| Supervised fine-tuning (SFT) | Translation, curation and judging behaviour | Target-language reasoning, which it removes | Empty-reasoning rate and reasoning length (Tables 8 , 7 ) | 47 / 107 GPU |
| Direct preference optimisation (DPO) | The reasoning block, as a format | Problem-solving capability, and instruction compliance | Empty-block rate and bare-letter answer rate (Section 7.2.1 ) | 14 / 115 GPU |
| Verifiable reward (RLVR) | Target-language reasoning and recovered capability | Full recovery at 8B, and Cantonese reasoning on code generation | Per-environment reward and language multiplier (Figure 13 ) | 441 / 1,256 GPU |
| Category | Tokens | % |
|---|---|---|
| Common Crawl, written Chinese | 215,407,694 | 27.5% |
| English replay (Nemotron) | 163,657,706 | 20.9% |
| Web fiction and creative | 133,788,878 | 17.1% |
| Encyclopaedic | 98,147,161 | 12.5% |
| News and synth. commentary | 65,854,845 | 8.4% |
| Common Crawl, Cantonese | 42,390,861 | 5.4% |
| Model | Avg. | Final Loss |
|---|---|---|
| Qwen3 30B-A3B Base | 67.69 | 1.83 |
| CPT, LR 1.0 10 -5 | 68.21 | 1.69 |
| CPT, LR 1.5 10 -5 | 68.47 | 1.66 |
| CPT, LR 5.0 10 -5 | 67.65 | 1.52 |
| Model | Avg. | |
|---|---|---|
| 8B Chat Vector | 69.51 | 3.18% |
| 30B-A3B Chat Vector | 74.36 | 2.55% |
| Class | Rows | Row % | Tokens | Token % | CoT tokens | CoT % |
|---|---|---|---|---|---|---|
| Cantonese SFT | 36,745 | 49.1% | 51,907,374 | 29.3% | 16,354,573 | 31.5% |
| Distillation-like | 22,120 | 29.5% | 57,752,366 | 32.6% | 27,092,090 | 46.9% |
| Replay | 16,000 | 21.4% | 67,705,664 | 38.2% | 49,154,023 | 72.6% |
| Total | 74,865 | 100% | 177,365,404 | 100% | 92,600,686 | 52.2% |
| Checkpoint | Total | Mean | Med- ian | CoT to answer |
|---|---|---|---|---|
| 8B official | 3,927 | 491 | 502 | 2.94 |
| 8B chat vector | 3,743 | 468 | 512 | 3.27 |
| 8B SFT | 211 | 26 | 0 | 0.21 |
| 8B DPO | 2,652 | 332 | 357 | 1.29 |
| 8B GRPO | 1,855 | 232 | 237 | 1.09 |
| 30B-A3B Official | 8,335 | 1,042 | 1,023 | 6.25 |
| Measure | 8B Dense | 30B-A3B MoE |
|---|---|---|
| Generations with no reasoning | 64.5% | 13.2% |
| Reasoning length, mean (tokens) | 437 | 1,123 |
| Reasoning length, median (tokens) | 0 | 631 |
| Balanced length ratio | 21.1% | 53.2% |
| Judge, complete_cot | 2.36 | 4.33 |
| Judge, cot_cantonese | 1.93 | 3.19 |
| Generation Dimension | Verbose | Plain |
|---|---|---|
| Overall, 30B-A3B | 3.527 | 3.783 |
| Overall, 8B | 2.787 | 3.245 |
| Only Complete CoT, 8B | 1.705 | 3.017 |
| Step 1, arithmetic | Step 2, six environments | |||
| 8B | 30B-A3B | 8B | 30B-A3B | |
| Objective | Install output format and CoT language | Broaden the reward across tasks | ||
| Task term | Exact numeric verification | Six per-environment graders | ||
| Training rows | 7473 | 8,291 | 7,086 | |
| Policy initialisation | DPO Final Step | Step 1 Final Step | ||
| Tuning | Full | LoRA 64 | Full, FP8 | LoRA 64 |
| Factor | Condition | Value |
|---|---|---|
| Language | Dominant script Latin | 0.00 |
| Han, Cantonese or mixed | 1.00 | |
| Han, neutral | 0.55 | |
| Han, Mandarin | 0.10 | |
| Script | Fewer than two listed characters | 1.00 |
| Share 0.05 | 1.00 |
| Environment | Source | Rows |
|---|---|---|
| Mathematics | Nemotron, adapted | 3,917 |
| Code Generation | Nemotron, adapted | 2,505 |
| STEM Multiple Choice | Nemotron, adapted | 2,208 |
| Workplace Assistant | Nemotron, adapted | 796 |
| Instruction Following | Built for this work | 2,525 |
| Structured Outputs | Built for this work | 1,274 |
| Environment | en | yue | Gap |
|---|---|---|---|
| Mathematics | 0.631 | 0.384 | 0.247 |
| Workplace assistant | 0.451 | 0.262 | 0.189 |
| Code generation | 0.313 | 0.208 | 0.105 |
| STEM multiple choice | 0.491 | 0.431 | 0.060 |
| Structured outputs | 0.781 | 0.769 | 0.012 |
| Instruction following | 0.461 | 0.458 | 0.003 |
| Model | MMLU | Canto MMLU | Cultural | Linguistic | Academic & Prof. | Avg. | |
|---|---|---|---|---|---|---|---|
| Qwen3 8B | 81.08 | 76.68 | 57.94 | 39.50 | 81.61 | 67.36 | - |
| 8B Chat Vector | 80.04 | 76.96 | 66.67 | 41.50 | 82.36 | 69.51 | 3.18% |
| 8B SFT | 64.23 | 56.15 | 47.62 | 23.00 | 53.97 | 48.99 | -27.27% |
| 8B DPO | 69.19 | 61.85 | 59.52 | 34.00 | 71.35 | 59.18 | -12.14% |
| 8B GRPO | 73.86 | 69.73 | 58.33 | 36.00 | 76.08 | 62.80 | -6.77% |
| Qwen3 30B-A3B Thinking 2507 | 86.65 | 82.52 | 68.65 | 57.00 | 86.70 | 76.30 | - |
Appendix figures & tables31 assets
Supplementary material from the paper’s appendix.
Appendix
| Category | Documents | Tokens | % |
|---|---|---|---|
| Common Crawl, Written Chinese stream | 141,230 | 215,407,694 | 27.5% |
| Encyclopaedic (cross-lingual Wikipedia, HK wiki) | 27,980 | 98,147,161 | 12.5% |
| English replay (Nemotron) | 177,621 | 163,657,706 | 20.9% |
| Web fiction and creative writing | 6,819 | 133,788,878 | 17.1% |
| News, periodicals and synthetic commentary | 69,268 | 65,854,845 | 8.4% |
| Common Crawl, Cantonese stream | 31,505 | 42,390,861 | 5.4% |
| Quantity | Value |
|---|---|
| Rows | 28,478 |
| Articles per cluster (median) | 2 |
| Articles per cluster (mean) | 3.16 |
| Articles per cluster (max) | 10 |
| Distinct persona occupations | 1,643 |
| Generated length (median) | 528 chars |
| Setting | Value |
|---|---|
| Sequence length | 4,096 |
| Multi-document packing | enabled |
| Per-device batch size | 4 |
| Devices | TPU v6e-64 |
| Gradient accumulation steps | 4 |
| Optimizer | AdamW |
| 8B Dense | 30B-A3B MoE | |
| Step Time (s) | 11.0 | 21.2 |
| TFLOPS per Chip | 292.7 | 71.5 |
| Model FLOPs util. (%) | 32% | 8% |
| Agg. throughput (tokens/s) | 382K | 198K |
| Wall-clock (hour) | 1.62 | 3.12 |
| Chip-hours per run | 103 | 199 |
| Model | MMLU | Canto MMLU | Cultural | Linguistic | Academic & Prof. | Avg. | |
|---|---|---|---|---|---|---|---|
| Qwen3 8B Base | 76.78 | 71.04 | 61.11 | 30.00 | 76.44 | 63.07 | - |
| CPT, 520 steps | 76.18 | 70.76 | 64.68 | 36.00 | 77.73 | 65.07 | 3.17% |
| CPT, 530 steps | 75.94 | 70.92 | 66.27 | 35.00 | 77.49 | 65.12 | 3.25% |
| CPT, 540 steps | 76.18 | 70.93 | 67.46 | 32.00 | 77.66 | 64.85 | 2.81% |
| Model | MMLU | Canto MMLU | Cultural | Lin- guistic | Academic & Prof. | Avg. | Final Loss | |
|---|---|---|---|---|---|---|---|---|
| Qwen3 30B-A3B Base | 81.33 | 75.79 | 65.87 | 35.50 | 79.94 | 67.69 | - | 1.83 |
| LR 1.0 10 -5 | 80.91 | 75.26 | 68.65 | 35.50 | 80.71 | 68.21 | 0.77% | 1.69 |
| LR 1.5 10 -5 | 80.78 | 75.37 | 68.25 | 37.00 | 80.95 | 68.47 | 1.16% | 1.66 |
| LR 2.0 10 -5 | 80.66 | 75.1 | 67.86 | 36.00 | 80.50 | 68.02 | 0.50% | 1.63 |
| LR 2.5 10 -5 | 80.61 | 75.14 | 68.65 | 34.00 | 80.01 | 67.68 | 0.00% | n.a. |
| LR 3.0 10 -5 | 80.43 | 74.98 | 68.65 | 33.00 | 79.67 | 67.35 | -0.50% | 1.59 |
| Model | MMLU | Canto MMLU | Cultural | Linguistic | Academic & Prof. | Avg. | |
|---|---|---|---|---|---|---|---|
| Qwen3 8B | 81.08 | 76.68 | 57.94 | 39.50 | 81.61 | 67.36 | - |
| 8B Chat Vector | 80.04 | 76.96 | 66.67 | 41.50 | 82.36 | 69.51 | 3.18% |
| Qwen3 30B-A3B Thinking 2507 | 86.65 | 82.52 | 68.65 | 57.00 | 86.70 | 76.30 | - |
| 30B-A3B Chat Vector | 80.71 | 80.26 | 70.24 | 55.00 | 85.59 | 74.36 | -2.55% |
| Task group | Rows | % |
|---|---|---|
| Language form and translation | 20,274 | 55.2% |
| Corpus curation | 6,575 | 17.9% |
| Reasoning and examination | 5,590 | 15.2% |
| Hong Kong grounded content | 1,878 | 5.1% |
| Long-form narrative | 1,402 | 3.8% |
| Multi-turn dialogue | 764 | 2.1% |
| HuggingFace Source | Rows | Tokens (M) | CoT Tokens (M) | CoT Share | |
|---|---|---|---|---|---|
| Kimi 2.5 | ianncity/KIMI-K2.5-1000000x | 11,594 | 35.6 | 14.5 | 41.0% |
| Nemotron Math & Science | nvidia/Nemotron-Math-v2 nvidia/Nemotron-Science-v1 | 3,902 | 11.3 | 7.8 | 69.5% |
| Qwen3 | - | 6,624 | 10.8 | 4.7 | 43.4% |
| Total | - | 22,120 | 57.8 | 27.0 | 46.7% |
| Portion | Uni- que | Re- peat | Pas- ses |
|---|---|---|---|
| Cantonese, duplicated | 17,183 | 2 | 6 |
| Cantonese, single | 2,379 | 1 | 3 |
| Distillation-like | 22,120 | 1 | 3 |
| Replay | 16,000 | 1 | 3 |
| Total | 57,682 | 1.30 |
| Setting | 8B dense | 30B-A3B MoE |
|---|---|---|
| Framework | LLaMA-Factory ( Zheng et al., 2024 ) | NeMo-RL (Megatron backend, Ray cluster) |
| Hardware | 8 H100 HBM3 80 GB, 1 node | 16 H100 HBM2e 94 GB, 4 nodes |
| Parallelism | 8-way data parallel | EP 16, DP 1, TP 1, PP 1, CP 1 |
| Dataset variant | Hybrid (154,637,972 Tokens) | Full (177,365,404 tokens) |
| Sequence length | 8,192, neat packing | 8,192, modified first-fit decreasing packing |
| Global batch | 64 sequences (2 per device, 4 accumulation) | 128 sequences (1 per device, 128 accumulation) |
| Reasoning span | SC per 1k Han | Probe with SC |
|---|---|---|
| 8B Chat Vector | 191.1 | 7 / 8 |
| 8B SFT | 0.0 | 0 / 8 |
| 30B-A3B Chat Vector | 0.0 | 0 / 8 |
| 30B-A3B SFT | 0.0 | 0 / 8 |
| Component | Source | Range | Weight |
|---|---|---|---|
| Overall | Judge | 1–5 | 3.0 |
| Complete response | Judge | 1–5 | 3.0 |
| Complete CoT | Judge | 1–5 | 2.0 |
| Reasoning language | Classifier | 0/0.3/0.5/1 | 2.0 |
| Response length | Generation | log chars | 1.5 |
| Reasoning length | Generation | log chars | 0.8 |
| Pairs | Side | CoT Mean | CoT Median | Resp. Mean | |
|---|---|---|---|---|---|
| 8B | 12,204 | chosen | 1,114 | 632 | 885 |
| rejected | 122 | 0 | 606 | ||
| 30B | 14,679 | chosen | 1,124 | 733 | 1,861 |
| rejected | 766 | 268 | 880 |
| Setting | 8B dense | 30B-A3B MoE |
|---|---|---|
| Base checkpoint | SFT checkpoint at 801 steps | SFT checkpoint at 1,575 steps |
| Hardware | 4 H100 HBM2e 94 GB GPUs, 1 node | 32 H100 HBM2e 94 GB GPUs, 8 nodes |
| Parallelism | TP 4, DP 1, PP 1 | EP 32, DP 32, TP 1, PP 1 |
| Preference pairs | 12,204 (11,594 train, 610 validation) | 14,679 (13,946 train, 733 validation) |
| Global batch | 16 pairs (1 per device, 16 accumulation) | 32 pairs (1 per device, 1 accumulation) |
| Steps and warmup | 724 steps, 72 warmup | 435 steps, 44 warmup |
| Auxiliary | Curve |
|---|---|
| Reasoning steps | 3 indicators 1.0, 2 indicators 0.7, |
| 1 indicator 0.5, none 0 | |
| Response content | 30–500 characters 1.0, 500–1,000 |
| cosine decay to 0.4, 1,000 at 0.4 | |
| Reasoning length | 100 characters 0.1, 100–1,300 at 1.0, |
| 1,300–3,584 cosine decay 1.0 to 0.5 |
| Qwen3-8B | Qwen3-30B-A3B | |
| Policy initialisation | DPO checkpoint, step 724 | DPO checkpoint, step 435 |
| Chat template | checkpoint’s native hybrid | checkpoint’s native hybrid |
| Parallelism | TP 1, PP 2, DP 2 | TP 2, PP 1, EP 4, DP 4, sequence parallel |
| Generation engine | vLLM TP 1, memory utilisation 0.6 | vLLM TP 4 decoupled, memory utilisation 0.5 |
| Tuning | Full fine-tune | LoRA, 64, 128, all linear |
| Learning rate | 1.0 10 -6 to 1.0 10 -7 | 1.0 10 -5 to 1.0 10 -7 |
| Setting | Step 1 | Step 2 |
|---|---|---|
| Task term | one verifier | six graders |
| Sequence length | 4,096 | 16,384 |
| Rollouts per step | 128 | 192 |
| Rollout precision | BF16 | FP8 for 8B |
| Training precision | BF16 | FP8 for 8B |
| Importance-sampling correction | off | on |
| # | Change | Steps | Outcome |
|---|---|---|---|
| 1 | correction disabled | 115 | entropy 82%, |
| gradient norm 643 | |||
| 2 | correction enabled, | 79 | stable, entropy |
| truncation at 2.0 | still 54% | ||
| 3 | memory utilisation 0.75 | 2 | out of memory during |
| generation wake |
| 8B Dense | 30B-A3B MoE | |||
|---|---|---|---|---|
| h | % | h | % | |
| Generation | 0.99 | 37 | 0.94 | 23 |
| Policy training | 0.60 | 22 | 1.64 | 41 |
| Log-probabilities | 0.44 | 16 | 1.12 | 28 |
| Preparation for generation | 0.40 | 15 | 0.22 | 5 |
| Remainder | 0.28 | 10 | 0.10 | 3 |
| Disposition | Types | Basis |
|---|---|---|
| Transferred unchanged | 22 | Language-neutral, such as counts of paragraphs, sections or bullet points |
| Re-implemented | 17 | Depend on the writing system, so recounted over Jieba word segmentation, full-width punctuation and characters rather than words |
| Dropped | 9 | Specific to the Latin alphabet, such as capitalisation and letter-frequency rules |
| Retained from English | 39 | |
| Added for the targets | 13 | New types defined over Cantonese and written Chinese orthography and phonology |
| Cantonese variant | 52 |
Low-Resource Language Processing
Low-resource language processing builds and evaluates language technologies for languages with limited data, tools, or digital representation.
See all 565 papers