ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

「AI Agent 全栈开发 50 讲」——从本地模型部署到多智能体系统,一年省 87 万 第6节

「AI Agent 全栈开发 50 讲」——从本地模型部署到多智能体系统,一年省 87 万 第6节 第 06 课 | 高性能推理vLLM 部署与 OpenAI 兼容接口Ollama 好用但它是「单线程」的——一次只能处理一个请求。当你跑多 Agent 系统的时候4 个 Agent 同时发请求Ollama 就只能排队。vLLM 就是来解决这个问题的高并发、高吞吐、生产级推理引擎。为什么需要 vLLM前两节课我们用 Ollama 跑起了本地模型体验不错。但 Ollama 有一个明显的局限它是一次只处理一个请求的。当你跑一个简单的对话时这没问题。但当你在后面构建多 Agent 系统时问题就来了——4 个 Agent 同时向模型发请求Ollama 只能一个一个处理其他 3 个得排队等着。这就好比一个餐厅只有一个厨师不管来了多少客人菜只能一道一道做。客人少的时候没问题客人一多就全堵住了。vLLM就是来解决这个问题的。它是一个高性能的 LLM 推理引擎核心特性包括连续批处理Continuous Batching动态合并多个请求一起处理PagedAttention高效利用显存支持更长的上下文高吞吐量比 Ollama 快 2-4 倍特别是在并发场景下OpenAI 兼容 API代码几乎不用改切换后端就行打个比方如果 Ollama 是一个厨师vLLM 就是一个厨房——多个厨师同时做菜还能动态调整谁先做谁后做。对于我们的教程来说前期开发用 Ollama 就够了。但当你开始跑多 Agent 系统场景三的时候vLLM 的高并发能力就派上用场了。vLLM 核心特性先简单了解 vLLM 的两个核心技术。你不需要成为专家但理解它们有助于你做出正确的架构选择。PagedAttention传统的 LLM 推理会把整个 KV Cache注意力机制的中间结果放在连续的显存空间里。但显存是稀缺资源连续的显存空间更难找。PagedAttention 借鉴了操作系统虚拟内存的思想把 KV Cache 分成固定大小的「页」不需要连续存储。这样显存利用率大幅提升能支持更长的上下文和更大的批处理。连续批处理传统批处理是等一个批次的所有请求都完成后才开始处理下一个批次。如果批次里有一个请求特别长其他请求就得等它完成。连续批处理更聪明它动态地把新请求加入正在处理的批次把已完成的请求移出。这样 GPU 始终在满负荷工作吞吐量大幅提升。vLLM 连续批处理请求 1 2 3一起处理总耗时 6sOllama 单请求请求 1处理 5s请求 2处理 5s请求 3处理 5s图 1Ollama 单请求 vs vLLM 连续批处理安装 vLLMvLLM 的安装比 Ollama 稍微复杂一点因为它需要 CUDA 环境。首先确认你的 NVIDIA 驱动和 CUDA 版本nvidia-smi看输出里的CUDA Version字段应该是 12.x 以上。然后安装 vLLMuv pip install vllm如果你遇到安装问题可能是因为 Windows 上 vLLM 的支持不如 Linux 完善。vLLM 官方主要支持 LinuxWindows 上可能需要通过 WSL2 来运行。如果你的 Windows 环境安装 vLLM 有困难不用担心——Ollama 已经足够支撑我们学完大部分课程。vLLM 主要在后期的多 Agent 高并发场景才体现出优势。你可以先把 Ollama 用熟后面需要 vLLM 的时候再装。启动 vLLM 服务安装成功后启动 vLLM 服务python-m vllm.entrypoints.openai.api_server \--model Qwen/Qwen2-7B-Instruct \--host 0.0.0.0 \--port 8000 \--max-model-len 8192 \--gpu-memory-utilization 0.85参数说明--model模型名称vLLM 会自动从 HuggingFace 下载--host 0.0.0.0监听所有网络接口--port 8000服务端口--max-model-len 8192最大上下文长度--gpu-memory-utilization 0.85显存使用率上限留 15% 给系统服务启动后vLLM 会提供一个 OpenAI 兼容的 API地址是http://localhost:8000。验证一下curl http://localhost:8000/v1/models如果返回模型列表就说明服务启动成功了。用 Python 调用 vLLMvLLM 的 API 和 Ollama 几乎一样——都是 OpenAI 兼容格式。这意味着你之前写的调用代码几乎不用改就能用。# vllm_chat.py - 用 Python 调用 vLLM# AI Agent 全栈开发 50 讲 - 第 06 课importrequestsdefchat_vllm(prompt:str,model:strQwen/Qwen2-7B-Instruct)-str:调用 vLLM 的 OpenAI 兼容 APIurlhttp://localhost:8000/v1/chat/completionspayload{model:model,messages:[{role:user,content:prompt}],temperature:0.7,}responserequests.post(url,jsonpayload,timeout120)response.raise_for_status()resultresponse.json()returnresult[choices][0][message][content]defmain():replychat_vllm(用 3 句话总结一下 AI Agent 的核心价值。)print(fvLLM 回复:\n{reply})if__name____main__:main()看到了吗代码和第 4 课的ollama_chat.py几乎一模一样只是 URL 从localhost:11434变成了localhost:8000。这就是 OpenAI 兼容 API 的好处——切换后端几乎零成本。性能对比vLLM vs Ollama我们用脚本测试一下 vLLM 和 Ollama 的性能差异。# vllm_benchmark.py - vLLM vs Ollama 性能对比# AI Agent 全栈开发 50 讲 - 第 06 课importrequestsimporttimeimportconcurrent.futuresdefsingle_request(url:str,model:str,prompt:str)-dict:单次请求测试payload{model:model,messages:[{role:user,content:prompt}],temperature:0.7,}starttime.time()responserequests.post(url,jsonpayload,timeout120)elapsedtime.time()-start contentresponse.json()[choices][0][message][content]tokenslen(content)/2return{elapsed:round(elapsed,2),tokens_per_second:round(tokens/elapsed,1),}defconcurrent_requests(url:str,model:str,prompt:str,n:int5)-dict:并发请求测试starttime.time()withconcurrent.futures.ThreadPoolExecutor(max_workersn)asexecutor:futures[executor.submit(single_request,url,model,prompt)for_inrange(n)]results[f.result()forfinfutures]total_elapsedtime.time()-start avg_tpssum(r[tokens_per_second]forrinresults)/len(results)return{total_elapsed:round(total_elapsed,2),avg_tokens_per_second:round(avg_tps,1),requests:n,}defmain():prompt用 200 字介绍一下人工智能的发展历程。print(*60)print( vLLM vs Ollama 性能对比)print(*60)# 测试配置configs[{name:Ollama (Qwen2 7B),url:http://localhost:11434/v1/chat/completions,model:qwen2:7b},{name:vLLM (Qwen2 7B),url:http://localhost:8000/v1/chat/completions,model:Qwen/Qwen2-7B-Instruct},]forconfiginconfigs:print(f\n[{config[name]}])# 单请求测试try:resultsingle_request(config[url],config[model],prompt)print(f 单请求:{result[elapsed]}s,{result[tokens_per_second]}tokens/s)exceptExceptionase:print(f 单请求: [错误]{e})# 并发测试5 个并发try:resultconcurrent_requests(config[url],config[model],prompt,n5)print(f 5 并发: 总耗时{result[total_elapsed]}s, 平均{result[avg_tokens_per_second]}tokens/s)exceptExceptionase:print(f 5 并发: [错误]{e})if__name____main__:main()在我的 RTX 3090 上测试结果如下测试项OllamavLLMvLLM 提升单请求速度~45 tokens/s~50 tokens/s11%5 并发总耗时~25 秒~7 秒3.6x5 并发平均速度~9 tokens/s~36 tokens/s4x关键发现单请求速度vLLM 比 Ollama 略快但差距不大11%。并发场景vLLM 的优势非常明显。5 个并发请求vLLM 的总耗时只有 Ollama 的 1/3.6平均速度是 Ollama 的 4 倍。这就是连续批处理的威力。当多个请求同时到达时vLLM 能把它们合并成一个批次一起处理GPU 利用率大幅提升。Ollama vs vLLM如何选择是否你的场景是什么本地开发/个人使用生产部署/多 Agent用 Ollama简单、快速、够用需要高并发用 vLLM高吞吐、低延迟Ollama 也行简单优先图 2Ollama vs vLLM 选择决策树维度OllamavLLM安装难度简单一行命令中等需要 CUDA使用难度简单中等单请求速度好略好并发能力弱串行处理强连续批处理适用场景本地开发、个人使用生产部署、多 AgentWindows 支持好一般建议 WSL2我的推荐开发阶段用 Ollama。简单、快速、够用。生产部署用 vLLM。高并发、高吞吐、更稳定。教程学习前期用 Ollama后面多 Agent 场景再切换到 vLLM。统一 LLM 客户端设计为了让代码能在 Ollama 和 vLLM 之间无缝切换我们设计一个统一的 LLM 客户端。# llm_client.py - 统一 LLM 客户端# AI Agent 全栈开发 50 讲 - 第 06 课importrequestsfromconfigimportLLM_BACKEND,LLM_MODEL,LLM_BASE_URL,LLM_API_KEYclassLLMClient:统一的 LLM 客户端支持 Ollama 和 vLLMdef__init__(self,backend:strNone,model:strNone,base_url:strNone):self.backendbackendorLLM_BACKEND self.modelmodelorLLM_MODEL self.base_urlbase_urlorLLM_BASE_URL self.api_keyLLM_API_KEYdefchat(self,messages:list,temperature:float0.7)-str:发送聊天请求 Args: messages: 消息列表 [{role: user, content: ...}] temperature: 温度参数 Returns: 模型回复文本 urlf{self.base_url}/chat/completionsheaders{}ifself.api_keyandself.api_key!ollama:headers[Authorization]fBearer{self.api_key}payload{model:self.model,messages:messages,temperature:temperature,}responserequests.post(url,jsonpayload,headersheaders,timeout120)response.raise_for_status()resultresponse.json()returnresult[choices][0][message][content]def__repr__(self):returnfLLMClient(backend{self.backend}, model{self.model})defmain():# 创建客户端自动读取配置clientLLMClient()print(f客户端:{client})# 测试对话messages[{role:system,content:你是一个专业的市场分析师。},{role:user,content:用 2 句话总结 AI Agent 的核心价值。}]replyclient.chat(messages)print(f\n回复:\n{reply})if__name____main__:main()这个客户端通过配置文件自动选择后端。想切换 Ollama 和 vLLM只需要改.env文件里的LLM_BASE_URL# 用 OllamaLLM_BASE_URLhttp://localhost:11434/v1# 用 vLLMLLM_BASE_URLhttp://localhost:8000/v1代码完全不用改。这就是统一接口设计的好处。小结与预告这节课我们学习了 vLLM——一个生产级的高性能推理引擎。核心收获vLLM 的优势连续批处理、PagedAttention、高并发性能对比并发场景下 vLLM 比 Ollama 快 3-4 倍统一客户端封装了 LLMClient支持 Ollama 和 vLLM 无缝切换现在你有了两个推理引擎可选Ollama 适合开发vLLM 适合生产。后面的课程中我们会根据场景灵活切换。下一节课我们会把 Ollama、vLLM、OpenAI API 统一封装成一个客户端通过配置文件一键切换。这是整个教程的基础设施——后面所有的 Agent 调用都通过这个客户端完成。我们下一课见。系列教程导航上一篇第 05 课 | 模型量化与优化让 14B 模型也能流畅运行下一篇第 07 课 | 统一 LLM 客户端本地与云端 API 无缝切换本系列共 50 课持续更新中。关注我不迷路。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表