Ollama: 自托管LLM的简单方案

Self Hosted 自托管
Feb 5, 2024 ~

这两天心血来潮,看着机箱里面的早就不用来打游戏的显卡,总觉得需要做点什么。碰巧看到Ollama,似乎自托管LLM变得比以往容易了很多。特此尝试并记录一下。文中涉及了Ollama的部署和使用,以及两个UI的使用:Big-AGI和Ollama WebUI。

Ollama是什么

大概可以理解为一个本地运行LLM的Framework或者说Platform。跑起来之后可以很方便的对接一众支持的LLM模型,然后还可以对接一众UI。大概可以理解为一种LLM和UI/app之间的Multiplexer。

💡
题外话,其实所谓的Integration就是这类工作。而且基本上可以说很多很多的工作都是这类的,并不涉及太多的硬核技术。然而这类工作确实也要求速度,快速的对接足够多的上下游以站稳脚跟。而这个速度有时不只是单纯的速度,还要求对于上下游精确深入的理解,才能少走弯路,不重复造轮子。然而这个要求很多时候潜藏在表层之下,很多从业人员根本就意识不到,而这对于有追求的技术人员来讲,不能不说是可悲的。
GitHub - ollama/ollama: Get up and running with Llama 2, Mistral, and other large language models locally.
Get up and running with Llama 2, Mistral, and other large language models locally. - GitHub - ollama/ollama: Get up and running with Llama 2, Mistral, and other large language models locally.

既然只是一个平台或者说Framework,那么自然还是需要UI和LLM才能运行的。在Ollama的Github page上面已经列出了一些选项,个人也进行了一些尝试,在此记录了一下最近的尝试。

Ollama会expose一个OpenAI compatible的API在11434端口上面,然后一种给ChatGPT做的UI大概只需要一些简单的修改就可以对接Ollma上面的模型了。

至于Ollama支持的模型,自然Meta的llama2是在列的。其他的还有最近挺火的Mixtral 8x7b以及Mistral还有Llava2。

Installation and/or Deployment

Ollama本身提供了一个 ollama command line tool 来管理 service up/down 以及模型的pull and deletion。

安装非常简单,Ollama有个Linux上面安装的文档

# Download the install script
curl https://ollama.ai/install.sh | sh

# other than the script, use this to install manually
sudo curl -L https://ollama.ai/download/ollama-linux-amd64 -o /usr/bin/ollama
sudo chmod +x /usr/bin/ollama
# Create a user specifically for runing ollama
sudo useradd -r -s /bin/false -m -d /usr/share/ollama ollama

之后最好把Ollama的服务设置为自动启动的。这个任务自然落到Systemd上面。
写一个systemd的service config: /etc/systemd/system/ollama.service

