inline-core 1.2.71__tar.gz → 1.2.73__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {inline_core-1.2.71 → inline_core-1.2.73}/PKG-INFO +1 -1
- {inline_core-1.2.71 → inline_core-1.2.73}/pyproject.toml +1 -1
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/checkpoint.py +37 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/requirements.py +39 -4
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/variants.py +75 -11
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/loaders.py +55 -17
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/models.py +11 -1
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/training.py +49 -20
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_checkpoint.py +64 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_variants.py +68 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_training.py +75 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/.gitignore +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/.python-version +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/CLAUDE.md +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/README.md +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/main.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/scripts/flux2_train_matrix.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/scripts/minimax_h3_lora_check.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/scripts/minimax_h3_train_matrix.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/scripts/reference.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/apply.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/charfile.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/encode.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/library.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/scoring.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/characters/weights.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/components/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/components/conditioning.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/components/interfaces.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/config.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/auto.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/detect.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/memory.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/policy.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/probe.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/device/types.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/errors.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/api.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/constraints.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/fetch.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/handlers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/importer.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/install.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/loader.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/manifest.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/models.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/paths.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/resolve.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/scanner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/state.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/extensions/tools.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/ffmpeg.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/cache.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/descriptor.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/executor.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/loader_runners.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/primitives.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/registry.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/runners.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/schema.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/topo.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/graph/validate.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/media.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/catalog.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/controlspace.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/controlnet.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/embeds.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/provider.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/flux2/runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/keymap.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/convert.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/depth_control.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/img2img.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/provider.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/krea2/runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/lora.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/lora_keys.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/memory.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/pipeline.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/provider.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/allocator_trim_strategy.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/batch_split.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/block_fetcher.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/builder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/disk.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/pool.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/provider.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/source.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/stream_sync.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/utils.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/block_streaming/wrapper.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/audio_mux.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/hlg.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/primaries.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/color/yuv.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/diffusion_steps.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/guiders.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/noisers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/patchifiers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/protocols.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/components/schedulers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/exceptions.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/item.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/mask_utils.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/attention_strength_wrapper.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/keyframe_cond.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/keyframe_slots.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/latent_cond.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/mask_cond.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/noise_mask_cond.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/reference_audio_cond.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/conditioning/types/reference_video_cond.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/devices.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/duration_head.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/duration_head/model_configurator.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/guidance/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/guidance/perturbations.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/hdr.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/attention_ops.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/fuse_loras.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/helpers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/kernels.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/module_ops.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/primitives.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/registry.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/sd_ops.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/sft_loader.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/loader/single_gpu_model_builder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/modality_tiling.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/attention.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/audio_vae.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/causal_conv_2d.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/causality_axis.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/downsample.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/model_configurator.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/ops.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/resnet.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/upsample.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/audio_vae/vocoder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/common/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/common/normalization.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/disposable.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/model_protocol.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/adaln.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/attention.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/compiling.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/cudagraph_capture.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/feed_forward.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/gelu_approx.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/modality.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/model.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/model_configurator.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/ops.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/rope.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/text_projection.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/timestep_embedding.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/transformer.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/transformer/transformer_args.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/blur_downsample.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/model.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/model_configurator.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/pixel_shuffle.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/res_block.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/upsampler/spatial_rational_resampler.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/attention.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/conv_video_decoder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/convolution.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/diffusion_tiling.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/diffusion_video_decoder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/enums.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/memory_efficient_decode.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/model_configurator.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/normalization.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/ops.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/resnet.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/sampling.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/apply.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/attention.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/blocks.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/attn.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/block.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/context.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/chunked/mlp.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/attn.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/block.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/context.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/combined/mlp.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/compiling.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/config.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/det_attn_rope.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/apply_dsl.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/attn.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/block.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/dsl_kernels/chain.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/eager.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/fallback_na/triton_na.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/layers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/qkv.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/rope.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/rope_math.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/transformer/swiglu.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/model/video_vae/video_vae.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/accelerate_wrapper.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/batch_parallel_wrapper.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/broadcast_wrapper.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/gemma/loader.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/sharded_sd.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/attention.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/sequence_parallel.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/transformer/tiled_data_parallel.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/vae/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/multigpu/vae/distributed_decoder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/blockwise/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/blockwise/_impl.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/fp8_cast.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/fp8_scaled_mm.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/convert.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/fuse.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/linear.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/prequant.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/nvfp4/types.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/quantization/policy.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/embeddings_connector.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/embeddings_processor.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/base_encoder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/encoder_configurator.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma3_i2v_system_prompt.txt +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma3_t2v_system_prompt.txt +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma4_i2v_system_prompt.txt +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/encoders/prompts/gemma4_t2v_system_prompt.txt +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/feature_extractor.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/gemma_assets.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/text_encoders/gemma/tokenizer.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/tiling.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/tools.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/types.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_core/utils.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/a2vid_two_stage.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dfr_layout.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dfr_pipeline.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/distilled.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/distilled_mgpu.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/dubit.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/hdr_ic_lora.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ic_lora.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/iclora_utils.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/keyframe_interpolation.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/_broadcast.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/bp_gemma_builder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/controller.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/delegating_builder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/fleet.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/gemma_builders.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/nccl_groups.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/sp_builder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/tdp_builder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/vae_builders.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/multigpu/weight_tracker.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/retake.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/t2a_one_stage.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_one_stage.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_hq.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_hq_mgpu.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/ti2vid_two_stages_mgpu.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/args.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/blocks.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/constants.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/denoisers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/gpu_model.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/helpers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/color_config.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/decode.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/encode.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/exr.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/range_map.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/media_io/resize.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/model_paths.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/quantization_factory.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/res2s.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/samplers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/ltx25/vendor/ltx_pipelines/utils/types.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/adaln.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/keys.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/load.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/lora_keys.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/pipeline.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/provider.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vae_keys.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/autoencoder_kl_minimax_h3.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/autoencoder_kl_minimax_h3_audio.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/before_denoise.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/before_encoder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/decoders.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/denoise.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/encoders.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/modular_blocks_minimax_h3.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/modular_pipeline.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/packing.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/packing_ref2va.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/scheduling_minimax_h3.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/minimaxh3/vendor/transformer_minimax_h3.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/offload.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/pipeline_runtime.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/prepared.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/preprocess/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/preprocess/requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/preprocess/runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/references.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/sampling.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/video_params.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/primitives.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/provider.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/models/zimage/runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/config.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/group.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/launch.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/protocol.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/registry.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/parallel/worker.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/context.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/file_store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/progress.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/run.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/runtime/video_encode.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/sampling/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/sampling/batch.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/__main__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/app.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/assets.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/bootstrap.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/frontend.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/manager.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/rpc.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/run_store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/server/serialize.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/activity.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/assets.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/characters.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/config.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/dataset_import.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/fal.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/frames.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/generation.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/graph_build.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/handlers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/image_meta.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/moodboard.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/peaks.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/recipe.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/schema.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/system_stats.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/compose.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/ffmpeg.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/render.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/timeline/resolve.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/studio/training_store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/takes.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/__init__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/__main__.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/arch.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/cache.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/caption.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/dataset.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/h3.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/ltx25.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/models.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/precache_store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/protocol.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/src/inline_core/training/trainer.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/conftest.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/helpers.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/reference/lookalike_faces.json +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_cache.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_catalog.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_encode.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_library.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_rpc.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_scoring.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_characters_wiring.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_charfile.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_clip_grid_parity.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_config.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_dataset_import.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_device_detect.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_encoder_parking.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_executor.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_api.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_install.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_manifest.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_resolve.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_scanner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_spine.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_extension_state.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_file_store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_controlnet.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_folder.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_resolve.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_flux2_training.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_frontend_serving.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_hidden_nodes.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_keymap.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_krea2_convert.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_krea2_depth_control.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_krea2_requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_krea2_runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_loader_runners.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_loaders.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_lora.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_lora_download.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_lora_keys.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_nodes.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_training.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_ltx25_wired_refs.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_manager_queue.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_memory_policy.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_adaln.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_keys.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_load.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_lora_keys.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_nodes.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_minimaxh3_training.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_model_requirements.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_offload_prepared.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_output_kind_contract.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_parallel_group.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_pipeline_cache.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_precache_store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_primitives.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_recipe.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_references.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_rpc_bridge.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_run_store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_sampling.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_schema.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_server.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_staged_residency.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_activity.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_assets.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_fal.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_frames.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_generation.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_graph_build.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_models.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_moodboard.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_multi_reference.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_node_size.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_peaks.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_rpc.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_schema.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_store.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_studio_timeline.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_take_bytes.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_topo.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_arch.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_dataset.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_models.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_resolve.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_training_snapshots.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_validate.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_video_encode.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_video_params.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_webui_install.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_xfuser_sampler.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_zimage_primitives.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_zimage_resolve.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/tests/test_zimage_runner.py +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/uv.lock +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/webui.bat +0 -0
- {inline_core-1.2.71 → inline_core-1.2.73}/webui.sh +0 -0
|
@@ -34,6 +34,38 @@ _DTYPE_NAMES = {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
|
|
37
|
+
#: Markers a checkpoint carries when it was already quantized by someone else. ``comfy_quant`` is
|
|
38
|
+
#: ComfyUI's own tag; ``weight_scale`` is the per-tensor scale every fp8/int8 repack ships beside
|
|
39
|
+
#: the packed weights. Never match a bare ``.scale``: real models carry RMSNorm weights so named.
|
|
40
|
+
_QUANT_MARKERS = ("comfy_quant", "weight_scale", "scale_weight", "weight_scale_2")
|
|
41
|
+
_QUANT_DTYPES = frozenset({"I8", "U8"})
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def prequantized_kind(path: str | Path) -> str | None:
|
|
45
|
+
"""What quantization a checkpoint already carries, or None if it is plain weights.
|
|
46
|
+
|
|
47
|
+
Loading one of these into a stock model silently drops the scales as unexpected keys, leaving
|
|
48
|
+
packed tensors in layers sized for unpacked ones - which surfaces as a shape mismatch deep in a
|
|
49
|
+
matmul rather than as a load error. Quantizing it a second time compounds that.
|
|
50
|
+
"""
|
|
51
|
+
file = Path(path)
|
|
52
|
+
if not file.is_file() or file.suffix.lower() not in (".safetensors", ".sft"):
|
|
53
|
+
return None
|
|
54
|
+
try:
|
|
55
|
+
reader = CheckpointReader(file)
|
|
56
|
+
dtypes = reader.dtypes()
|
|
57
|
+
except Exception: # noqa: BLE001 - unreadable is not classifiable
|
|
58
|
+
return None
|
|
59
|
+
if any(any(m in key for m in _QUANT_MARKERS) for key in dtypes):
|
|
60
|
+
return "prequantized"
|
|
61
|
+
weights = {d for key, d in dtypes.items() if key.endswith(".weight")}
|
|
62
|
+
if any(d.startswith("F8_") for d in weights):
|
|
63
|
+
return "fp8"
|
|
64
|
+
if weights & _QUANT_DTYPES:
|
|
65
|
+
return "int8"
|
|
66
|
+
return None
|
|
67
|
+
|
|
68
|
+
|
|
37
69
|
class CheckpointReader:
|
|
38
70
|
"""Random access to one safetensors file, one tensor at a time."""
|
|
39
71
|
|
|
@@ -64,6 +96,11 @@ class CheckpointReader:
|
|
|
64
96
|
infer a checkpoint's architecture (layer counts, widths) before deciding how to load it."""
|
|
65
97
|
return {key: list(entry.get("shape") or []) for key, entry in self._index.items()}
|
|
66
98
|
|
|
99
|
+
def dtypes(self) -> dict[str, str]:
|
|
100
|
+
"""Every tensor's on-disk dtype name, header only. These are safetensors' own spellings
|
|
101
|
+
(``BF16``, ``F8_E4M3``, ...), not torch's, so a dtype we cannot load is still reportable."""
|
|
102
|
+
return {key: str(entry.get("dtype") or "") for key, entry in self._index.items()}
|
|
103
|
+
|
|
67
104
|
def get_tensor(self, key: str, device: str | None = None) -> Any:
|
|
68
105
|
"""One tensor, read straight from its byte range into a fresh buffer."""
|
|
69
106
|
import torch
|
|
@@ -15,6 +15,7 @@ lets a Z-Image, Krea 2 and FLUX.2 checkpoint share ``diffusion_models/`` safely.
|
|
|
15
15
|
|
|
16
16
|
from __future__ import annotations
|
|
17
17
|
|
|
18
|
+
import logging
|
|
18
19
|
import os
|
|
19
20
|
import re
|
|
20
21
|
from pathlib import Path
|
|
@@ -24,6 +25,8 @@ from ..catalog import resolve_picked
|
|
|
24
25
|
from ..requirements import ModelComponent
|
|
25
26
|
from . import variants as V
|
|
26
27
|
|
|
28
|
+
logger = logging.getLogger("inline_core.flux2")
|
|
29
|
+
|
|
27
30
|
__all__ = [
|
|
28
31
|
"DIFFUSION_FILE",
|
|
29
32
|
"SPLIT_REPO",
|
|
@@ -65,10 +68,13 @@ _EXTRAS: tuple[tuple[str, str, str, str, str], ...] = (
|
|
|
65
68
|
),
|
|
66
69
|
(
|
|
67
70
|
"diffusion_klein_9b",
|
|
68
|
-
"Klein 9B (
|
|
71
|
+
"Klein 9B (18 GB download, quantized on load)",
|
|
69
72
|
"diffusion_models",
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
# BFL's own repo, because no ungated mirror carries the 9B transformer: Comfy-Org's
|
|
74
|
+
# flux2-klein-9B holds only the encoders and the VAE. The fp8 build is deliberately not
|
|
75
|
+
# used here - diffusers' single-file converter cannot read it (see loaders.py).
|
|
76
|
+
"black-forest-labs/FLUX.2-klein-9B",
|
|
77
|
+
"flux-2-klein-9b.safetensors",
|
|
72
78
|
),
|
|
73
79
|
(
|
|
74
80
|
"text_encoder_qwen3_8b",
|
|
@@ -205,7 +211,36 @@ def _folder_encoder_width(folder: Path) -> int | None:
|
|
|
205
211
|
|
|
206
212
|
def flux2_checkpoints() -> list[Path]:
|
|
207
213
|
"""Every FLUX.2 checkpoint installed, identified by content rather than by name."""
|
|
208
|
-
|
|
214
|
+
found: list[Path] = []
|
|
215
|
+
skipped: list[str] = []
|
|
216
|
+
for path in _weight_files("diffusion_models"):
|
|
217
|
+
if _identify(path) is not None:
|
|
218
|
+
found.append(path)
|
|
219
|
+
else:
|
|
220
|
+
skipped.append(f"{path.name} ({skip_reason(path)})")
|
|
221
|
+
# A file that cannot be identified is left out of the dropdown, which from the UI is
|
|
222
|
+
# indistinguishable from it not being there at all. Say so once per scan.
|
|
223
|
+
if skipped and skipped != _LAST_SKIPPED:
|
|
224
|
+
_LAST_SKIPPED[:] = skipped
|
|
225
|
+
logger.info("Not offered as FLUX.2 checkpoints: %s", ", ".join(sorted(skipped)))
|
|
226
|
+
return found
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
#: Last reported skip list, so a rescan on every catalog bump does not repeat itself in the log.
|
|
230
|
+
_LAST_SKIPPED: list[str] = []
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def skip_reason(path: Path) -> str:
|
|
234
|
+
"""Why a file in ``diffusion_models/`` is not offered, in the words a user can act on."""
|
|
235
|
+
blocked = V.single_file_blocker(path)
|
|
236
|
+
if blocked is not None:
|
|
237
|
+
return f"{blocked}, so diffusers cannot convert it"
|
|
238
|
+
carried = V.quantization_of(path)
|
|
239
|
+
if carried is not None:
|
|
240
|
+
return f"a {carried} repack whose tensor names we do not recognise"
|
|
241
|
+
if path.suffix.lower() == ".gguf":
|
|
242
|
+
return "unrecognised GGUF build"
|
|
243
|
+
return "not a FLUX.2 checkpoint, or a repack whose tensor names we do not recognise"
|
|
209
244
|
|
|
210
245
|
|
|
211
246
|
def flux2_encoders() -> list[Path]:
|
|
@@ -25,6 +25,8 @@ __all__ = [
|
|
|
25
25
|
"derive_transformer_config",
|
|
26
26
|
"folder_config",
|
|
27
27
|
"is_prequantized",
|
|
28
|
+
"quantization_of",
|
|
29
|
+
"single_file_blocker",
|
|
28
30
|
"detect",
|
|
29
31
|
"get",
|
|
30
32
|
"text_encoder_kind",
|
|
@@ -270,24 +272,86 @@ def folder_config(path: str | Path) -> dict[str, object] | None:
|
|
|
270
272
|
return {k: v for k, v in config.items() if not k.startswith("_")}
|
|
271
273
|
|
|
272
274
|
|
|
275
|
+
#: Safetensors spells fp8 as ``F8_E4M3`` / ``F8_E5M2``. Never match on a ``.scale`` suffix alone:
|
|
276
|
+
#: a plain FLUX.2 checkpoint carries 80 RMSNorm ``norm.query_norm.scale`` weights that are not
|
|
277
|
+
#: quantization scales at all. Only a scale riding on a *fused qkv* is a repack artifact, and it is
|
|
278
|
+
#: the one diffusers' converter chokes on.
|
|
279
|
+
_FP8_PREFIX = "F8_"
|
|
280
|
+
_INT_DTYPES = frozenset({"I8", "U8"})
|
|
281
|
+
_QKV_SCALE_SUFFIXES = ("qkv.scale", "qkv.weight_scale", "qkv.scale_weight")
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def quantization_of(path: str | Path) -> str | None:
|
|
285
|
+
"""The quantization a checkpoint already carries, or None if it is plain weights.
|
|
286
|
+
|
|
287
|
+
A folder declares it in ``config.json``. A single file does not, so it is sniffed from the
|
|
288
|
+
header: an fp8 dtype, or the per-tensor scale tensors every int8/fp8 repack ships alongside.
|
|
289
|
+
"""
|
|
290
|
+
target = Path(path)
|
|
291
|
+
if target.is_dir():
|
|
292
|
+
try:
|
|
293
|
+
import json
|
|
294
|
+
|
|
295
|
+
config = json.loads((target / "config.json").read_text())
|
|
296
|
+
except (OSError, ValueError):
|
|
297
|
+
return None
|
|
298
|
+
if not isinstance(config, dict):
|
|
299
|
+
return None
|
|
300
|
+
declared = config.get("quantization_config")
|
|
301
|
+
if not isinstance(declared, dict):
|
|
302
|
+
return None
|
|
303
|
+
return str(declared.get("quant_method", "quantized"))
|
|
304
|
+
|
|
305
|
+
if not target.is_file() or target.suffix.lower() not in _WEIGHT_SUFFIXES:
|
|
306
|
+
return None
|
|
307
|
+
try:
|
|
308
|
+
from ..checkpoint import CheckpointReader
|
|
309
|
+
|
|
310
|
+
reader = CheckpointReader(target)
|
|
311
|
+
dtypes = reader.dtypes()
|
|
312
|
+
except Exception: # noqa: BLE001 - unreadable means "not something we can classify"
|
|
313
|
+
return None
|
|
314
|
+
weights = {d for key, d in dtypes.items() if key.endswith(".weight")}
|
|
315
|
+
if any(d.startswith(_FP8_PREFIX) for d in weights):
|
|
316
|
+
return "fp8"
|
|
317
|
+
if weights & _INT_DTYPES:
|
|
318
|
+
return "int8"
|
|
319
|
+
if any(key.endswith(_QKV_SCALE_SUFFIXES) for key in dtypes):
|
|
320
|
+
return "quantized"
|
|
321
|
+
return None
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def single_file_blocker(path: str | Path) -> str | None:
|
|
325
|
+
"""Why a failed single-file load probably failed, or None if this is not the known cause.
|
|
326
|
+
|
|
327
|
+
Diagnostic only, never a gate: nothing calls this to decide whether to attempt a load. The
|
|
328
|
+
converter maps a ``.scale`` key to a weight and chunks it into q/k/v, so a **per-tensor**
|
|
329
|
+
(0-dim) scale on a fused qkv dies deep inside diffusers without naming the file.
|
|
330
|
+
"""
|
|
331
|
+
target = Path(path)
|
|
332
|
+
if not target.is_file() or target.suffix.lower() not in _WEIGHT_SUFFIXES:
|
|
333
|
+
return None
|
|
334
|
+
try:
|
|
335
|
+
from ..checkpoint import CheckpointReader
|
|
336
|
+
|
|
337
|
+
shapes = CheckpointReader(target).shapes()
|
|
338
|
+
except Exception: # noqa: BLE001 - unreadable is not our call to make here
|
|
339
|
+
return None
|
|
340
|
+
scalar = [k for k, s in shapes.items() if k.endswith(_QKV_SCALE_SUFFIXES) and not s]
|
|
341
|
+
if not scalar:
|
|
342
|
+
return None
|
|
343
|
+
return f"it carries a single scale value on each of {len(scalar)} fused qkv tensors"
|
|
344
|
+
|
|
345
|
+
|
|
273
346
|
def is_prequantized(path: str | Path) -> bool:
|
|
274
|
-
"""Whether a checkpoint
|
|
347
|
+
"""Whether a checkpoint carries its own quantization (an NF4 dev folder, an fp8 single file).
|
|
275
348
|
|
|
276
349
|
Such a checkpoint must not be quantized again: its on-disk size already is its resident size,
|
|
277
350
|
and handing diffusers a second, different quantization config is a hard error. It also means the
|
|
278
351
|
fit ladder's assumption - that on-disk size is bf16 and quantization can halve it - does not
|
|
279
352
|
hold here, so the caller passes ``Quantization.NONE`` and loads the weights as they are.
|
|
280
353
|
"""
|
|
281
|
-
|
|
282
|
-
if not folder.is_dir():
|
|
283
|
-
return False
|
|
284
|
-
try:
|
|
285
|
-
import json
|
|
286
|
-
|
|
287
|
-
config = json.loads((folder / "config.json").read_text())
|
|
288
|
-
except (OSError, ValueError):
|
|
289
|
-
return False
|
|
290
|
-
return isinstance(config, dict) and bool(config.get("quantization_config"))
|
|
354
|
+
return quantization_of(path) is not None
|
|
291
355
|
|
|
292
356
|
|
|
293
357
|
def config_for(path: str | Path) -> dict[str, object] | None:
|
|
@@ -25,6 +25,7 @@ over it. Callers are the model-runner subpackages, which the server registers be
|
|
|
25
25
|
from __future__ import annotations
|
|
26
26
|
|
|
27
27
|
import hashlib
|
|
28
|
+
import logging
|
|
28
29
|
import os
|
|
29
30
|
from collections.abc import Callable
|
|
30
31
|
from dataclasses import dataclass
|
|
@@ -35,6 +36,9 @@ from typing import TYPE_CHECKING, Any
|
|
|
35
36
|
from ..config import data_dir
|
|
36
37
|
from ..device.policy import Quantization
|
|
37
38
|
from ..errors import ComponentError
|
|
39
|
+
from . import checkpoint
|
|
40
|
+
|
|
41
|
+
logger = logging.getLogger("inline_core.loaders")
|
|
38
42
|
|
|
39
43
|
if TYPE_CHECKING:
|
|
40
44
|
from ..graph.loader_runners import LoraRef
|
|
@@ -663,14 +667,33 @@ def load_text_encoder(
|
|
|
663
667
|
root = ensure_assets(arch)
|
|
664
668
|
weights_dir = _staged_encoder_dir(arch, file)
|
|
665
669
|
device_map = {"": device} if device else None
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
670
|
+
# A repack that already carries its own scales must not be quantized again, and transformers
|
|
671
|
+
# drops those scales as unexpected keys - leaving packed tensors in layers sized for
|
|
672
|
+
# unpacked ones, which surfaces as a matmul shape error rather than a load failure.
|
|
673
|
+
carried = checkpoint.prequantized_kind(file)
|
|
674
|
+
effective = Quantization.NONE if carried else quant
|
|
675
|
+
if carried:
|
|
676
|
+
logger.info(
|
|
677
|
+
"%s is a %s text encoder; loading it as-is rather than quantizing on top.",
|
|
678
|
+
Path(file).name, carried,
|
|
679
|
+
)
|
|
680
|
+
try:
|
|
681
|
+
text_encoder = Qwen3Model.from_pretrained(
|
|
682
|
+
str(weights_dir),
|
|
683
|
+
torch_dtype=dtype,
|
|
684
|
+
low_cpu_mem_usage=True,
|
|
685
|
+
device_map=device_map,
|
|
686
|
+
local_files_only=True,
|
|
687
|
+
quantization_config=_quant_config(effective, framework="transformers"),
|
|
688
|
+
)
|
|
689
|
+
except Exception as error:
|
|
690
|
+
if not carried:
|
|
691
|
+
raise
|
|
692
|
+
raise ComponentError(
|
|
693
|
+
f"{Path(file).name} is a {carried} text encoder, which this loader cannot read: "
|
|
694
|
+
"its scales are not part of the stock Qwen3 layout. Use the full-precision encoder "
|
|
695
|
+
"(qwen_3_8b.safetensors from Comfy-Org/flux2-klein-9B)."
|
|
696
|
+
) from error
|
|
674
697
|
tokenizer = AutoTokenizer.from_pretrained(str(root / "tokenizer"), local_files_only=True)
|
|
675
698
|
return text_encoder, tokenizer
|
|
676
699
|
|
|
@@ -1108,15 +1131,30 @@ def load_flux2_transformer(
|
|
|
1108
1131
|
kwargs: dict[str, Any] = {}
|
|
1109
1132
|
if _is_gguf(file):
|
|
1110
1133
|
kwargs["quantization_config"] = _gguf_config(dtype)
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1134
|
+
try:
|
|
1135
|
+
model = Flux2Transformer2DModel.from_single_file(
|
|
1136
|
+
file,
|
|
1137
|
+
config=str(root),
|
|
1138
|
+
torch_dtype=dtype,
|
|
1139
|
+
low_cpu_mem_usage=True,
|
|
1140
|
+
device=device,
|
|
1141
|
+
local_files_only=True,
|
|
1142
|
+
**kwargs,
|
|
1143
|
+
)
|
|
1144
|
+
except Exception as error:
|
|
1145
|
+
# Every checkpoint gets attempted - a user's own file is never refused on suspicion.
|
|
1146
|
+
# Explain afterwards instead, because diffusers' converter fails deep inside itself
|
|
1147
|
+
# without naming the file (see flux2/variants.single_file_blocker).
|
|
1148
|
+
from .flux2 import variants as flux2_variants
|
|
1149
|
+
|
|
1150
|
+
blocked = flux2_variants.single_file_blocker(file)
|
|
1151
|
+
if blocked is None:
|
|
1152
|
+
raise
|
|
1153
|
+
raise ComponentError(
|
|
1154
|
+
f"{Path(file).name} did not load: {blocked}, and diffusers splits those as if they "
|
|
1155
|
+
"were weights. A full-precision or .gguf build of the same model will work, and "
|
|
1156
|
+
"Inline Studio quantizes on load to fit your card either way."
|
|
1157
|
+
) from error
|
|
1120
1158
|
if _is_gguf(file):
|
|
1121
1159
|
if loras:
|
|
1122
1160
|
raise ComponentError(
|
|
@@ -185,7 +185,17 @@ class ModelDownloads:
|
|
|
185
185
|
if getattr(getattr(error, "response", None), "status_code", None) not in (401, 403):
|
|
186
186
|
raise
|
|
187
187
|
shutil.rmtree(staging, ignore_errors=True)
|
|
188
|
-
|
|
188
|
+
try:
|
|
189
|
+
path = _fetch(False)
|
|
190
|
+
except HfHubHTTPError as anonymous:
|
|
191
|
+
# Hugging Face reports a gated or missing repo identically, as 404 "Repository Not
|
|
192
|
+
# Found", which reads as a broken link rather than a licence the user must accept.
|
|
193
|
+
raise RuntimeError(
|
|
194
|
+
f"Could not download {comp.filename} from {comp.repo}. If that repository is "
|
|
195
|
+
f"gated, open https://huggingface.co/{comp.repo} , accept the licence, then "
|
|
196
|
+
"sign in with `hf auth login` (or set HF_TOKEN) and try again. If it is not "
|
|
197
|
+
"gated, the repository has moved or been removed."
|
|
198
|
+
) from anonymous
|
|
189
199
|
|
|
190
200
|
category_dir.mkdir(parents=True, exist_ok=True)
|
|
191
201
|
destination = category_dir / comp.filename
|
|
@@ -13,6 +13,7 @@ from __future__ import annotations
|
|
|
13
13
|
|
|
14
14
|
import asyncio
|
|
15
15
|
import json
|
|
16
|
+
import logging
|
|
16
17
|
import re
|
|
17
18
|
import shutil
|
|
18
19
|
import sys
|
|
@@ -35,6 +36,8 @@ from .dataset_import import read_metadata
|
|
|
35
36
|
|
|
36
37
|
_CAPTION_EXT = ".txt"
|
|
37
38
|
|
|
39
|
+
logger = logging.getLogger("inline_core.training")
|
|
40
|
+
|
|
38
41
|
|
|
39
42
|
def _preview_json(preview: Any) -> dict[str, Any]:
|
|
40
43
|
return {
|
|
@@ -543,19 +546,25 @@ class Training:
|
|
|
543
546
|
folder = self._run_dir(run_id) / "snapshots"
|
|
544
547
|
if not folder.is_dir():
|
|
545
548
|
return []
|
|
549
|
+
name = _safe(str((self._lookup(run_id) or {}).get("name") or run_id))
|
|
546
550
|
out: list[dict[str, Any]] = []
|
|
547
551
|
for file in sorted(folder.glob("step-*.safetensors")):
|
|
548
552
|
digits = file.stem.removeprefix("step-")
|
|
553
|
+
step = int(digits) if digits.isdigit() else 0
|
|
549
554
|
stat = file.stat()
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
555
|
+
row: dict[str, Any] = {
|
|
556
|
+
"runId": run_id,
|
|
557
|
+
"step": step,
|
|
558
|
+
"path": self._relativize(str(file)),
|
|
559
|
+
"sizeBytes": stat.st_size,
|
|
560
|
+
"createdAt": int(stat.st_mtime * 1000),
|
|
561
|
+
}
|
|
562
|
+
# Report the export if it is already there, or a reload offers "Add to models" on a
|
|
563
|
+
# snapshot that was auto-exported and makes a second copy under a -2 name.
|
|
564
|
+
exported = f"loras/{name}-step{step}.safetensors"
|
|
565
|
+
if (models_dir() / exported).is_file():
|
|
566
|
+
row["loraPath"] = exported
|
|
567
|
+
out.append(row)
|
|
559
568
|
return out
|
|
560
569
|
|
|
561
570
|
def export_snapshot(self, run_id: str, step: int) -> dict[str, Any]:
|
|
@@ -567,6 +576,10 @@ class Training:
|
|
|
567
576
|
source = self._run_dir(run_id) / "snapshots" / f"step-{step:06d}.safetensors"
|
|
568
577
|
if not source.is_file():
|
|
569
578
|
raise ValueError(f"Run {run_id} has no snapshot at step {step}.")
|
|
579
|
+
return {"path": self._copy_to_loras(run_id, source, step)}
|
|
580
|
+
|
|
581
|
+
def _copy_to_loras(self, run_id: str, source: Path, step: int) -> str:
|
|
582
|
+
"""Place one snapshot in ``models/loras/`` and make the picker aware of it."""
|
|
570
583
|
run = self._lookup(run_id) or {}
|
|
571
584
|
loras = models_dir() / "loras"
|
|
572
585
|
loras.mkdir(parents=True, exist_ok=True)
|
|
@@ -576,7 +589,7 @@ class Training:
|
|
|
576
589
|
# Same hook a finished run uses, so the new file bumps the registry and reaches the picker.
|
|
577
590
|
if self._on_output is not None:
|
|
578
591
|
self._on_output()
|
|
579
|
-
return
|
|
592
|
+
return rel
|
|
580
593
|
|
|
581
594
|
def cancel(self, run_id: str) -> None:
|
|
582
595
|
proc = self._active.get(run_id)
|
|
@@ -642,16 +655,7 @@ class Training:
|
|
|
642
655
|
elif kind == "checkpoint" and msg.get("path"):
|
|
643
656
|
self._persist(run_id, {"checkpointPath": msg["path"]})
|
|
644
657
|
elif kind == "snapshot" and msg.get("path"):
|
|
645
|
-
|
|
646
|
-
# on disk with no way to reach it.
|
|
647
|
-
self._events.broadcast(
|
|
648
|
-
"events:trainingSnapshot",
|
|
649
|
-
{
|
|
650
|
-
"runId": run_id,
|
|
651
|
-
"step": int(msg.get("step", 0)),
|
|
652
|
-
"path": self._relativize(msg["path"]),
|
|
653
|
-
},
|
|
654
|
-
)
|
|
658
|
+
self._on_snapshot(run_id, msg)
|
|
655
659
|
elif kind == "error" and msg.get("message"):
|
|
656
660
|
# A trainer-side failure: keep it in the run's log so the node shows why it died.
|
|
657
661
|
self._events.broadcast(
|
|
@@ -661,6 +665,31 @@ class Training:
|
|
|
661
665
|
saw_done = True
|
|
662
666
|
return saw_done
|
|
663
667
|
|
|
668
|
+
def _on_snapshot(self, run_id: str, msg: dict[str, Any]) -> None:
|
|
669
|
+
"""Place a mid-run snapshot where a picker can see it, then announce it.
|
|
670
|
+
|
|
671
|
+
Exported as it is written rather than when the run ends: the reason to snapshot at step 400
|
|
672
|
+
is to test it while step 800 is still training, and the project working dir is not scanned
|
|
673
|
+
by any model catalog.
|
|
674
|
+
"""
|
|
675
|
+
step = int(msg.get("step", 0))
|
|
676
|
+
written = Path(msg["path"])
|
|
677
|
+
# A complete TrainingSnapshot, not a partial one: the panel renders size and time straight
|
|
678
|
+
# off the event, and a missing field shows as "NaN KB" until the next listing lands.
|
|
679
|
+
stat = written.stat() if written.is_file() else None
|
|
680
|
+
payload: dict[str, Any] = {
|
|
681
|
+
"runId": run_id,
|
|
682
|
+
"step": step,
|
|
683
|
+
"path": self._relativize(msg["path"]),
|
|
684
|
+
"sizeBytes": stat.st_size if stat else 0,
|
|
685
|
+
"createdAt": int(stat.st_mtime * 1000) if stat else 0,
|
|
686
|
+
}
|
|
687
|
+
try:
|
|
688
|
+
payload["loraPath"] = self._copy_to_loras(run_id, written, step)
|
|
689
|
+
except Exception as error: # noqa: BLE001 - training is the expensive thing in flight
|
|
690
|
+
logger.warning("Could not export the snapshot at step %d: %s", step, error)
|
|
691
|
+
self._events.broadcast("events:trainingSnapshot", payload)
|
|
692
|
+
|
|
664
693
|
def _on_progress(self, run_id: str, msg: dict[str, Any]) -> None:
|
|
665
694
|
step = int(msg.get("step", 0))
|
|
666
695
|
total = int(msg.get("total", 0)) or None
|
|
@@ -8,9 +8,14 @@ must agree with safetensors exactly.
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
+
import json
|
|
12
|
+
import struct
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
11
15
|
import pytest
|
|
12
16
|
|
|
13
17
|
from inline_core.errors import ComponentError
|
|
18
|
+
from inline_core.models import checkpoint
|
|
14
19
|
from inline_core.models.checkpoint import CheckpointReader
|
|
15
20
|
|
|
16
21
|
torch = pytest.importorskip("torch")
|
|
@@ -77,3 +82,62 @@ def test_a_non_checkpoint_file_is_a_clear_error(tmp_path) -> None:
|
|
|
77
82
|
def test_a_missing_file_is_a_clear_error(tmp_path) -> None:
|
|
78
83
|
with pytest.raises(ComponentError, match="Could not read checkpoint"):
|
|
79
84
|
CheckpointReader(tmp_path / "absent.safetensors")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
# --- already-quantized checkpoints ---------------------------------------------------------------
|
|
88
|
+
#
|
|
89
|
+
# A ComfyUI-quantized text encoder loads into a stock Qwen3Model with its `comfy_quant` and
|
|
90
|
+
# `weight_scale` keys dropped as unexpected, leaving packed tensors in layers sized for unpacked
|
|
91
|
+
# ones. That surfaced as a matmul shape error deep inside torchao, after the pipeline had
|
|
92
|
+
# already reported itself ready.
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _write(path: Path, index: dict[str, object]) -> Path:
|
|
96
|
+
blob = json.dumps(index).encode()
|
|
97
|
+
path.write_bytes(struct.pack("<Q", len(blob)) + blob + b"\x00" * 64)
|
|
98
|
+
return path
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def _t(dtype: str, shape: list[int]) -> dict[str, object]:
|
|
102
|
+
return {"dtype": dtype, "shape": shape, "data_offsets": [0, 1]}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def test_a_comfy_quantized_encoder_is_recognised(tmp_path: Path) -> None:
|
|
106
|
+
file = _write(
|
|
107
|
+
tmp_path / "qwen_3_8b_comfyquant.safetensors",
|
|
108
|
+
{
|
|
109
|
+
"model.layers.0.self_attn.k_proj.weight": _t("I8", [1024, 2048]),
|
|
110
|
+
"model.layers.0.self_attn.k_proj.weight_scale": _t("F32", [1024]),
|
|
111
|
+
"model.layers.0.self_attn.k_proj.comfy_quant": _t("I8", []),
|
|
112
|
+
},
|
|
113
|
+
)
|
|
114
|
+
assert checkpoint.prequantized_kind(file) == "prequantized"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def test_an_fp8_checkpoint_is_recognised(tmp_path: Path) -> None:
|
|
118
|
+
file = _write(
|
|
119
|
+
tmp_path / "enc_fp8.safetensors",
|
|
120
|
+
{"model.layers.0.mlp.up_proj.weight": _t("F8_E4M3", [4096, 4096])},
|
|
121
|
+
)
|
|
122
|
+
assert checkpoint.prequantized_kind(file) == "fp8"
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def test_a_plain_checkpoint_is_not_flagged(tmp_path: Path) -> None:
|
|
126
|
+
"""A false positive here refuses to quantize a model that needs it, so it must not fire on
|
|
127
|
+
ordinary weights or on the RMSNorm tensors every transformer carries."""
|
|
128
|
+
file = _write(
|
|
129
|
+
tmp_path / "qwen_3_8b.safetensors",
|
|
130
|
+
{
|
|
131
|
+
"model.layers.0.self_attn.k_proj.weight": _t("BF16", [1024, 4096]),
|
|
132
|
+
"model.layers.0.input_layernorm.weight": _t("BF16", [4096]),
|
|
133
|
+
"model.layers.0.self_attn.q_norm.scale": _t("BF16", [128]),
|
|
134
|
+
},
|
|
135
|
+
)
|
|
136
|
+
assert checkpoint.prequantized_kind(file) is None
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_an_unreadable_file_is_not_classified(tmp_path: Path) -> None:
|
|
140
|
+
junk = tmp_path / "junk.safetensors"
|
|
141
|
+
junk.write_bytes(b"\x00" * 32)
|
|
142
|
+
assert checkpoint.prequantized_kind(junk) is None
|
|
143
|
+
assert checkpoint.prequantized_kind(tmp_path / "missing.safetensors") is None
|
|
@@ -127,3 +127,71 @@ def test_an_unreadable_file_is_simply_not_flux2(tmp_path: Path) -> None:
|
|
|
127
127
|
junk.write_bytes(b"\x00" * 64)
|
|
128
128
|
assert V.detect(junk) is None
|
|
129
129
|
assert V.detect(tmp_path / "missing.safetensors") is None
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
# --- prequantized single files --------------------------------------------------------------------
|
|
133
|
+
#
|
|
134
|
+
# diffusers' single-file converter admits `.scale` keys and then chunks them like a fused qkv
|
|
135
|
+
# weight. A per-tensor scale is 0-dim, so the load dies inside diffusers with no mention of which
|
|
136
|
+
# file caused it. Detecting the checkpoint up front is what turns that into a usable message.
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _write_index(path: Path, index: dict[str, object]) -> Path:
|
|
140
|
+
blob = json.dumps(index).encode()
|
|
141
|
+
path.write_bytes(struct.pack("<Q", len(blob)) + blob + b"\x00" * 64)
|
|
142
|
+
return path
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _tensor(dtype: str, shape: list[int]) -> dict[str, object]:
|
|
146
|
+
return {"dtype": dtype, "shape": shape, "data_offsets": [0, 1]}
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def test_fp8_and_int8_single_files_are_prequantized(tmp_path: Path) -> None:
|
|
150
|
+
fp8 = _write_index(
|
|
151
|
+
tmp_path / "fp8.safetensors",
|
|
152
|
+
{
|
|
153
|
+
"double_blocks.0.img_attn.qkv.weight": _tensor("F8_E4M3", [9216, 3072]),
|
|
154
|
+
"double_blocks.0.img_attn.qkv.scale": _tensor("F32", []),
|
|
155
|
+
},
|
|
156
|
+
)
|
|
157
|
+
int8 = _write_index(
|
|
158
|
+
tmp_path / "int8.safetensors",
|
|
159
|
+
{"double_blocks.0.img_mlp.0.weight": _tensor("I8", [12288, 3072])},
|
|
160
|
+
)
|
|
161
|
+
assert V.quantization_of(fp8) == "fp8"
|
|
162
|
+
assert V.quantization_of(int8) == "int8"
|
|
163
|
+
assert V.is_prequantized(fp8) and V.is_prequantized(int8)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def test_a_scale_on_a_fused_qkv_is_a_repack_even_at_bf16(tmp_path: Path) -> None:
|
|
167
|
+
"""The ConvRot-style repacks keep bf16 weights but add the scale that breaks the converter."""
|
|
168
|
+
repack = _write_index(
|
|
169
|
+
tmp_path / "convrot.safetensors",
|
|
170
|
+
{
|
|
171
|
+
"double_blocks.0.img_attn.qkv.weight": _tensor("BF16", [9216, 3072]),
|
|
172
|
+
"double_blocks.0.img_attn.qkv.scale": _tensor("F32", []),
|
|
173
|
+
},
|
|
174
|
+
)
|
|
175
|
+
assert V.quantization_of(repack) == "quantized"
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def test_rmsnorm_scales_do_not_make_a_plain_checkpoint_look_quantized(tmp_path: Path) -> None:
|
|
179
|
+
"""Every plain FLUX.2 checkpoint carries 80 `norm.*.scale` weights. Matching on the `.scale`
|
|
180
|
+
suffix alone would refuse to load the one build that actually works."""
|
|
181
|
+
plain = _write_index(
|
|
182
|
+
tmp_path / "plain.safetensors",
|
|
183
|
+
{
|
|
184
|
+
"double_blocks.0.img_attn.qkv.weight": _tensor("BF16", [9216, 3072]),
|
|
185
|
+
"double_blocks.0.img_attn.norm.query_norm.scale": _tensor("BF16", [128]),
|
|
186
|
+
"double_blocks.0.img_attn.norm.key_norm.scale": _tensor("BF16", [128]),
|
|
187
|
+
},
|
|
188
|
+
)
|
|
189
|
+
assert V.quantization_of(plain) is None
|
|
190
|
+
assert not V.is_prequantized(plain)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def test_a_non_checkpoint_is_not_classified(tmp_path: Path) -> None:
|
|
194
|
+
junk = tmp_path / "notamodel.safetensors"
|
|
195
|
+
junk.write_bytes(b"\x00" * 64)
|
|
196
|
+
assert V.quantization_of(junk) is None
|
|
197
|
+
assert V.quantization_of(tmp_path / "missing.safetensors") is None
|