B站同步视频 -> 点击进入> 点击进入> 点击进入> 点击进入> 点击进入> 点击进入> 点击进入>

6.3Client接入本地ollamavLLM大模型

6.3.1ollamavLL介绍

ollama简介

ollama是一款本地化大模型运行框架,支持macOS、Linux和Windows三大主流操作系统。它的核心优势在于提供了开箱即用的模型管理功能,用户可以通过简单的命令如ollama pull来下载和管理各种开源大模型。此外,ollama内置了REST API服务,默认监听11434端口,方便开发者进行二次开发和集成。目前,ollama已支持Llama2、Mistral等主流开源模型,非常适合本地开发和小规模部署场景。

vLLM简介

vLLM是一个高性能的LLM推理和服务引擎,其核心技术是基于PagedAttention的高吞吐量实现。与ollama相比,vLLM更侧重于生产环境的高并发场景,具有以下特点:兼容OpenAI API协议,支持连续批处理和量化技术,能够在有限的硬件资源下提供更高的吞吐量和更低的延迟。vLLM适合需要大规模部署和高并发请求的企业级应用。

6.3.2、环境准备

6.3.2.1、安装ollama

安装ollama非常简单,只需执行以下命令:

Bash
curl -fsSL https://ollama.com/install.sh | sh

该命令会自动下载并安装适合当前操作系统的ollama版本。安装完成后,ollama服务会自动启动,并在后台运行。

6.3.2.2、安装vLLM

vLLM可以通过pip命令进行安装:

Bash
pip install vllm

安装完成后,我们需要启动vLLM的API服务。以Llama-2-7b-chat-hf模型为例,启动命令如下:

Bash
python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Llama-2-7b-chat-hf \
  --port 8000

这里我们指定了模型名称和服务端口,vLLM会自动下载模型文件并启动API服务。

6.3.3ollama接入实现

6.3.3.1、客户端类设计

我们首先创建一个OllamaClient类来封装与ollama服务的交互:

Python
import requests

class OllamaClient:
    def __init__(self, base_url="http://localhost:11434/api"):
        self.base_url = base_url

构造函数中,我们指定了ollama服务的默认地址和端口。

6.3.3.2、生成方法实现

接下来实现generate方法,用于发送生成请求:

Python
def generate(self, prompt, model="llama2", **params):
    """
调用生成接口"""
    url = f"{self.base_url}/generate"
    payload = {
        "model": model,
        "prompt": prompt,
        "stream": False,
        **params
    }
    response = requests.post(url, json=payload)
    return response.json()["response"]

这个方法接受prompt、model和其他可选参数,构造请求 payload 并发送POST请求到ollama的/generate接口。

6.3.3.3、使用示例

Python
if __name__ == "__main__":
    client = OllamaClient()
    response = client.generate(
        prompt="
解释量子纠缠的基本原理",
        model="llama2",
        options={"temperature": 0.7, "num_predict": 128}
    )
    print("Ollama 响应:", response)

在使用时,我们创建OllamaClient实例,调用generate方法并传入提示词和相关参数。这里的options参数可以设置温度、预测数量等采样参数。

6.3.3.4、关键参数说明

  • model: 指定要使用的模型名称,需提前通过ollama pull命令下载
  • stream: 布尔值,指定是否启用流式响应
  • options: 包含各种采样参数,如temperature控制输出随机性,num_predict控制最大生成长度

6.3.4vLLM接入实现

6.3.4.1、客户端类设计

vLLM兼容OpenAI API,因此我们可以使用OpenAI官方客户端库来与vLLM服务交互:

Python
from openai import OpenAI  # 使用官方OpenAI客户端

class vLLMClient:
    def __init__(self, base_url="http://localhost:8000/v1"):
        self.client = OpenAI(
            base_url=base_url,
            api_key="no-api-key-needed"  # vLLM无需真实密钥
        )

构造函数中,我们指定了vLLM服务的地址,并创建了OpenAI客户端实例。注意,vLLM不需要真实的API密钥。

6.3.4.2、生成方法实现

Python
def generate(self, prompt, model="", **params):
    """
兼容OpenAI的生成接口"""
    completion = self.client.completions.create(
        model=model,
        prompt=prompt,
        **params
    )
    return completion.choices[0].text

