CoolFace
Modelpublic

VitalyProtasov/Nemotron-3.5-Content-Safety-FP8-LLM-Compressor

sourceHugging Faceotherupdated 24d agoView on Hugging Face
0likes322downloads
Model Card

Nemotron 3.5 Content Safety — LLM Compressor FP8

This is an independently produced FP8 quantization of nvidia/Nemotron-3.5-Content-Safety. NVIDIA developed the source model but did not produce or endorse this quantized checkpoint. The original model card is retained below, following the additional quantization and benchmark information for this derivative.

Quantized checkpoint overview

PropertyValue
Source checkpointnvidia/Nemotron-3.5-Content-Safety
Compression toolLLM Compressor 0.9.0.4
Serializationcompressed-tensors 0.13.0
Weight / activation schemeFP8_DYNAMIC W8A8
WeightsStatic, symmetric, per-channel FP8
ActivationsDynamic, symmetric, per-token FP8
KV cacheStatic, symmetric, per-tensor FP8 scales
Modules left unquantizedlm_head and the complete vision tower
Checkpoint size6.4 GiB on disk
Source-model context lengthUp to 128K tokens

The language-model linear layers were compressed with:

python
QuantizationModifier(
    targets="Linear",
    scheme="FP8_DYNAMIC",
    ignore=["lm_head", r"re:model\.vision_tower.*"],
    kv_cache_scheme=QuantizationArgs(
        num_bits=8,
        type="float",
        strategy="tensor",
        dynamic=False,
        symmetric=True,
    ),
)

FP8_DYNAMIC uses static per-channel weight scales and dynamic per-token activation scales, so the W8A8 path itself does not require an activation-calibration corpus. The 512 CNN/DailyMail samples at sequence length 512 were used only to determine the static per-tensor FP8 KV-cache scales.

The export retained lm_head and the SigLIP vision tower in their original precision. Unused vision KV-scale tensors were removed for vLLM compatibility; language-model weight tensors and text K/V scale values were not modified by that compatibility step. The export ran on one NVIDIA H100 80 GB. The checkpoint is not hardware-bound; the serving benchmark below ran on one NVIDIA B300.

B300 benchmark

The following is a custom, text-only deployment benchmark, not an NVIDIA benchmark and not a replacement for the source model's published evaluations. It is included to show the measured quality/performance trade-off against the unquantized source checkpoint under one matched serving setup.

Quality

Quality was scored on the strict common intersection of 10,269 binary conversation/category pairs from 3,614 internally annotated conversations across all five B300 deployments in the full experiment. Only the BF16 and LLM Compressor FP8 rows relevant to this checkpoint are shown here. Every model evaluated all seven moderation categories in one request. Rows without a valid parse from any of the five deployments were excluded from every score. The reference annotations were generated automatically with GPT-5.6 and are not multi-reviewer human ground truth.

B300 deploymentPrecisionRecallMicro-F1AccuracyBalanced accuracy
Source BF160.6140.1480.2390.8400.565
This LLM Compressor FP8 checkpoint0.6280.1510.2440.8410.566

The observed +0.005 Micro-F1 difference is small and should not be interpreted as evidence that quantization improves model quality. This evaluation also contains no positive sexually explicit examples and only 13 positive hate-speech examples, so those category estimates are absent or unstable.

Streaming performance

Both deployments used one physical NVIDIA B300 SXM6 PC (275,040 MiB reported), tensor parallelism 1, vLLM 0.20.2, PyTorch 2.11.0+cu130, CUDA 13.0, a 131,072-token limit, maximum 64 sequences, 90% GPU-memory utilization, prefix caching, and text-only serving. Generation used temperature 0, top-p 1, thinking disabled, and at most 256 output tokens. The FP8 deployment used --kv-cache-dtype fp8; BF16 used the automatic BF16 KV cache.

