使用ollama本地运行大语言模型

目录:人工智能  |  标签:AI  |  发表于:2024-06-15 11:33:34

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速度慢太多了。

ollama安装

我们直接在官方主页中找到Download按钮下载即可,对于Linux系统它需要我们执行一个安装Shell脚本,对于Windows系统则有一个exe格式的安装包。

安装完成后,我们打开Linux或Windows命令行即可使用ollama了。它的使用很简单,我们可以执行以下命令查看帮助信息。

ollama help

下载和运行大语言模型

ollama维护了一个模型仓库,大部分支持GGUF格式的主流模型都可以在这个仓库中找到,我们可以直接在其中搜索我们需要的大模型并通过ollama命令下载和运行。ollama仓库中这些模型的维护和Docker镜像有些类似,模型有名字和Tag,例如llama3:8bqwen2:7b等,我们可以在页面上选择不同Tag查看这些模型的参数规模、量化等信息。

https://ollama.com/library

不过在此之前,我们可以先修改一下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

加载GGUF模型文件

除了Ollama仓库提供的模型,我们也可以直接加载下载到本地的GGUF模型文件,这只需要创建一个Modelfile模型描述文件,下面是一个例子。

xxx.mf

FROM ./xxx.gguf

代码中,FROM后面的内容是GGUF模型文件的路径,创建好模型描述文件后,我们使用ollama命令行工具即可将模型注册到本地。

ollama create xxx -f ./xxx.mf

此时我们就可以使用ollama listollama run等命令操作这个模型了。

使用Open WebUI

ollama只提供了命令行界面,使用可能不是非常方便。Open WebUI是一个开源项目,它提供了一个类似ChatGPT的图形界面,并支持连接到ollama后端。

官方主页:https://openwebui.com/

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中已经安装的模型。

定制参数和System Prompt

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中我们就可以和这个定制后的模型进行多轮对话了。

直接调用ollama接口

实际上,Open WebUI之所以能够连接到ollama上,是因为ollama在本地的11434端口启动了一个HTTP服务,我们也可以直接用程序调用这个接口。

POST http://localhost:11434/api/generate

将ollama集成到LangChain框架

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对其翻译后进行输出。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap