当前位置: 首页 > news >正文

[具身智能-504]:使用Transformers python库进行大模型的再训练、部署、使用的示例

使用 Hugging Face 的Transformers库进行大模型的再训练、部署和使用,是 AI 开发的核心工作流。下面将通过一个完整的实战示例,带你从零开始,体验这三个关键环节。

我们将以阿里的Qwen2.5-7B-Instruct模型为例,展示如何对其进行微调,并将其部署为一个可调用的 API 服务。

🛠️ 环境准备

首先,你需要安装必要的 Python 库。这里我们使用pip进行安装。

bash

# 安装核心库 pip install transformers accelerate torch datasets peft bitsandbytes trl
  • transformers: Hugging Face 的核心库,用于加载模型和分词器。
  • accelerate: 简化多 GPU 和混合精度训练。
  • torch: PyTorch 深度学习框架。
  • datasets: 方便地加载和处理数据集。
  • peft:参数高效微调库,用于 LoRA/QLoRA 等高效微调方法。
  • bitsandbytes: 提供量化支持,如 4-bit/8-bit 加载,大幅降低显存占用。
  • trl: Transformer Reinforcement Learning,这里我们用它提供的SFTTrainer来简化监督微调流程。

📚 第一步:再训练(以 QLoRA 微调为例)

直接训练一个 7B 参数量的模型需要巨大的显存。QLoRA (Quantized Low-Rank Adaptation) 技术通过量化和高效参数微调,让我们能在单张消费级显卡(如 RTX 3090/4090)上完成训练

1. 准备数据集

我们使用一个 JSONL 格式的数据集,其中每一行都是一个包含instruction(指令)、input(输入)和output(期望输出)的样本。

json

{"instruction": "解释量子纠缠", "input": "", "output": "量子纠缠是量子力学中的一种现象..."} {"instruction": "将这句话翻译成英文", "input": "你好,世界", "output": "Hello, World"}
2. 编写训练脚本

下面是一个完整的 QLoRA 微调脚本,包含了量化配置、LoRA 配置和训练流程。

python

import torch from datasets import load_dataset from transformers import ( AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, TrainingArguments ) from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training from trl import SFTTrainer # --- 1. 配置 4-bit 量化 (QLoRA 核心) --- # 这将模型权重压缩到 4-bit,显存占用直接减半 bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, bnb_4bit_use_double_quant=True, )<websource>source_group_web_3</websource> # --- 2. 加载模型和分词器 --- MODEL_ID = "Qwen/Qwen2.5-7B-Instruct" tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) # 确保分词器有 pad_token tokenizer.pad_token = tokenizer.eos_token model = AutoModelForCausalLM.from_pretrained( MODEL_ID, quantization_config=bnb_config, # 应用量化配置 device_map="auto", # 自动分配设备 trust_remote_code=True ) # --- 3. 预处理模型以进行 k-bit 训练 --- model = prepare_model_for_kbit_training(model) # --- 4. 配置 LoRA --- # 我们只训练新增的少量参数,而不是整个模型 peft_config = LoraConfig( r=16, # 秩,决定新增参数规模 lora_alpha=32, # 缩放系数,通常是 r 的 2 倍 lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"] ) model = get_peft_model(model, peft_config)<websource>source_group_web_4</websource> # --- 5. 加载数据 --- dataset = load_dataset("json", data_files="data.jsonl", split="train") # --- 6. 配置训练参数 --- training_args = TrainingArguments( output_dir="./qwen_lora_finetuned", num_train_epochs=3, per_device_train_batch_size=4, gradient_accumulation_steps=4, # 模拟更大的 batch size learning_rate=2e-4, fp16=True, # 混合精度训练 logging_steps=10, save_strategy="steps", save_steps=100, load_best_model_at_end=True, ) # --- 7. 开始训练 --- trainer = SFTTrainer( model=model, args=training_args, train_dataset=dataset, tokenizer=tokenizer, ) trainer.train() # --- 8. 保存模型 --- # 保存的是 LoRA 适配器权重,体积很小 model.save_pretrained("./qwen_lora_finetuned") tokenizer.save_pretrained("./qwen_lora_finetuned")

🚀 第二步:部署(以 FastAPI 为例)

训练完成后,我们需要将模型部署为一个 Web API,以便其他应用调用。这里使用FastAPI框架,它快速且能自动生成文档

注意:部署时,你需要将基础模型和训练好的 LoRA 权重合并,或者分别加载。为简化示例,这里假设你已经将 LoRA 权重合并到了基础模型中,并保存为./qwen-7b-merged

python

