ollama 使用手册

Ollama 使用方式类似于 Docker 的使用方式,模型上传到 ollama 的镜像库中,使用的时候,可以直接用 pull 命令拉取。

安装方案

因为使用 Linux 和 MacOS 两套系统管理,两块的使用方案不同。

# darwin
brew install ollama
# linux
curl -fsSL https://ollama.com/install.sh | sh

拉取镜像

在安装 ollama 之后,可以直接运行 ollama serve 命令进行启动,然后用 ollama pull llama3 下载对应的 model 的镜像。

llava
写作模型,用来执行编写报告、文档相关的任务
llama3
比较好的英文处理模型,一些涉及英文理解的任务由此模型承担
qwen2
中文模型,使用中文编写脚本和任务清单的内容,由此模型担任

模型存储位置

MacOS
~/.ollama/models
linux
usr/share/ollama.ollama/models

但是需要对模型进行共享,所以可以使用 OLLAMA_MODELS 来配置成相同的路径。

可以配置配置文件:

#vi /etc/systemd/system/ollama.service
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
#配置远程访问
Environment="OLLAMA_HOST=0.0.0.0"
#配置跨域请求
Environment="OLLAMA_ORIGINS=*"
#配置OLLAMA的模型存放路径防止内存不足一般的默认路径是/usr/share/ollama/.ollama/models/
Environment="OLLAMA_MODELS=/home/ollama/.ollama/models"

[Install]
WantedBy=default.target

更新文件内容后,执行下面的命令:

##修改完后执行
sudo systemctl daemon-reload
sudo systemctl enable ollama

模型打包脚本

在使用过程中,需要将 ollama 下载的模型分导入到其它环境中,但是随着模型的增加,其记录的信息也特别复杂,希望可以仅将某个模型打包而不是对整个 models/ 文件夹打包。

研究了一下 ollama list 命令下的数据,发现在 models 下面,blobs 中存储的是模型,而在 manifests 中存储的是对应的模型信息。

less 查看一下内容,发现是一段 json 代码,其中模型的数据主要是存储在 digest 对应的信息中。使用如下命令对模型进行打包;

from pandas import json_normalize
import json
import pandas as pd
import os
import tarfile

json_path = '<ollama_models>/manifests/registry.ollama.ai/library/<model_name>/<model_version>'
blob_path = '<ollama_models>/blobs/'
tar_path = '<tar_path>'

with open(json_path) as f:
    df = json.load(f)

out = pd.json_normalize(df, record_path=['layers'], meta=['schemaVersion','mediaType','config'], meta_prefix='layer_')
results = list(map(lambda x: x.replace(':', '-'), out.digest.values))

files = list(map(lambda x: os.path.join(blob_path, x), results))

print(files)

outFileTarName = os.path.join(tar_path, "<model_name_version>.tar.gz")
with tarfile.open(outFileTarName, "w:gz") as tar:
    for file in files:
        tar.add(file)


print(outFileTarName)

之后如果使用 Fat32 U 盘备份的话,需要将 tar 文件切成多个文件,使用下命令:

split -b 500M -d -a 2 <tar_name>.tar.gz <tar_name>.tar.gz.

这里是按 500M 进行分包,每个包按 2 位数字进行命名。