Explorar o código

recipes/mimo-*-sparkring: float the model id + dflash drafter

Same model-revision anti-pattern as kindling (fixed earlier): model and
the dflash drafter were hard-pinned to container-side snapshot hashes.

Now:
  - model = org/model id (XiaomiMiMo/MiMo-V2.6-{Flash,Pro}-MOPD), resolved
    by the engine via the NAS HF cache refs/main.
  - the speculative-config drafter uses the {{dflash}} path-ref (repo +
    subfolder='dflash'), resolved per node via refs/main — floats with the
    model.
  - the pinned snapshot (2479e2d0 / adea8e2c) stays in a header comment,
    informational only.

Verified: refs/main exists for both MiMo models on the NAS and points at
the same snapshots as the old pins, so today's behavior is unchanged.
Dry-run confirms the launcher accepts the repo+subfolder path-ref.
Alexander Korolev hai 3 semanas
pai
achega
7559d62476

+ 15 - 4
recipes/mimo26-flash-mopd-2x-sparkring/recipe.toml

@@ -22,9 +22,11 @@ engine = "vllm"
 name = "MiMo-V2.6-Flash-MOPD (SparkRing installer image, 2x DAC pair)"
 docker_image = "ghcr.io/fujitsupolycom/sparkring@sha256:c977a2d2efb7ecf9ea856cd0379fdd93a8913f0770f4627a3ae00a084cfaf582"
 entrypoint = ["python3", "/opt/sparkring/toolchain/toolchain.py", "serve"]
-# Pin = their profile revision (verified: config/index sha256 match the
-# profile); flat snapshot dir contains dflash/ for the draft loader.
-model = "/root/.cache/huggingface/hub/models--XiaomiMiMo--MiMo-V2.6-Flash-MOPD/snapshots/2479e2d0029eca9a34cc7e7f55a121925f81908e"
+# Floating model: the engine resolves the org/model id via the NAS HF cache
+# (refs/main -> latest snapshot; the flat snapshot dir carries dflash/ for the
+# draft loader). Their pin 2479e2d0 (profile config/index sha256 match) is
+# what refs/main points at on 2026-10-02 — informational only.
+model = "XiaomiMiMo/MiMo-V2.6-Flash-MOPD"
 parent_model = "XiaomiMiMo/MiMo-V2.6-Flash-MOPD"
 port = 30000
 required_nodes = 2