[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

Reload the service config and enable ollama service.

sudo systemctl daemon-reload
sudo systemctl enable ollama

但是到此为止,Ollama目前只会接受来自172.0.0.1的请求。所以如果你像我一样希望在另一个Host上面的跑UI,那么到这一步还不够。要开放所有IP的访问,需要设置Environment variable。

OLLAMA_HOST=0.0.0.0

然而我们需要在Systemd运行的时候把这个Environment variable送进去。在 [Service]下面加上一行:

Environment="OLLAMA_HOST=0.0.0.0"

或者直接把下面两行加在一个新的文件下面 /etc/systemd/system/ollama.service.d/environment.conf

[Service]
Environment="OLLAMA_HOST=0.0.0.0"

之后可以重启一下确保生效

sudo systemctl daemon-reload
sudo systemctl enable ollama

这一切都折腾完了之后,终于可以开始用一用了。

ollama pull llama2

ollama run llama2

这之后就是个command line的UI,可以用来跟UI对话。但是这个UI显然不是很现代,不太方便设置system prompt,以及设置Temperature之类的。这些东西自然还是通过UI来设置最好。

Setup UI

目前本人试用过的两个UI是Big-AGI和OllamaUI。

Big-AGI

Big-AGI,从这个名字看就很有野心。Ollama只是它支持的众多后端的一个。Big-AGI大概是打算整合众多AI后端,达成一种,只要通过Big-AGI,就可以完成任何AI相关工作,的效果。

Big-AGI目前一个小遗憾是没有自己的Authentication。这一点其实也说不准是不是遗憾,有时这种项目如果过于注重多用户,可能也会影响项目发展。个人用户的话可以用Reverse Proxy上面建立一个简单的Access List来限制访客。

GitHub - enricoros/big-AGI: 💬 Personal AI application powered by GPT-4 and beyond, with AI personas, AGI functions, text-to-image, voice, response streaming, code highlighting and execution, PDF import, presets for developers, much more. Deploy and gift #big-AGI-energy! Using Next.js, React, Joy.
💬 Personal AI application powered by GPT-4 and beyond, with AI personas, AGI functions, text-to-image, voice, response streaming, code highlighting and execution, PDF import, presets for developers…

Big-AGI之前没有比较靠谱的Docker Image用(最近更新了)。所以与其折腾Dockerfile,不如直接在LXC上面安装。不过big-AGI的安装需要NPM。

apt install在Ubuntu上面的安装NodeJS显然不是一个好主意。如果你不幸跟我一样用了 apt install npm 这类的命令,以下的步骤可以撤销所有的影响。

sudo rm -rf /usr/local/bin/npm /usr/local/share/man/man1/node* ~/.npm
sudo rm -rf /usr/local/lib/node*
sudo rm -rf /usr/local/bin/node*
sudo rm -rf /usr/local/include/node*
sudo apt-get purge nodejs npm
sudo apt autoremove

正确安装最新的版本也比想象中容易。首先是Download the latest tar.xz NodeJS file from https://nodejs.org/en/download/

tar -xf node-v#.#.#-linux-x64.tar.xz
sudo mv node-v#.#.#-linux-x64/bin/* /usr/local/bin/
sudo mv node-v#.#.#-linux-x64/lib/node_modules/ /usr/local/lib/
# Where #.#.# is the version you downloaded.

# Verify installation using
node -v
npm -v

NodeJS装好之后,事情就好办多了。照着文档做就可以了。

git clone https://github.com/enricoros/big-agi.git
cd big-agi
npm install
npm run build
next start --port 3000

docker compose

最近Big-AGI更新了docker image。同时还可以配合Browserless,达成让LLM阅读指定URL网页内容的功能。

version: '3.9'

services:
  big-agi:
    image: ghcr.io/enricoros/big-agi:latest
    ports:
      - "3000:3000"
    env_file:
      - .env
    environment:
      - PUPPETEER_WSS_ENDPOINT=ws://browserless:3000
    command: [ "next", "start", "-p", "3000" ]
    depends_on:
      - browserless

  browserless:
    image: browserless/chrome:latest
    ports:
      - "9222:3000"  # Map host's port 9222 to container's port 3000
    environment:
      - MAX_CONCURRENT_SESSIONS=10

总体来看还是Docker-compose的部署方案干净整洁。

Connect big-AGI with Ollama

一图就可以解释清楚:

当然,官方也有文档:

big-AGI/docs/config-ollama.md at main · enricoros/big-AGI
💬 Personal AI application powered by GPT-4 and beyond, with AI personas, AGI functions, text-to-image, voice, response streaming, code highlighting and execution, PDF import, presets for developers…

Big-AGI的使用

一切就绪之后,在UI里面选择Ollama已经Pull下来的模型。可以考虑调节模型每次的输出token数量以及Temperature:

big-AGI: 选择Ollama已经Pull下来的模型
big-AGI: 调节模型参数

big-AGI也可以通过Ollama Admin Panel,直接命令Ollama从网上Pull新的模型下来:

big-AGI: Ollama Admin button
big-AGI: Ollama Admin Panel

某种意义上讲,这个比Ollama自己的Command line UI还要好用一些。不过pull model这种事情,动辄几个GB甚至几十个GB的文件,还是需要花一些时间的,所以UI就有可能直接timeout。

big-AGI: Ollama Admin Panel Pulling Model

Big-AGI的一个独到之处是,已经预设了一些AI Persona,相当于省去了一些sysem prompt的麻烦,用户大概可以更快的获得想要的内容。比如Developer Persona大概对于代码更加专精,可能有更少的胡编乱造的成分。Catalyst可能更适合写一些博客之类的,也大概会有更多的胡编乱造。Executive也许适合写报告,用词也许会更职业一些。

big-AGI: AI Persona

之后就可以对话了。Big-AGI也支持直接访问麦克风,首先识别语音,转译成文字之后再送到LLM里面去。某种程度上可以达到人机对话的程度。

big-AGI: voice input
big-AGI: talk to AI

Big-AGI还有很多的功能没有探索,留待日后再谈了。

Ollama WebUI

不同于Big-AGI,Ollama WebUI就是完全面向Ollama设计的。但是其界面是类比了ChatGPT的界面。相比于Big-AGI,这个界面显然是更让人熟悉的。Ollama WebUI也自带了Authentication。

GitHub - ollama-webui/ollama-webui: ChatGPT-Style Web UI Client for Ollama 🦙
ChatGPT-Style Web UI Client for Ollama 🦙. Contribute to ollama-webui/ollama-webui development by creating an account on GitHub.

因为Ollama WebUI是给Ollama设计的,所以所谓集成,基本上也只需要Ollama。因此Ollama<>Ollama WebUI的integration就直接通过Environment Variable OLLAMA_API_BASE_URL 的形式给进Ollama WebUI。以下是Docker-compose:

version: '3.8'

services:
  ollama-webui:
    image: ghcr.io/ollama-webui/ollama-webui:main
    container_name: ollama-webui
    volumes:
      - <path_for_ollama_data_on_your_host>:/app/backend/data
    ports:
      - 3000:8080
    environment:
      - 'OLLAMA_API_BASE_URL=http://<you_ollama_IP/hostname>:11434/api'
    restart: unless-stopped

第一次登录的时候,可以注册用户。第一个注册的用户就是管理员。

如果是个人用户,一定要记得把新用户注册关上,尽量提高一点安全吧。

Ollama的使用

首先选择一个模型。

ollama-webui: Select Model

如果没有想要的模型,也可以通过UI直接Pull新的模型下来。

ollama-webui: pull models

只是比较可惜的是,这里就没有列表可供选择了。我们需要从下面这个链接找模型的名称以及tag。

library
Get up and running with large language models, locally.

Ollama-WebUI也提供了麦克风输入方式。不过相比big-AGI,似乎灵敏度查了一点点,也没有自动continue的选项。不过对于很多普通使用场景来讲,已经足够了。

ollama-webUI: Sample

Generated Blog Post

在这个时候我就有点好奇了。用这个LLM生成的文章大概会是什么样子呢?所以我就通过Mistral:7b模型生成了一段文章,我给的要求是,生成一篇关于自托管LLM的文章,要提到自托管的原因,以及使用Ollama运行Mixtral模型的步骤,还有就是要提到使用GPU进行加速。

从文中可以看到,大体的行文是不错的。但是由于模型没有联网自我学习,所以这个文章中充斥着各种幻想出来的东西。并且大概是受制于token的限制,文章的细节也不充足。只能说,在一张小小的3070显卡上面自托管LLM,目前来看,只能当作娱乐。

以下部分就是生成的文字了。

为什么要选择自主托管的LLM?

随着语言模型在深度学习中越来越广泛应用,人们开始注意到 OpenAI 提供的 ChatGPT 虽然强大,但是有些限制。首先,ChatGPT 需要在 OpenAI 服务器上运行,这意味着你无法进行自主托管。其次,使用 ChatGPT 会导致部分数据被收集并存储在 OpenAI 的企业服务器上,这可能会引起一些人的疑问和安全性担忧。因此,使用自主托管的LLM可以解决这些问题。

自我托管LLM的选项

当你想要使用自主托管的LLM时,有许多选项可供选择。其中一个最流行的是 Ollama,这是一个通过 GitHub 开源的 LLaMA(Language Model for All)的自主托管模型。Ollama 支持多种语言模型,包括 BERT、RoBERTa 和 DistilBERT,可以在不同的任务上使用。

另一个选项是 llama2,这是一个通过 GitHub 开源的基于 RoBERTa 的自主托管模型。llama2 支持多种语言模型,包括 RoBERTa、DistilRoBERTa 和 ELECTRA。

Mixtral 也是一个很有价值的自主托管LLM选项。Mixtral 使用了一种名为“Transformers”的语言模型,可以在不同的任务上使用。Mixtral 还支持多种语言模型,包括 BERT、RoBERTa 和 DistilBERT。

部署LLM

尽管自主托管的LLM可以解决一些问题,但是其他限制也需要考虑。首先,你需要一个能够运行 LL 模型的计算机和几十兆字节的存储空间。在家中使用一个普通的电脑可能不足够。

其次,你需要了解如何部署 LL 模型。这包括了解如何安装 Python、PyTorch 和 Hugging Face Transformers,以及如何编写代码来调用这些模型。

下面是一个使用 Ollama 和 Mixtral 的具体例子/步骤/指令:

使用 Ollama 的具体步骤

  1. 安装 Python、PyTorch 和 Hugging Face Transformers。
  2. 下载一个 Ollama 模型并将其存储在你的计算机上。
  3. 编写代码来调用 Ollama 模型,以便在使用中能够解释和应对模型的输出。
  4. 运行你的代码并与 Ollama 模型进行交互。

使用 Mixtral 的具体步骤

  1. 安装 Python、PyTorch 和 Hugging Face Transformers。
  2. 下载一个 Mixtral 模型并将其存储在你的计算机上。
  3. 编写代码来调用 Mixtral 模型,以便在使用中能够解释和应对模型的输出。
  4. 运行你的代码并与 Mixtral 模型进行交互。

使用 GPU 来加速 LL 模型的运行

如果你有一个具有可用的GPU的计算机,你可以在这里使用它来加速 LL 模型的运行。将 LL 模型存储在 GPU 上可以大大提高其性能。

结论

自主托管LLM是一项非常有价值的选项,它可以解决使用 ChatGPT 或者 OpenAI 服务器上运行的模型所面临的限制。在选择自主托管LLM时,你需要了解不同的选项,包括 Ollama、llama2 和 Mixtral。尽管这些 LL 模型可以使用 GPU 加速,但是如果你没有一个具有可用的GPU的计算机,你需要考虑其他选项来部署 LL 模型。

标签