The timing cohort contained 500 length-stratified prompts disjoint from the quality cohort: 100 prompts at each concurrency level. Each deployment started in a fresh vLLM process. Prefix caching remained enabled within a deployment run, matching the intended serving configuration.

DeploymentConcurrencySuccessRequests/sPrompt tokens/sTTFT P50TTFT P95Decode P50Decode P95Decode P50 ms/token
Source BF161100/10012.1172,63838.7 ms159.3 ms27.3 ms67.9 ms3.03
This FP8 checkpoint1100/10013.2679,50237.6 ms136.5 ms23.5 ms54.0 ms2.72
Source BF162100/10015.6799,62359.3 ms206.3 ms27.4 ms125.0 ms3.11
This FP8 checkpoint2100/10017.63112,07054.4 ms215.2 ms20.1 ms116.6 ms2.62
Source BF16499/10019.60127,313109.6 ms335.8 ms27.4 ms209.0 ms3.46
This FP8 checkpoint499/10022.40145,51297.7 ms275.2 ms20.0 ms162.9 ms2.76
Source BF16898/10022.44147,303187.6 ms632.3 ms73.8 ms357.2 ms10.39
This FP8 checkpoint8100/10026.85175,016171.1 ms466.8 ms55.2 ms253.4 ms7.56
Source BF1616100/10023.25160,177370.2 ms977.5 ms181.2 ms758.0 ms26.11
This FP8 checkpoint16100/10028.56196,797285.6 ms781.0 ms162.3 ms440.0 ms25.88

Peak measured throughput increased from 23.25 to 28.56 requests/s (+22.8%) while Micro-F1 remained within +0.005 of the BF16 result on the strict common set.

TTFT is measured client-side from request start to the first non-empty SSE content delta. It includes HTTP overhead, scheduler queueing, prefill, and first-token decoding. Decode time is measured from the first content delta to stream completion. Decode P50 ms/token is the median per-request value of decode_ms / max(completion_tokens - 1, 1); the first token is excluded because it is already included in TTFT. These are end-to-end deployment metrics, not isolated GPU-kernel measurements.

The BF16 and FP8 deployments differ in both W8A8 compression and KV-cache precision. The benchmark therefore measures the complete deployment and cannot attribute the observed change specifically to FP8 weights, activations, or KV-cache quantization.

Serving with vLLM

The B300 benchmark used the following text-only configuration:

bash
vllm serve VitalyProtasov/Nemotron-3.5-Content-Safety-FP8-LLM-Compressor \
  --served-model-name nemotron-content-safety-fp8 \
  --quantization compressed-tensors \
  --dtype bfloat16 \
  --kv-cache-dtype fp8 \
  --tensor-parallel-size 1 \
  --max-model-len 131072 \
  --max-num-seqs 64 \
  --gpu-memory-utilization 0.90 \
  --enable-prefix-caching \
  --language-model-only

Remove --language-model-only when the vision encoder is required. Multimodal behavior was not evaluated in the custom benchmark above.

Compatibility notes

  • —Validated for text-only serving with vLLM 0.20.2 on NVIDIA B300.
  • —vLLM loaded the checkpoint through the compressed-tensors quantization backend and used an FP8 KV cache.
  • —At startup, vLLM may warn that separately calibrated attention q_scale and prob_scale values are unavailable and use fallback values. This is a serving-stack limitation and may affect results.
  • —The tokenizer may emit a Mistral-regex compatibility warning in some Transformers/vLLM versions. Validate tokenization when changing the serving stack.
  • —The benchmark data is internal and cannot be used to reproduce the reported scores from this repository alone.

Source model and license

This checkpoint is a quantized derivative of NVIDIA Nemotron-3.5-Content-Safety. Refer to the source model card for architecture, training data, supported languages, intended use, safety evaluation, and model-specific limitations.

Use is governed by the OpenMDW License Agreement 1.1, the Gemma Terms of Use, and the Gemma Prohibited Use Policy. NVIDIA produced the source model but did not produce or endorse this quantized checkpoint.