ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">这一年来,我已经习惯了使用线上大模型 API 来工作,只要网络在,就可以很方便地使用, 同时还能享受比较好的性能。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">不过前两周的时候和一个客户聊系统,他们虽然现在没有应用大模型相关的能力,也没有计划安排 GPU 算力, 不过他们还是执着地要在本地进行大模型的部署。我想这也是很多企业不可改变的现状。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">对于这部分需求,社区自然是已经有了很好而且很多的解决方案,比如Ollama,这个 Github 已经80.3K星标的项目。本来这类工具做的易用性非常好(简单),一般是拿来看官网文档直接用就好,不过我在使用的时候发现,他的官网是没有专门的文档页面, 只有连接到 Github 的 Markdown,搞得我连运行起来之后的默认端口都要问一下 AI。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin: 1.5em 8px;color: rgb(63, 63, 63);"> ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;border-radius: 8px;display: block;margin: 0.1em auto 0.5em;border-width: 0px;border-style: solid;border-color: initial;height: auto !important;" title="null" src="https://api.ibos.cn/v4/weapparticle/accesswximg?aid=86343&url=aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9hZzdaM2RDcTdMa2JxNTRjc25CeTFRMm9IUnhlSzJpYXJpYkRqRXpEaWFrcUdhd01vRHNkVkFNYjF0Nlk4NlBDVXUxUWljSjJLUDgxOGlha2pIdjZqYWN6dHJnLzY0MD93eF9mbXQ9cG5nJmFtcA==;from=appmsg"/>ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">所以我就想还是写篇文章,就把我看到的有用的信息都整理了一下,相信对大家也有点用,同时好让大家对 Ollama 有一个比较全面的了解。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">文章包含以下内容:ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;margin-left: 8px;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63);" class="list-paddingleft-2">•软件安装以及使用容器运行 •模型下载、运行、对话 •导入自定义模型 •定制系统提示 •CLI 命令全解 •REST API 介绍 •Python API 介绍 •日志和 Debug •Ollama 作为一个服务使用 •模型的存储 •OpenAI 兼容性 •并发等常见问题 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 20px;font-weight: bold;display: table;margin: 2em auto 1.5em;padding-top: 6px;padding-bottom: 6px;padding-left: 16.75px;background-image: linear-gradient(135deg, rgb(113, 23, 234), rgba(113, 23, 234, 0.667), rgba(234, 96, 96, 0.533), rgba(217, 57, 205, 0.267), rgba(217, 57, 205, 0));background-position: initial;background-size: initial;background-repeat: initial;background-attachment: initial;background-origin: initial;background-clip: initial;color: rgb(255, 255, 255);border-radius: 8px;width: 318.25px;">Ollama 介绍ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;margin: 1em 8px;letter-spacing: 0.1em;color: rgb(33, 37, 41);padding: 8px 12px;background: rgba(237, 242, 255, 0.8);border-radius: 8px;">Ollama是一个专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计的开源工具。它让用户无需深入了解复杂的底层技术,就能轻松地加载、运行和交互各种LLM模型。Ollama 的特点: •本地部署:不依赖云端服务,用户可以在自己的设备上运行模型,保护数据隐私。 •多操作系统支持:无论是 Mac、Linux 还是 Window,都能很方便安装使用。 •多模型支持:Ollama 支持多种流行的LLM模型,如Llama、Falcon等,用户可以根据自己的需求选择不同的模型,一键运行。 •易于使用:提供了直观的命令行界面,操作简单,上手容易。 •可扩展性:支持自定义配置,用户可以根据自己的硬件环境和模型需求进行优化。 •开源:代码完全开放,用户可以自由查看、修改和分发,虽然没有很多人会去修改。
安装MacOS苹果电脑安装很简单,下载 Zip 解压,运行即可: https://ollama.com/download/Ollama-darwin.zip 安装运行Ollama.app之后,系统任务栏上会有一个应用程序图标,点击可以关闭 Ollama 服务。  WindowsWindows 现在还处于预览版,官方也提供了安装包,安装过程不再赘述。 https://ollama.com/download/OllamaSetup.exe LinuxLinux 直接 Shell 脚本执行: curl-fsSLhttps://ollama.com/install.sh|sh Docker除了直接安装,我们还可以通过 Docker 运行,官方提供了镜像ollama/ollama[1], 可以直接运行。 由于 Docker 有一层封装,所以使用 CPU 和 GPU 需要不同的配置。 CPU 模式先说 CPU 模式运行,这个不需要什么配置和驱动,直接就可以运行,这也是 Ollama 的优势。 #CPU模式 dockerrun-d-vollama:/root/.ollama-p11434:11434--nameollamaollama/ollama
NVIDIA GPU前面的命令运行时直接使用 CPU 来进行推理的,适合普通电脑没有 GPU 资源的场景。如果想要在容器(Docker)内使用 GPU 进行推理,配置稍微麻烦一下。 在 Docker 中使用 Nvidia GPU 的过程大家可以参考NVIDIA 容器工具包文件安装文档[2]。 首先是为 Linux 发行版安装 NVIDIA GPU 驱动程序,安装过程也不是很复杂,以 APT(Ubuntu、Debian 等系统适用)为例。 curl-fsSLhttps://nvidia.github.io/libnvidia-container/gpgkey|sudogpg--dearmor-o/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\ &&curl-s-Lhttps://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list|\ sed's#debhttps://#deb[signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg]https://#g'|\ sudotee/etc/apt/sources.list.d/nvidia-container-toolkit.list sed-i-e'/experimental/s/^#//g'/etc/apt/sources.list.d/nvidia-container-toolkit.list sudoapt-getupdate sudoapt-getinstall-ynvidia-container-toolkit
然后配置容器运行时,并重新启动容器服务进程(下面以 Docker 为例,Containerd/Kubernetes 可以参考文末文档): sudonvidia-ctkruntimeconfigure--runtime=docker sudosystemctlrestartdocker
然后增加启动参数--gpus=all使用 GPU 模式启动容器: #GPU模式 dockerrun-d--gpus=all-vollama:/root/.ollama-p11434:11434--nameollamaollama/ollama
AMD GPU如果使用 AMD GPUs 来运行 Ollama, 使用rocm版本的镜像和以下命令运行: dockerrun-d--device/dev/kfd--device/dev/dri-vollama:/root/.ollama-p11434:11434--nameollamaollama/ollama:rocm 运行模型本地运行安装成功之后,运行模型只需要简单的一句命令: ollamarunllama3.1 如果是第一次运行, Ollama 会先从网络上下载模型(5个G左右),比如我下载速度是 2-5M/s,半个多小时之后就可以下载完成了。等待过程大家可以泡个茶休息下。  容器运行在容器里面运行模型和在本机运行一样,使用ollama run <model>命令: dockerexec-itollamaollamarunllama3 支持的模型使用ollama run <模型名>来运行模型,第一次运行会先下载模型哦。 比如下载 「Llama 3.1」, 那么执行下面命令即可: ollamarunllama:3.1 下面列出常用的模型,以及其参数数量、文件大小、在 Ollama 中的模型名,比如 Meta 公司的 Llama 模型, 谷歌公司的 Gemma 模型,以及国内智谱的 GLM 模型、阿里云的千问模型。。 | 模型 | 参数 | 大小 | 模型名 | | Llama3.1 | 8B | 4.7G | llama3.1 | | Llama3.1 | 405B | 231G | llama3.1:405b | | GLM4 | 9B | 5.5G | glm4 | | Qwen2 | 7B | 4.4G | qwen2 | | Qwen2 | 72B | 41G | qwen2:72b | | Llama3 | 8B | 4.7G | llama3 | | Llama3 | 70B | 40G | llama3:70b | | Phi3 | 3.8B | 2.3G | phi3 | | Phi3 | 14B | 7.9G | phi3:medium | | Gemma2 | 9B | 5.5G | gemma2 | | Gemma2 | 27B | 16G | gemma2:27b | | Mistral | 7B | 4.1G | mistral | | Starling | 7B | 4.1G | starling-lm | | CodeLlama | 7B | 3.8G | codellama | | LLaVA | 7B | 4.5G | llava | | Solar | 10.7B | 6.1G | solar |
完整的模型大家可以去Ollama Library[3]去搜索和查看。  点击模型可以看到模型的介绍、参数列表、下载命令,等详细信息。  部分模型的 Readme 里面还可以看到模型的评估报告:  自定义模型除了内置支持的模型,你也可以使用 Ollama 来运行自定义模型。支持下面三种方式导入模型: •GGUF •PyTorch •Safetensors
从 GGUF 导入GGUF 是一种文件格式,用于存储使用 GGML 进行推理的模型以及基于 GGML 的执行器。 GGUF 是一种二进制格式,旨在快速加载和保存模型,并且易于读取。一般情况下,模型是使用 PyTorch 或其他框架开发的,然后转换为 GGUF 以在 GGML 中使用。  GGUF 的更多介绍和特点我们不过多介绍,您可以访问GGUF Github 站点[4]来获取相关信息。 使用 Ollama 导入 GGUF 模型非常简单,只需要如下三步: 1. 创建一个名为 的文件Modelfile,其中包含FROM要导入的模型的本地文件路径的指令。
FROM./vicuna-33b.Q4_0.gguf 1.在 Ollama 中创建模型,这一步我们可以指定模型的名称,比如vicuna-33b-q4
ollamacreatevicuna-33b-q4-fModelfile 1. 经过上面两个步骤,我们就可以像运行内置模型一样运行刚刚导入的自定义模型了。
ollamarunvicuna-33b-q4 从 PyTorch 或 Safetensors 导入如果导入的模型是以下架构之一,则可以通过 Modelfile 直接导入 Ollama: •LlamaForCausalLM •MistralForCausalLM •GemmaForCausalLM
FROM/path/to/safetensors/directory 如果不能支持的话,需要先使用llama.cpp 转换成 GGUF 格式[5]: 常见的格式比如 HuggingFace、GGML、Lora 都支持,并提供了转换文件。 使用也很简单,比如转换 HuggingFace 模型。 首先克隆llama.cpp仓库, gitclonehttps://github.com/ggerganov/llama.cpp.git 安装必要的 Python 依赖: pipinstall-rllama.cpp/requirements.txt 使用也很简单,传入 HuggingFace 的模型和输出位置等参数即可: pythonllama.cpp/convert_hf_to_gguf.pyvicuna-hf\ --outfilevicuna-13b-v1.5.gguf\ --outtypeq8_0
定制系统提示Ollama 支持运行系统模型时候,为每个模型定制系统提示(System Prompt)。 以智谱的 GLM 为例,来看看如何定制系统提示语。 首先确保我们下载了该模型: ollamapullglm4 创建一个模型文件Modelfile: FROMglm4
#setthetemperatureto1[higherismorecreative,lowerismorecoherent] PARAMETERtemperature1
#setthesystemmessage SYSTEM""" 你现在是一个修仙世界的修炼导师,来指导人们修炼。每次回答都以:「渺小的人类」作为开始。 """
然后运行模型: ollamacreateglm4xiuxian-f./Modelfile ollamarunglm4xiuxian
然后问问他「今天我要做什么」,看看大模型怎么回答:  Ollama 相关命令前面已经用到了很多 Ollama 命令,我们下载系统的看一下 Ollama 的 CLI 命令。 创建模型ollama create用于从 Modelfile 创建模型。
ollamacreatemymodel-f./Modelfile 拉取和更新模型ollama pull用于拉取模型,如果模型已经存在,那么则更新本地模型。
ollamapullllama3 删除模型如果模型不再使用,可以使用ollama rm从本机删除掉,以节省磁盘存储空间。下次使用的时候,仍然可以重新拉取。 ollamarmllama3 复制模型ollama cp命令可以复制一个模型,复制模型会占用双倍的磁盘空间。
ollamacpllama3my-model 多行输入在 Ollama 的命令行里面,回车表示发送指令,如果需要多行输入,可以使用单引号 (""") 来完成。 >>>"""Hello, ...world! ..."""
多模态模型使用多模态模型,只需要输入文件图片地址,即可表示上传了这个图片文件。 >>>What'sinthisimage?/Users/jmorgan/Desktop/smile.png Theimagefeaturesayellowsmileyface,whichislikelythecentralfocusofthepicture.
run 参数提问我们可以把提示词直接通过参数传递给大模型,该命令不会进入交互式输入模式。比如: ollamarunglm4xiuxian今天我要做什么  显示模型信息ollamashowglm4 注意,只有下载过之后的模型才能通过show命令来显示模型相关信息。 启动当您想启动 Ollama 时可以使用ollama serve。这样就不需要使用 Ollama 的客户端程序了。比如我们在 Linux 服务器上就可以这样使用。 ollamaserve 启动之后,我们需要新开一个 Shell 窗口来运行模型: ./ollamarunglm4 由于 命令行和 APP 都使用11435默认端口,我们再 GUI 工作的时候执行ollama server会提示端口已占用。我们可以通过环境变量指定一个新的端口,来同时运行两个 ollama 实例: OLLAMA_HOST=127.0.0.1:11435ollamaserve Serve 命令提供了很多环境变量,可以让你更自由的运行 Ollama 程序: •OLLAMA_DEBUG显示其他调试信息(例如 OLLAMA_DEBUG=1) •OLLAMA_HOSTollama 服务器的 IP 地址(默认 127.0.0.1:11434) •OLLAMA_KEEP_ALIVE模型在内存中保持加载状态的持续时间(默认“5 分钟”) •OLLAMA_MAX_LOADED_MODELS每个 GPU 加载的最大模型数量 •OLLAMA_MAX_QUEUE排队请求的最大数量 •OLLAMA_MODELS模型目录的路径 •OLLAMA_NUM_PARALLEL并行请求的最大数量 •OLLAMA_NOPRUNE启动时不修剪模型 blob •OLLAMA_ORIGINS允许来源的逗号分隔列表 •OLLAMA_TMPDIR临时文件的位置 •OLLAMA_FLASH_ATTENTION启用闪存注意 •OLLAMA_LLM_LIBRARY设置 LLM 库以绕过自动检测
REST APIOllama 启动之后,会自动运行一个执行和管理模型的 API。 回答 APIcurlhttp://localhost:11434/api/generate-d'{ "model":"llama3", "prompt":"Whyistheskyblue?" }'
聊天 APIcurlhttp://localhost:11434/api/chat-d'{ "model":"llama3", "messages":[ {"role":"user","content":"whyistheskyblue?"} ] }'
除了上述最基本的用法,我们还可以指定响应格式、使用流式响应等。 比如使用流式 API: curlhttp://localhost:11434/api/generate-d'{ "model":"glm4", "prompt":"天空是什么颜色?" }'
或者非流式 API,直接返回结果: curlhttp://localhost:11434/api/generate-d'{ "model":"glm4", "prompt":"天空是什么颜色?", "stream":false }'
更多用法可以参考Ollama API 文档[6]。 Python APIOllama 提供了 Python API,可以让 Python 程序快速与 Ollama 集成起来。 首先安装依赖库: pipinstallollama 聊天: importollama response=ollama.chat(model='llama3',messages=[ { 'role':'user', 'content':'Whyistheskyblue?', }, ]) print(response['message']['content'])
使用流式API: importollama
stream=ollama.chat( model='llama3', messages=[{'role':'user','content':'Whyistheskyblue?'}], stream=True, )
forchunkinstream: print(chunk['message']['content'],end='',flush=True)
另外,CLI 提供的指令在 Python 里面都有 API 对应。 聊天ollama.create(model='example',modelfile=modelfile) 生成文本ollama.generate(model='llama3',prompt='Whyistheskyblue?') 列出模型ollama.list() 显示模型信息ollama.show('llama3')创建模型modelfile=''' FROMllama3 SYSTEMYouaremariofromsupermariobros. '''
ollama.create(model='example',modelfile=modelfile)
拉取模型ollama.pull('llama3')拷贝模型ollama.copy('llama3','user/llama3')删除模型ollama.delete('llama3')自定义客户端创建客户端的时候可以指定host和timeout两个参数: fromollamaimportClient client=Client(host='http://localhost:11434') response=client.chat(model='llama3',messages=[ { 'role':'user', 'content':'Whyistheskyblue?', }, ])
错误处理一般使用ResponseError来捕获异常,处理错误: try: ollama.chat(model) exceptollama.ResponseErrorase: print('Error:',e.error) ife.status_code==404: ollama.pull(model)
日志Ollama 的日志文件存储在~/.ollama/logs/server.log,我们可以通过查看 这个日志文件来获取 Ollama 的运行信息,以及排查错误。 在 Mac 上直接打开文件即可查看日志:  也可以通过命令行来查看: cat~/.ollama/logs/server.log  如果是容器运行的话,更简单,直接查看容器的输出即可: dockerlogs<container-name> 调试LLM 窗口大小默认情况下,Ollama 使用 2048 个标记的上下文窗口大小。 要在使用ollama run的时候更改此设置,请使用/set parameter: /setparameternum_ctx4096 使用API时,指定num_ctx参数: curlhttp://localhost:11434/api/generate-d'{ "model":"llama3", "prompt":"Whyistheskyblue?", "options":{ "num_ctx":4096 } }'
GPU 使用通过 PS 命令查看 模型是否加载到了 GPU 上。 PS 命令会返回当前内存中已经加载的模型:  Processor列显示模型被加载到哪个内存中:
Ollama 作为服务使用一直到前面为止, Ollama 运行起来都只能在本机使用,可以通过设置环境变量来让其他客户端访问。 Serve 命令如果是使用 Serve 命令启动,那就比较简单,和我们前面改端口一样: OLLAMA_HOST=0.0.0.0:11435ollamaserve MacOS 应用程序如果 Ollama 作为 macOS 应用程序运行,则应使用以下命令设置环境变量launchctl: 使用launchctl setenv设置环境变量,然后重新运行程序。 launchctlsetenvOLLAMA_HOST"0.0.0.0" 使用代理Ollama 支持使用HTTP_PROXY和HTTPS_PROXY来配置代理。 如果是 Docker 运行,那么使用-e HTTPS_PROXY=https://proxy.example.com来设置环境变量即可。 模型存储Ollama 会下载模型到本地,不同操作系统的模型位置分别是: 如果你想将模型存储到不同位置,可以使用OLLAMA_MODELS环境变量来指定不同的目录。 并发以下服务器设置可用于调整 Ollama 在大多数平台上处理并发请求的方式: •OLLAMA_MAX_LOADED_MODELS可同时加载的最大模型数量(前提是它们适合可用内存)。默认值为 3 * GPU 数量或 3(用于 CPU 推理)。 •OLLAMA_NUM_PARALLEL每个模型同时处理的最大并行请求数。默认将根据可用内存自动选择 4 或 1。 •OLLAMA_MAX_QUEUEOllama 在繁忙时排队的最大请求数,在拒绝其他请求之前。默认值为 512
Ollama 处理并发请求的逻辑是: •如果有足够内存,则可以同时加载多个模型 •对于某个模型,如果有足够内存,则可以并发处理请求 •如果内存不足以加载新模型:所有请求都排队,直至新模型加载 •之前的模型空闲时,会写在一个或多个模型腾出空间给新模型 •排队的请求按顺序处理
OpenAI 兼容性Ollama 与OpenAI API的部分内容提供了实验性的兼容性, 以帮助将现有应用程序连接到 Ollama。 使用 OpenAI Python 库用法和 OpenAI 的客户端用法一样。 fromopenaiimportOpenAI
client=OpenAI( base_url='http://localhost:11434/v1/',
#requiredbutignored api_key='ollama', )
chat_completion=client.chat.completions.create( messages=[ { 'role':'user', 'content':'Saythisisatest', } ], model='llama3', )
OpenAI JavaScriptimportOpenAIfrom'openai'
constopenai=newOpenAI({ baseURL:'http://localhost:11434/v1/',
//requiredbutignored apiKey:'ollama', })
constchatCompletion=awaitopenai.chat.completions.create({ messages:[{role:'user',content:'Saythisisatest'}], model:'llama3', })
CURL 工具curlhttp://localhost:11434/v1/chat/completions\ -H"Content-Type:application/json"\ -d'{ "model":"llama3", "messages":[ { "role":"system", "content":"Youareahelpfulassistant." }, { "role":"user", "content":"Hello!" } ] }'
模型名称有些程序依赖 OpenAI 默认的模型名称(例如gpt-3.5-turbo), 无法修改或者指定模型,可以使用如下方法来解决。 复制一个你喜欢的模型为gpt-3.5-turbo, ollamacpllama3gpt-3.5-turbo 这样我们就可以李代桃僵来保证原有程序不变,依然传递gpt-3.5-turbo作为模型名称: curlhttp://localhost:11434/v1/chat/completions\ -H"Content-Type:application/json"\ -d'{ "model":"gpt-3.5-turbo", "messages":[ { "role":"user", "content":"Hello!" } ] }'
社区和集成社区有大量工具和类库都对 Ollama 做了集成,或者说基于 Ollama 进行构建, 我们可以在官网文档[7]上查看具体的项目列表:  |