from fastapi import FastAPI, Body from transformers import AutoTokenizer, AutoModelForCausalLM import torch import uvicorn app = FastAPI(title="我的大模型API") # --- 1. 服务启动时加载模型 --- # 使用 8-bit 加载以节省显存,适合部署环境 model_name = "./qwen-7b-merged" tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", load_in_8bit=True, trust_remote_code=True ).eval() # 切换到评估模式 # --- 2. 定义推理接口 --- @app.post("/generate") async def generate( prompt: str = Body(..., description="输入提示词"), max_tokens: int = Body(512, description="最大生成token数"), temperature: float = Body(0.7, description="采样温度") ): # 构建输入 inputs = tokenizer(prompt, return_tensors="pt").to("cuda") # 模型推理 with torch.no_grad(): # 推理时不需要计算梯度 outputs = model.generate( **inputs, max_new_tokens=max_tokens, do_sample=True, temperature=temperature, pad_token_id=tokenizer.eos_token_id ) # 解码输出 result = tokenizer.decode(outputs, skip_special_tokens=True) return {"code": 200, "prompt": prompt, "response": result} # --- 3. 启动服务 --- if __name__ == "__main__": # 运行在 http://0.0.0.0:8000 uvicorn.run(app, host="0.0.0.0", port=8000)

启动服务后,你可以访问http://localhost:8000/docs查看自动生成的交互式 API 文档,并直接进行测试。

💬 第三步:使用(基础推理示例)

在微调或部署之后,你也可以直接用Transformers库加载模型进行简单的推理,感受模型的能力。

python

from transformers import AutoTokenizer, AutoModelForCausalLM import torch # --- 1. 加载模型 --- model_name = "Qwen/Qwen2.5-7B-Instruct" tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) # 使用 8-bit 加载,降低显存门槛 model = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", load_in_8bit=True, trust_remote_code=True ).eval() # --- 2. 构建对话 --- messages = [ {"role": "system", "content": "你是一个专业的AI助手。"}, {"role": "user", "content": "请介绍一下大模型量化技术。"} ] # 应用模型的对话模板 text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) model_inputs = tokenizer([text], return_tensors="pt").to("cuda") # --- 3. 生成回复 --- generated_ids = model.generate(**model_inputs, max_new_tokens=512) # 截取新生成的部分 output_ids = generated_ids[len(model_inputs.input_ids):] response = tokenizer.decode(output_ids, skip_special_tokens=True) print(response)

通过以上三个步骤,你就完成了从模型再训练、服务部署到最终使用的完整闭环。

http://www.jsqmd.com/news/716914/

相关文章:

  • 2026年3月聚四氟乙烯盘根生产厂家推荐,定型四氟板/316L 金属缠绕垫片/四氟条板,聚四氟乙烯盘根供应商哪个好 - 品牌推荐师
  • GPT5.5办公场景实测文档表格处理效率提升全记录
  • OPC UA + Python + XGBoost = 故障提前72小时预警?:某汽车焊装车间已验证的端到端工业预测链路
  • 随机计算与VDC-2n序列在低功耗硬件设计中的应用
  • 告警根因诊断与路由优化算法【附代码】
  • Pixelle-Video:5分钟学会用AI自动生成多语言短视频
  • LangChain4j工作流编排深度解析:Java智能体架构设计与最佳实践
  • YouTube推出“Ask YouTube“功能,用AI对话方式搜索视频
  • 别再混淆了!一文讲透PCIe Root Complex在不同处理器架构(x86 vs. PowerPC)里的真实差异
  • 论文查重辅助存证程序,写作过程记录上链,证明原创性,降低查重纠纷。
  • 星布谷地可以钓鱼吗 星布谷地钓鱼模式怎么玩
  • 风控规则变更要停服重启?Python动态AST解析器+YAML策略热加载,实现0.3秒内全量策略生效(含生产环境压测数据)
  • RimSort终极指南:三步解决《边缘世界》模组冲突与排序难题
  • 告别重复劳动!用Python的PyAutoGUI库5分钟搞定自动化办公(附完整代码)
  • npm注册表中发现恶意pgserve与automagik开发工具
  • PicoMQTT:ESP8266/ESP32轻量级MQTT库解析与应用
  • 量子神经网络辐射场(QNeRF)技术解析与应用
  • 3分钟极简方案:Onekey让Steam游戏清单下载自动化
  • 在维特根斯坦与米歇尔亨利之间
  • 完全掌握Radeon Software Slimmer:专业用户的AMD显卡驱动优化终极指南
  • ExtractorSharp终极指南:免费开源游戏资源编辑利器
  • 电动汽车BMS光耦隔离技术解析与应用
  • Pixelle-Video:三步实现AI全自动短视频生成的专业开发指南
  • ARM Cortex-R4/R4F处理器勘误解析与实时系统优化
  • 深度解析|为何众多企业采购,都优先选择江苏海之塑滚塑箱
  • javaweb--15
  • Python 并发编程:最佳实践与性能
  • 冷热电气多能互补的微能源网鲁棒优化调度(Matlab代码实现)
  • Layerdivider终极指南:如何3步将任何图片转换为专业PSD分层文件
  • RV1126双摄IMX577驱动移植避坑:从RK3588移植到DTS配置的完整流程