recipe.toml 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # MiMo-V2.6-Pro-MOPD on 8x DGX Spark — SparkRing runtime stack applied to the
  2. # Pro model (operator 2026-09-29: MOPD only, RL lanes retired — RL keeps
  3. # training artifacts). There is NO upstream SparkRing profile for Pro, so this
  4. # adapts our qualified tp4 contract: tp/nnodes/draft-tp = 8, per-model cache
  5. # namespace, served name TP8.
  6. #
  7. # Verified 2026-09-29:
  8. # * snapshot XiaomiMiMo/MiMo-V2.6-Pro-MOPD @ adea8e2c5373, 573.5 GB (NAS);
  9. # * config arch `MiMoV2ForCausalLM` (same as Flash → their qualified
  10. # Omni hf-overrides apply) and `processor_config` byte-equal to Flash's;
  11. # * dflash/ draft present (dflash_draft_model.safetensors + dflash.py);
  12. # * quant fp8 e4m3 + mxfp4_block_size → b12x MXFP4/MXFP8 backend, same env.
  13. #
  14. # Intended cluster: `8nodes-switch` (all 8; fleet coordination — prod must be
  15. # down first; sparkring image sits only on dgx5-8 → `--sync-image` ships it).
  16. # KV at TP8: weights ≈ 72 GiB/rank → auto pool ≈ 20-25 GiB ≈ 1M-1.2M tokens.
  17. # Details: specs/tech-architecture/sparkring-mimo-lanes.md
  18. engine = "vllm"
  19. name = "MiMo-V2.6-Pro-MOPD (SparkRing installer image, 8x switched)"
  20. docker_image = "ghcr.io/fujitsupolycom/sparkring@sha256:c977a2d2efb7ecf9ea856cd0379fdd93a8913f0770f4627a3ae00a084cfaf582"
  21. entrypoint = ["python3", "/opt/sparkring/toolchain/toolchain.py", "serve"]
  22. # Pin = our vendored NAS revision (there is no upstream Pro profile to
  23. # cross-check against); snapshot carries dflash/ for the draft loader.
  24. model = "/root/.cache/huggingface/hub/models--XiaomiMiMo--MiMo-V2.6-Pro-MOPD/snapshots/adea8e2c5373181e5a973fa1ecb343cb31af214b"
  25. parent_model = "XiaomiMiMo/MiMo-V2.6-Pro-MOPD"
  26. port = 30000
  27. required_nodes = 8
  28. tensor_parallel_size = 8
  29. pipeline_parallel_size = 1
  30. distributed_backend = "mp"
  31. shm_size = "32gb"
  32. devices = ["/dev/infiniband"]
  33. args = [
  34. "--served-model-name", "MiMo-V2.6-Pro-MOPD-TP8",
  35. "--trust-remote-code",
  36. "--distributed-executor-backend", "mp",
  37. "--gpu-memory-utilization", "0.85",
  38. "--block-size", "128",
  39. # 524288 prod parity. (2026-09-29: the c2 "collapse" A/B at their 262144
  40. # was bit-identical — it later proved to be a BENCH artifact, not engine;
  41. # see specs/tech-architecture/sparkring-mimo-lanes.md.)
  42. "--max-model-len", "524288",
  43. "--max-num-seqs", "16",
  44. "--max-num-batched-tokens", "8192",
  45. "--model-loader-extra-config", """
  46. '{"read_mode":"bounce","io_threads":8}'""",
  47. "--enable-chunked-prefill",
  48. "--enable-prefix-caching",
  49. "--attention-backend", "B12X",
  50. "--linear-backend", "b12x",
  51. "--moe-backend", "b12x",
  52. "--no-enable-flashinfer-autotune",
  53. "--load-format", "b12x",
  54. "--kv-cache-dtype", "bfloat16",
  55. # NOTE: our nightly's `--kernel-config {enable_flashinfer_autotune:false}`
  56. # is mutually exclusive with their `--no-enable-flashinfer-autotune`
  57. # (ValueError at engine build) — their qualified shape wins, kernel-config
  58. # is dropped for this lane.
  59. # Their qualified multimodal shape: full Omni + data-parallel encoder
  60. # (this fork auto-falls back to weights for MiMo: "model does not support
  61. # --mm-encoder-tp-mode data"), per-prompt media limits, video kwargs,
  62. # pinned processor config.
  63. # Their qualified multimodal shape: full Omni + data-parallel encoder,
  64. # per-prompt media limits, video kwargs, pinned processor config.
  65. "--decode-context-parallel-size", "1",
  66. "--enable-prompt-tokens-details",
  67. "--limit-mm-per-prompt", """
  68. '{"image":3,"video":1,"audio":1}'""",
  69. "--mm-processor-cache-gb", "0",
  70. "--mm-encoder-tp-mode", "data",
  71. "--media-io-kwargs", """
  72. '{"video":{"num_frames":8}}'""",
  73. "--hf-overrides", """
  74. '{"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}}'""",
  75. # Draft: dflash/ inside the pinned snapshot (their /models/target/dflash).
  76. "--speculative-config", """
  77. '{"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":{}}}'""",
  78. "--compilation-config", """
  79. '{"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]}'""",
  80. "--reasoning-parser", "mimo",
  81. "--tool-call-parser", "mimo",
  82. "--enable-auto-tool-choice",
  83. "--generation-config", "vllm",
  84. ]
  85. # One cache root for their /cache layout (eight *_CACHE_DIR keys below point
  86. # here; first boot warms JIT into it, the B12X selection-cache fix persists
  87. # across restarts — the single-mount story our nightly lane never had).
  88. [[extra_mounts]]
  89. host = "~/sm121-cache/sparkring-pro-8x"
  90. container = "/cache"
  91. [env]
  92. # --- SparkRing compose environment, verbatim except the noted drops ------
  93. HF_HUB_OFFLINE = "1"
  94. TRANSFORMERS_OFFLINE = "1"
  95. VLLM_WORKER_MULTIPROC_METHOD = "spawn"
  96. PYTORCH_CUDA_ALLOC_CONF = "expandable_segments:True"
  97. OMP_NUM_THREADS = "16"
  98. MAX_JOBS = "16"
  99. VLLM_ENABLE_PCIE_ALLREDUCE = "0"
  100. VLLM_ENABLE_ROCE_ALLREDUCE = "1"
  101. VLLM_ROCE_ALLREDUCE_MAX_SIZE = "2097152"
  102. VLLM_ROCE_ALLGATHER_MAX_SIZE = "16777216"
  103. SPARKCACHE_ENABLED = "0"
  104. SOURCE_IMAGE_PROFILE = ""
  105. B12X_POLICY_MODE = "auto"
  106. NCCL_NET = "IB"
  107. NCCL_NET_PLUGIN = "none"
  108. NCCL_IB_DISABLE = "0"
  109. NCCL_IB_EXTENDED_IPV4_GIDS = "1"
  110. NCCL_IB_MERGE_NICS = "0"
  111. NCCL_IB_PRESERVE_PCI_DOMAIN = "1"
  112. NCCL_IB_ROUTE_DIAGNOSTICS = "1"
  113. NCCL_IB_SUBNET_AWARE_ROUTING = "1"
  114. NCCL_IGNORE_CPU_AFFINITY = "1"
  115. NCCL_CROSS_NIC = "1"
  116. NCCL_ALGO = "Ring"
  117. NCCL_CUMEM_ENABLE = "0"
  118. NCCL_DEBUG = "WARN"
  119. NCCL_DEBUG_SUBSYS = "NET,INIT,GRAPH"
  120. NCCL_MAX_NCHANNELS = "4"
  121. NCCL_MIN_NCHANNELS = "4"
  122. NCCL_P2P_LEVEL = "SYS"
  123. NCCL_PROTO = "LL,LL128,Simple"
  124. NCCL_IB_GID_INDEX = "3"
  125. # Their bundled NCCL 2.32.3 (loader search tree inside the image).
  126. NCCL_ROOT = "/opt/sparkring/toolchain/nccl"
  127. NCCL_LIB_DIR = "/opt/sparkring/toolchain/nccl/lib"
  128. NCCL_INCLUDE_DIR = "/opt/sparkring/toolchain/nccl/include"
  129. NCCL_LOCAL_INFERENCE_PATH = "/opt/sparkring/toolchain/nccl/lib/libnccl.so.2"
  130. VLLM_NCCL_SO_PATH = "/opt/sparkring/toolchain/nccl/lib/libnccl.so.2"
  131. VLLM_NCCL_INCLUDE_PATH = "/opt/sparkring/toolchain/nccl/include"
  132. CUDA_HOME = "/usr/local/cuda-13.4"
  133. CUDA_PATH = "/usr/local/cuda-13.4"
  134. CUDA_VERSION = "13.4.2"
  135. VLLM_USE_V2_MODEL_RUNNER = "1"
  136. VLLM_MXFP8_LM_HEAD = "0"
  137. VLLM_LM_HEAD_A16 = "1"
  138. VLLM_B12X_MOE_FP4_FORCE_A16 = "0"
  139. VLLM_KV_CACHE_LAYOUT = "BLHNC"
  140. VLLM_PLUGINS = "b12x_loader,sparkring_status"
  141. # DIAGNOSIS CLOSED 2026-09-29: the c2 depth "collapse" was the bench's
  142. # own default (llama-benchy without --enable-prefix-caching serializes
  143. # cold 67K prefills per pair — artifact, not engine). DEBUG removed.
  144. B12X_ROCE_GID_INDEX = "3"
  145. SPARKRING_FEATURES = ""
  146. SPARKRING_TOOL_CHOICE_CONTRACT = "1"
  147. SIRCL_ENABLED = "0"
  148. VLLM_SPARK_TP4_MODE = ""
  149. VLLM_SPARK_TP4_VOCAB_MODE = ""
  150. # --- caches under /cache (compose names, verbatim) -----------------------
  151. XDG_CACHE_HOME = "/cache/mimo-v26-pro-mopd-4b7049d1e00f-adea8e2c5373"
  152. VLLM_CACHE_ROOT = "/cache/mimo-v26-pro-mopd-4b7049d1e00f-adea8e2c5373/vllm"
  153. TORCHINDUCTOR_CACHE_DIR = "/cache/mimo-v26-pro-mopd-4b7049d1e00f-adea8e2c5373/inductor"
  154. TRITON_CACHE_DIR = "/cache/mimo-v26-pro-mopd-4b7049d1e00f-adea8e2c5373/triton"
  155. CUTE_DSL_CACHE_DIR = "/cache/mimo-v26-pro-mopd-4b7049d1e00f-adea8e2c5373/cute"
  156. TILELANG_CACHE_DIR = "/cache/mimo-v26-pro-mopd-4b7049d1e00f-adea8e2c5373/tilelang"
  157. TVM_FFI_CACHE_DIR = "/cache/mimo-v26-pro-mopd-4b7049d1e00f-adea8e2c5373/tvm-ffi"
  158. FLASHINFER_WORKSPACE_BASE = "/cache/mimo-v26-pro-mopd-4b7049d1e00f-adea8e2c5373/flashinfer"
  159. B12X_COMPILE_CACHE_DIR = "/cache/mimo-v26-pro-mopd-cuda13.4.2-adea8e2c5373/b12x"
  160. # --- launcher-controlled bits -------------------------------------------
  161. VLLM_ENGINE_READY_TIMEOUT_S = "3600"
  162. VLLM_NO_USAGE_STATS = "1"
  163. # DROPPED on purpose (see header): NCCL_SWITCHLESS_RING_ONLY,
  164. # B12X_ROCE_OPPOSITE_PATHS, B12X_ROCE_PEER_HCA_MAP, B12X_ROCE_HCA,
  165. # NCCL_IB_HCA (cluster block: f0 pair), NCCL_SOCKET_IFNAME/GLOO (cluster
  166. # block: enp1s0f0np0), SPARKRING_TRANSPORT_* (ring pacing), mem_limit.