Initial commit
Browse files- README.md +83 -0
- convert_fp32_to_fp16.py +77 -0
- mmaudio_nsfw_gold_8.5k_final_fp16.safetensors +3 -0
README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
language: en
|
| 4 |
+
pipeline_tag: text-to-audio
|
| 5 |
+
base_model: cloud19/NSFW_MMaudio
|
| 6 |
+
---
|
| 7 |
+
|
| 8 |
+
# MMAudio NSFW - FP16 Optimized
|
| 9 |
+
|
| 10 |
+
This repository contains an **FP16 safetensors** version of the fine-tuned MMAudio model from [cloud19/NSFW_MMaudio](https://huggingface.co/cloud19/NSFW_MMaudio), optimized for improved memory efficiency and faster loading times.
|
| 11 |
+
|
| 12 |
+
**Base Model:** [cloud19/NSFW_MMaudio](https://huggingface.co/cloud19/NSFW_MMaudio)
|
| 13 |
+
**Original Project:** [hkchengrex/MMAudio](https://github.com/hkchengrex/MMAudio)
|
| 14 |
+
|
| 15 |
+
## Model Details
|
| 16 |
+
|
| 17 |
+
* **Base Architecture:** `large_44k` (from the original MMAudio)
|
| 18 |
+
* **Fine-tuning:** Fine-tuned on NSFW content (see base model for details)
|
| 19 |
+
* **Optimization:** Converted from FP32 PyTorch checkpoint to FP16 safetensors
|
| 20 |
+
* **Capabilities:** Video-to-Audio, Image-to-Audio, Text-to-Audio
|
| 21 |
+
* **Format:** Safetensors (`.safetensors`)
|
| 22 |
+
* **Precision:** 16-bit floating point
|
| 23 |
+
|
| 24 |
+
## Improvements Over Base Model
|
| 25 |
+
|
| 26 |
+
✅ **~50% smaller file size** (FP32 → FP16 conversion)
|
| 27 |
+
✅ **Faster loading** with safetensors format
|
| 28 |
+
✅ **Lower GPU memory usage** during inference
|
| 29 |
+
✅ **Same quality output** (minimal precision loss with FP16)
|
| 30 |
+
✅ **Better compatibility** with modern ML frameworks
|
| 31 |
+
|
| 32 |
+
## How to Use
|
| 33 |
+
|
| 34 |
+
This model can be used as a drop-in replacement for the original model. Load the safetensors file instead of the original PyTorch checkpoint:
|
| 35 |
+
|
| 36 |
+
```python
|
| 37 |
+
from safetensors.torch import load_file
|
| 38 |
+
|
| 39 |
+
# Load the FP16 model weights
|
| 40 |
+
model_weights = load_file("model_fp16.safetensors")
|
| 41 |
+
|
| 42 |
+
# Load into your MMAudio model architecture
|
| 43 |
+
# (follow the same usage pattern as the base model)
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
**System Requirements:**
|
| 47 |
+
* GPU: 8-12 GB VRAM (reduced from 12-16 GB due to FP16 optimization)
|
| 48 |
+
* Python 3.10+
|
| 49 |
+
* PyTorch with CUDA support
|
| 50 |
+
|
| 51 |
+
## Installation
|
| 52 |
+
|
| 53 |
+
For usage instructions, please refer to the [base model repository](https://huggingface.co/cloud19/NSFW_MMaudio) and simply replace the model loading with the FP16 safetensors version.
|
| 54 |
+
|
| 55 |
+
## Technical Details
|
| 56 |
+
|
| 57 |
+
* **Original Format:** FP32 PyTorch (.pth) - ~2.5GB
|
| 58 |
+
* **Optimized Format:** FP16 Safetensors (.safetensors) - ~1.25GB
|
| 59 |
+
* **Conversion Method:** Direct FP32 → FP16 tensor conversion
|
| 60 |
+
* **Quality Impact:** Negligible quality loss in practice
|
| 61 |
+
|
| 62 |
+
## Limitations
|
| 63 |
+
|
| 64 |
+
* Same limitations as the base model apply
|
| 65 |
+
* **Content Warning:** Due to the NSFW nature of the fine-tuning dataset, the model may generate explicit or mature audio content. User discretion is advised.
|
| 66 |
+
* FP16 precision may introduce minimal numerical differences compared to FP32
|
| 67 |
+
|
| 68 |
+
## Credits & Citation
|
| 69 |
+
|
| 70 |
+
**Base Model:** [cloud19/NSFW_MMaudio](https://huggingface.co/cloud19/NSFW_MMaudio)
|
| 71 |
+
**Original MMAudio:** [hkchengrex/MMAudio](https://github.com/hkchengrex/MMAudio)
|
| 72 |
+
**Optimization:** FP16 conversion for improved efficiency
|
| 73 |
+
|
| 74 |
+
All credit for the original architecture, fine-tuning, and model development goes to the respective authors. This repository only provides format optimization.
|
| 75 |
+
|
| 76 |
+
```bibtex
|
| 77 |
+
@inproceedings{cheng2025taming,
|
| 78 |
+
title={{MMAudio}: Taming Multimodal Joint Training for High-Quality Video-to-Audio Synthesis},
|
| 79 |
+
author={Cheng, Ho Kei and Ishii, Masato and Hayakawa, Akio and Shibuya, Takashi and Schwing, Alexander and Mitsufuji, Yuki},
|
| 80 |
+
booktitle={CVPR},
|
| 81 |
+
year={2025}
|
| 82 |
+
}
|
| 83 |
+
```
|
convert_fp32_to_fp16.py
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
Simple FP32 to FP16 converter for safetensors files.
|
| 4 |
+
Converts ALL FP32 tensors to FP16 without discrimination.
|
| 5 |
+
|
| 6 |
+
USAGE:
|
| 7 |
+
python convert_fp16.py input.safetensors [output.safetensors]
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
import argparse
|
| 11 |
+
from pathlib import Path
|
| 12 |
+
from typing import Dict
|
| 13 |
+
|
| 14 |
+
import torch
|
| 15 |
+
from safetensors.torch import load_file, save_file
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
def convert_fp32_to_fp16(state_dict: Dict[str, torch.Tensor]) -> Dict[str, torch.Tensor]:
|
| 19 |
+
"""Convert all FP32 tensors to FP16."""
|
| 20 |
+
converted = {}
|
| 21 |
+
fp32_count = 0
|
| 22 |
+
total_tensors = len(state_dict)
|
| 23 |
+
|
| 24 |
+
for name, tensor in state_dict.items():
|
| 25 |
+
if tensor.dtype == torch.float32:
|
| 26 |
+
converted[name] = tensor.half() # Convert to FP16
|
| 27 |
+
fp32_count += 1
|
| 28 |
+
else:
|
| 29 |
+
converted[name] = tensor # Keep as-is
|
| 30 |
+
|
| 31 |
+
print(f"Converted {fp32_count}/{total_tensors} tensors from FP32 to FP16")
|
| 32 |
+
return converted
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
def calculate_size_reduction(original: Dict[str, torch.Tensor], converted: Dict[str, torch.Tensor]) -> None:
|
| 36 |
+
"""Calculate and print size reduction."""
|
| 37 |
+
original_bytes = sum(t.numel() * t.element_size() for t in original.values())
|
| 38 |
+
converted_bytes = sum(t.numel() * t.element_size() for t in converted.values())
|
| 39 |
+
saved_bytes = original_bytes - converted_bytes
|
| 40 |
+
|
| 41 |
+
original_gb = original_bytes / (1024**3)
|
| 42 |
+
converted_gb = converted_bytes / (1024**3)
|
| 43 |
+
saved_gb = saved_bytes / (1024**3)
|
| 44 |
+
|
| 45 |
+
print(f"Size: {original_gb:.3f} GB → {converted_gb:.3f} GB (saved {saved_gb:.3f} GB)")
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
def main():
|
| 49 |
+
parser = argparse.ArgumentParser(description="Convert all FP32 tensors to FP16 in a safetensors file")
|
| 50 |
+
parser.add_argument("input", help="Input safetensors file")
|
| 51 |
+
parser.add_argument("output", nargs="?", help="Output safetensors file (optional)")
|
| 52 |
+
|
| 53 |
+
args = parser.parse_args()
|
| 54 |
+
|
| 55 |
+
# Generate output filename if not provided
|
| 56 |
+
if args.output is None:
|
| 57 |
+
input_path = Path(args.input)
|
| 58 |
+
stem = input_path.stem
|
| 59 |
+
if not stem.endswith("_fp16"):
|
| 60 |
+
stem += "_fp16"
|
| 61 |
+
args.output = str(input_path.with_name(stem + input_path.suffix))
|
| 62 |
+
|
| 63 |
+
print(f"Loading: {args.input}")
|
| 64 |
+
state_dict = load_file(args.input)
|
| 65 |
+
|
| 66 |
+
print("Converting FP32 → FP16...")
|
| 67 |
+
converted_state_dict = convert_fp32_to_fp16(state_dict)
|
| 68 |
+
|
| 69 |
+
calculate_size_reduction(state_dict, converted_state_dict)
|
| 70 |
+
|
| 71 |
+
print(f"Saving: {args.output}")
|
| 72 |
+
save_file(converted_state_dict, args.output)
|
| 73 |
+
print("Done!")
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
if __name__ == "__main__":
|
| 77 |
+
main()
|
mmaudio_nsfw_gold_8.5k_final_fp16.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f30ab5d3aa0add25fa6c5894a00fa72bad28673125a1618e1c082b70ed7b573a
|
| 3 |
+
size 2060050528
|