@@ -78,7 +80,7 @@ args = [
 '{"architectures":["MiMoV2OmniForCausalLM"],"processor_config":{"audio_avg_pooler":2,"audio_channels":20,"audio_end_token_id":151674,"audio_fmax":null,"audio_fmin":0,"audio_group_size":4,"audio_hop_length":240,"audio_input_id_per_second":25.0,"audio_kernel_size":3,"audio_n_mels":128,"audio_nfft":960,"audio_sampling_rate":24000,"audio_segment_size":6000,"audio_start_token_id":151673,"audio_stride_size":2,"audio_token_id":151669,"audio_window_size":960,"audio_zeroemb_idx":[1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024],"fps":1.0,"image_max_pixels":1048576,"image_min_pixels":8192,"image_token_id":151655,"max_frames":8,"merge_size":2,"min_frames":null,"num_frames":null,"pad_token_id":151643,"patch_size":16,"rope_type":"rope","temporal_compression_ratio":1,"temporal_patch_size":2,"use_per_grid_t_timestamps":false,"use_video_timestamps":true,"video_audio_interleave_length":0.0,"video_end_token_id":151671,"video_max_pixels":262144,"video_min_pixels":8192,"video_process_num_threads":16,"video_start_token_id":151670,"video_token_id":151656,"video_tokens_per_second":2,"video_total_max_pixels":268435456,"vision_end_token_id":151653,"vision_start_token_id":151652}}'""",
     # Draft: dflash/ inside the pinned snapshot (their /models/target/dflash).
     "--speculative-config", """
-'{"model":"/root/.cache/huggingface/hub/models--XiaomiMiMo--MiMo-V2.6-Flash-MOPD/snapshots/2479e2d0029eca9a34cc7e7f55a121925f81908e/dflash","method":"dflash","num_speculative_tokens":5,"draft_tensor_parallel_size":2,"kv_cache_dtype":"bfloat16","attention_backend":"B12X","draft_load_config":{"load_format":"safetensors","model_loader_extra_config":{}}}'""",
+'{"model":"{{dflash}}","method":"dflash","num_speculative_tokens":5,"draft_tensor_parallel_size":2,"kv_cache_dtype":"bfloat16","attention_backend":"B12X","draft_load_config":{"load_format":"safetensors","model_loader_extra_config":{}}}'""",
     "--compilation-config", """
 '{"pass_config":{"fuse_act_quant":true},"cudagraph_mode":"FULL_AND_PIECEWISE","max_cudagraph_capture_size":96,"cudagraph_capture_sizes":[1,2,4,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96]}'""",
     "--reasoning-parser", "mimo",
@@ -87,6 +89,15 @@ args = [
     "--generation-config", "vllm",
 ]
 
+# DFlash drafter: the dflash/ subfolder of the main model repo, resolved per
+# node via refs/main (floats with the model); substituted into the
+# speculative-config as {{dflash}}. No bind-mount — the HF cache is already
+# mounted at /root/.cache/huggingface.
+[[extra_mounts]]
+repo = "XiaomiMiMo/MiMo-V2.6-Flash-MOPD"
+subfolder = "dflash"
+container = "dflash"
+
 # One cache root for their /cache layout (eight *_CACHE_DIR keys below point
 # here; first boot warms JIT into it, the B12X selection-cache fix persists
 # across restarts — the single-mount story our nightly lane never had).

+ 15 - 4
recipes/mimo26-flash-mopd-4x-sparkring/recipe.toml

@@ -45,9 +45,11 @@ engine = "vllm"
 name = "MiMo-V2.6-Flash-MOPD (SparkRing installer image, 4x switched)"
 docker_image = "ghcr.io/fujitsupolycom/sparkring@sha256:c977a2d2efb7ecf9ea856cd0379fdd93a8913f0770f4627a3ae00a084cfaf582"
 entrypoint = ["python3", "/opt/sparkring/toolchain/toolchain.py", "serve"]
-# Pin = their profile revision (verified: config/index sha256 match the
-# profile); flat snapshot dir contains dflash/ for the draft loader.
-model = "/root/.cache/huggingface/hub/models--XiaomiMiMo--MiMo-V2.6-Flash-MOPD/snapshots/2479e2d0029eca9a34cc7e7f55a121925f81908e"
+# Floating model: the engine resolves the org/model id via the NAS HF cache
+# (refs/main -> latest snapshot; the flat snapshot dir carries dflash/ for the
+# draft loader). Their pin 2479e2d0 (profile config/index sha256 match) is
+# what refs/main points at on 2026-10-02 — informational only.
+model = "XiaomiMiMo/MiMo-V2.6-Flash-MOPD"
 parent_model = "XiaomiMiMo/MiMo-V2.6-Flash-MOPD"
 port = 30000
 required_nodes = 4
@@ -104,7 +106,7 @@ args = [
 '{"architectures":["MiMoV2OmniForCausalLM"],"processor_config":{"audio_avg_pooler":2,"audio_channels":20,"audio_end_token_id":151674,"audio_fmax":null,"audio_fmin":0,"audio_group_size":4,"audio_hop_length":240,"audio_input_id_per_second":25.0,"audio_kernel_size":3,"audio_n_mels":128,"audio_nfft":960,"audio_sampling_rate":24000,"audio_segment_size":6000,"audio_start_token_id":151673,"audio_stride_size":2,"audio_token_id":151669,"audio_window_size":960,"audio_zeroemb_idx":[1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024],"fps":1.0,"image_max_pixels":1048576,"image_min_pixels":8192,"image_token_id":151655,"max_frames":8,"merge_size":2,"min_frames":null,"num_frames":null,"pad_token_id":151643,"patch_size":16,"rope_type":"rope","temporal_compression_ratio":1,"temporal_patch_size":2,"use_per_grid_t_timestamps":false,"use_video_timestamps":true,"video_audio_interleave_length":0.0,"video_end_token_id":151671,"video_max_pixels":262144,"video_min_pixels":8192,"video_process_num_threads":16,"video_start_token_id":151670,"video_token_id":151656,"video_tokens_per_second":2,"video_total_max_pixels":268435456,"vision_end_token_id":151653,"vision_start_token_id":151652}}'""",
     # Draft: dflash/ inside the pinned snapshot (their /models/target/dflash).
     "--speculative-config", """
-'{"model":"/root/.cache/huggingface/hub/models--XiaomiMiMo--MiMo-V2.6-Flash-MOPD/snapshots/2479e2d0029eca9a34cc7e7f55a121925f81908e/dflash","method":"dflash","num_speculative_tokens":5,"draft_tensor_parallel_size":4,"kv_cache_dtype":"bfloat16","attention_backend":"B12X","draft_load_config":{"load_format":"safetensors","model_loader_extra_config":{}}}'""",
+'{"model":"{{dflash}}","method":"dflash","num_speculative_tokens":5,"draft_tensor_parallel_size":4,"kv_cache_dtype":"bfloat16","attention_backend":"B12X","draft_load_config":{"load_format":"safetensors","model_loader_extra_config":{}}}'""",
     "--compilation-config", """
 '{"pass_config":{"fuse_act_quant":true},"cudagraph_mode":"FULL_AND_PIECEWISE","max_cudagraph_capture_size":96,"cudagraph_capture_sizes":[1,2,4,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96]}'""",
     "--reasoning-parser", "mimo",
@@ -113,6 +115,15 @@ args = [
     "--generation-config", "vllm",
 ]
 
+# DFlash drafter: the dflash/ subfolder of the main model repo, resolved per
+# node via refs/main (floats with the model); substituted into the
+# speculative-config as {{dflash}}. No bind-mount — the HF cache is already
+# mounted at /root/.cache/huggingface.
+[[extra_mounts]]
+repo = "XiaomiMiMo/MiMo-V2.6-Flash-MOPD"
+subfolder = "dflash"
+container = "dflash"
+
 # One cache root for their /cache layout (eight *_CACHE_DIR keys below point
 # here; first boot warms JIT into it, the B12X selection-cache fix persists
 # across restarts — the single-mount story our nightly lane never had).

+ 15 - 4
recipes/mimo26-pro-mopd-8x-sparkring/recipe.toml

@@ -21,9 +21,11 @@ engine = "vllm"
 name = "MiMo-V2.6-Pro-MOPD (SparkRing installer image, 8x switched)"
 docker_image = "ghcr.io/fujitsupolycom/sparkring@sha256:c977a2d2efb7ecf9ea856cd0379fdd93a8913f0770f4627a3ae00a084cfaf582"
 entrypoint = ["python3", "/opt/sparkring/toolchain/toolchain.py", "serve"]
-# Pin = our vendored NAS revision (there is no upstream Pro profile to
-# cross-check against); snapshot carries dflash/ for the draft loader.
-model = "/root/.cache/huggingface/hub/models--XiaomiMiMo--MiMo-V2.6-Pro-MOPD/snapshots/adea8e2c5373181e5a973fa1ecb343cb31af214b"
+# Floating model: the engine resolves the org/model id via the NAS HF cache
+# (refs/main -> latest snapshot; the snapshot carries dflash/ for the draft
+# loader). Our vendored NAS revision adea8e2c (no upstream Pro profile to
+# cross-check) is what refs/main points at on 2026-10-02 — informational only.
+model = "XiaomiMiMo/MiMo-V2.6-Pro-MOPD"
 parent_model = "XiaomiMiMo/MiMo-V2.6-Pro-MOPD"
 port = 30000
 required_nodes = 8
@@ -77,7 +79,7 @@ args = [
 '{"architectures":["MiMoV2OmniForCausalLM"],"processor_config":{"audio_avg_pooler":2,"audio_channels":20,"audio_end_token_id":151674,"audio_fmax":null,"audio_fmin":0,"audio_group_size":4,"audio_hop_length":240,"audio_input_id_per_second":25.0,"audio_kernel_size":3,"audio_n_mels":128,"audio_nfft":960,"audio_sampling_rate":24000,"audio_segment_size":6000,"audio_start_token_id":151673,"audio_stride_size":2,"audio_token_id":151669,"audio_window_size":960,"audio_zeroemb_idx":[1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024,1024],"fps":1.0,"image_max_pixels":1048576,"image_min_pixels":8192,"image_token_id":151655,"max_frames":8,"merge_size":2,"min_frames":null,"num_frames":null,"pad_token_id":151643,"patch_size":16,"rope_type":"rope","temporal_compression_ratio":1,"temporal_patch_size":2,"use_per_grid_t_timestamps":false,"use_video_timestamps":true,"video_audio_interleave_length":0.0,"video_end_token_id":151671,"video_max_pixels":262144,"video_min_pixels":8192,"video_process_num_threads":16,"video_start_token_id":151670,"video_token_id":151656,"video_tokens_per_second":2,"video_total_max_pixels":268435456,"vision_end_token_id":151653,"vision_start_token_id":151652}}'""",
     # Draft: dflash/ inside the pinned snapshot (their /models/target/dflash).
     "--speculative-config", """
-'{"model":"/root/.cache/huggingface/hub/models--XiaomiMiMo--MiMo-V2.6-Pro-MOPD/snapshots/adea8e2c5373181e5a973fa1ecb343cb31af214b/dflash","method":"dflash","num_speculative_tokens":5,"draft_tensor_parallel_size":8,"kv_cache_dtype":"bfloat16","attention_backend":"B12X","draft_load_config":{"load_format":"safetensors","model_loader_extra_config":{}}}'""",
+'{"model":"{{dflash}}","method":"dflash","num_speculative_tokens":5,"draft_tensor_parallel_size":8,"kv_cache_dtype":"bfloat16","attention_backend":"B12X","draft_load_config":{"load_format":"safetensors","model_loader_extra_config":{}}}'""",
     "--compilation-config", """
 '{"pass_config":{"fuse_act_quant":true},"cudagraph_mode":"FULL_AND_PIECEWISE","max_cudagraph_capture_size":96,"cudagraph_capture_sizes":[1,2,4,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96]}'""",
     "--reasoning-parser", "mimo",
@@ -86,6 +88,15 @@ args = [
     "--generation-config", "vllm",
 ]
 
+# DFlash drafter: the dflash/ subfolder of the main model repo, resolved per
+# node via refs/main (floats with the model); substituted into the
+# speculative-config as {{dflash}}. No bind-mount — the HF cache is already
+# mounted at /root/.cache/huggingface.
+[[extra_mounts]]
+repo = "XiaomiMiMo/MiMo-V2.6-Pro-MOPD"
+subfolder = "dflash"
+container = "dflash"
+
 # One cache root for their /cache layout (eight *_CACHE_DIR keys below point
 # here; first boot warms JIT into it, the B12X selection-cache fix persists
 # across restarts — the single-mount story our nightly lane never had).