Nodes/Arthemy Live Tuner - Z-image/Arthemy Qwen Tuner (LAB)
ComfyUI Node

Arthemy Qwen Tuner (LAB)

Per-layer control of Qwen3-4B, when six zones aren't precise enough

By aledelpho·Created 7 months ago·Updated 7 months ago· 15
Arthemy Qwen Tuner (LAB)
  • clip
  • CLIP
  • info
  • debug_data
mode
base_strength1.00
LLM_Syntax_L001.00
LLM_Syntax_L011.00
LLM_Syntax_L021.00
LLM_Syntax_L031.00
LLM_Syntax_L041.00
LLM_Syntax_L051.00
LLM_Syntax_L061.00
LLM_Syntax_L071.00
LLM_Syntax_L081.00
LLM_Semantics_L091.00
LLM_Semantics_L101.00
LLM_Semantics_L111.00
LLM_Semantics_L121.00
LLM_Semantics_L131.00
LLM_Semantics_L141.00
LLM_Semantics_L151.00
LLM_Semantics_L161.00
LLM_Semantics_L171.00
LLM_Context_L181.00
LLM_Context_L191.00
LLM_Context_L201.00
LLM_Context_L211.00
LLM_Context_L221.00
LLM_Context_L231.00
LLM_Context_L241.00
LLM_Context_L251.00
LLM_Context_L261.00
LLM_Abstract_L271.00
LLM_Abstract_L281.00
LLM_Abstract_L291.00
LLM_Abstract_L301.00
LLM_Abstract_L311.00
LLM_Abstract_L321.00
LLM_Abstract_L331.00
LLM_Abstract_L341.00
LLM_Abstract_L351.00

The Simple version of the Qwen tuner hands you six semantic zones and hopes that's enough. Arthemy Qwen Tuner (LAB) discards the groupings and exposes all 36 layers of Qwen3-4B as individual sliders - the same "look under the hood" philosophy as the Z-Image Lab node, but for the text encoder. Where Simple lets you say "nudge the syntax," this lets you say "nudge layer 13 specifically and nothing else."

The 36 sliders

They're generated dynamically and named by the author's rough semantic buckets:

  • LLM_Syntax_L00LLM_Syntax_L08 - layers 0–8, tagged as syntax
  • LLM_Semantics_L09LLM_Semantics_L17 - layers 9–17, tagged as semantics
  • LLM_Context_L18LLM_Context_L26 - layers 18–26, tagged as context
  • LLM_Abstract_L27LLM_Abstract_L35 - layers 27–35, tagged as abstract reasoning

The names encode the author's hypothesis about what each band does, but don't treat them as ground truth. A single-stream LLM is exactly as messy as a single-stream DiT - the layer that owns "strict grammar adherence" for one prompt may be a dud for another. That's what the Lab node is for: finding out.

How it works

Mechanically it's identical to the Simple tuner - ComfyUI's native lazy patch system, no in-place mutation, no ArthemyTunerLoader required. It regex-matches each layer in the encoder's state dict, skips normalization and bias keys, and registers a patch with strength (scale − 1). Non-destructive, stacks cleanly, and at scale 1.0 a layer stays completely untouched.

Same inputs as Simple: clip, mode (Real Value vs the gentler Soft Value mapping), and base_strength (0–2) as a master gain. Same three outputs: the patched CLIP for CLIPTextEncode, an info string with the active patch count, and debug_data - a dict of every per-layer strength, which is genuinely handy when you're juggling 36 sliders and want to see what you actually changed.

How to actually use it

Same discipline as the Z-Image Lab node:

  1. Fix a seed and a prompt.
  2. Bump one layer to ~1.5 in Soft Value, generate, compare.
  3. Note what moved, then move on to the next layer.

This is slow, and most layers will do nothing you can name - that's normal. The payoff is that the zones in the Simple tuner were derived from exactly this kind of probing, and your findings on your own prompts are just as valid as the author's defaults.

Wiring

CLIPLoader (qwen_3_4b) ──> Arthemy Qwen Tuner (LAB) ──> CLIPTextEncode ──> KSampler

The honest take

This is the most "experimental" node in the pack, and the README knows it - it exists so the community can map what's really inside each slice of Qwen. If you just want a better prompt result, the Simple tuner's six zones get you 90% of the way with a tenth of the fiddling. Reach for the Lab when you've hit a wall, or when you're curious enough to chart the encoder yourself. And when you find a combination worth keeping, run the tuned CLIP through ArthemyQwenSaver to bake it into a standalone text encoder file - that's the loop this pack is built around.

CategoryArthemy/Qwen-TE/Tuning

Inputs (39)

NameTypeDefaultDescription
clipCLIP
modeCOMBO2 options: Soft Value, Real Value
base_strengthFLOAT1.000–2
LLM_Syntax_L00optFLOAT1.000–2
LLM_Syntax_L01optFLOAT1.000–2
LLM_Syntax_L02optFLOAT1.000–2
LLM_Syntax_L03optFLOAT1.000–2
LLM_Syntax_L04optFLOAT1.000–2
LLM_Syntax_L05optFLOAT1.000–2
LLM_Syntax_L06optFLOAT1.000–2
LLM_Syntax_L07optFLOAT1.000–2
LLM_Syntax_L08optFLOAT1.000–2
LLM_Semantics_L09optFLOAT1.000–2
LLM_Semantics_L10optFLOAT1.000–2
LLM_Semantics_L11optFLOAT1.000–2
LLM_Semantics_L12optFLOAT1.000–2
LLM_Semantics_L13optFLOAT1.000–2
LLM_Semantics_L14optFLOAT1.000–2
LLM_Semantics_L15optFLOAT1.000–2
LLM_Semantics_L16optFLOAT1.000–2
LLM_Semantics_L17optFLOAT1.000–2
LLM_Context_L18optFLOAT1.000–2
LLM_Context_L19optFLOAT1.000–2
LLM_Context_L20optFLOAT1.000–2
LLM_Context_L21optFLOAT1.000–2
LLM_Context_L22optFLOAT1.000–2
LLM_Context_L23optFLOAT1.000–2
LLM_Context_L24optFLOAT1.000–2
LLM_Context_L25optFLOAT1.000–2
LLM_Context_L26optFLOAT1.000–2
LLM_Abstract_L27optFLOAT1.000–2
LLM_Abstract_L28optFLOAT1.000–2
LLM_Abstract_L29optFLOAT1.000–2
LLM_Abstract_L30optFLOAT1.000–2
LLM_Abstract_L31optFLOAT1.000–2
LLM_Abstract_L32optFLOAT1.000–2
LLM_Abstract_L33optFLOAT1.000–2
LLM_Abstract_L34optFLOAT1.000–2
LLM_Abstract_L35optFLOAT1.000–2

Outputs (3)

NameTypeDescription
CLIPCLIP
infoSTRING
debug_dataDICT