Skip to content

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 23 Oct 18:19
c7ec301

The first versioned release, following our product launch on X. If you're reading this, welcome. From our blog announcement:

If you hit a bug or need a model or feature we don’t support yet, open an issue. You can open a PR directly for new model configs or performance tuning on existing ones. To upstream anything bigger, come chat with us in our Slack so we can discuss your ideas!

Added

  • [NEW MODEL] DeepSeek-V4.1-Flash LoRA recipe, deepseek_v41_flash_lora_8k, trained and served on B300s from pinned BF16 weights (#73, #74, #75).
  • Spindle reports its version and source commit: spindle --version, spindle_version and spindle_commit (short SHA) tags on every Modal app Spindle creates, and the version and full SHA in /api/v1/get_server_capabilities.
  • Spindle apps carry _modal_source, spindle_role, job type, framework and model tags for usage reporting (#99).
  • trainer_gpu and inference_gpu accept a list of GPU types in preference order (#89). qwen36-35b-a3b-lora-32k falls back from H200 to B300 and B200.
  • spindle deploy interactive mode (#91) and a check for required environment variables (#92).
  • Support for Tinker SDK 0.25 through 0.33 (#3, #69).
  • Multiple target tokens per input position (#104).
  • Model recipes with multi-LoRA backend support (#35), a Qwen3.5 9B 256K config (#86), and output-head LoRA for Qwen3.6 35B (#103).
  • trainer_image selects a named trainer image, and multi-LoRA Miles recipes can run on Miles v0.1.2. LoRA target modules accept wildcard checkpoint paths (#74).
  • While a trainer waits for GPU capacity, create_model reports which GPUs it is waiting for and for how long, instead of "starting a trainer" (#113).
  • Per-phase startup timing on trainer and sampler containers (#58).

Changed

  • GPU placement is no longer pinned to us-west by default (#4). platform.modal.region now defaults to None; set it only to restrict placement.
  • SGLang v0.5.21 and a newer Stitch (#30).
  • gpt-oss presets: train lm_head LoRA to match Tinker SDK defaults (#6), serve LoRA from BF16 weights (#7), and retuned trainer and sampler parallelism and admission limits (#36, #40, #45, #49).
  • Sampling: multi-turn conversations route to one sampler replica (#46), and warm sampler pools persist between training steps (#37).
  • Faster cold starts: TileLang kernels persist in the shared kernel cache (#82), the asset download is skipped once weights are on the volume (#83), and spindle deploy builds the sampler image up front (#95).
  • spindle deploy starts each model's base-weight download in the background. create_model and create_sampling_client return immediately, report download progress while they wait, and work for checkpoints that take longer than a request timeout to download (#107).
  • Deployment configs reach the frontend as a file instead of an environment variable (#94).
  • Optimizers other than AdamW are rejected instead of silently running AdamW (#78, #101).
  • A client that asks to train the unembedding, as Tinker clients do by default, keeps it frozen when the deployment doesn't target it, instead of being refused (#74).
  • Lower request and training overhead (#29, #31, #41, #42).

Fixed

  • spindle deploy from macOS and other onboarding issues (#23).
  • Miles CLI overrides applied after all argument groups are registered (#5).
  • Miles LoRA A initialization matches PEFT and Tinker (#10).
  • Grouped-expert LoRA checkpoint loading in the pinned Miles version (#16).
  • execute_sample is non-preemptible (#15).
  • load_state on multi-node LoRA trainers, which failed on missing checkpoint shards (#74).