recipe.toml 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # DeepSeek-V4-Flash-Vision-Exp on 2× GB10 — aiden image, flag route.
  2. #
  3. # aidendle94/sparkrun-vllm-ds4-gb10:production-3.72-vision, TP2 over ds4.
  4. # His production 2x DSpark-6 profile translated to our launcher shape: his
  5. # own serve line (moe/linear b12x, B12X_MLA_SPARSE attention, fp8 KV, block
  6. # 256, DSpark-6 greedy, graphs FULL_AND_PIECEWISE) as plain flags — the
  7. # image's BAKED-IN entrypoint is his env-script (which doubles our tail args
  8. # if left in place), so the recipe sets entrypoint = ["vllm","serve"] and one
  9. # mods line, which makes the launcher wrap everything in `--entrypoint sh -c`
  10. # and exec our tail directly with the image's system vllm — which IS his
  11. # multimodal wheel (the dist-packages vllm here carries the DeepseekV4 vision
  12. # wrap; the earlier "not multimodal" 400s came from OUR overlay image, not
  13. # this one).
  14. #
  15. # Weights from the SHARED NAS HF cache (all 4 nodes mount nas.lan:/sna as
  16. # /mnt/nas; the repo's refs/main resolves offline). 2x reference: his 4x
  17. # DCP1 DSpark profile is 73.8-75.2 tok/s; 2x should sit below that.
  18. # Boot markers: "Model loading took ~82 GiB" → "GPU KV cache size" →
  19. # "Application startup complete". Smoke: 47*83 → 3901 + image_url ask.
  20. engine = "vllm"
  21. name = "DeepSeek V4 Flash Vision-Exp (aiden image, 2x Spark, DSpark-6)"
  22. docker_image = "aidendle94/sparkrun-vllm-ds4-gb10:production-3.72-vision"
  23. model = "deepseek-ai/DeepSeek-V4-Flash-Vision-Exp"
  24. required_nodes = 2
  25. tensor_parallel_size = 2
  26. pipeline_parallel_size = 1
  27. distributed_backend = "mp"
  28. shm_size = "32gb"
  29. # required for the launcher's `--entrypoint sh -c` override path (mods),
  30. # which also replaces the image's baked env-script entrypoint.
  31. entrypoint = ["vllm", "serve"]
  32. args = [
  33. "--served-model-name", "deepseek-v4-vision",
  34. "--trust-remote-code",
  35. "--attention-backend", "B12X_MLA_SPARSE",
  36. "--moe-backend", "b12x",
  37. "--linear-backend", "b12x",
  38. "--kv-cache-dtype", "fp8",
  39. "--block-size", "256",
  40. "--gpu-memory-utilization", "0.80",
  41. "--kv-cache-memory-bytes", "12884901888",
  42. "--max-model-len", "393216",
  43. "--max-num-seqs", "8",
  44. "--max-num-batched-tokens", "8192",
  45. "--max-cudagraph-capture-size", "56",
  46. "--compilation-config", """
  47. '{"cudagraph_mode":"FULL_AND_PIECEWISE","custom_ops":["all"]}'""",
  48. "--async-scheduling",
  49. "--no-scheduler-reserve-full-isl",
  50. "--enable-chunked-prefill",
  51. "--enable-prefix-caching",
  52. "--tokenizer-mode", "deepseek_v4",
  53. "--tool-call-parser", "deepseek_v4",
  54. "--enable-auto-tool-choice",
  55. "--reasoning-parser", "deepseek_v4",
  56. "--reasoning-config", """
  57. '{"reasoning_parser":"deepseek_v4","reasoning_start_str":"","reasoning_end_str":""}'""",
  58. "--default-chat-template-kwargs", """
  59. '{"thinking":true}'""",
  60. "--speculative-config", """
  61. '{"method":"dspark","num_speculative_tokens":6,"draft_sample_method":"greedy"}'""",
  62. "--disable-chunked-mm-input",
  63. "--limit-mm-per-prompt", """
  64. '{"image":4}'""",
  65. ]
  66. [mods]
  67. commands = [
  68. # (mods exist so the launcher takes the --entrypoint sh override path;
  69. # the pre-serve work — page-cache flush — is done host-side by before_serve)
  70. "true",
  71. ]
  72. [env]
  73. CUTE_DSL_ARCH = "sm_121a"
  74. VLLM_ENABLE_DSPARK = "1"
  75. VLLM_ENABLE_MTP = "0"
  76. NUM_SPECULATIVE_TOKENS = "6"
  77. DSPARK_DRAFT_SAMPLE_METHOD = "greedy"
  78. DSPARK_SPS_CURVE = "auto"
  79. VLLM_CUDAGRAPH_MODE = "FULL_AND_PIECEWISE"
  80. VISION_MHC = "1"
  81. MAX_CUDAGRAPH_CAPTURE_SIZE = "56"
  82. # (DCP prefill gather envs are DCP2-only; DCP1 here needs none)
  83. HF_HUB_OFFLINE = "1"
  84. TRANSFORMERS_OFFLINE = "1"
  85. VLLM_NO_USAGE_STATS = "1"