transformer在人工智能中,特别是深度学习这一块非常重要,相当于人工智能的基石。

这里只演示回答问题,训练及保存见其他笔记。

安装依赖

pip install transformers peft accelerate torch datasets

注:
transformer是概念名,但是包的名字是transformers

本地调用示例-基础版
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

# 1. 指定模型名称 (也可以替换为本地路径 "./my_local_model")
model_name = "Qwen/Qwen2.5-7B-Instruct"

print(f"正在加载模型: {model_name} ...")

# 2. 加载分词器 (Tokenizer) - 负责将文字转为数字
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)

# 3. 加载模型权重 (Model) - 负责计算
# device_map="auto" 会自动检测并使用 GPU,如果没有 GPU 则用 CPU
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,  # 使用半精度节省显存
    device_map="auto",
    trust_remote_code=True
)

# 4. 准备输入数据 (构建 Prompt)
messages = [
    {"role": "system", "content": "你是一个有用的助手。"},
    {"role": "user", "content": "请用一句话解释什么是远程过程调用 (RPC)。"}
]

# 应用聊天模板 (Chat Template),将对话列表转换为模型能理解的文本格式
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

print("正在生成回复...")

# 5. 生成推理 (核心 API 调用)
generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=512,       # 最大生成长度
    do_sample=True,           # 开启采样,使回答更自然
    temperature=0.7,          # 温度参数,越高越随机
    top_p=0.9                 # 核采样参数
)

# 6. 解码输出
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

print("\n--- 模型回复 ---")
print(response)
本地调用-pipeline简化版
from transformers import pipeline

# 自动下载模型并创建管道 (本地运行)
# task="text-generation" 告诉它我们要做什么
generator = pipeline("text-generation", model="Qwen/Qwen2.5-7B-Instruct")

# 直接调用
messages = [{"role": "user", "content": "Python 和 Java 有什么区别?"}]
response = generator(messages, max_new_tokens=200)

print(response[0]['generated_text'])
api调用(见openAI笔记)

训练及保存(见其他笔记)

AutoModelForCausalLM

from_pretrained()

from_pretrained是预训练方法,特别重要的一个方法。

from_pretrained()-最常用完整版代码(带注释)
model = AutoModelForCausalLM.from_pretrained(
    # 1. 模型名称或本地路径(必填)
    pretrained_model_name_or_path="Qwen/Qwen2.5-1.5B-Instruct",
    # 2. 4bit 量化(你现在最需要)
    quantization_config=bnb_config,    
    # 3. 设备自动分配(cpu / cuda)
    device_map="cpu",  # 或 "auto" / "cuda"
    # 4. 降低CPU内存使用
    low_cpu_mem_usage=True,
    # 5. 数据类型(CPU必须用float32)
    torch_dtype=torch.float32,
    # 6. 信任远程代码(有些模型需要)
    trust_remote_code=False,
    # 7. 不加载权重(仅测试)
    force_download=False,
)
from_pretrained()-参数说明
参数名类型说明示例
pretrained_model_name_or_pathstr(必填) 模型名称或本地路径。
1. Hugging Face ID: "Qwen/Qwen2.5-1.5B-Instruct"
2. 本地路径: "./models/qwen-1.5b"
3. 快照ID: "Qwen/Qwen2.5-1.5B-Instruct/snapshot/abc123"
"Qwen/Qwen2.5-1.5B-Instruct"
device_mapstr / dict设备映射策略。
- "auto": 自动分配 (优先 GPU,不够放 CPU/磁盘)。
- "cuda:0": 强制全量放在第一张显卡。
- "cpu": 强制放在 CPU。
- {"": "cpu"}: 显式指定。
GTX 850M: "cuda:0" (配合 max_memory)
纯 CPU: "cpu"
max_memorydict限制每张卡/CPU 的最大显存/内存使用量。
格式:{设备ID: "容量字符串"}
防止占满显存导致系统卡死。
GTX 850M: {0: "1800MiB"} (留余量给系统)
CPU: 通常不设,或设 { "cpu": "10GiB" }
offload_folderstr当显存/内存不足时,将部分权重卸载到硬盘的文件夹路径。
需配合 device_map="auto" 使用。
如果 2G 显存实在不够,可设 "./offload",但速度会极慢。
quantization_configBitsAndBytesConfig4-bit/8-bit 量化配置对象。
这是加载 4-bit 模型的唯一入口。必须传入由 BitsAndBytesConfig 初始化的对象。
quantization_config=bnb_config (必传)
torch_dtype / dtypetorch.dtype / str加载权重的数据类型。
- torch.float16: 半精度 (省显存,GPU 常用)。
- torch.bfloat16: BF16 (新显卡常用)。
- torch.float32: 全精度 (CPU 常用,稳定)。
注:新版推荐用 dtype,旧版用 torch_dtype
GPU: torch.float16
CPU: torch.float32
low_cpu_mem_usagebool低 CPU 内存模式。
True: 避免在加载过程中将完整模型载入 CPU 内存,直接分片加载到目标设备。
加载大模型时建议始终开启。
True (推荐,防止加载瞬间爆内存)
trust_remote_codebool是否信任远程代码。
许多国产模型 (如 Qwen, ChatGLM) 包含自定义的 Python 代码 (modeling_xxx.py)。设为 True 才能加载这些模型。
Qwen 系列必须设为 True
revisionstr指定加载模型的特定分支、Tag 或 Commit Hash。
用于复现特定版本或测试未合并的模型。
默认 "main"
cache_dirstr自定义模型缓存下载目录。默认在 ~/.cache/huggingface
force_downloadbool强制重新下载模型,忽略本地缓存。
resume_downloadbool允许断点续传 (新版本默认开启)。
local_files_onlybool只读取本地文件,不尝试联网。联网失败时很有用。
use_safetensorsbool是否优先加载 .safetensors 格式 (更安全、加载更快)。默认 True
cpu环境代码
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-1.5B-Instruct",
    device_map="cpu",
    low_cpu_mem_usage=True,
    torch_dtype=torch.float32,
)
cpu+4bit量化(最快)
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-1.5B-Instruct",
    quantization_config=bnb_config,
    device_map="cpu",
    low_cpu_mem_usage=True,
    torch_dtype=torch.float32,
)
gpu环境
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2.5-1.5B-Instruct",
    device_map="auto",
    torch_dtype=torch.float16,
)

