Repository navigation
v0.1.1
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_versionandspindle_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_gpuandinference_gpuaccept a list of GPU types in preference order (#89).qwen36-35b-a3b-lora-32kfalls back from H200 to B300 and B200.spindle deployinteractive 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_imageselects 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_modelreports 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-westby default (#4).platform.modal.regionnow defaults toNone; set it only to restrict placement. - SGLang v0.5.21 and a newer Stitch (#30).
- gpt-oss presets: train
lm_headLoRA 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 deploybuilds the sampler image up front (#95). spindle deploystarts each model's base-weight download in the background.create_modelandcreate_sampling_clientreturn 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 deployfrom 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_sampleis non-preemptible (#15).load_stateon multi-node LoRA trainers, which failed on missing checkpoint shards (#74).