SAVRN
Search Contact SAVRN

Open-weight model · Text generation

Huihui-NeoHorse-1-4B-abliterated

by Huihui.ai huihui-ai/Huihui-NeoHorse-1-4B-abliterated

This is an uncensored version of TokenRhythm/NeoHorse-1-4B created with abliteration (see remove-refusals-with-transformers to know more about it).

Parameters4.2B
Context262,144
Weights9.3 GB
Licenseapache-2.0
AccessOpen weights
Monthly Downloads42

Runs On

What it takes to serve Huihui-NeoHorse-1-4B-abliterated (4.2B parameters): the memory its weights need at each precision, and the cheapest way to rent enough data-center GPUs to hold them.

PrecisionWeightsMemory neededCheapest setupPer hourAlso fits
16-bit 8.4 GB 10.1 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00
8-bit 4.2 GB 5.0 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00
4-bit 2.1 GB 2.5 GB 1x MI300X (192 GB)
Vultr
$1.85 1x H100 $1.99 · 1x MI325X $2.00

Memory is the weights at that precision plus 20% for the runtime and a short context; a long context needs more. Prices are the lowest on-demand hourly rates in the SAVRN Index, read Sep 18, 2026.

Model Card

By Huihui.ai, published under apache-2.0, revision ed87d7cdfb88.

This is an uncensored version of TokenRhythm/NeoHorse-1-4B created with abliteration (see remove-refusals-with-transformers to know more about it). This is a crude, proof-of-concept implementation to remove refusals from an LLM model without using TransformerLens. Layers 5-17 are being ablated (0-based indexing). The MTP and Visual components were extracted from the original Qwen/Qwen3.5-4B and can provide excellent support. If needed, you only need to copy the contents of MTP-Visual to overwrite the model directory. You can use this model in your applications by loading it with Hugging Face's transformers library: - Risk of Sensitive or Controversial Outputs: This model’s safety filtering…

Read Huihui.ai's full model card

This is an uncensored version of TokenRhythm/NeoHorse-1-4B created with abliteration (see remove-refusals-with-transformers to know more about it). This is a crude, proof-of-concept implementation to remove refusals from an LLM model without using TransformerLens.

Note

Layers 5-17 are being ablated (0-based indexing).

The MTP and Visual components were extracted from the original Qwen/Qwen3.5-4B and can provide excellent support.
If needed, you only need to copy the contents of MTP-Visual to overwrite the model directory.

Usage

You can use this model in your applications by loading it with Hugging Face's transformers library:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import torch
import argparse
from transformers import AutoModelForCausalLM, AutoTokenizer, TextStreamer
import os
import signal
import time

def parse_args():
    parser = argparse.ArgumentParser(
        description="Load HuggingFace repo or local path of the base model"
    )
    parser.add_argument(
        "--base_model",
        type=str,
        default="huihui-ai/Huihui-NeoHorse-1-4B-abliterated",
        help="HuggingFace repo or local path of the base model.",
    )
    parser.add_argument(
        "--dtype",
        type=str,
        default="bfloat16",
        choices=["float16", "bfloat16", "float32"],
        help="Data type for loading the base model (default: bfloat16).",
    )
    parser.add_argument(
        "--device_map",
        type=str,
        default="auto",
        help="Device map for model loading (e.g. 'cpu', 'auto').",
    )
    return parser.parse_args()

