Phi-3-mini-128k-instruct教程vLLM支持LoRA微调的本地化适配方法想在自己的电脑上跑一个既聪明又小巧的AI模型吗今天要聊的Phi-3-mini-128k-instruct就是一个只有38亿参数的“小个子”但它在理解、推理和对话上的表现却能让很多大模型都刮目相看。更棒的是我们将使用vLLM这个高效的推理引擎来部署它并通过Chainlit搭建一个清爽的网页界面来和它聊天。最重要的是我们还会探索如何为这个已经部署好的模型无缝集成LoRA微调能力让你能轻松地“教”它学习新知识适应你的专属任务。无论你是想快速搭建一个本地AI助手还是希望深入研究模型个性化定制这篇教程都将手把手带你走完全程。1. 环境准备与快速部署首先我们需要一个能运行模型的环境。这里假设你已经有了一个基础的Linux环境比如云服务器、本地虚拟机或者WSL2并且安装了Python和基本的开发工具。1.1 获取模型与部署代码最直接的方式是使用预构建的Docker镜像或部署脚本。为了简化流程我们可以参考社区已有的成熟方案。核心是准备好模型文件和vLLM的启动配置。下载模型从Hugging Face等平台获取Phi-3-mini-128k-instruct的模型文件。# 示例使用git-lfs克隆模型仓库确保已安装git-lfs git lfs install git clone https://huggingface.co/microsoft/Phi-3-mini-128k-instruct如果网络条件受限也可以寻找国内的镜像源。准备vLLM部署脚本vLLM提供了简单的API服务器启动命令。创建一个启动脚本例如start_server.py或直接使用命令行。# 假设模型路径为 /path/to/Phi-3-mini-128k-instruct MODEL_PATH/path/to/Phi-3-mini-128k-instruct # 使用vLLM启动API服务器 python -m vllm.entrypoints.openai.api_server \ --model $MODEL_PATH \ --served-model-name Phi-3-mini-128k-instruct \ --api-key token-abc123 \ # 设置一个简单的API密钥 --port 8000 \ # 指定服务端口 --trust-remote-code # 此模型可能需要此参数执行这个命令后vLLM会加载模型并在本地的8000端口提供一个兼容OpenAI API格式的服务。1.2 验证模型服务服务启动后如何确认它运行正常呢检查日志在启动服务的终端你会看到模型加载的进度日志。当看到类似“Uvicorn running on...”和模型加载完成的提示时说明服务已就绪。发送测试请求打开另一个终端使用curl命令快速测试。curl http://localhost:8000/v1/completions \ -H Content-Type: application/json \ -H Authorization: Bearer token-abc123 \ -d { model: Phi-3-mini-128k-instruct, prompt: San Francisco is a, max_tokens: 10, temperature: 0 }如果返回一个包含生成文本的JSON响应恭喜你模型服务部署成功了2. 搭建Chainlit聊天前端通过命令行测试虽然高效但有个网页界面聊天会更方便。Chainlit是一个专门为AI应用设计的前端框架能快速构建聊天界面。2.1 安装与配置Chainlit安装Chainlit在同一个Python环境下安装Chainlit。pip install chainlit创建Chainlit应用文件创建一个名为app.py的文件。import chainlit as cl from openai import OpenAI # 配置客户端指向我们本地运行的vLLM服务器 client OpenAI( base_urlhttp://localhost:8000/v1, # vLLM API地址 api_keytoken-abc123 # 与启动服务时设置的api-key一致 ) cl.on_message async def main(message: cl.Message): 处理用户消息的核心函数 # 创建一个消息元素来显示“思考中” msg cl.Message(content) await msg.send() # 调用本地的vLLM API response client.chat.completions.create( modelPhi-3-mini-128k-instruct, messages[ {role: system, content: 你是一个乐于助人的AI助手。}, {role: user, content: message.content} ], temperature0.7, max_tokens500, streamTrue # 启用流式输出体验更好 ) # 流式接收并显示回复 for chunk in response: if chunk.choices[0].delta.content is not None: await msg.stream_token(chunk.choices[0].delta.content) # 流式传输完成更新消息状态 await msg.update()这个脚本做了几件事导入必要的库、配置到本地vLLM服务器的连接、定义了一个处理用户消息的函数。当用户发送消息时它会将消息转发给我们的模型并把模型的回复流式地显示在聊天界面上。2.2 启动Chainlit应用在包含app.py文件的目录下运行chainlit run app.py -w-w参数会自动打开浏览器。默认情况下Chainlit服务会运行在http://localhost:8000注意端口可能冲突如果vLLM占了8000Chainlit会自动换到8001。现在你可以在浏览器里和你的Phi-3模型对话了试试问它“用Python写一个快速排序函数”或者“解释一下量子计算的基本概念”。3. 核心技巧为vLLM部署的模型集成LoRA适配器模型跑起来了界面也有了。但如果我们想让这个通用的Phi-3模型学会一些特殊技能比如用特定的风格写邮件、理解某个垂直领域的术语该怎么办这就需要微调。而LoRA是一种参数高效微调技术它只训练一小部分额外的参数适配器而不是整个庞大的模型省时省力。关键问题是如何让我们已经用vLLM部署好的模型能够动态加载和使用LoRA适配器vLLM从某个版本开始已经实验性地支持了LoRA。下面我们来看看具体步骤。3.1 准备LoRA权重首先你需要有一个训练好的LoRA适配器。这通常是一个包含adapter_config.json和adapter_model.bin(或.safetensors) 文件的目录。假设你通过Peft等库训练了一个LoRA其权重目录为/path/to/my_lora_adapter。3.2 启动支持LoRA的vLLM服务器启动vLLM服务器时需要增加LoRA相关的参数。最直接的方式是在启动命令中指定一个或多个LoRA模块。python -m vllm.entrypoints.openai.api_server \ --model /path/to/Phi-3-mini-128k-instruct \ --served-model-name Phi-3-mini-128k-instruct \ --port 8000 \ --api-key token-abc123 \ --trust-remote-code \ --enable-lora \ # 启用LoRA支持 --lora-modules my-lora/path/to/my_lora_adapter # 指定LoRA模块名称路径--enable-lora必须添加以启用LoRA功能。--lora-modules可以指定多个LoRA。格式为名称1路径1,名称2路径2,...。这里的“名称”是你在后续API调用中用来选择该LoRA的标识符。重启vLLM服务器后它就具备了加载你指定LoRA适配器的能力。3.3 在API调用中动态使用LoRA现在当你通过API调用模型时可以额外传递一个lora_id参数来告诉服务器使用哪个LoRA适配器。对于Completion API (/v1/completions)curl http://localhost:8000/v1/completions \ -H Content-Type: application/json \ -H Authorization: Bearer token-abc123 \ -d { model: Phi-3-mini-128k-instruct, prompt: 根据公司规范写一封会议邀请邮件。, max_tokens: 200, lora_id: my-lora # 关键指定要使用的LoRA名称 }对于ChatCompletion API (/v1/chat/completions)这也是我们Chainlit前端在使用的 请求的JSON体中同样可以加入lora_id: my-lora。3.4 修改Chainlit以支持LoRA切换为了让前端也能灵活切换LoRA我们可以升级一下app.py。例如增加一个侧边栏让用户选择不同的技能适配器。import chainlit as cl from openai import OpenAI from typing import Optional client OpenAI(base_urlhttp://localhost:8000/v1, api_keytoken-abc123) # 可用的LoRA配置 AVAILABLE_LORAS { 无: None, 邮件专家: my-email-lora, 代码助手: my-code-lora, 客服专员: my-service-lora } cl.on_chat_start async def start(): 聊天开始时设置一个选择LoRA的下拉框 settings await cl.ChatSettings( [ cl.input_widget.Select( idLoraSelector, label选择技能模块, valueslist(AVAILABLE_LORAS.keys()), initial_index0 ) ] ).send() # 初始化一个会话变量来存储当前选择的LoRA ID cl.user_session.set(selected_lora_id, None) cl.on_settings_update async def setup_agent(settings): 当用户在前端更改设置如选择LoRA时触发 lora_name settings[LoraSelector] lora_id AVAILABLE_LORAS.get(lora_name) cl.user_session.set(selected_lora_id, lora_id) await cl.Message(contentf已切换至模式: **{lora_name}**).send() cl.on_message async def main(message: cl.Message): msg cl.Message(content) await msg.send() # 从会话中获取当前选择的LoRA ID lora_id cl.user_session.get(selected_lora_id) # 构建请求参数 request_params { model: Phi-3-mini-128k-instruct, messages: [ {role: system, content: 你是一个乐于助人的AI助手。}, {role: user, content: message.content} ], temperature: 0.7, max_tokens: 500, stream: True } # 如果选择了LoRA则添加到参数中 if lora_id: request_params[lora_id] lora_id # 发起请求 response client.chat.completions.create(**request_params) for chunk in response: if chunk.choices[0].delta.content is not None: await msg.stream_token(chunk.choices[0].delta.content) await msg.update()这样用户就可以在聊天界面里通过下拉菜单轻松切换模型背后的“技能包”了。选择“邮件专家”模型回复就更符合商务邮件风格选择“代码助手”它写代码可能就更在行。4. 实践建议与常见问题4.1 性能与资源考量显存占用Phi-3-mini-128k-instruct本身很小但在启用128K长上下文时显存占用会显著增加。加载多个LoRA适配器也会占用额外显存。务必监控你的GPU显存使用情况。推理速度vLLM以其高效的注意力算法和PagedAttention著称能极大提升吞吐量。加入LoRA后由于需要动态加载和融合权重可能会引入轻微的开销但对于单个或少量LoRA通常影响不大。4.2 可能遇到的问题vLLM版本确保你安装的vLLM版本支持LoRA功能。较老的版本可能不支持。建议使用最新稳定版或明确支持LoRA的版本。LoRA权重格式vLLM可能对LoRA权重的格式有要求如Peft格式。确保你的适配器权重能被正确读取。API参数lora_id参数是vLLM对OpenAI API的扩展并非标准参数。确保你的客户端如Chainlit中使用的openai库能够传递这个额外参数。上述示例中OpenAI Python库的create方法会直接将未知参数传递给请求体所以是可行的。模型与LoRA的兼容性LoRA适配器是针对特定基础模型包括其具体版本和分词器训练的。确保你的LoRA是在这个Phi-3-mini-128k-instruct模型上训练出来的否则加载会失败或产生乱码。5. 总结通过这篇教程我们完成了一个从模型部署、前端搭建到高级功能集成的完整流程快速部署利用vLLM的高效推理引擎我们轻松地将轻量但能力强大的Phi-3-mini-128k-instruct模型部署为本地API服务。友好交互借助Chainlit我们快速构建了一个美观实用的网页聊天界面让与模型的对话变得像使用聊天软件一样简单。能力扩展我们深入探讨了vLLM对LoRA微调适配器的支持。通过启动参数和API调用实现了为已部署的模型动态加载不同的技能模块并改造前端实现了用户可选的技能切换。这套组合拳的优势在于解耦、灵活、高效。模型服务、前端界面、技能模块各自独立可以分别更新和维护。你可以训练多个针对不同任务的LoRA适配器然后像给模型“插拔技能卡”一样在同一个服务中动态切换无需重新部署整个模型。现在你可以尝试训练自己的LoRA适配器例如用你公司的文档训练一个内部知识问答专家然后按照上面的步骤将其集成到这个系统中打造一个真正属于你自己的、个性化的AI助手。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
Phi-3-mini-128k-instruct教程:vLLM支持LoRA微调的本地化适配方法
Phi-3-mini-128k-instruct教程vLLM支持LoRA微调的本地化适配方法想在自己的电脑上跑一个既聪明又小巧的AI模型吗今天要聊的Phi-3-mini-128k-instruct就是一个只有38亿参数的“小个子”但它在理解、推理和对话上的表现却能让很多大模型都刮目相看。更棒的是我们将使用vLLM这个高效的推理引擎来部署它并通过Chainlit搭建一个清爽的网页界面来和它聊天。最重要的是我们还会探索如何为这个已经部署好的模型无缝集成LoRA微调能力让你能轻松地“教”它学习新知识适应你的专属任务。无论你是想快速搭建一个本地AI助手还是希望深入研究模型个性化定制这篇教程都将手把手带你走完全程。1. 环境准备与快速部署首先我们需要一个能运行模型的环境。这里假设你已经有了一个基础的Linux环境比如云服务器、本地虚拟机或者WSL2并且安装了Python和基本的开发工具。1.1 获取模型与部署代码最直接的方式是使用预构建的Docker镜像或部署脚本。为了简化流程我们可以参考社区已有的成熟方案。核心是准备好模型文件和vLLM的启动配置。下载模型从Hugging Face等平台获取Phi-3-mini-128k-instruct的模型文件。# 示例使用git-lfs克隆模型仓库确保已安装git-lfs git lfs install git clone https://huggingface.co/microsoft/Phi-3-mini-128k-instruct如果网络条件受限也可以寻找国内的镜像源。准备vLLM部署脚本vLLM提供了简单的API服务器启动命令。创建一个启动脚本例如start_server.py或直接使用命令行。# 假设模型路径为 /path/to/Phi-3-mini-128k-instruct MODEL_PATH/path/to/Phi-3-mini-128k-instruct # 使用vLLM启动API服务器 python -m vllm.entrypoints.openai.api_server \ --model $MODEL_PATH \ --served-model-name Phi-3-mini-128k-instruct \ --api-key token-abc123 \ # 设置一个简单的API密钥 --port 8000 \ # 指定服务端口 --trust-remote-code # 此模型可能需要此参数执行这个命令后vLLM会加载模型并在本地的8000端口提供一个兼容OpenAI API格式的服务。1.2 验证模型服务服务启动后如何确认它运行正常呢检查日志在启动服务的终端你会看到模型加载的进度日志。当看到类似“Uvicorn running on...”和模型加载完成的提示时说明服务已就绪。发送测试请求打开另一个终端使用curl命令快速测试。curl http://localhost:8000/v1/completions \ -H Content-Type: application/json \ -H Authorization: Bearer token-abc123 \ -d { model: Phi-3-mini-128k-instruct, prompt: San Francisco is a, max_tokens: 10, temperature: 0 }如果返回一个包含生成文本的JSON响应恭喜你模型服务部署成功了2. 搭建Chainlit聊天前端通过命令行测试虽然高效但有个网页界面聊天会更方便。Chainlit是一个专门为AI应用设计的前端框架能快速构建聊天界面。2.1 安装与配置Chainlit安装Chainlit在同一个Python环境下安装Chainlit。pip install chainlit创建Chainlit应用文件创建一个名为app.py的文件。import chainlit as cl from openai import OpenAI # 配置客户端指向我们本地运行的vLLM服务器 client OpenAI( base_urlhttp://localhost:8000/v1, # vLLM API地址 api_keytoken-abc123 # 与启动服务时设置的api-key一致 ) cl.on_message async def main(message: cl.Message): 处理用户消息的核心函数 # 创建一个消息元素来显示“思考中” msg cl.Message(content) await msg.send() # 调用本地的vLLM API response client.chat.completions.create( modelPhi-3-mini-128k-instruct, messages[ {role: system, content: 你是一个乐于助人的AI助手。}, {role: user, content: message.content} ], temperature0.7, max_tokens500, streamTrue # 启用流式输出体验更好 ) # 流式接收并显示回复 for chunk in response: if chunk.choices[0].delta.content is not None: await msg.stream_token(chunk.choices[0].delta.content) # 流式传输完成更新消息状态 await msg.update()这个脚本做了几件事导入必要的库、配置到本地vLLM服务器的连接、定义了一个处理用户消息的函数。当用户发送消息时它会将消息转发给我们的模型并把模型的回复流式地显示在聊天界面上。2.2 启动Chainlit应用在包含app.py文件的目录下运行chainlit run app.py -w-w参数会自动打开浏览器。默认情况下Chainlit服务会运行在http://localhost:8000注意端口可能冲突如果vLLM占了8000Chainlit会自动换到8001。现在你可以在浏览器里和你的Phi-3模型对话了试试问它“用Python写一个快速排序函数”或者“解释一下量子计算的基本概念”。3. 核心技巧为vLLM部署的模型集成LoRA适配器模型跑起来了界面也有了。但如果我们想让这个通用的Phi-3模型学会一些特殊技能比如用特定的风格写邮件、理解某个垂直领域的术语该怎么办这就需要微调。而LoRA是一种参数高效微调技术它只训练一小部分额外的参数适配器而不是整个庞大的模型省时省力。关键问题是如何让我们已经用vLLM部署好的模型能够动态加载和使用LoRA适配器vLLM从某个版本开始已经实验性地支持了LoRA。下面我们来看看具体步骤。3.1 准备LoRA权重首先你需要有一个训练好的LoRA适配器。这通常是一个包含adapter_config.json和adapter_model.bin(或.safetensors) 文件的目录。假设你通过Peft等库训练了一个LoRA其权重目录为/path/to/my_lora_adapter。3.2 启动支持LoRA的vLLM服务器启动vLLM服务器时需要增加LoRA相关的参数。最直接的方式是在启动命令中指定一个或多个LoRA模块。python -m vllm.entrypoints.openai.api_server \ --model /path/to/Phi-3-mini-128k-instruct \ --served-model-name Phi-3-mini-128k-instruct \ --port 8000 \ --api-key token-abc123 \ --trust-remote-code \ --enable-lora \ # 启用LoRA支持 --lora-modules my-lora/path/to/my_lora_adapter # 指定LoRA模块名称路径--enable-lora必须添加以启用LoRA功能。--lora-modules可以指定多个LoRA。格式为名称1路径1,名称2路径2,...。这里的“名称”是你在后续API调用中用来选择该LoRA的标识符。重启vLLM服务器后它就具备了加载你指定LoRA适配器的能力。3.3 在API调用中动态使用LoRA现在当你通过API调用模型时可以额外传递一个lora_id参数来告诉服务器使用哪个LoRA适配器。对于Completion API (/v1/completions)curl http://localhost:8000/v1/completions \ -H Content-Type: application/json \ -H Authorization: Bearer token-abc123 \ -d { model: Phi-3-mini-128k-instruct, prompt: 根据公司规范写一封会议邀请邮件。, max_tokens: 200, lora_id: my-lora # 关键指定要使用的LoRA名称 }对于ChatCompletion API (/v1/chat/completions)这也是我们Chainlit前端在使用的 请求的JSON体中同样可以加入lora_id: my-lora。3.4 修改Chainlit以支持LoRA切换为了让前端也能灵活切换LoRA我们可以升级一下app.py。例如增加一个侧边栏让用户选择不同的技能适配器。import chainlit as cl from openai import OpenAI from typing import Optional client OpenAI(base_urlhttp://localhost:8000/v1, api_keytoken-abc123) # 可用的LoRA配置 AVAILABLE_LORAS { 无: None, 邮件专家: my-email-lora, 代码助手: my-code-lora, 客服专员: my-service-lora } cl.on_chat_start async def start(): 聊天开始时设置一个选择LoRA的下拉框 settings await cl.ChatSettings( [ cl.input_widget.Select( idLoraSelector, label选择技能模块, valueslist(AVAILABLE_LORAS.keys()), initial_index0 ) ] ).send() # 初始化一个会话变量来存储当前选择的LoRA ID cl.user_session.set(selected_lora_id, None) cl.on_settings_update async def setup_agent(settings): 当用户在前端更改设置如选择LoRA时触发 lora_name settings[LoraSelector] lora_id AVAILABLE_LORAS.get(lora_name) cl.user_session.set(selected_lora_id, lora_id) await cl.Message(contentf已切换至模式: **{lora_name}**).send() cl.on_message async def main(message: cl.Message): msg cl.Message(content) await msg.send() # 从会话中获取当前选择的LoRA ID lora_id cl.user_session.get(selected_lora_id) # 构建请求参数 request_params { model: Phi-3-mini-128k-instruct, messages: [ {role: system, content: 你是一个乐于助人的AI助手。}, {role: user, content: message.content} ], temperature: 0.7, max_tokens: 500, stream: True } # 如果选择了LoRA则添加到参数中 if lora_id: request_params[lora_id] lora_id # 发起请求 response client.chat.completions.create(**request_params) for chunk in response: if chunk.choices[0].delta.content is not None: await msg.stream_token(chunk.choices[0].delta.content) await msg.update()这样用户就可以在聊天界面里通过下拉菜单轻松切换模型背后的“技能包”了。选择“邮件专家”模型回复就更符合商务邮件风格选择“代码助手”它写代码可能就更在行。4. 实践建议与常见问题4.1 性能与资源考量显存占用Phi-3-mini-128k-instruct本身很小但在启用128K长上下文时显存占用会显著增加。加载多个LoRA适配器也会占用额外显存。务必监控你的GPU显存使用情况。推理速度vLLM以其高效的注意力算法和PagedAttention著称能极大提升吞吐量。加入LoRA后由于需要动态加载和融合权重可能会引入轻微的开销但对于单个或少量LoRA通常影响不大。4.2 可能遇到的问题vLLM版本确保你安装的vLLM版本支持LoRA功能。较老的版本可能不支持。建议使用最新稳定版或明确支持LoRA的版本。LoRA权重格式vLLM可能对LoRA权重的格式有要求如Peft格式。确保你的适配器权重能被正确读取。API参数lora_id参数是vLLM对OpenAI API的扩展并非标准参数。确保你的客户端如Chainlit中使用的openai库能够传递这个额外参数。上述示例中OpenAI Python库的create方法会直接将未知参数传递给请求体所以是可行的。模型与LoRA的兼容性LoRA适配器是针对特定基础模型包括其具体版本和分词器训练的。确保你的LoRA是在这个Phi-3-mini-128k-instruct模型上训练出来的否则加载会失败或产生乱码。5. 总结通过这篇教程我们完成了一个从模型部署、前端搭建到高级功能集成的完整流程快速部署利用vLLM的高效推理引擎我们轻松地将轻量但能力强大的Phi-3-mini-128k-instruct模型部署为本地API服务。友好交互借助Chainlit我们快速构建了一个美观实用的网页聊天界面让与模型的对话变得像使用聊天软件一样简单。能力扩展我们深入探讨了vLLM对LoRA微调适配器的支持。通过启动参数和API调用实现了为已部署的模型动态加载不同的技能模块并改造前端实现了用户可选的技能切换。这套组合拳的优势在于解耦、灵活、高效。模型服务、前端界面、技能模块各自独立可以分别更新和维护。你可以训练多个针对不同任务的LoRA适配器然后像给模型“插拔技能卡”一样在同一个服务中动态切换无需重新部署整个模型。现在你可以尝试训练自己的LoRA适配器例如用你公司的文档训练一个内部知识问答专家然后按照上面的步骤将其集成到这个系统中打造一个真正属于你自己的、个性化的AI助手。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。