NVIDIA-Nemotron-Nano-9B-v2-Japanese is a hybrid Mamba-Transformer model (Nemotron-H architecture) optimized for the Japanese language. It achieves top-tier performance among sub-10B models on the Nejumi Leaderboard 4, Japan's most comprehensive LLM evaluation platform.
Note on MLX inference speed: This model uses the Mamba-2 hybrid architecture (Nemotron-H), which relies on state space model (SSM) computations instead of standard attention. On Apple Silicon via MLX, SSM kernels are not yet as optimized as attention-based operations, resulting in slower token generation than comparably-sized Transformer models. NVIDIA's reported speed figures are CUDA-specific and should not be expected on MLX. See the fp16 version for details.
Tested on Apple MacBook Pro M4 Max (128GB):
Metric
Value
Peak Memory
9.6 GB
Prompt Processing
~105 tokens/sec
Token Generation
~46 tokens/sec
Quality Evaluation
Disclaimer: Preliminary evaluation by the model converter. Not an official benchmark. See the fp16 version for full methodology and comparative results.
This model uses reasoning traces (<think>...</think>) by default. The original NVIDIA model supports /think and /no_think system prompts to control reasoning, but on MLX (mlx-lm / LM Studio MLX backend), /no_think does not suppress reasoning traces. See the known limitation below.
⚠️ Known Limitation: /no_think on MLX (mlx-lm / LM Studio MLX backend)
/no_think does not suppress reasoning traces when running via mlx-lm or LM Studio's MLX backend. The model generates <think>...</think> traces regardless of the /no_think directive, and the output length is identical to /think mode. This is an upstream behavior — the original NVIDIA model's chat_template always inserts <think>, and /no_think is designed to be handled by the inference engine (e.g., vLLM on CUDA), not the prompt template.
Impact on LM Studio (MLX backend): The MLX backend does not separate <think> content from the response. Reasoning tokens consume the max_tokens budget, which can cause empty responses if max_tokens is too low (e.g., 1500). Set max_tokens to 4096 or higher as a workaround.
GGUF format is not affected — LM Studio's llama.cpp backend correctly separates reasoning content from response content.
LM Studio
⚠️ LM Studio v1.5.0/v1.6.0 Known Issue: All Nemotron 9B series models fail to load with KeyError: '-' in LM Studio v1.5.0. This is a LM Studio bug, not a model issue. v1.4.0 and earlier work without any patch. The Japanese MLX versions published by tocchitocchi have been verified working on v1.5.0 with the patches below.
Three files need to be patched under LM Studio's bundled Python packages. Apply once, then restart LM Studio.
The model files in this repository are already fixed and ready to use. The following instructions are only for those who want to convert the original model themselves.
Important: When converting this model from the original safetensors using mlx_lm.convert, two manual fixes are required after conversion. Without these fixes, the model will produce broken output.
1. Replace tokenizer_config.json
The conversion process generates a simplified tokenizer_config.json with "tokenizer_class": "TokenizersBackend", which is incorrect. Replace it with the original from NVIDIA:
import json
with open('config.json') as f:
cfg = json.load(f)
cfg['torch_dtype'] = 'bfloat16'
if 'dtype' in cfg:
del cfg['dtype']
for key in ['quantization', 'quantization_config']:
if 'mode' in cfg.get(key, {}):
del cfg[key]['mode']
cfg['time_step_limit'] = [0.0, float('inf')]
with open('config.json', 'w') as f:
json.dump(cfg, f, indent=4)
MLXでの推論速度について: このモデルはMamba-2ハイブリッドアーキテクチャ(Nemotron-H)を採用しており、通常のAttentionではなくState Space Model(SSM)演算を使用しています。Apple SiliconのMLXではSSMカーネルの最適化がAttentionベースの演算ほど進んでおらず、同規模のTransformerモデルより生成速度が遅くなります。NVIDIAが公表している速度数値はCUDA環境での結果であり、MLX環境では期待できません。詳細はfp16版を参照してください。
import json
with open('config.json') as f:
cfg = json.load(f)
cfg['torch_dtype'] = 'bfloat16'
if 'dtype' in cfg:
del cfg['dtype']
for key in ['quantization', 'quantization_config']:
if 'mode' in cfg.get(key, {}):
del cfg[key]['mode']
cfg['time_step_limit'] = [0.0, float('inf')]
with open('config.json', 'w') as f:
json.dump(cfg, f, indent=4)