A new nightly version has been released! ![]()
See the quickstart guide for installation instructions: Quickstart | MAX
MAX changelog updates:
-
FLUX.2 models now generate more than one image per request, so
num_imagesabove 1 inmax serveandnum_images_per_promptin
generate_images()andAutoModel.generate()work for them. Such a
request used to fail in the first denoising step. -
Serving metric names now use
max.*instead ofmaxserve.*. Batch
instruments usemax.batch.*, such asmax.batch.size. Prometheus
exposes the correspondingmax_*families. Update collector allowlists,
dashboards, and alerts with the deployment; existing metric history stays
under its previous names. Units, labels, histogram boundaries, and
benchmark result fields are unchanged. -
max servenow rejects an image generation request that asks for more
than 4 images with a 422 error namingnum_images, the same response as
other out-of-range image options.generate_images()and
AutoModel.generate()raise aValueErrorfornum_images_per_prompt
above 4 before any prompt runs. A request had no upper limit before. -
The eager
Moduleframework moved frommax.experimental.nntomax.nn,
and the graph-based layers thatmax.nnheld moved tomax.nn.legacy.
max.nn.legacyis deprecated and will be removed in MAX 27.1. Code that
uses it gets aDeprecationWarningnaming the line that used it. To keep
using the graph-based layers until then, changefrom max.nn import ...to
from max.nn.legacy import .... -
max.nn.legacy.Transformer,DistributedTransformer,
logits_postprocess()anddistributed_logits_postprocess()return a
max.nn.legacy.graph_groups.DecoderOutputsof named groups instead of a
tuple.
max.functional’smatmul()require both inputs to share a dtype, which
the result keeps, somax.nn.legacy.Linearraises when its input and weight
dtypes differ.max.nn.Linearcasts its input to the weight’s dtype, so a -
Added
max.driver.Buffer.memset(value)to fill a contiguous buffer or
slice in place with a byte value, without allocating a source buffer.ops.resize_linear,ops.resize_nearest, and theirmax.functional
counterparts take them forcoordinate_transform_modeand -
Removed
max.nn.legacy.FusedMLP. Usemax.nn.legacy.MLP, which takes the
separategate_projandup_projweights a checkpoint ships and fuses their
matmuls in the graph. -
Removed the
per_layer_buffersKV cache option, which gave each layer its
own buffer to get past a device’s per-allocation size limit, along with the
kv_blocks_per_layerandkv_scales_per_layerfields of
KVCacheInputsPerDevice. A KV cache is again one buffer per device, capped
at that limit. -
Enabled automatic fusion of eligible bfloat16 matrix multiplications and
SwiGLU activations on NVIDIA B200 GPUs. -
Added
DeviceContext.device(), which returns aDeviceview of the
accelerator with anidfield andget_name(),get_attribute(),
is_host_unified(),get_arch()andcan_access_peer()methods.
DeviceContext.id(),name(),get_attribute(),is_host_unified()and
can_access()are deprecated: writectx.device().id,
ctx.device().get_name(),ctx.device().can_access_peer(peer.device())
and so on. -
The free memory that CPU and Apple GPU devices report now accounts for
memory used by other processes. Before, MAX could start a model that didn’t
fit in memory, which on macOS could exhaust swap and crash the machine.
Mojo changelog updates:
- [External] [Stdlib] Add
os.path.normpath(#107338) - [External] [mojo][stdlib] Re-enable
ConvertibleToPythonconformance for builtin types (#106687) - [stdlib] Remove the
Powable,CeilDivableRaising, and_Expabletraits - [stdlib] Make FileHandle own its descriptor through FileDescriptor
Raw MAX diff: https://github.com/modular/modular/compare/cb987e0e4f4df28d19f04dd586dc76713751cf65...8ed65fc6ac15950ce62da1f8e8d50c2c7c528065
Current Mojo changelog: https://github.com/modular/modular/blob/main/Mojo/docs/site/nightly-changelog.md