找回密码
 会员注册
查看: 46|回复: 0

Ollama完整教程:本地LLM管理、WebUI对话、PythonJava客户端API应用

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64756
发表于 2024-9-4 00:36:15 | 显示全部楼层 |阅读模式
老牛同学在前面有关大模型应用的文章中,多次使用了Ollama来管理和部署本地大模型(包括:Qwen2、Llama3、Phi3、Gemma2等),但对Ollama这个非常方便管理本地大模型的软件的介绍却很少。目前,清华和智谱AI联合发布开源的GLM4-9B大模型也能支持Ollama进行本地部署了(本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验),Ollama支持的大模型越多越普及,对于的应用也就越多。为了降低大家查阅资料等学习时间,老牛同学今天尝试着对Ollama进行一次详细完整介绍。毕竟老牛同学也在不断学习中,若有疏漏或者错误之处,还请各位朋友多多指正,谢谢大家。本文将分为以下章节对Ollama进行介绍:Ollama基本介绍,它的作用是什么Ollama软件安装、一些常用的系统参数设置Ollama管理本地已有大模型(包括终端对话界面)Ollama导入模型到本地的三种方式:直接从Ollama远程仓库拉取、通过GGUF模型权重文件导入到本地、通过safetensors模型权限文件导入到本地基于WebUI部署Ollama可视化对话界面Ollama客户端API应用,包括PythonAPI和JavaAPI接口应用Ollama是什么,它与Llama有什么关系?Ollama官网:https://ollama.com/,官方网站的介绍就一句话:Getupandrunningwithlargelanguagemodels.(开始使用大语言模型。)Ollama是一个开源的LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型、降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和部署最新大语言模型,包括如Qwen2、Llama3、Phi3、Gemma2等开源的大型语言模型。Ollama支持的大语言模型列表,可通过搜索模型名称查看:https://ollama.com/libraryOllama官方GitHub源代码仓库:https://github.com/ollama/ollama/Llama是Meta公司开源的备受欢迎的一个通用大语言模型,和其他大模型一样,Llama可以通过Ollama进行管理部署和推理等。因此,Ollama与Llama的关系:Llama是大语言模型,而Ollama是大语言模型(不限于Llama模型)便捷的管理和运维工具,它们只是名字后面部分恰巧相同而已!Ollama安装和常用系统参数设置在官网首页,我们可以直接下载Ollama安装程序(支持Windows/MacOS/Linux):https://ollama.com/Ollama的安装过程,与安装其他普通软件并没有什么两样,安装完成之后,有几个常用的系统环境变量参数建议进行设置:OLLAMA_MODELS:模型文件存放目录,默认目录为当前用户目录(Windows目录:C:\Users%username%.ollama\models,MacOS目录:~/.ollama/models,Linux目录:/usr/share/ollama/.ollama/models),如果是Windows系统建议修改(如:D:\OllamaModels),避免C盘空间吃紧OLLAMA_HOST:Ollama服务监听的网络地址,默认为127.0.0.1,如果允许其他电脑访问Ollama(如:局域网中的其他电脑),建议设置成0.0.0.0,从而允许其他网络访问OLLAMA_PORT:Ollama服务监听的默认端口,默认为11434,如果端口有冲突,可以修改设置成其他端口(如:8080等)OLLAMA_ORIGINS:HTTP客户端请求来源,半角逗号分隔列表,若本地使用无严格要求,可以设置成星号,代表不受限制OLLAMA_KEEP_ALIVE:大模型加载到内存中后的存活时间,默认为5m即5分钟(如:纯数字如300代表300秒,0代表处理请求响应后立即卸载模型,任何负数则表示一直存活);我们可设置成24h,即模型在内存中保持24小时,提高访问速度OLLAMA_NUM_PARALLEL:请求处理并发数量,默认为1,即单并发串行处理请求,可根据实际情况进行调整OLLAMA_MAX_QUEUE:请求队列长度,默认值为512,可以根据情况设置,超过队列长度请求被抛弃OLLAMA_DEBUG:输出Debug日志标识,应用研发阶段可以设置成1,即输出详细日志信息,便于排查问题OLLAMA_MAX_LOADED_MODELS:最多同时加载到内存中模型的数量,默认为1,即只能有1个模型在内存中Ollama管理本地已有大模型【展示本地大模型列表:ollamalist】>ollamalistNAMEIDSIZEMODIFIEDgemma2:9bc19987e1e6e25.4GB7daysagoqwen2:7be0d4e1163c584.4GB10daysago1234可以看到,老牛同学本地有2个大模型,它们的名称(NAME)分别为gemma2:9b和qwen2:7b。【删除单个本地大模型:ollamarm本地模型名称】>ollamarmgemma2:9bdeleted'gemma2:9b'>ollamalistNAMEIDSIZEMODIFIEDqwen2:7be0d4e1163c584.4GB10daysago123456老牛同学通过rm命令删除了gemma2:9b大模型之后,再次通过list命令查看,本地只有qwen2:7b一个大模型了。【启动本地模型:ollamarun本地模型名】>ollamarunqwen2:0.5b>>>12启动成功之后,就可以通过终端对话界面进行对话了(本命令下面也会讲到,其他详细暂且忽略)【查看本地运行中模型列表:ollamaps】>ollamapsNAMEIDSIZEPROCESSORUNTILqwen2:0.5b6f48b936a09f693MB100%CPU4minutesfromnow123通过ps命名可以看到,老牛同学本地qwen2:0.5b大模型正在运行中。【复制本地大模型:ollamacp本地存在的模型名新复制模型名】>ollamacpqwen2:0.5bQwen2-0.5Bcopied'qwen2:0.5b'to'Qwen2-0.5B'>ollamalistNAMEIDSIZEMODIFIEDQwen2-0.5B:latest6f48b936a09f352MB4secondsagoqwen2:0.5b6f48b936a09f352MB29minutesagoqwen2:7be0d4e1163c584.4GB10daysago12345678上面cp命令,老牛同学把本地qwen2:0.5b复制了一份,新模型名为Qwen2-0.5B下面老牛同学介绍三种通过Ollama下载到本地大模型方式:方式一:直接通过Ollama远程仓库下载,这是最直接的方式,也是最推荐、最常用的方式方式二:如果已经有GGUF模型权重文件了,不想重新下载,也可以通过Ollama把该文件直接导入到本地(不推荐、不常用)方式三:如果已经有safetensors模型权重文件,也不想重新下载,也可以通过Ollama把该文件直接导入到本地(不推荐、不常用)方式一:Ollama从远程仓库下载大模型到本地【下载或者更新本地大模型:ollamapull本地/远程仓库模型名称】本pull命令从Ollama远程仓库完整下载或增量更新模型文件,模型名称格式为:模型名称:参数规格;如ollamapullqwen2:0.5b则代表从Ollama仓库下载qwen2大模型的0.5b参数规格大模型文件到本地磁盘:如果参数规格标记为latest则代表为默认参数规格,下载时可以不用指定,如Qwen2的7b被标记为latest,则ollamapullqwen2和ollamapullqwen2:7b这2个命令的意义是一样的,都下载的为7b参数规格模型。为了保证后续维护方便、避免误操作等,老牛同学建议不管是否为默认参数规格,我们下载命令中均明确参数规格。值得一提的是,今天开始GLM4支持Ollama部署和推理,老牛同学特意列出它的下载命令:ollamapullglm4:9b(和其他模型相比,其实并没有特殊支出)。需要注意的是:Ollama最低版本为0.2.0才能支持GLM4大模型!>ollamapullqwen2:0.5bpullingmanifestpullingmanifestpullingmanifestpullingmanifestpullingmanifestpulling8de95da68dc4...100%▕████████████████████████▏352MBpulling62fbfd9ed093...100%▕████████████████████████▏182Bpullingc156170b718e...100%▕████████████████████████▏11KBpullingf02dd72bb242...100%▕████████████████████████▏59Bpulling2184ab82477b...100%▕████████████████████████▏488Bverifyingsha256digestwritingmanifestremovinganyunusedlayerssuccess>ollamalistNAMEIDSIZEMODIFIEDqwen2:0.5b6f48b936a09f352MB9minutesagoqwen2:7be0d4e1163c584.4GB10daysago1234567891011121314151617181920若本地不存在大模型,则下载完整模型文件到本地磁盘;若本地磁盘存在该大模型,则增量下载大模型更新文件到本地磁盘。从上面最后的list命令结果可以看到,老牛同学本地存在了qwen2:0.5b这个名称的大模型。【下载且运行本地大模型:ollamarun本地/远程仓库模型名称】>ollamarunqwen2:0.5b>>>12若本地不存在大模型,则下载完整模型文件到本地磁盘(类似于pull命令),然后启动大模型;若本地存在大模型,则直接启动(不进行更新)。启动成功后,默认为终端对客界面:若需要输入多行文本,需要用三引号包裹,如:"""这里是多行文本"""/clear清除对话上下文信息/bye则退出对话窗口/setparameternum_ctx4096可设置窗口大小为4096个Token,也可以通过请求设置,如:curl-d'{"model":"qwen2:7b","prompt":"Whyistheskyblue?","options":{"num_ctx":4096}}'/showinfo可以查看当前模型详情:,>>>/showinfoModelarchqwen2parameters494.03MquantizationQ4_0contextlength32768embeddinglength896Parametersstop""stop""LicenseApacheLicenseVersion2.0,January2004123456789101112131415方式二:Ollama导入GGUF模型文件到本地磁盘若我们已经从HF或者ModeScope下载了GGUF文件(文件名为:Meta-Llama-3-8B-Instruct.Q4_K_M.gguf),在我们存放Llama3-8B的GGUF模型文件目录中,创建一个文件名为Modelfile的文件,该文件的内容如下:FROM./Meta-Llama-3-8B-Instruct.Q4_K_M.gguf1然后,打开终端,执行命令导入模型文件:ollamacreate模型名称-f./Modelfile>ollamacreateLlama-3-8B-f./Modelfiletransferringmodeldatausingexistinglayersha256:647a2b64cbcdbe670432d0502ebb2592b36dd364d51a9ef7a1387b7a4365781fcreatingnewlayersha256:459d7c837b2bd7f895a15b0a5213846912693beedaf0257fbba2a508bc1c88d9writingmanifestsuccess123456导入成功之后,我们就可以通过list命名,看到名为Llama-3-8B的本地模型了,后续可以和其他模型一样进行管理了。方式三:Ollama导入safetensors模型文件到到本地磁盘官方操作文档:https://ollama.fan/getting-started/import/#importing-pytorch-safetensors若我们已经从HF或者ModeScope下载了safetensors文件(文件目录为:Mistral-7B),gitlfsinstallgitclonehttps://www.modelscope.cn/rubraAI/Mistral-7B-Instruct-v0.3.gitMistral-7B123然后,我们转换模型(结果:Mistral-7B-v0.3.bin):pythonllm/llama.cpp/convert.py./Mistral-7B--outtypef16--outfileMistral-7B-v0.3.bin1接下来,进行量化量化:llm/llama.cpp/quantizeMistral-7B-v0.3.binMistral-7B-v0.3_Q4.binq4_01最后,通过Ollama导入到本地磁盘,创建Modelfile模型文件:FROMMistral-7B-v0.3_Q4.bin1执行导入命令,导入模型文件:ollamacreate模型名称-f./Modelfile>ollamacreateMistral-7B-v0.3-f./Modelfiletransferringmodeldatausingexistinglayersha256:647a2b64cbcdbe670432d0502ebb2592b36dd364d51a9ef7a1387b7a4365781fcreatingnewlayersha256:459d7c837b2bd7f895a15b0a5213846912693beedaf0257fbba2a508bc1c88d9writingmanifestsuccess123456导入成功之后,我们就可以通过list命名,看到名为Mistral-7B-v0.3的本地模型了,后续可以和其他模型一样进行管理了。基于WebUI部署Ollama可视化对话界面Ollama自带控制台对话界面体验总归是不太好,接下来部署Web可视化聊天界面:下载并安装Node.js工具:https://nodejs.org/zh-cn下载ollama-webui工程代码:gitclonehttps://github.com/ollama-webui/ollama-webui-liteollama-webui切换ollama-webui代码的目录:cdollama-webui设置Node.js工具包镜像源(下载提速):npmconfigsetregistryhttp://mirrors.cloud.tencent.com/npm/安装Node.js依赖的工具包:npminstall最后,启动Web可视化界面:npmrundev如果看到以上输出,代表Web可视化界面已经成功了!浏览器打开Web可视化界面:http://localhost:3000/Ollama客户端:HTTP访问服务Ollama默认提供了generate和chat这2个原始的API接口,使用方式如下:generate接口的使用样例:curlhttp://localhost:11434/api/generate-d"{'model':'qwen:0.5b','prompt':'为什么天空是蓝色的?'}"1234chat接口的使用样例:curlhttp://localhost:11434/api/chat-d'{"model":"qwen:7b","messages":[{"role":"user","content":"为什么天空是蓝色的?"}]}'123456接下来的Python和Java客户端应用,都是对这2个接口的封装。Ollama客户端:PythonAPI应用我们把Ollama集成到Python应用中,只需要以下简单2步即可:第一步,安装Python依赖包:pipinstallollama1第二步,使用Ollama接口,stream=True代表按照流式输出:importollama#流式输出defapi_generate(text:str):print(f'提问:{text}')stream=ollama.generate(stream=True,model='qwen:7b',prompt=text,)print('-----------------------------------------')forchunkinstream:ifnotchunk['done']:print(chunk['response'],end='',flush=True)else:print('\n')print('-----------------------------------------')print(f'总耗时:{chunk['total_duration']}')print('-----------------------------------------')if__name__=='__main__':#流式输出api_generate(text='天空为什么是蓝色的?')#非流式输出content=ollama.generate(model='qwen:0.5b',prompt='天空为什么是蓝色的?')print(content)123456789101112131415161718192021222324252627282930Ollama客户端:JavaAPI应用(SpringBoot应用)我们也可以把Ollama集成到SpringBoot应用中,只需要以下简单3步即可:第一步,在总pom.xml中新增SpringBootStarter依赖:io.springboot.ai1.0.012345第二步,在SpringBoot配置文件application.properties中增加Ollama配置信息:server.port=8088spring.application.name=NTopicBootXspring.ai.ollama.base-url=http://localhost:11434spring.ai.ollama.chat.options.model=qwen:0.5b1234配置文件指定了OllamaAPI地址和端口,同时指定了默认模型qwen:0.5b(注意:模型需要在本地已经存在)第三步,使用OllamaChatClient进行文字生成或者对话:importorg.springframework.ai.chat.ChatResponse;importorg.springframework.ai.chat.prompt.Prompt;importorg.springframework.ai.ollama.OllamaChatClient;importorg.springframework.ai.ollama.api.OllamaOptions;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassOllamaClientController{@Autowired@Qualifier("ollamaChatClient")privateOllamaChatClientollamaChatClient;/***http://localhost:8088/ollama/chat/v1?msg=天空为什么是蓝色的?*/@GetMapping("/ollama/chat/v1")publicStringollamaChat(@RequestParamStringmsg){returnthis.ollamaChatClient.call(msg);}/***http://localhost:8088/ollama/chat/v2?msg=人为什么要不断的追求卓越?*/@GetMapping("/ollama/chat/v2")publicObjectollamaChatV2(@RequestParamStringmsg){Promptprompt=newPrompt(msg);ChatResponsechatResponse=ollamaChatClient.call(prompt);returnchatResponse;}/***http://localhost:8088/ollama/chat/v3?msg=你认为老牛同学的文章如何?*/@GetMapping("/ollama/chat/v3")publicObjectollamaChatV3(@RequestParamStringmsg){Promptprompt=newPrompt(msg,OllamaOptions.create().withModel("qwen:0.5b").withTemperature(0.4F));ChatResponsechatResponse=ollamaChatClient.call(prompt);returnchatResponse.getResult().getOutput().getContent();}}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849以上是Java客户端的简单样例,我们可以通过OllamaChatClient访问Ollama接口,既可以使用默认大模型,也可以在参数指定模型名称!基于Qwen2/Lllama3等大模型,部署团队私有化RAG知识库系统的详细教程(Docker+AnythingLLM)使用Llama3/Qwen2等开源大模型,部署团队私有化CodeCopilot和使用教程本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验玩转AI,笔记本电脑安装属于自己的Llama38B大模型和对话客户端ChatTTS开源文本转语音模型本地部署、API使用和搭建WebUI界面
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-28 21:35 , Processed in 1.388252 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表