def main():
    cpu_count = os.cpu_count()
    print(f"Number of CPU cores in the system: {cpu_count}")
    half_cpu_count = cpu_count // 2
    os.environ["MKL_NUM_THREADS"] = str(half_cpu_count)
    os.environ["OMP_NUM_THREADS"] = str(half_cpu_count)
    torch.set_num_threads(half_cpu_count)

    print(f"PyTorch threads: {torch.get_num_threads()}")
    print(f"MKL threads: {os.getenv('MKL_NUM_THREADS')}")
    print(f"OMP threads: {os.getenv('OMP_NUM_THREADS')}")

    args = parse_args()

    # Load the model and tokenizer
    print(f"Load Model {args.base_model} ... ")

    torch_dtype = {
        "float16": torch.float16,
        "bfloat16": torch.bfloat16,
        "float32": torch.float32,
    }[args.dtype]

    model = AutoModelForCausalLM.from_pretrained(
        args.base_model,
        dtype=torch_dtype,
        device_map=args.device_map,
        trust_remote_code=True,
        low_cpu_mem_usage=True,
    )

    tokenizer = AutoTokenizer.from_pretrained(args.base_model, trust_remote_code=True)

    messages = []
    class CustomTextStreamer(TextStreamer):
        def __init__(self, tokenizer, skip_prompt=True, skip_special_tokens=True):
            super().__init__(tokenizer, skip_prompt=skip_prompt, skip_special_tokens=skip_special_tokens)
            self.generated_text = ""
            self.stop_flag = False
            self.init_time = time.time()  # Record initialization time
            self.end_time = None  # To store end time
            self.first_token_time = None  # To store first token generation time
            self.think_tokens_count = 0  # To track total think tokens
            self.token_count = 0  # To track total tokens

        def on_finalized_text(self, text: str, stream_end: bool = False):
            if self.first_token_time is None and text.strip():  # Set first token time on first non-empty text
                self.first_token_time = time.time()
            if stream_end:
                self.end_time = time.time()  # Record end time when streaming ends

            self.generated_text += text
            tokens = self.tokenizer.encode(text, add_special_tokens=False)
            self.token_count += len(tokens)
            if self.think_tokens_count == 0 and "</think>" in self.generated_text:
                self.think_tokens_count = self.token_count
            print(text, end="", flush=True)

            if self.stop_flag:
                raise StopIteration

        def stop_generation(self):
            self.stop_flag = True
            self.end_time = time.time()  # Record end time when generation is stopped

        def get_metrics(self):
            """Returns initialization time, first token time, first token latency, end time, total time, total tokens, and tokens per second."""
            if self.end_time is None:
                self.end_time = time.time()  # Set end time if not already set
            total_time = self.end_time - self.init_time  # Total time from init to end
            tokens_per_second = self.token_count / total_time if total_time > 0 else 0
            first_token_latency = (self.first_token_time - self.init_time) if self.first_token_time is not None else None
            metrics = {
                "init_time": self.init_time,
                "first_token_time": self.first_token_time,
                "first_token_latency": first_token_latency,
                "end_time": self.end_time,
                "total_time": total_time,  # Total time in seconds
                "total_tokens": self.token_count,
                "think_tokens_count": self.think_tokens_count,
                "real_tokens_count": self.token_count - self.think_tokens_count,
                "tokens_per_second": tokens_per_second
            }
            return metrics

    def generate_stream(model, tokenizer, messages, enable_thinking, skip_prompt, skip_special_tokens, max_new_tokens):
        text = tokenizer.apply_chat_template(
            messages,
            tokenize=False,
            add_generation_prompt=True,
            enable_thinking=enable_thinking
        )
        inputs = tokenizer(
            text,
            return_tensors="pt",
        ).to(model.device)

        streamer = CustomTextStreamer(tokenizer, skip_prompt=skip_prompt, skip_special_tokens=skip_special_tokens)

        def signal_handler(sig, frame):
            streamer.stop_generation()
            print("\n[Generation stopped by user with Ctrl+C]")

        signal.signal(signal.SIGINT, signal_handler)

        print("Response: ", end="", flush=True)
        try:
            generated_ids = model.generate(
                **inputs,
                max_new_tokens=max_new_tokens,
                streamer=streamer
            )
            del generated_ids
        except StopIteration:
            print("\n[Stopped by user]")

        del inputs
        torch.cuda.empty_cache()
        signal.signal(signal.SIGINT, signal.SIG_DFL)

        return streamer.generated_text, streamer.stop_flag, streamer.get_metrics()

    skip_prompt=True
    skip_special_tokens=True
    enable_thinking=False

    while True:
        print(f"skip_prompt = {skip_prompt}.")
        print(f"skip_special_tokens = {skip_special_tokens}.")
        print(f"enable_thinking = {enable_thinking}.")

        user_input = input("User: ").strip()
        if user_input.lower() == "/exit":
            print("Exiting chat.")
            break
        if user_input.lower() == "/clear":
            messages = []
            print("Chat history cleared. Starting a new conversation.")
            continue
        if user_input.lower() == "/skip_prompt":
            skip_prompt = not skip_prompt
            continue
        if user_input.lower() == "/skip_special_tokens":
            skip_special_tokens = not skip_special_tokens
            continue
        if user_input.lower() == "/enable_thinking":
            enable_thinking = not enable_thinking
            continue
        if not user_input:
            print("Input cannot be empty. Please enter something.")
            continue

        messages.append({"role": "user", "content": user_input})
        response, stop_flag, metrics = generate_stream(model, tokenizer, messages, enable_thinking, skip_prompt, skip_special_tokens, 40960)
        print("\n\nMetrics:")
        for key, value in metrics.items():
            print(f"  {key}: {value}")

        print("", flush=True)

        if stop_flag:
            continue
        messages.append({"role": "assistant", "content": response})

if __name__ == "__main__":
    main()