这个方法使用OpenAI客户端的completions.create方法来发送生成请求,返回结果中的文本部分。

6.3.4.3、使用示例

Python
if __name__ == "__main__":
    client = vLLMClient()
    response = client.generate(
        prompt="
用Python实现快速排序",
        max_tokens=256,
        temperature=0.5,
        top_p=0.9
    )
    print("vLLM 响应:", response)

使用vLLMClient的方式与使用OpenAI客户端非常相似,只需传入提示词和相关参数即可。

6.3.4.4、关键优势

  • 完全兼容OpenAI API规范,降低迁移成本
  • 支持completions和chat两种端点,满足不同场景需求
  • 自动处理连续批处理,提高吞吐量

6.3.5、统一调用封装

6.3.5.1、统一客户端设计

为了方便在不同后端之间切换,我们创建一个UnifiedModelClient类:

Python
class UnifiedModelClient:
    def __init__(self, backend="vllm"):
        self.backend = backend
        if backend == "ollama":
            self.client = OllamaClient()
        else:
            self.client = vLLMClient()

构造函数根据指定的backend参数创建相应的客户端实例。

6.3.5.2、生成方法实现

Python
def generate(self, prompt, **kwargs):
    #
添加后端特定的默认参数
    if self.backend == "ollama":
        kwargs.setdefault("model", "llama2")
    return self.client.generate(prompt, **kwargs)

generate方法会根据后端类型添加相应的默认参数,然后调用对应客户端的generate方法。

6.3.5.3、使用示例

Python
client = UnifiedModelClient(backend="vllm")
print(client.generate("
请写一首关于春天的诗"))

通过UnifiedModelClient,我们可以方便地在ollama和vLLM后端之间切换,而无需修改大量代码。

6.3.6、注意事项与优化

ollama配置要点

  • 模型管理:使用ollama list查看已下载模型,ollama pull下载新模型
  • 自定义模型:通过创建Modelfile来配置系统提示词和其他参数
  • 性能优化:根据硬件配置调整模型参数,如设置适当的上下文窗口大小

vLLM优化策略

  • 启用量化:使用--quantization参数可以显著降低内存占用

Bash
python -m vllm.entrypoints.openai.api_server \
  --quantization awq \
  --model TheBloke/Llama-2-7B-Chat-AWQ

  • 批处理优化:调整--max-num-batched-tokens参数以适应硬件能力
  • 分布式部署:对于超大模型,可以使用多GPU分布式部署

客户端健壮性设计

  • 超时处理:在请求中添加超时设置,避免无限等待

Python
response = requests.post(url, json=payload, timeout=30)

  • 错误重试:实现简单的重试机制,应对临时网络问题
  • 流式响应:对于大型生成任务,使用流式响应可以提升用户体验

6.4 生产环境考虑

  • 健康检查:定期检查模型服务状态,确保服务可用
  • 监控告警:设置关键指标监控,如响应时间、错误率等
  • 负载均衡:对于高并发场景,考虑使用负载均衡器分发请求

6.3.7、应用场景与最佳实践

开发调试场景

在开发调试阶段,推荐使用ollama,因为它启动快速,配置简单,适合快速验证想法和测试代码逻辑。

生产部署场景

对于生产环境,vLLM是更好的选择,因为它提供了更高的吞吐量和更好的API兼容性,能够满足企业级应用的需求。

混合使用策略

可以根据任务类型和优先级灵活选择后端:

  • 对于低延迟要求的简单任务,使用ollama
  • 对于高并发、大批量的生成任务,使用vLLM
  • 通过统一客户端封装,可以在运行时动态选择最适合的后端

性能测试建议

在正式部署前,建议进行充分的性能测试:

  • 测量不同并发量下的响应时间
  • 测试不同模型参数对性能的影响
  • 验证系统在极限情况下的稳定性

通过本章介绍的内容,相信大家已经对MCP客户端接入本地ollama和vLLM模型有了全面的了解。在实际应用中,还需要根据具体需求和硬件条件进行适当调整和优化,以获得最佳的性能和用户体验。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