The Auto* classes are dispatchers
Below the pipeline() abstraction sit the Auto* classes: AutoTokenizer, AutoModel, AutoModelForCausalLM, AutoModelForSequenceClassification, AutoModelForSeq2SeqLM, AutoModelForImageClassification, AutoFeatureExtractor, AutoProcessor, ... — one per task family.
Each Auto class wraps a registry: from a config.json field "model_type": "llama" it dispatches to LlamaTokenizer + LlamaForCausalLM. You almost never instantiate the concrete class directly; you call AutoModelForXxx.from_pretrained(repo_id) and the right class is chosen.
The four loader knobs that matter
torch_dtype—"auto"reads dtype from config;torch.float16/torch.bfloat16halves memory;torch.float32only if you need it.device_map—"auto"shards across visible GPUs/MPS/CPU; pass a dict for explicit placement.load_in_8bit/load_in_4bit— bitsandbytes quantization at load time. 8-bit is ~half memory; 4-bit is ~quarter. Inference quality cost is usually small for chat tasks.revision— pin a commit SHA. Same rule as the Hub track.
The same loader works for any model that declares its task via library_name: transformers in the card. That's the whole point of the registry.