部署大模型的方式有很多,比如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
OpenAI 的 API 接口是大模型应用开发中最常用、且集成度最高的 API 接口规范,其兼容接口主要包括:
chat/completionscompletionsmodelsembeddings
下面的1.2.2和1.2.3中/api/generate 和 /api/chat 接口,其实就是 Ollama 兼容 OpenAI 的 REST API 接口的底层实现。其中:
/api/generate接口对应OpenAI的completions接口;/api/chat接口对应OpenAI的chat/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可控制性和灵活性更强。