个人本地部署大模型和调用的常用方式

30 阅读4分钟

部署大模型的方式有很多,比如ollama、vllm,个人常用的部署方式是使用ollama框架进行部署。

1 ollama

1.1 ollama本地部署大模型

步骤1:下载ollama软件

# download ollama software
curl -fsSL https://ollama.com/install.sh | sh

步骤2: 加载模型

  • 方法1:官网下载,优点方便,缺点仅支持官网列出来的模型
# download model
ollama run kimi-k2.5:cloud # function1
ollama pull bge-m3  # function2
  • 方法2:个性化加载 去huggingface 下载gguf格式的模型,同时下载原生模型的其他配置文件放在一起 通过导入到ollama的model list里面

如果有多卡的情况下,进行模型部署会优先进行单卡的显存占用,会出现负载不均衡的情况,这时候可以进行系统配置 systemctl edit ollama.service 进行如下修改

[Service]
...
Environment="CUDA_VISIBLE_DEVICES=0,1,2,3"  # 指定要使用的GPU编号
Environment="OLLAMA_SCHED_SPREAD=1"         # 关键:启用跨GPU调度,负载均衡的关键
Environment="OLLAMA_KEEP_ALIVE=-1"          # 可选:模型常驻内存,避免频繁加载

重启systemd服务 systemctl daemon-reload

重启ollama服务 systemctl restart ollama

1.2 调用ollama部署大模型

相同服务器调用的方式,直接采用localhost的;不同服务器,需要进行如下操作:

  • 设置ollama的系统配置:和上面进行系统设置一样,需要加一个Environment="OLLAMA_HOST=0.0.0.0:11434"
  • 需要知道ollama部署的服务器可以公网访问的ip地址 查看方式netstat -tn | grep ESTABLISHED可以查看已经建立的访问端口设置,里面会涉及到公网ip可以找到
  • 在下面用到url的地方使用该公网ip就可以正常进行远程访问了

1.2.1 ollama rest api

OpenAIAPI 接口是大模型应用开发中最常用、且集成度最高的 API 接口规范,其兼容接口主要包括:

  • chat/completions
  • completions
  • models
  • embeddings

下面的1.2.2和1.2.3中/api/generate/api/chat 接口,其实就是 Ollama 兼容 OpenAIREST API 接口的底层实现。其中:

  • /api/generate 接口对应 OpenAIcompletions 接口;
  • /api/chat 接口对应 OpenAIchat/completions 接口;

使用方式(流失输出)

from openai import OpenAI

client = OpenAI(
    base_url='http://192.168.110.131:11434/v1/',
    api_key='ollama',
)

messages = [
    {
        'role': 'user',
        'content': '你好,请你介绍一下什么是人工智能?',
    }
]

try:
    # 调用聊天接口
    stream = client.chat.completions.create(
        model='deepseek-r1:8b',
        messages=messages,
        stream=True
    )
    
    # 处理流式响应
    for chunk in stream:
        if chunk.choices[0].delta.content is not None:
            print(chunk.choices[0].delta.content, end='', flush=True)
            
except Exception as e:
    print(f"发生错误: {str(e)}")

1.2.2 generate的API

对于endpoints来说,如果使用代码调用,常规的调用方式是通requests库进行调用。

import requests # type: ignore
import json

# 设置 API 端点
generate_url = "http://192.168.110.131:11434/api/generate"    # 这里需要根据实际情况进行修改

# 示例数据
generate_payload = {
    "model": "deepseek-r1:7b",   # 这里需要根据实际情况进行修改
    "prompt": "请生成一个关于人工智能的简短介绍。",  # 这里需要根据实际情况进行修改
    "stream": False,       # 默认使用的是True,如果设置为False,则返回的是一个完整的响应,而不是一个流式响应
}

# 调用生成接口
response_generate = requests.post(generate_url, json=generate_payload)
if response_generate.status_code == 200:
    generate_response = response_generate.json()
    print("生成响应:", json.dumps(generate_response, ensure_ascii=False, indent=2))
else:
    print("生成请求失败:", response_generate.status_code, response_generate.text)

重要参数及其解释:

  • model:模型的名称,一定要是ollama上展示的模型的名称
  • prompt:字符串,用户的提问
  • format:
  • options:对输入输出进行控制的参数,类型是字典
    • num_ctx:输入的文本的token长度限制
    • num_predict:输出文本的token限制长度(think模型的think部分也会计算在内)
    • temperature,top_k, top_p:文本生成多样性的控制,temperature一般在0.5-0.7可以有效避免循环生成。
    • stop:停止控制,遇到给定的字符串就停止继续生成文本。
  • system:系统提示词
  • stream:是否流式打印,其中,是否流失对于需要的代码是不一样的
  • keep_alive:模型加载在显存中如果长期不使用会浪费资源,ollama不设置该参数的话,通常保存5分钟加载,限定时间的话可以设置“10m”等,如果想永久加载就设置负数

1.2.3 chat的API

与generate参数基本一致,但是在使用上更符合chat用户的对话习惯,如使用messages传参而不是prompt,支持tools 调用方法和generate大部分一致,只是在url和传参是messages有一点不同


generate_url = "http://localhost:11434/api/chat"
generate_payload = {
    "model": "llama-2-7b-chat-q4_0",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user",
            "content": "What is the meaning of transformers?"
        }
    ],
    "stream": False
}

1.2.4 总结

openai兼容的接口,但是可使用的参数相对较少一些; generate和chat这种原生api可控制性和灵活性更强。