Ollama绝对是最简单的一种大模型部署方式,尽管该方式不支持function calling,但对于我们进行大模型的初步开发与探索已经足够。
本篇介绍了如何使用Ollama本地化部署qwen2:7b,以及进行Ollama的参数设置以及使用api调用qwen2的api服务的方法。
一、安装或者升级Ollama
运行qwen2需要Ollama版本 ollama>=0.1.42
可以通过ollama -v命令检查安装的版本。
我这里已经升级到0.1.44了满足条件。我之前是0.1.32,不满足版本要求的话,运行qwen2会显示乱码。
以下记录如何更新服务器上的Ollama版本。
官方的教程是直接使用命令:
curl -fsSL https://ollama.com/install.sh | sh
但实际执行的时候90%都会遇到网络问题不成功,只能用备用方案:
1、通过本地下载安装文件,再上传到服务器。
- 本地使用浏览器访问https://ollama.com/download/ollama-linux-amd64触发下载;
- 将下载的文件重命名为ollama;
- 通过winscp工具或者scp命令,将其上传至服务器目录:/usr/bin/
- 给文件赋予可执行权限:chmod +x /usr/bin/ollama
- 如果不能调到最新的Ollama,可以修改环境变量的读取顺序:export PATH="/usr/bin:/usr/local/bin:/bin:$PATH",也可以替换之前目录使用的ollama程序:例如我之前的Ollama程序在/usr/local/bin/ollama,将该文件直接替换为最新的即可。
2、Ollama相关设置
在服务器的环境变量中设置Ollama相关的参数:
- OLLAMA_HOST:这个变量定义了Ollama监听的网络接口。通过设置OLLAMA_HOST=0.0.0.0,我们可以让Ollama监听所有可用的网络接口,从而允许外部网络访问。
- OLLAMA_MODELS:这个变量指定了模型镜像的存储路径。通过设置OLLAMA_MODELS=/data/model/ollama_models,我们可以将模型镜像存储在/data目录下,避免默认目录下存储空间不够的情况。
- OLLAMA_KEEP_ALIVE:这个变量控制模型在内存中的存活时间。设置OLLAMA_KEEP_ALIVE=24h可以让模型在内存中保持24小时,提高访问速度。
- OLLAMA_PORT:这个变量允许我们更改Ollama的默认端口。例如,设置OLLAMA_PORT=8080可以将服务端口从默认的11434更改为8080。(我这里没有设置)
- OLLAMA_NUM_PARALLEL:这个变量决定了Ollama可以同时处理的用户请求数量。设置OLLAMA_NUM_PARALLEL=4可以让Ollama同时处理两个并发请求。
- OLLAMA_MAX_LOADED_MODELS:这个变量限制了Ollama可以同时加载的模型数量。设置OLLAMA_MAX_LOADED_MODELS=4可以确保系统资源得到合理分配。
在linux上通过设置ollama的环境变量:
(1)修改~/.bashrc文件
vi ~/.bashrc
在末行添加
export OLLAMA_MODELS=/data/model/ollama_models
export OLLAMA_HOST=0.0.0.0
export OLLAMA_KEEP_ALIVE=24h
export OLLAMA_NUM_PARALLEL=4
export OLLAMA_MAX_LOADED_MODELS=4
(2)在当前会话中生效
source ~/.bashrc
3、启动Ollama服务
(1)启动命令
ollama serve
(2)后台启动命令
nohup ollama serve >/dev/null 2>&1 &
该命令将不保存日志信息,如果需要日志信息,将>/dev/null修改为想要保存的日志文件路径即可。
二、使用Ollama拉取并运行qwen2
使用命令
ollama run qwen2
会自动拉取镜像。等拉取完毕就可以进行对话了。
也可以使用ollama pull qwen2,再使用ollama run qwen2也可以运行,都是一样的。
我们可以看到拉取默认拉取的是4.4GB的模型。
到Ollama的模型仓库中看看可用的模型:
同时我们看到该模型其实是经过Q4量化过的模型,难怪4.4G。我们看一下显存占用:
nvidia-smi
占用5.8G显存
加上本身Ollama本身的服务,1.8G,不到8个G的显存。
这么说8G显存就能在本地运行qwen2:7b了。是不是非常的惊喜!!!而且经过我们工作中的使用,其实Ollama提供的qwen2:7b模型已经具有相当好的效果,比起chatGLM等其他同规格参数模型,qwen2:7b是最好的,真的强。
三、api调用Ollama部署的qwen2:7b
由于我没有修改Ollama的默认端口,服务将监听默认的11434端口。如果需要其他机器访问,而服务器开启了防火墙,我们则需要开放服务器的端口11434。
1、开启防火墙端口(如果服务器未开启防火墙则跳过)
打开防火墙某个端口
sudo firewall-cmd --permanent --add-port=11434/tcp
重载防火墙设置
sudo firewall-cmd --reload
这样我们就可以通过接口访问服务器提供的大模型服务了。
2、api方式调用qwen2:7b
Ollama部署的qwen2:7b是标准的Openai API格式,因此直接采用chatOpenai的调用方式即可,如下:
import os
from langchain.chat_models import ChatOpenAI
os.environ['OPENAI_API_KEY'] = 'none'
os.environ['OPENAI_BASE_URL'] = 'http://{服务器ip地址}:11434/v1'
# 使用qwen2-7b(实际为in4量化版本)
llm = ChatOpenAI(temperature=0, model_name='qwen2:7b')
{服务器ip地址}修改为服务器实际的ip地址。
3、调用测试
from langchain.chains.llm import LLMChain
from langchain_core.prompts import PromptTemplate
_prompt = """ 你是一个发言友好的AI助理。现在回答用户的提问:{question}。"""
prompt = PromptTemplate.from_template(_prompt)
chat_chain = LLMChain(llm=model, prompt=prompt, verbose=True)
q = "你好,你有什么功能?"
response = chat_chain.run(question=q,verbose=True) # 终端用户的提问字符串
print(response)
看到模型回复如下:
证明已经部署完成,可以进行使用了。我们可以将其进行意图识别,或者完成一些文本摘要、实体提取任务都可以很愉快的完成、
四、补充说明
1、关于function calling
Ollama启动方式不支持function calling功能。
function calling在langchain的很多功能中具有重要的作用,例如路由链、提取链等都需要function calling。
官方说采用qwen-agent可以进行支持,但实际上为了我们的使用,我们可以采用其他方式进行部署,则可以支持function calling,例如Xinference部署,后续我可以再出具一篇教程、
2、关于langchain
还有关于上述测试api调用是否可用的代码,是关于langchain框架的,我这里示意的是langchain0.1.x版本的大模型链的定义方法,现0.2.x版本已经弃用。langchain0.2.x版本新增很多新的功能。我也正在学习,后续有时间我继续向大家分享。