python调用transformer示例、transformer规范等
·
文章目录
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_path | str | (必填) 模型名称或本地路径。 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_map | str / dict | 设备映射策略。 - "auto": 自动分配 (优先 GPU,不够放 CPU/磁盘)。- "cuda:0": 强制全量放在第一张显卡。- "cpu": 强制放在 CPU。- {"": "cpu"}: 显式指定。 | GTX 850M: "cuda:0" (配合 max_memory)纯 CPU: "cpu" |
max_memory | dict | 限制每张卡/CPU 的最大显存/内存使用量。 格式: {设备ID: "容量字符串"}。防止占满显存导致系统卡死。 | GTX 850M: {0: "1800MiB"} (留余量给系统)CPU: 通常不设,或设 { "cpu": "10GiB" } |
offload_folder | str | 当显存/内存不足时,将部分权重卸载到硬盘的文件夹路径。 需配合 device_map="auto" 使用。 | 如果 2G 显存实在不够,可设 "./offload",但速度会极慢。 |
quantization_config | BitsAndBytesConfig | 4-bit/8-bit 量化配置对象。 这是加载 4-bit 模型的唯一入口。必须传入由 BitsAndBytesConfig 初始化的对象。 | quantization_config=bnb_config (必传) |
torch_dtype / dtype | torch.dtype / str | 加载权重的数据类型。 - torch.float16: 半精度 (省显存,GPU 常用)。- torch.bfloat16: BF16 (新显卡常用)。- torch.float32: 全精度 (CPU 常用,稳定)。注:新版推荐用 dtype,旧版用 torch_dtype。 | GPU: torch.float16CPU: torch.float32 |
low_cpu_mem_usage | bool | 低 CPU 内存模式。True: 避免在加载过程中将完整模型载入 CPU 内存,直接分片加载到目标设备。加载大模型时建议始终开启。 | True (推荐,防止加载瞬间爆内存) |
trust_remote_code | bool | 是否信任远程代码。 许多国产模型 (如 Qwen, ChatGLM) 包含自定义的 Python 代码 ( modeling_xxx.py)。设为 True 才能加载这些模型。 | Qwen 系列必须设为 True |
revision | str | 指定加载模型的特定分支、Tag 或 Commit Hash。 用于复现特定版本或测试未合并的模型。 | 默认 "main" |
cache_dir | str | 自定义模型缓存下载目录。默认在 ~/.cache/huggingface。 | — |
force_download | bool | 强制重新下载模型,忽略本地缓存。 | — |
resume_download | bool | 允许断点续传 (新版本默认开启)。 | — |
local_files_only | bool | 只读取本地文件,不尝试联网。联网失败时很有用。 | — |
use_safetensors | bool | 是否优先加载 .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
更多推荐



所有评论(0)