小技巧

如何实现不匹配返回0,让大模型不学习?

labels设为-100。

# 【核心技巧】:如何实现“不匹配则是0”?
# 在 Transformers 中,将 labels 设为 -100,计算 Loss 时会自动忽略该位置
 if tag == 1:
     # 匹配:保留原始 ID 作为 label,模型会学习
     labels_list.append(ids)
 else:
     # 不匹配:全部填 -100,模型看见但不学习 (Loss=0)
     labels_list.append([-100] * len(ids))
pipeline

pipeline是transformer下的一个包。

pipeline可用的任务列表(task列表)

这个很重要,顺便也可以了解下常用的业务场景。

任务名 (Task Name)说明典型应用场景
text-classification文本分类情感分析、垃圾邮件识别
sentiment-analysis情感分析这是 text-classification 的别名,专门用于情感判断
ner命名实体识别从简历中提取人名、公司名
question-answering问答阅读理解,给一段话问问题
summarization文本摘要长文章自动生成短摘要
translation翻译英译中、中译法
text-generation文本生成续写故事、聊天机器人(如 GPT 类)
fill-mask完形填空猜句子中间缺的词
zero-shot-classification零样本分类给文本打标签,但不需要训练(你给它标签列表,它直接分)
image-classification图像分类识别图片里是猫还是狗
object-detection目标检测找出图片里物体的位置(画框框)
情感分析示例

如果任务确定,机制基本就确定,返回结构基本也固定。
例如情感分析返回的结果是一个json对象:
[{'label': 'NEGATIVE', 'score': 0.89558345079422}]
label表示正面或负面等,score表示得分。

注:distilbert这个模型是专门做情感分析的,是不能用来文本生成的,否则会报错。

代码:

from transformers import pipeline as hf_pipeline

print("加载工具 (CPU)...")
classifier = hf_pipeline("text-classification", model="distilbert-base-uncased-finetuned-sst-2-english", device=-1)

result = classifier("物流实在是太慢了")
print(result)
# result 结构通常是 [{'label': 'NEGATIVE', 'score': 0.99}]
label = result[0]['label']
score = result[0]['score']
print(f"情感倾向: {label}, 置信度: {score:.4f}")

输出结果:

加载工具 (CPU)...
[{'label': 'NEGATIVE', 'score': 0.89558345079422}]
情感倾向: NEGATIVE, 置信度: 0.8956
情感分析

是直接返回内容,和文本生成不一样,文本生成是每个字都需要运算下。

常见的形式:
1、先锁定答案,再生成文字
2、先推理,再下结论

文本生成示例

这里用distilgpt2模型,最好拿它来生成英文,生成中文不太好用。
替换input_text可以模拟不同的开头场景。

代码:

from transformers import pipeline

model_name = "distilgpt2"
print(f"正在加载最小模型: {model_name} ...")

generator = pipeline("text-generation", model=model_name, device=-1)

# 3. 开始生成
input_text = "I like fruit" # 这是最开始的文字,后续生成会根据这个来
print(f"输入: {input_text}")

# 4. 执行生成
# max_new_tokens=20 表示新生成 20 个 token (约等于 15-20 个英文单词)
results = generator(input_text, max_new_tokens=20, do_sample=True)

print(f"输出: {results[0]['generated_text']}")

其他

文档

github transformer git地址(还可以吧,比hugging face访问成功率高些)
https://github.com/huggingface/transformers

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