Usage Warnings

  • Risk of Sensitive or Controversial Outputs: This model’s safety filtering has been significantly reduced, potentially generating sensitive, controversial, or inappropriate content. Users should exercise caution and rigorously review generated outputs.

  • Not Suitable for All Audiences: Due to limited content filtering, the model’s outputs may be inappropriate for public settings, underage users, or applications requiring high security.

  • Legal and Ethical Responsibilities: Users must ensure their usage complies with local laws and ethical standards. Generated content may carry legal or ethical risks, and users are solely responsible for any consequences.

  • Research and Experimental Use: It is recommended to use this model for research, testing, or controlled environments, avoiding direct use in production or public-facing commercial applications.

  • Monitoring and Review Recommendations: Users are strongly advised to monitor model outputs in real-time and conduct manual reviews when necessary to prevent the dissemination of inappropriate content.

  • No Default Safety Guarantees: Unlike standard models, this model has not undergone rigorous safety optimization. huihui.ai bears no responsibility for any consequences arising from its use.

Donation

Your donation helps us continue our further development and improvement, a cup of coffee can do it.
  • bitcoin:
  bc1qqnkhuchxw0zqjh2ku3lu4hq45hc6gy84uk70ge
  • Support our work on Ko-fi!

Configuration

Architecture
Qwen3_5ForCausalLM
Context length (tokens)
262,144
Layers
32
Hidden size
2,560
Feed-forward size
9,216
Attention heads
16
Key/value heads
4
Head dimension
256
Vocabulary size
248,320
Model type
qwen3_5_text

Identity and Version

Repository
huihui-ai/Huihui-NeoHorse-1-4B-abliterated
Publisher
Huihui.ai
Task
Text generation
Modality
Text
Library
transformers
Parameters
4.2B parameters
Languages
Not stated by the source
Revision
ed87d7cdfb88e4815e95741e3e003a8942b1b270
First published
2026-09-18
Last updated
2026-09-18

Files and Weights

18 files, 9.3 GB in total. The weights are 4 files totalling 9.3 GB in safetensors.

Weights4 files · 9.3 GB
Configuration6 files · 99.3 KB
Tokenizer4 files · 22.9 MB
Documentation2 files · 22.0 KB
Other1 file · 7.8 KB
Repository1 file · 1.6 KB
Every file
FileTypeSizeSHA-256
MTP-Visual/mtp.safetensorsWeights241.2 MB 7f993d7b896c
MTP-Visual/visual.safetensorsWeights667.1 MB 42939a2326ee
model-00001-of-00002.safetensorsWeights5.0 GB 4cd7cdee3dd7
model-00002-of-00002.safetensorsWeights3.4 GB d5b0562183e6
MTP-Visual/config.jsonConfiguration3.2 KB
MTP-Visual/model.safetensors.index.jsonConfiguration57.3 KB
MTP-Visual/preprocessor_config.jsonConfiguration390 B
MTP-Visual/video_preprocessor_config.jsonConfiguration385 B
config.jsonConfiguration2.2 KB
model.safetensors.index.jsonConfiguration35.8 KB
LICENSEDocumentation11.8 KB
README.mdDocumentation10.2 KB
chat_template.jinjaOther7.8 KB
.gitattributesRepository1.6 KB
merges.txtTokenizer3.4 MB
tokenizer.jsonTokenizer12.8 MB 5f9e4d4901a9
tokenizer_config.jsonTokenizer16.7 KB
vocab.jsonTokenizer6.7 MB

License and Download

License
apache-2.0
Access
Open weights, no gate
Download size
9.3 GB
Download from Huihui.ai

Released by Huihui.ai through its official repository on Hugging Face. Read the license.

Built From

  • Derived from TokenRhythm/NeoHorse-1-4B

Memory Requirements

PrecisionWeights in memory
As published9.3 GB
16-bit8.4 GB
8-bit4.2 GB
4-bit2.1 GB

Weights only, from the published parameter count; the key-value cache and runtime add to this.

Questions About Huihui-NeoHorse-1-4B-abliterated

How much GPU memory does Huihui-NeoHorse-1-4B-abliterated need?

About 10.1 GB at 16-bit and 2.5 GB at 4-bit: the weights (4.2B parameters) plus a working margin. A long context needs more.

What is the cheapest GPU to run Huihui-NeoHorse-1-4B-abliterated on?

At 16-bit, 1x MI300X from $1.85 an hour; at 4-bit, 1x MI300X from $1.85 an hour, at the lowest on-demand prices the SAVRN Index lists.

Can I use Huihui-NeoHorse-1-4B-abliterated commercially?

Yes. Huihui-NeoHorse-1-4B-abliterated is released under Apache License 2.0. The Apache License 2.0 is a permissive open-source license. It permits commercial use, modification and redistribution. It requires keeping the license and copyright notices and any NOTICE file, stating significant changes, and it includes an express patent grant from contributors.

