recipe.toml 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # DeepSeek-V4.1-Flash (552B MoE, MXFP4 experts, Engram-on-disk) — 4x DGX Spark.
  2. #
  3. # Image: dsv41-flash:local (docker-images/dsv41-flash/ — tonyd2wild overlay
  4. # chain as clone-at-pin build: vllm dsv41-feat@e47aa780 + sm121
  5. # _C_stable_libtorch + FlashInfer 0.7.0rc1 + 7 boot-10 patches baked in,
  6. # MIT provenance).
  7. #
  8. # Model: deepseek-ai/DeepSeek-V4.1-Flash (476 GB on the NFS HF cache,
  9. # refs/main). The two 203 GB FP8 Engram n-gram tables are NEVER loaded into
  10. # HBM — the baked engram.py patch keeps them on disk (DSV41_ENGRAM_DISK=1)
  11. # and reads rows on demand. Node-local sparse copies of each rank's rows
  12. # (48 GB, engram-local.json) accelerate decode once created (DSV41_ENGRAM_DIR
  13. # below, added after the copies exist — first boot reads straight from NFS).
  14. #
  15. # Config mirrors their boot-10 serving setup (launch/dsv41-tp4.sh):
  16. # CUDA graphs FULL_AND_PIECEWISE + exact DSpark capture sizes (no padded
  17. # rows — padded speculative batches hang SM120 sparse MLA, FlashInfer
  18. # #5015), DSpark k=5 with the checkpoint's own draft layers, GMU 0.80,
  19. # 300K ctx (KV pool ~1.07M tokens = 3.57x headroom), tools + vision on,
  20. # thinking off by default.
  21. engine = "vllm"
  22. name = "DeepSeek-V4.1-Flash MXFP4 (dsv41 img, 4x, DSpark k=5, Engram-on-disk)"
  23. docker_image = "dsv41-flash:local"
  24. docker_image_dir = "dsv41-flash"
  25. model = "deepseek-ai/DeepSeek-V4.1-Flash"
  26. required_nodes = 4
  27. tensor_parallel_size = 4
  28. pipeline_parallel_size = 1
  29. distributed_backend = "mp"
  30. shm_size = "32gb"
  31. # NO recipe entrypoint: the base image bakes ENTRYPOINT ["vllm","serve"]
  32. # (vllm/vllm-openai), so the launcher's CMD (model + flags) completes it.
  33. args = [
  34. "--served-model-name", "dsv41",
  35. "--trust-remote-code",
  36. "--distributed-executor-backend", "mp",
  37. "--gpu-memory-utilization", "0.80",
  38. "--max-model-len", "300000",
  39. "--max-num-seqs", "8",
  40. "--max-num-batched-tokens", "8192",
  41. # boot-4 fix: the V4 indexer backend refuses the smallest-listed block
  42. "--block-size", "128",
  43. # boot-10: exact capture sizes for DSpark k=5, SEQS=8 (multiples of 5
  44. # and 6 up to 48 — every decode batch gets an exact FULL graph, no padding)
  45. "--compilation-config", """
  46. '{"cudagraph_mode":"FULL_AND_PIECEWISE","cudagraph_capture_sizes":[5,6,10,12,15,18,20,24,25,30,35,36,40,42,48]}'""",
  47. "--speculative-config", """
  48. '{"method":"dspark","num_speculative_tokens":5,"draft_sample_method":"probabilistic","rejection_sample_method":"block","enable_adaptive_verification":false}'""",
  49. "--tool-call-parser", "deepseek_v41",
  50. "--enable-auto-tool-choice",
  51. "--reasoning-parser", "deepseek_v41",
  52. "--default-chat-template-kwargs", """
  53. '{"thinking": false}'""",
  54. ]
  55. [env]
  56. HF_HUB_OFFLINE = "1"
  57. # Engram tables stay on disk (the baked engram.py patch); 32 parallel row
  58. # reads, 16 MB chunks (their launch defaults)
  59. DSV41_ENGRAM_DISK = "1"
  60. DSV41_ENGRAM_DISK_THREADS = "32"
  61. DSV41_ENGRAM_DISK_CHUNK = "16"
  62. # Node-local sparse Engram copy (per-rank row ranges from the first boot's
  63. # "Engram DISK mode" log lines; built with tools/engram_local.py, verified
  64. # byte-for-byte). NVMe instead of NFS for the 23.6 GiB/rank tables.
  65. DSV41_ENGRAM_LOCAL = "1"
  66. DSV41_ENGRAM_DIR = "/engram-local"
  67. # CUDA graphs: the Engram rows are staged in prepare_inputs (baked
  68. # model_state.py prestage patch) so the whole decode step is capturable
  69. VLLM_USE_BREAKABLE_CUDAGRAPH = "1"
  70. VLLM_HAS_FLASHINFER_CUBIN = "1"
  71. VLLM_USE_RUST_FRONTEND = "0"
  72. # runtime JIT wedge countermeasure (their boot-3 lesson): kernels are
  73. # prebuilt in the image, but any residual JIT must not OOM the box
  74. MAX_JOBS = "2"
  75. VLLM_ENGINE_READY_TIMEOUT_S = "3600"
  76. PYTORCH_CUDA_ALLOC_CONF = "expandable_segments:True"
  77. TORCH_CUDA_ARCH_LIST = "12.1a"
  78. FLASHINFER_CUDA_ARCH_LIST = "12.1a"
  79. OMP_NUM_THREADS = "2"
  80. # Per-node sparse Engram copy (model-00047/00048 shards + engram-local.json)
  81. [[extra_mounts]]
  82. host = "/var/tmp/engram-local/DeepSeek-V4.1-Flash"
  83. container = "/engram-local"
  84. read_only = true
  85. # JIT caches persist per-node (self-namespace by engine version key; the
  86. # image prebakes the flashinfer 0.7.0rc1 SM120 kernels, first boots re-JIT
  87. # the rest)
  88. [[extra_mounts]]
  89. host = "~/sm121-cache/jit-121f/flashinfer"
  90. container = "/root/.cache/flashinfer"
  91. [[extra_mounts]]
  92. host = "~/sm121-cache/jit-121f/torchinductor"
  93. container = "/root/.cache/torchinductor"
  94. [[extra_mounts]]
  95. host = "~/sm121-cache/jit-121f/vllm"
  96. container = "/root/.cache/vllm"