ollama是一个用于部署和运行LLM的轻量级开源框架,它提供了一些十分方便的命令用于管理模型,此外还提供了HTTP接口供上层应用程序使用,我们基于ollama部署的模型能够轻松地开发各种上层应用程序,这篇文章我们简单介绍ollama工具。
官方网站:https://ollama.com/
Github地址:https://github.com/ollama/ollama
对于本地运行的大语言模型,8b规模是比较合适的,在int4量化下我们需要8GB显存(VRAM)即可运行,Nvidia RTX20、30、40系列的60级别以上显卡都可以完美运行。内存通常满足当前主流的32GB就足够了。如果出现显存不足的情况,Windows操作系统实际上也能利用内存补足(在任务管理器中我们可以看到共享显存相关的信息),但会严重拖慢运行速度。
对于70b规模的大语言模型,int4量化下可能需要约40GB的显存,单张消费级显卡通常是无法实现的,不过ollama也支持多卡。
GTX9、10或更古老的显卡通常显存较小,但仍有Tesla M40、P40、P100这类计算卡可以选择,虽然运行速度较慢,未来也可能失去新版本Cuda的支持,不过目前仍可以使用。
使用CPU运行是不推荐的,即使有较大的内存和高配置的CPU输出速度也慢如蜗牛,我在Intel 13700K上尝试用CPU运行,它仍比GPU速度慢太多了。
我们直接在官方主页中找到Download
按钮下载即可,对于Linux系统它需要我们执行一个安装Shell脚本,对于Windows系统则有一个exe
格式的安装包。
安装完成后,我们打开Linux或Windows命令行即可使用ollama了。它的使用很简单,我们可以执行以下命令查看帮助信息。
ollama help
ollama维护了一个模型仓库,大部分支持GGUF格式的主流模型都可以在这个仓库中找到,我们可以直接在其中搜索我们需要的大模型并通过ollama命令下载和运行。ollama仓库中这些模型的维护和Docker镜像有些类似,模型有名字和Tag,例如llama3:8b
,qwen2:7b
等,我们可以在页面上选择不同Tag查看这些模型的参数规模、量化等信息。
不过在此之前,我们可以先修改一下ollama的模型缓存地址,LLM的文件尺寸都非常大,例如8b左右规模的模型通常在4~5GB,70b规模的模型可能要占用几十GB的存储空间,ollama默认会将这些缓存文件放置在用户目录(对于Windows通常是C盘),我们可以使用环境变量OLLAMA_MODELS
将其指定到其它目录。
具体下载和运行模型需要使用ollama命令行,下面例子中我们下载并运行当前最强大的Llama3大语言模型,我们这里使用的llama3:instruct
是一个为多轮对话优化的版本,它默认是8b规模和int4量化的,需要8GB的显存即可运行。
ollama run llama3:instruct
运行后如果模型尚未下载,我们需要等待下载完成,如果一切正常,我们就会进入一个交互式的命令行聊天界面中。
这个界面中我们可以输入/?
查看命令提示,如果想要退出这个界面,可以输入/bye
。
如果想要查看我们已经安装了哪些模型,我们可以执行以下命令。
ollama list
除了Ollama仓库提供的模型,我们也可以直接加载下载到本地的GGUF模型文件,这只需要创建一个Modelfile
模型描述文件,下面是一个例子。
xxx.mf
FROM ./xxx.gguf
代码中,FROM
后面的内容是GGUF模型文件的路径,创建好模型描述文件后,我们使用ollama
命令行工具即可将模型注册到本地。
ollama create xxx -f ./xxx.mf
此时我们就可以使用ollama list
和ollama run
等命令操作这个模型了。
ollama只提供了命令行界面,使用可能不是非常方便。Open WebUI是一个开源项目,它提供了一个类似ChatGPT的图形界面,并支持连接到ollama后端。
Open WebUI提供了Docker镜像供我们部署,对于Windows操作系统我们需要安装Docker Desktop(基于WSL2)。安装好Docker后,我们直接执行以下命令下载并运行Open WebUI的镜像。
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
启动完成后,我们使用浏览器访问http://localhost:3000
即可进入Open WebUI,这个程序设计上是支持多用户的,第一次使用可能需要设定账号和密码,不过我们是本地单用户使用,因此随便设置即可,在界面的左上角我们可以选择ollama中已经安装的模型。
ollama支持一个叫做Modelfile
的功能,它类似一个Docker镜像的构建脚本,我们在Modelfile
中可以指定基础模型和相关的参数以及System Prompt来定制大语言模型的使用。
在Open WebUI中我们点击左上角的Workspace,选择Create a modelfile
即可进入Modelfile
的编辑界面。类似ollama的模型名字,我们也需要给Modelfile
定制后的“模型”起一个名字和Tag,Modelfile
的内容例子如下。
FROM llama3:instruct
PARAMETER temperature 1
SYSTEM """
You are an AI assistant named Aiko living in cyberspace. You help people with your knowledge. You always add emojis in what you say. You always answer all questions to the best of your ability. You reply in English.
"""
我们可以看到Modelfile
中,From
指定了基础的模型,PARAMETER
我们这里设置了模型的temperature
参数,此外我们还设置了System Prompt。保存后,在Open WebUI中我们就可以和这个定制后的模型进行多轮对话了。
实际上,Open WebUI之所以能够连接到ollama上,是因为ollama在本地的11434端口启动了一个HTTP服务,我们也可以直接用程序调用这个接口。
POST http://localhost:11434/api/generate
LangChain是目前一个比较流行的AI应用开发框架,它也支持ollama的集成。下面例子中,我们使用LangChain框架实现了一个类似文本翻译的功能。
from langchain_community.llms import Ollama
from langchain_core.prompts import ChatPromptTemplate
if __name__ == "__main__":
prompt = ChatPromptTemplate.from_messages(
[
('system', 'Translate the user text into Simplified Chinese. '
'Reply the translated text only, without extra content.'),
('user', '{message}'),
]
)
model = Ollama(
model="qwen2:7b"
)
chain = prompt | model
while True:
message = input("User: ")
if message == "exit":
break
output = chain.invoke({"message": message})
print(output)
由于我们输出的内容是中文,Llama3的中文能力比较搞笑,因此我们选择国产的qwen2
。代码中我们使用LangChain组装了相关的提示词并加载了ollama相关的配置,最后我们编写了一个循环来读取用户输入,并使用qwen2
对其翻译后进行输出。