资讯详情

源2.0(Yuan2.0)大模型实战指南:FastApi 部署、LangChain 接入、vLLM 推理与 Lora 微调

📅 2026/9/12 2:20:15 | 华诺云谱 👁 阅读
源2.0(Yuan2.0)大模型实战指南:FastApi 部署、LangChain 接入、vLLM 推理与 Lora 微调
源2.0Yuan2.0大模型实战指南FastApi 部署、LangChain 接入、vLLM 推理与 Lora 微调【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm导读本指南以《开源大模型食用指南》仓库self-llm中models/Yuan2.0目录下的系列教程为主体系统讲解浪潮信息发布的源2.0Yuan2.0大语言模型在 Linux 环境下的完整食用链路从模型选型与下载、FastApi 在线部署、LangChain 知识库接入、Streamlit WebDemo 部署到 vLLM 高性能推理与 Lora 高效微调。读者按本文操作后可以独立完成源2.0-2B 系列模型从下载到部署、从推理到微调的完整闭环并将其复用到其他 LLM 的部署实践中。1. 模型简介源2.0 与 LFA 注意力机制源2.0 是浪潮信息发布的新一代基础语言大模型包含源2.0-102B、源2.0-51B 和源2.0-2B三个规模。源2.0 在源1.0 的基础上利用更多样的高质量预训练数据和指令微调数据集令模型在语义、数学、推理、代码、知识等不同方面具备更强的理解能力。算法方面源2.0 提出并采用了一种新型的注意力算法结构——局部注意力过滤增强机制LFALocalized Filtering-based Attention。LFA 通过先学习相邻词之间的关联性然后再计算全局关联性的方法能够更好地学习到自然语言的局部和全局语言特征对自然语言的关联语义理解更准确、更人性从而提升模型的自然语言表达能力与精度。从微调 Notebook 中打印的模型结构见 Lora-bf16 Notebook可以看到 LFA 在源码层的落点每个YuanDecoderLayer的self_attn由q_proj / k_proj / v_proj / o_proj线性投影与一个LocalizedFiltering门控模块组成该模块内部是两层Conv2d2048 → 1024 → 2048与YuanRMSNorm这正是 LFA 通过卷积核在相邻 token 上先做局部建模的实现形态。这为后续理解为什么微调时要同时适配其特殊 tokenizer 与特殊分隔符提供了结构背景。2. 模型下载源2.0 各尺寸与格式Yuan2.0 提供了多种模型格式各尺寸的序列长度与下载渠道如下表所示均可在 ModelScope、HuggingFace、OpenXlab、百度网盘、WiseModel 等平台获取本文实操统一使用 ModelScope 通道模型序列长度源2.0-102B-hf4K源2.0-51B-hf4K源2.0-2B-hf8K源2.0-2B-Janus-hf8K源2.0-2B-Februa-hf8K源2.0-2B-Mars-hfNew8K其中源2.0-2B-Mars-hf、源2.0-2B-Februa-hf、源2.0-2B-Janus-hf均为源2.0-2B-hf 的迭代版本。为什么教程选源2.0-2B-Mars-hf在上一节的多个模型中源2.0-2B-Mars-hf 是最新版本的 2B 参数模型微调和部署它对显存和硬盘的要求都相对较低非常适合教学演示因此本系列教程均以它为基座。3. 环境准备与模型下载通用前置步骤3.1 租赁显卡机器与打开终端在 AutoDL 平台租赁一台RTX 3090/24G 显存的显卡机器镜像选择PyTorch → 2.1.0 → 3.10(ubuntu22.04) → 12.1各部署教程的环境准备见 FastApi 部署、LangChain 接入、WebDemo 部署 三篇文档的开篇部分。随后打开服务器的 JupyterLab 及其终端开始环境配置、模型下载与运行演示。3.2 pip 换源与依赖安装# 升级pip python -m pip install --upgrade pip # 更换 pypi 源加速库的安装 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 按需安装FastApi 部署 pip install fastapi modelscope # LangChain 接入 pip install langchain modelscope # WebDemo 部署 pip install einops modelscope streamlit1.24.0考虑到部分同学配置环境可能会遇到一些问题项目在 AutoDL 平台准备了 Yuan2.0 的镜像可点击镜像链接直接创建 AutoDL 实例详见各篇教程中的提示。3.3 使用 ModelScope 下载模型使用 modelscope 中的snapshot_download函数下载模型第一个参数为模型名称参数cache_dir为模型的下载路径。建议先初始化机器对应区域的 AutoDL 文件存储路径为/root/autodl-fs——该存储中的文件不会随机器关闭而丢失可避免模型二次下载。from modelscope import snapshot_download model_dir snapshot_download(YuanLLM/Yuan2-2B-Mars-hf, cache_dir/root/autodl-fs)模型大小约 4.5GB下载约需 5 分钟。下载完成后模型路径为/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf后续所有教程均引用该路径。4. Yuan2.0-2B FastApi 部署调用4.1 开放 AutoDL 端口点击自定义服务开启 AutoDL 开放端口。部分区域的机器需要配置 AutoDL 开放端口配置方法已写入项目的 General-Setting 开放端口文档首次使用请先参考该文档。4.2 编写 api.py新建api.py文件并输入以下内容代码注释详尽便于二次开发from fastapi import FastAPI, Request from transformers import LlamaTokenizer, AutoModelForCausalLM import uvicorn import json import datetime import torch # 设置设备参数 DEVICE cuda # 使用CUDA DEVICE_ID 0 # CUDA设备ID如果未设置则为空 CUDA_DEVICE f{DEVICE}:{DEVICE_ID} if DEVICE_ID else DEVICE # 组合CUDA设备信息 # 清理GPU内存函数 def torch_gc(): if torch.cuda.is_available(): # 检查是否可用CUDA with torch.cuda.device(CUDA_DEVICE): # 指定CUDA设备 torch.cuda.empty_cache() # 清空CUDA缓存 torch.cuda.ipc_collect() # 收集CUDA内存碎片 # 创建FastAPI应用 app FastAPI() # 处理POST请求的端点 app.post(/) async def create_item(request: Request): global model, tokenizer # 声明全局变量以便在函数内部使用模型和分词器 json_post_raw await request.json() # 获取POST请求的JSON数据 json_post json.dumps(json_post_raw) # 将JSON数据转换为字符串 json_post_list json.loads(json_post) # 将字符串转换为Python对象 prompt json_post_list.get(prompt) # 获取请求中的提示 # 调用模型进行对话生成 prompt sep inputs tokenizer(prompt, return_tensorspt)[input_ids].cuda() outputs model.generate(inputs, do_sampleFalse, max_length4000) output tokenizer.decode(outputs[0]) response output.split(sep)[-1] now datetime.datetime.now() # 获取当前时间 time now.strftime(%Y-%m-%d %H:%M:%S) # 格式化时间为字符串 # 构建响应JSON answer { response: response, status: 200, time: time } # 构建日志信息 log [ time ] , prompt: prompt , response: repr(response) print(log) # 打印日志 torch_gc() # 执行GPU内存清理 return answer # 返回响应 # 主函数入口 if __name__ __main__: # 加载预训练的分词器和模型 path /root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf print(Creat tokenizer...) tokenizer LlamaTokenizer.from_pretrained(path, add_eos_tokenFalse, add_bos_tokenFalse, eos_tokeneod) tokenizer.add_tokens([sep, pad, mask, predict, FIM_SUFFIX, FIM_PREFIX, FIM_MIDDLE,commit_before,commit_msg,commit_after,jupyter_start,jupyter_text,jupyter_code,jupyter_output,empty_output], special_tokensTrue) print(Creat model...) model AutoModelForCausalLM.from_pretrained(path, torch_dtypetorch.bfloat16, trust_remote_codeTrue).cuda() # 启动FastAPI应用 # 用6006端口可以将autodl的端口映射到本地从而在本地使用api uvicorn.run(app, host0.0.0.0, port6006, workers1) # 在指定端口和主机上启动应用几个关键点值得展开说明tokenizer 特殊性源2.0 基于 Llama 分词器扩展推理时必须补充sep、pad、mask、predict以及FIM_*、commit_*、jupyter_*、empty_output等特殊 token。其中sep是对话分隔符——源2.0 的对话格式要求用户输入以sep结尾模型生成内容从sep之后的文本截取eod是结束符。精度选择模型以torch.bfloat16加载源2.0-2B 原始权重即 bf16需要英伟达安培Ampere及以上架构的显卡如 A100、A800、3090、30 系等才能完整发挥。端口约定默认部署在 6006 端口与 AutoDL 端口映射配合可在本地调用。4.3 启动服务与调用在终端输入以下命令启动 api 服务加载完毕后出现模型加载成功信息即说明服务就绪python api.py服务默认部署在 6006 端口通过 POST 方法调用。使用 curl 调用curl -X POST http://127.0.0.1:6006 \ -H Content-Type: application/json \ -d {prompt: 你好}也可以使用 Python 的 requests 库调用import requests import json def get_completion(prompt): headers {Content-Type: application/json} data {prompt: prompt} response requests.post(urlhttp://127.0.0.1:6006, headersheaders, datajson.dumps(data)) return response.json()[response] if __name__ __main__: print(get_completion(你好))5. 接入 LangChain 搭建知识库助手将本地 Yuan2 接入 LangChain核心是自定义一个继承自langchain.llms.base.LLM的子类并重写构造函数与_call函数从而以完全一致的方式调用 LangChain 接口无需考虑底层模型调用的不一致完整代码见 02-Yuan2.0-2B Langchain 接入.mdfrom langchain.llms.base import LLM from typing import Any, List, Optional from langchain.callbacks.manager import CallbackManagerForLLMRun from transformers import LlamaTokenizer, AutoModelForCausalLM import torch class Yuan2_LLM(LLM): # 基于本地 Yuan2 自定义 LLM 类 tokenizer: LlamaTokenizer None model: AutoModelForCausalLM None def __init__(self, mode_name_or_path :str): super().__init__() # 加载预训练的分词器和模型 print(Creat tokenizer...) self.tokenizer LlamaTokenizer.from_pretrained(mode_name_or_path, add_eos_tokenFalse, add_bos_tokenFalse, eos_tokeneod) self.tokenizer.add_tokens([sep, pad, mask, predict, FIM_SUFFIX, FIM_PREFIX, FIM_MIDDLE,commit_before,commit_msg,commit_after,jupyter_start,jupyter_text,jupyter_code,jupyter_output,empty_output], special_tokensTrue) print(Creat model...) self.model AutoModelForCausalLM.from_pretrained(mode_name_or_path, torch_dtypetorch.bfloat16, trust_remote_codeTrue).cuda() def _call(self, prompt : str, stop: Optional[List[str]] None, run_manager: Optional[CallbackManagerForLLMRun] None, **kwargs: Any): prompt sep inputs self.tokenizer(prompt, return_tensorspt)[input_ids].cuda() outputs self.model.generate(inputs, do_sampleFalse, max_length4000) output self.tokenizer.decode(outputs[0]) response output.split(sep)[-1] return response property def _llm_type(self) - str: return Yuan2_LLM实现要点构造函数在对象实例化时一次性加载本地 Yuan2 模型避免每次调用都重新加载模型带来的长时间等待。_call函数是 LLM 类的核心函数LangChain 会调用它来驱动 LLM。内部复用与 FastApi 部署相同的generate逻辑sep拼接、max_length4000、按sep切分响应。_llm_type属性返回自定义的模型类型标识Yuan2_LLM。在项目中上述代码封装为LLM.py后续可直接从该文件引入自定义的 LLM 类并像使用任何其他 LangChain 大模型功能一样调用from LLM import Yuan2_LLM llm Yuan2_LLM(/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf) print(llm(你是谁))值得一提的是本项目在 ChatGLM3 知识库助手、Qwen 知识库助手 等目录中提供了同类自定义 LLM 类与向量库、Gradio 界面配套的完整可运行示例读者可参照同样的模式将 Yuan2 接入知识库问答链路。6. Streamlit WebDemo 部署6.1 编写 chatBot.py在/root/autodl-tmp路径下新建chatBot.py核心逻辑如下完整代码见 03-Yuan2.0-2B WebDemo部署.md# 导入所需的库 from transformers import LlamaTokenizer, AutoModelForCausalLM import torch import streamlit as st # 在侧边栏中创建一个标题和一个链接 with st.sidebar: st.markdown(## Yuan2.0 LLM) [开源大模型食用指南 self-llm](https://github.com/datawhalechina/self-llm.git) # 创建一个滑块用于选择最大长度范围在0到1024之间默认值为512 max_length st.slider(max_length, 0, 1024, 512, step1) # 创建一个标题和一个副标题 st.title( Yuan2.0 Chatbot) st.caption( A streamlit chatbot powered by Self-LLM) # 定义模型路径 path /root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf # 定义一个函数用于获取模型和tokenizer st.cache_resource def get_model(): print(Creat tokenizer...) tokenizer LlamaTokenizer.from_pretrained(path, add_eos_tokenFalse, add_bos_tokenFalse, eos_tokeneod) tokenizer.add_tokens([sep, pad, mask, predict, FIM_SUFFIX, FIM_PREFIX, FIM_MIDDLE,commit_before,commit_msg,commit_after,jupyter_start,jupyter_text,jupyter_code,jupyter_output,empty_output], special_tokensTrue) print(Creat model...) model AutoModelForCausalLM.from_pretrained(path, torch_dtypetorch.bfloat16, trust_remote_codeTrue).cuda() return tokenizer, model # 加载model和tokenizer tokenizer, model get_model() # 如果session_state中没有messages则创建一个包含默认消息的列表 if messages not in st.session_state: st.session_state[messages] [{role: assistant, content: 有什么可以帮您的}] # 遍历session_state中的所有消息并显示在聊天界面上 for msg in st.session_state.messages: st.chat_message(msg[role]).write(msg[content]) # 如果用户在聊天输入框中输入了内容则执行以下操作 if prompt : st.chat_input(): # 将用户的输入添加到session_state中的messages列表中 st.session_state.messages.append({role: user, content: prompt}) # 在聊天界面上显示用户的输入 st.chat_message(user).write(prompt) # 调用模型多轮对话通过 n 拼接历史消息以 sep 结尾 input_str n.join(msg[content] for msg in st.session_state.messages) sep inputs tokenizer(input_str, return_tensorspt)[input_ids].cuda() outputs model.generate(inputs, do_sampleFalse, max_length4000) output tokenizer.decode(outputs[0]) response output.split(sep)[-1].replace(eod, ) # 将模型的输出添加到session_state中的messages列表中 st.session_state.messages.append({role: assistant, content: response}) # 在聊天界面上显示模型的输出 st.chat_message(assistant).write(response)与 FastApi 部署相比WebDemo 有两个新增技巧st.cache_resource缓存模型模型只加载一次刷新页面不会重复占用显存。多轮上下文管理将历史消息用n拼接、末尾追加sep后送入模型并用replace(eod, )去除结束符st.session_state[messages]负责维护对话历史。6.2 配置 VSCode SSH 并运行为在本地浏览器访问 Streamlit 界面可复制机器的 SSH 登录指令粘贴到本地电脑的~/.ssh/config并修改格式然后连接此 SSH选择 linux输入密码即可登录到机器。在终端运行以下命令启动 Streamlit 服务streamlit run chatBot.py --server.address 127.0.0.1 --server.port 6006点击在浏览器中打开即可看到聊天界面运行效果为一个完整的 Yuan2.0 Chatbot 对话页面。7. 基于 vLLM 的高性能推理与部署7.1 配置 vLLM 环境环境要求torch 2.1.2 cuda 12.1。由于 pip 版本 vLLM 目前还不支持 Yuan 2.0需要拉取官方 Yuan-2.0 项目源码并编译安装详细步骤见 04-Yuan2.0-2B vLLM部署调用.md# Step 1. 拉取 Yuan-2.0 项目 git clone https://github.com/IEIT-Yuan/Yuan-2.0.git # Step 2. 安装 vLLM 运行环境 cd Yuan-2.0/3rdparty/vllm # 安装依赖 pip install -r requirements.txt # vllm对setuptools的版本有要求 vim pyproject.toml # 修改为 setuptools 69.5.1 pip install setuptools 69.5.1 # 安装vllm pip install -e .7.2 基于 vLLM 推理配置SamplingParams并加载模型注意stopeod与trust_remote_codeTruefrom vllm import LLM, SamplingParams import time # 配置参数 sampling_params SamplingParams(max_tokens300, temperature1, top_p0, top_k1, min_p0.0, length_penalty1.0, repetition_penalty1.0, stopeod, ) # 加载模型 llm LLM(model/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf, trust_remote_codeTrue)推理支持单个或多个 promptprompts [给我一个python打印helloword的代码sep, 给我一个c打印helloword的代码sep] start_time time.time() outputs llm.generate(prompts, sampling_params) end_time time.time() for output in outputs: prompt output.prompt generated_text output.outputs[0].text print(Prompt:, prompt) print(Generated text:, generated_text) print() print(inference_time:, (end_time - start_time))参数速查SamplingParamsmax_tokens为最大生成长度temperature为采样温度top_p/top_k控制核/顶采样length_penalty为长度惩罚repetition_penalty为重复惩罚stop指定停止符此处为eod。7.3 基于 api_server 部署# 请在命令行运行以下命令不要直接在 jupyter 中用 !python 运行 python -m vllm.entrypoints.api_server --model/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf --trust-remote-code服务启动后监听 8000 端口调用方式有两种Option 1. 命令行调用curl http://localhost:8000/generate -d {prompt: 给我一个python打印helloword的代码sep, use_beam_search: false, n: 1, temperature: 1, top_p: 0, top_k: 1, max_tokens:256, stop: eod}Option 2. 脚本批量调用import requests import json prompt 给我一个python打印helloword的代码sep raw_json_data { prompt: prompt, logprobs: 1, max_tokens: 256, temperature: 1, use_beam_search: False, top_p: 0, top_k: 1, stop: eod, } json_data json.dumps(raw_json_data) headers { Content-Type: application/json, } response requests.post(fhttp://localhost:8000/generate, datajson_data, headersheaders) output response.text output json.loads(output) print(output)7.4 基于 OpenAI 兼容接口部署vLLM 同时提供 OpenAI 兼容的 api_server发起服务python -m vllm.entrypoints.openai.api_server --model/root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf --trust-remote-code命令行调用/v1/completions端点curl http://localhost:8000/v1/completions -H Content-Type: application/json -d {model: /root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf, prompt: 给我一个python打印helloword的代码sep, max_tokens: 300, temperature: 1, top_p: 0, top_k: 1, stop: eod}脚本调用时请求体中需带上model字段值为模型路径其余参数与原生接口一致。有了这套 OpenAI 兼容接口Yuan2 可直接被 OpenAI SDK、LangChain 的 OpenAI 组件等生态工具消费。8. Yuan2.0-2B Lora 微调8.1 环境要求与精度选型相比 7B、14B 甚至更大的模型Yuan2.0-2B 参数量较小显存门槛较低。以本教程的 batch size 与 sequence length 设置为例约6G 显存即可运行。由于 Yuan2.0-2B 原始权重是 bf16需要英伟达安培Ampere架构显卡如 A100、A800、3090 等 30 系若使用fp16 混合精度训练则 T4、2080 Ti、1080 Ti 等显卡也可以轻松运行。因此教程提供两个 Notebookbf16 Notebook需要英伟达安培架构显卡fp16 Notebook不需要英伟达安培架构显卡。8.2 数据处理与 prompt 模板微调使用仓库根目录下的 huanhuan-100.json 数据集甄嬛问答风格每条含instruction / input / output三字段通过 pandas 读取并转为datasets.Datasetimport pandas as pd from datasets import Dataset from transformers import LlamaTokenizer, AutoModelForCausalLM, DataCollatorForSeq2Seq, TrainingArguments, Trainer # 将JSON文件转换为CSV文件 df pd.read_json(../dataset/huanhuan-100.json) ds Dataset.from_pandas(df)处理函数将指令与回答拼接为指令sep回答eod的格式并保证指令部分不参与 loss 计算labels 中置为 -100path /root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf tokenizer LlamaTokenizer.from_pretrained(path, add_eos_tokenFalse, add_bos_tokenFalse, eos_tokeneod) tokenizer.add_tokens([sep, pad, mask, predict, FIM_SUFFIX, FIM_PREFIX, FIM_MIDDLE,commit_before,commit_msg,commit_after,jupyter_start,jupyter_text,jupyter_code,jupyter_output,empty_output], special_tokensTrue) tokenizer.pad_token tokenizer.eos_token def process_func(example): MAX_LENGTH 384 # Llama分词器会将一个中文字切分为多个token因此需要放开一些最大长度保证数据的完整性 instruction tokenizer(f{example[instruction]}sep) response tokenizer(f{example[output]}eod) input_ids instruction[input_ids] response[input_ids] attention_mask [1] * len(input_ids) labels [-100] * len(instruction[input_ids]) response[input_ids] # instruction 不计算loss if len(input_ids) MAX_LENGTH: # 做一个截断 input_ids input_ids[:MAX_LENGTH] attention_mask attention_mask[:MAX_LENGTH] labels labels[:MAX_LENGTH] return { input_ids: input_ids, attention_mask: attention_mask, labels: labels } tokenized_id ds.map(process_func, remove_columnsds.column_names)数据样例解码后形如 你是谁sep 我是甄嬛家父是大理寺少卿甄远道。eod即指令以sep结尾、回答以eod结尾。8.3 加载模型与配置 Lora加载模型bf16 device_mapauto并开启梯度检查点所需的输入梯度import torch model AutoModelForCausalLM.from_pretrained(path, device_mapauto, torch_dtypetorch.bfloat16, trust_remote_codeTrue) model.enable_input_require_grads() # 开启梯度检查点时要执行该方法配置 Lorar8、lora_alpha32、lora_dropout0.1目标模块覆盖注意力与 MLP 的全部线性层q/k/v/o_proj 与 gate/up/down_projfrom peft import LoraConfig, TaskType, get_peft_model config LoraConfig( task_typeTaskType.CAUSAL_LM, target_modules[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj], inference_modeFalse, # 训练模式 r8, # Lora 秩 lora_alpha32, # Lora alpha具体作用参见 Lora 原理 lora_dropout0.1 # Dropout 比例 ) model get_peft_model(model, config) model.print_trainable_parameters()输出显示trainable params: 9,043,968 || all params: 2,097,768,448 || trainable%: 0.4311即仅约 904 万参数可训练占比约 0.43%充分体现 Lora 的高效性。8.4 配置训练参数并训练args TrainingArguments( output_dir./output/Yuan2.0-2B_lora_bf16, per_device_train_batch_size4, gradient_accumulation_steps1, logging_steps10, num_train_epochs3, save_steps10, # 为了快速演示这里设置10建议你设置成100 learning_rate5e-5, save_on_each_nodeTrue, gradient_checkpointingTrue ) trainer Trainer( modelmodel, argsargs, train_datasettokenized_id, data_collatorDataCollatorForSeq2Seq(tokenizertokenizer, paddingTrue), ) trainer.train()Notebook 中的实际训练日志显示[75/75 00:20, Epoch 3/3]训练 loss 从 step 10 的 3.3070 快速下降到 step 50 的 0.0000最终training_loss0.5636、train_runtime21.9s此为 100 条小样本、3 epoch 的演示结果正式训练建议按业务数据量调整save_steps、num_train_epochs与 batch size。8.5 合并加载 LoRA 权重进行推理from transformers import AutoModelForCausalLM, LlamaTokenizer import torch from peft import PeftModel path /root/autodl-fs/YuanLLM/Yuan2-2B-Mars-hf lora_path ./output/Yuan2.0-2B_lora_bf16/checkpoint-70 # 这里改成你的 lora 输出对应 checkpoint 地址 # 加载tokenizer tokenizer LlamaTokenizer.from_pretrained(path, add_eos_tokenFalse, add_bos_tokenFalse, eos_tokeneod) tokenizer.add_tokens([sep, pad, mask, predict, FIM_SUFFIX, FIM_PREFIX, FIM_MIDDLE,commit_before,commit_msg,commit_after,jupyter_start,jupyter_text,jupyter_code,jupyter_output,empty_output], special_tokensTrue) tokenizer.pad_token tokenizer.eos_token # 加载模型 model AutoModelForCausalLM.from_pretrained(path, device_mapauto, torch_dtypetorch.bfloat16, trust_remote_codeTrue).eval() # 加载lora权重 model PeftModel.from_pretrained(model, model_idlora_path) prompt 你是谁sep inputs tokenizer(prompt, return_tensorspt)[input_ids].cuda() outputs model.generate(inputs, do_sampleFalse, max_length256) output tokenizer.decode(outputs[0]) print(output.split(sep)[-1])微调后的模型能够以甄嬛风格回答例如对你是谁输出我是甄嬛家父是大理寺少卿甄远道。说明指令跟随能力已被成功注入。8.6 fp16 训练的注意事项使用 fp16 混合精度训练时必须进行如下三处修改否则会报错或训练异常模型加载为 float16model AutoModelForCausalLM.from_pretrained(path, device_mapauto, torch_dtypetorch.float16, trust_remote_codeTrue)添加训练参数fp16Trueargs TrainingArguments( output_dir./output/Yuan2.0-2B_lora_fp16, per_device_train_batch_size4, gradient_accumulation_steps1, logging_steps10, num_train_epochs3, save_steps10, # 为了快速演示这里设置10建议你设置成100 learning_rate5e-5, save_on_each_nodeTrue, gradient_checkpointingTrue, fp16True # 使用fp16训练 )将可训练的 Lora 参数设置为 fp32# 待训练的lora参数需转成fp32 print_flag True for param in filter(lambda p: p.requires_grad, model.parameters()): if print_flag: print(param.data.dtype) print_flag False param.data param.data.to(torch.float32)若未做以上修改会遇到的典型问题无法正常混合精度训练ValueError: Attempting to unscale FP16 gradients.loss 变为 nan模型生成连续 unk 字符。修改后即可正常训练loss 与预测结果恢复正常。9. 总结与进阶指引本文覆盖了源2.0-2B-Mars-hf 的完整食用链路环节方案核心要点部署FastApisep拼接 prompt、eod结束符、bf16 加载、6006 端口应用LangChain继承LLM重写__init__与_call封装为LLM.py复用演示Streamlitst.cache_resource缓存模型n拼接多轮历史高性能推理vLLM需源码编译安装stopeod原生/OpenAI 两套 API微调Lorapeftr8、alpha32约 6G 显存可跑bf16/fp16 两版 Notebook在本次教程基础上读者可继续参考仓库中同类模型的部署范式例如 General-Setting 模型下载指南 了解多平台下载技巧AutoDL 开放端口文档 解决端口映射问题ChatGLM3 知识库助手 与 Qwen 知识库助手 提供了自定义 LLM 向量库 Gradio的完整参考实现可帮助你将 Yuan2 快速组装成生产可用的知识库问答应用。注意vLLM 部分需要拉取官方 Yuan-2.0 仓库源码编译因 pip 版 vLLM 尚不支持 Yuan 2.0其余方案仅依赖transformers、peft、langchain、streamlit、fastapi、modelscope等标准库即可复现。【免费下载链接】self-llm《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调全参数/Lora、部署国内外开源大模型LLM/多模态大模型MLLM教程项目地址: https://gitcode.com/GitHub_Trending/se/self-llm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。