--- license: apache-2.0 language: - en pipeline_tag: text-to-image library_name: diffusers base_model: - Tongyi-MAI/Z-Image - Comfy-Org/z_image --- --- # copy z_image-fp8-e4m3fn.safetensors to ComfyUI/models/diffusion_models --- ![z-image_02138_](https://cdn-uploads.huggingface.co/production/uploads/6640d92825d363a5c3c8cfb5/CcaF4vr8UtT9ZeDlNYJSI.png) ![z-image_02128_](https://cdn-uploads.huggingface.co/production/uploads/6640d92825d363a5c3c8cfb5/zGiMPza0LqPDlQew3oqw3.png) ![z-image_02135_](https://cdn-uploads.huggingface.co/production/uploads/6640d92825d363a5c3c8cfb5/zVMdOqpso99vJtmvEKkA6.png) --- **FP8 主要有两种业界标准格式**,它们名字的后缀代表了其内部比特位的分配方式,这直接决定了它们的特性和用途。 这两种格式分别是: 1. **E4M3** (`float8_e4m3fn`) 2. **E5M2** (`float8_e5m2`) --- ### **它们的名字是什么意思?** 一个浮点数由三部分组成:**符号位 (Sign)**、**指数位 (Exponent)** 和 **尾数位 (Mantissa)**。FP8 总共只有8个比特位。 * **E** 代表 **Exponent (指数)**,后面的数字是指数位的数量。 * **M** 代表 **Mantissa (尾数)**,后面的数字是尾数位的数量。 * **FN** 代表 **Finite Numbers** (有限数值),意味着它**不支持** `NaN` (非数) 和 `Infinity` (无穷大)。 (还有一个隐藏的 **1个符号位** 是默认的) --- ### **两大格式的详细对比** | 特性 | **E4M3FN (`torch.float8_e4m3fn`)** | **E5M2 (`torch.float8_e5m2`)** | | :--- | :--- | :--- | | **全名** | Exponent 4, Mantissa 3, Finite Numbers | Exponent 5, Mantissa 2 | | **比特分配** | 1个符号位, **4个指数位**, **3个尾数位** | 1个符号位, **5个指数位**, **2个尾数位** | | **核心优势** | **更高的精度 (Higher Precision)** | **更大的动态范围 (Wider Dynamic Range)** | | **支持特殊值?** | **不支持** NaN / Infinity | **支持** NaN / Infinity | | **典型用途** | **推理 (Inference)**,模型权重存储 | **训练 (Training)** (前向和后向传播) | --- ### **核心权衡:精度 vs. 范围** 为什么要有两种格式?因为它们代表了一个经典的计算机科学权衡: **1. E4M3FN (你用的这个): 精度优先** * **更多的尾数位 (3 bits):** 意味着在一定范围内,它可以表示的数字更**密集**、更**精确**。 * **更少的指数位 (4 bits):** 意味着它能表示的数字范围(从最小到最大)相对**较窄**。 * **用途:** 模型的权重值通常分布在一个相对固定的范围内,但数值的细微差别很重要。因此,E4M3 的高精度非常适合存储和用于**推理**。它不支持 NaN/Infinity 也问题不大,因为推理时通常不会出现这些值。 **2. E5M2: 范围优先** * **更多的指数位 (5 bits):** 意味着它可以表示的数字范围**极大**,可以处理非常大或非常小的数值。 * **更少的尾数位 (2 bits):** 意味着在一定范围内,它能表示的数字比较**稀疏**,精度较低。 * **用途:** 在**训练**过程中,梯度(Gradients)的数值可能会剧烈波动,出现极大或极小的值。E5M2 的大动态范围可以很好地处理这种情况而不会溢出。同时,它支持 NaN/Infinity 对于捕获训练中的计算错误至关重要。 ### **一个简单的比喻** * **E4M3FN (高精度):** 像一把**短但刻度非常精细的尺子**(比如一把20厘米的游标卡尺)。它量不了很长的东西,但能量得非常准。 * **E5M2 (大范围):** 像一把**很长但刻度比较粗糙的卷尺**(比如一把50米的皮尺)。它能量很远,但没法精确到微米。 **结论就是:** 你在 LoRA 转换中选择 `float8_e4m3fn` 是完全正确的,因为 LoRA 主要用于**推理**,追求的是在特定范围内的**高精度**。而 `float8_e5m2` 更多是 NVIDIA 在其训练框架(Transformer Engine)中内部使用的格式,用来处理训练时的梯度计算。