What is Huihui-NeoHorse-1-4B-abliterated's context length?

262,144 tokens, from the maximum position embeddings in its published configuration.

Similar Models

Model · Text generation

dQwen3.5-4B-Base

IFML

A masked diffusion language model adapted from Qwen3.5-4B. The backbone is hybrid: only its attention layers are made bidirectional, and the Gated DeltaNet layers stay causal. This is a base model, with no instruction tuning. Paper: dQwen3.5: Hybrid-Attention Diffusion Language Models. Code: https://github.com/AntonXue/dQwen Needs a CUDA GPU and transformers>=5.13 (tested with torch 2.7.1+cu128, flash-linear-attention 0.5.1). generate decodes the whole canvas at once, committing positions above a confidence threshold (tau=0.9); pass blocklength=32 for left-to-right block decoding, or tau=None, stepsperblock=k for a fixed budget. The 50B-token checkpoint from the paper is…

Open weights apache-2.0 4.2B parameters 262,144 tokens transformers

Model · Text generation

Qwen3-4B

Qwen

Qwen3 is the latest generation of large language models in Qwen series, offering a comprehensive suite of dense and mixture-of-experts (MoE) models. Built upon extensive training, Qwen3 delivers groundbreaking advancements in reasoning, instruction-following, agent capabilities, and multilingual support, with the following key features: - Uniquely support of seamless switching between thinking mode (for complex logical reasoning, math, and coding) and non-thinking mode (for efficient, general-purpose dialogue) within single model, ensuring optimal performance across various scenarios. - Significantly enhancement in its reasoning capabilities, surpassing previous QwQ (in thinking mode) and…

Open weights apache-2.0 4B parameters 40,960 tokens transformers

Model · Text generation

Qwen3-4B-Instruct-2507

Qwen

We introduce the updated version of the Qwen3-4B non-thinking mode, named Qwen3-4B-Instruct-2507, featuring the following key enhancements: - Significant improvements in general capabilities, including instruction following, logical reasoning, text comprehension, mathematics, science, coding and tool usage. - Substantial gains in long-tail knowledge coverage across multiple languages. - Markedly better alignment with user preferences in subjective and open-ended tasks, enabling more helpful responses and higher-quality text generation. - Enhanced capabilities in 256K long-context understanding. Qwen3-4B-Instruct-2507 has the following features: NOTE: This model supports only non-thinking…

Open weights apache-2.0 4B parameters 262,144 tokens transformers

Model · Text generation

Qwen3-4B-Base

Qwen

Qwen3 is the latest generation of large language models in Qwen series, offering a comprehensive suite of dense and mixture-of-experts (MoE) models. Building upon extensive advancements in training data, model architecture, and optimization techniques, Qwen3 delivers the following key improvements over the previously released Qwen2.5: Qwen3-4B-Base has the following features: For more details, including benchmark evaluation, hardware requirements, and inference performance, please refer to our blog, GitHub, and Documentation. The code of Qwen3 has been in the latest Hugging Face transformers and we advise you to use the latest version of transformers. With transformers<4.51.0, you will…

Open weights apache-2.0 4B parameters 32,768 tokens transformers

Model · Text generation

qwen3-4b-base-dapo-v4

Reliquary

Qwen3 is the latest generation of large language models in Qwen series, offering a comprehensive suite of dense and mixture-of-experts (MoE) models. Building upon extensive advancements in training data, model architecture, and optimization techniques, Qwen3 delivers the following key improvements over the previously released Qwen2.5: Qwen3-4B-Base has the following features: For more details, including benchmark evaluation, hardware requirements, and inference performance, please refer to our blog, GitHub, and Documentation. The code of Qwen3 has been in the latest Hugging Face transformers and we advise you to use the latest version of transformers. With transformers<4.51.0, you will…

Open weights apache-2.0 4B parameters 32,768 tokens transformers

Model · Text generation

RL-fromscratch

Tangyunbo

We introduce the updated version of the Qwen3-4B non-thinking mode, named Qwen3-4B-Instruct-2507, featuring the following key enhancements: - Significant improvements in general capabilities, including instruction following, logical reasoning, text comprehension, mathematics, science, coding and tool usage. - Substantial gains in long-tail knowledge coverage across multiple languages. - Markedly better alignment with user preferences in subjective and open-ended tasks, enabling more helpful responses and higher-quality text generation. - Enhanced capabilities in 256K long-context understanding. Qwen3-4B-Instruct-2507 has the following features: NOTE: This model supports only non-thinking…

Open weights apache-2.0 4B parameters 262,144 tokens transformers