Download
1 variant available
License:
AnimaThe Anima Model is licensed by CircleStone Labs LLC. Copyright CircleStone Labs LLC. IN NO EVENT SHALL CIRCLESTONE LABS LLC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH USE OF THIS MODEL.
Built on NVIDIA Cosmos
With the release of base V1 of ANIMA, now is the time to release a full checkpoint for some fun and stuff (including a bounty that will follow once i got some sleep 🤣)
Usage:
Resolution: Base V1 had a huge boost in quality with a final finetune at 1536x1536 resolution = Showcases picture are 960x1440 without any Hires.Fix or Upscale.
sampler/scheduler: ER_SDE + Beta (or Smoothstep for sd.cpp)
CFG: 1 since the Turbo LoRA is included (but 1.1 to 1.5 also works and allow back some negative prompting)
steps: 8-12 should be enough with the Turbo LoRA but i go for 16.
positive prompt: i like to start with masterpiece, best quality, score_9, newest, detailed
flow shift: keep the default at 3 if your tool of choice display the value
Works with Forge Neo, should work with ComfyUI.
NB: A Q4_K quantized version for sd.cpp is available on HF (remember this version does NOT work with Forge/Comfy)
It is made using:
nArnima V2 LoRA at 1.0 (this means that yes, the TE has been slightly modified. Using base Qwen3-4B as override will change results)
my Turbo LoRA at 0.9
my P3-to-V1 LoRA at -0.1 to restore some details i wanted back without breaking the impressive boost in quality of the Base V1 gens
Ugly build script:
from safetensors.torch import load_file, save_file
import torch
from tqdm import tqdm
torch.set_grad_enabled(False)
def prefix_replace(st, o, n):
for k in [k for k in st if k.startswith(o)]:
st[f"{n}{k[len(o):]}"] = st.pop(k)
def to_cuda(t):
return t.to(device="cuda", dtype=torch.float)
def to_cpu(t):
return t.to(device="cpu", dtype=torch.bfloat16).contiguous()
def merge_lora_weight(l, lk, w):
B = to_cuda(l[f"{lk}.lora_B.weight"])
A = to_cuda(l[f"{lk}.lora_A.weight"])
if f"{lk}.alpha" in l:
s = float(l[f"{lk}.alpha"]) / B.shape[1]
else:
s = 1.0
m = (B @ A) * s * w
return m
def weight_or_bias(k):
c = {"bias": "diff_b", "weight": "diff"}
for suffix in c:
if k.endswith(suffix):
return k.replace(suffix, c[suffix])
def merge_lora(st, f, w):
l = load_file(f)
prefix_replace(l, "text_encoders.qwen3_06b.", "cond_stage_model.qwen3_06b.transformer.")
prefix_replace(l, "diffusion_model.", "model.diffusion_model.")
print(f"Merging {f} at {w}")
for k in (pbar := tqdm(st.keys())):
pbar.set_postfix_str(k)
layer = st[k]
if len(layer.shape) not in [1, 2]:
del layer
continue
if len(layer.shape) == 1:
lk = weight_or_bias(k)
if lk in l:
st[k] = to_cpu(to_cuda(layer) + to_cuda(l[lk]) * w)
else:
lk = k.rstrip(".weight")
if f"{lk}.lora_B.weight" in l:
st[k] = to_cpu(to_cuda(layer) + merge_lora_weight(l, lk, w))
del layer
del l
def main():
print("Loading anima_baseV10.safetensors")
model = load_file("anima_baseV10.safetensors")
prefix_replace(model, "net.", "model.diffusion_model.")
print("Loading qwen_3_06b_base.safetensors")
te = load_file("qwen_3_06b_base.safetensors")
prefix_replace(te, "model.", "cond_stage_model.qwen3_06b.transformer.model.")
for k in te:
model[k] = te[k]
del te
merge_lora(model, "nArnima_V2.safetensors", 1.0)
merge_lora(model, "Turbo-ANIMA.safetensors", 0.9)
merge_lora(model, "anima-P3-to-V1.safetensors", -0.1)
print("Loading qwen_image_vae.safetensors")
vae = load_file("qwen_image_vae.safetensors")
prefix_replace(vae, "", "first_stage_model.")
for k in vae:
model[k] = vae[k]
del vae
print("Saving nArnima-Turbo-AIO.safetensors")
save_file(model, "nArnima-Turbo-AIO.safetensors")
print("Done!")
if __name__ == "__main__":
main()
Legal
The CircleStone Model is licensed by CircleStone Labs LLC under the CircleStone Non-Commercial License. Copyright CircleStone Labs LLC. IN NO EVENT SHALL CIRCLESTONE LABS LLC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH USE OF THIS MODEL.


