技术分享 || 在Windows上使用Ollama实现Gemma本地部署

查看 26|回复 1
作者:James_You   

   
ps:本文在微信公众号“福州GDG”上首发,因该教程为本人编辑,将同步转载至个人微信公众号“James You的部落阁”、酷安社区、哔哩哔哩等,欢迎各位关注支持!
------- 一条朴实无华的分割线 -------
第一章 安装Ollama
Ollama是一个专为运行、创建和分享大型语言模型而设计的开源项目,为开发者和研究者提供了一个平台,使得他们可以更方便地部署、管理和使用这些大型语言模型。目前Ollama支持在macOS、Windows、Linux和Docker等进行安装,还能通过API方式为本地AI服务提供便捷途径。
目前Ollama支持的模型[1]如下图所示。根据研究者与开发人员的项目推进,Ollama也将支持更多的模型,读者也可通过文末的引用链接获取相关信息。
首先,到Ollama官网[2]或者GitHub页面[3]下载最新的Windows版本安装包:
下载安装包后,打开安装,一路点击“下一步”安装即可。
由于安装过程中没有相关设置,因此,Ollama的安装目录与模型将会保存在C盘。对于部分硬盘空间吃紧的读者,编者也将在第二章部分提供一些解决方案供读者参考。
完成安装后,Ollama将自动运行并开机自启,此时桌面右下角Windows系统托盘里有正在运行的羊驼图标。
当然,由于没有自动创建桌面图标,读者也可以参考图5进行设置,在桌面上创建Ollama快捷方式。
接下来,进入命令提示符或Powershell,输入:
ollama --version
或者输入:
ollama -v
当看到Ollama版本号正确显示时,即完成Ollama安装。
------- 一条朴实无华的分割线 -------
第二章 Ollama使用技巧
本节内容将为后续的模型部署服务,主要是针对当无法在线下载模型时,可以通过编者镜像的模型(请注意!对应模型可能不是最新的!)进行使用。
在Windows下,Ollama会默认安装到该目录,并自动加入到用户环境变量:
C:\Users\用户名\AppData\Local\Programs\Ollama\
根据官方FAQ文档[4],Windows下的模型将会存储在以下目录:
C:\Users\用户名\.ollama\models
通常来说,模型将默认存储在C盘,这对于一些磁盘空间吃紧读者来说会比较头疼。参考WilliamBear的方案[5],可以通过添加系统环境变量的方法修改模型默认下载路径,读者可以参考以下图片进行操作:
读者应当注意:修改了模型地址,就意味着后续的操作中,若无法顺利下载模型,就需要下载编者制作的模型镜像,并将其解压到相应的模型地址中。所以,在此要求读者应注意模型的保存位置,切勿混淆!
------- 一条朴实无华的分割线 -------
第三章 下载并运行Gemma模型
这一步我们直接使用最简单的方法,使用Ollama来拉取Gemma的模型文件。请注意,由于文件服务器在国外,若使用校园网,可以尝试裸连,如果连接不上,就需要一些魔术上网的技巧,并需要配置相关的内容[4]。
需要注意的是,由于魔术上网的本质是使浏览器等非底层走网络代理。但命令行处于底层,编者测试,单纯的挂魔术上网,使用命令指示符ping google.com就无法正常连接——这个是读者配置相关内容时需要注意的地方。
此外,为解决魔术上网等依旧无法部署的问题,可以通过下载编者镜像的模型压缩包,并解压至模型文件夹的方式尝试解决。当然,针对这种方法,编者也将在第五章详细讲解。
根据不同的Gemma版本,读者可能要注意硬件配置:2B模型在没有独显、RAM为8G的电脑上可以非常流畅的运行;而7B模型则需要RAM在8G及以上,7B全量包需要RAM为16G及以上才可以较流畅的运行。当然,为了获得更好的运行体验,建议配置显卡,有条件可以使用Nvidia显卡以提高性能。截至发稿前,Ollama官方也已经在Windows、Linux平台适配AMD显卡加速[6]。
此处仅进行一个入门教程,故使用对电脑配置要求最低的Gemma 2B基础版模型。在命令提示符中,输入以下代码并回车:
ollama run gemma:2b
Ollama会先检测是否存在本地模型,若没有本地模型,则会自动从在线模型库中拉取模型文件并运行。当在线模型正常加载后,会显示success的标识,此时我们就可以输入文字与Gemma 2B进行对话。
如果想要结束对话,则可以在Gemma的信息输入框中输入/bye回车即可。
到底为止,Gemma在我们本地已经部署成功了。除此以外,还有一些小tip需要注意:
1. 首先Ollama虽然在GitHub页面中只列出了Gemma 2B和7B基础版模型的拉取代码,但实际上我们还是能通过它来拉取全量版模型的,代码分别如下:
ollama run gemma:2b-instruct-fp16
ollama run gemma:7b-instruct-fp16
2. 想要知道目前Ollama中已经拉取了哪些模型,可以用ollama list来实现:
除此以外,读者还可以通过ollama -h(或者ollama --help)来调阅Ollama的其他命令:
------- 一条朴实无华的分割线 -------
第四章 使用Jan AI美化UI界面
通过Ollama在本地部署Gemma后,虽然我们能在命令提示符中与模型对话,但对于普通用户而言,命令行的界面过于简略,并且在人工交互上也存在很大的优化空间。因此,还是需要有一个类似nextChat的软件来美化一下UI界面,同时还可以实现更多功能。
本来Open WebUI官方为Ollama推出了open-webui这个开源项目[7],目前该项目也支持在Windows上进行配置与安装,官方建议在wsl中使用docker安装。但考虑到实际,不少读者并不想花费太多心思去折腾Windows上的Linux,因此docker方式将会在后续Linux设备上配置进行讲解;此外,官方也提供了依赖Node.js和Python的配置方法[8],这个方案就无需使用docker,具体可参考官方项目教程。
因此,综合以上考量,这里选择比较成熟、可以快速上手的Jan AI与Ollama进行链接。
首先,到Jan AI的官方网站[9]下载Windows客户端,并直接安装。
初次打开Jan AI,程序需要进行准备。准备完成后,会显示以下窗口:
在Jan AI的官网上,有非常详细的操作手册[10],我们可以在其中找到关于如何链接Ollama的方法。
4.1 启动 Ollama 服务器
首先,打开命令提示符,加载运行Gemma,这里以普通7B版本为例:
根据Ollama官方发布的有关OpenAI兼容性文档[11],Ollama在运行时会提供类似OpenAI的API服务,可以使用以下网址连接到Ollama服务器:
http://localhost:11434/v1/chat/completions
接下来需要到JAN的安装地址,一般是“C:\Users\用户名\jan\engines”中找到openai.json文件,将其中的full_url修改为Ollama服务器的完整网址。当然,因为是使用本地服务器,不涉及api_key的问题,因此api_key的内容可以删除。
openai.json的内容如下所示:
{
  "full_url": "http://localhost:11434/v1/chat/completions"
}
4.2 模型配置
进入Jan安装位置的models 文件夹(C:\Users\用户名\jan\models),创建一个在Ollama中运行的模型同名的文件夹,例如gemma-7b。
需要注意的是,在命令指示符中,我们使用Ollama指定Gemma版本时是使用冒号,如gemma:7b;但由于系统文件夹的命名规则,要求文件名不能出现冒号,遇到这种情况,需要将冒号:改为短横杠-。此外,当前的Jan AI在下载时可能已经提供了带有json配置文件的模型文件夹,在设置时读者应该注意是否存在这些内容。
对于不存在该模型的文件夹,在新建模型文件夹后,需要在文件夹内创建一个model.json文件,在其中将id属性设置为Ollama模型名称,将格式属性(format)设为api,将引擎属性(engine)设为openai,将状态属性设为ready。
示例如下:
{
"sources": [
   {
     "filename": "gemma:7b",
     "url": "https://ollama.com/library/gemma:7b"
   }
],
"id": "gemma:7b",
"object": "model",
"name": "Ollama - gemma:7b",
"version": "1.0",
"description": "gemma:7b by ollama",
"format": "api",
"settings": {},
"parameters": {},
"metadata": {
   "author": "Meta",
   "tags": ["General", "Big Context Length"]
},
"engine": "openai"
}
4.3 启动模型
重新启动Jan AI,在模型Hub中找到我们刚才新建的gemma:7b,然后点击“Use”即可。
接下来我们就可以和Gemma进行正常对话了,比如问一问它,让它介绍一下自己:
------- 一条朴实无华的分割线 -------
第五章 Ollama模型离线镜像可行性研究
在前述内容中,编者为帮助读者解决无法下载安装模型的问题,提出了使用解压离线镜像的方法解决——但是,为什么能够使用离线镜像?Ollama对于本地模型的使用规则是怎么样的?这是本章节计划详细讨论的内容。
5.1 将离线镜像导入到Ollama模型文件夹
在第三章内容中,编者通过打包已下载的模型镜像方法帮助读者使用Gemma模型。此处编者将详细介绍如何操作,并成功在命令行中调用到相应的模型。
从编者提供的镜像地址下载Gemma镜像模型[12],此处以Gemma 7B模型为例。
打开离线镜像,为操作方便,在打包阶段,编者将Gemma 7B模型包含的内容单独抽取出来,并将这个模型文件夹打包。
读者只需将这个models文件夹解压出来,并覆盖Ollama的models文件夹即可。在解压、覆盖过程中,若提示存在同名文件,跳过/覆盖均可。
但在跳过/覆盖之前,需要读者需要注意文件的大小——因为文件是以SHA256校验值为文件名,因此,文件名一致,理论上大小也应该一致。
解压后,在命令指示符中输入ollama list显示已有模型,看到可以显示Gemma 7B模型。
5.2 可行性研究:Ollama如何使用本地模型
编者在打包相关模型镜像包时,当时已经错过下载时的相关文件校验提示。当然,这些内容在Ollama的官方模型资源库也有相关说明。
但是代入到编者打包时的情况:假设不知道官方也有相关的一些提示,并且也已经关闭了下载模型的界面。那么,Ollama是如何判断本地已有这个模型及其相关组件的呢?
以Gemma 7B全量模型(gemma:7b-instruct-fp16)为例,编者进行以下操作:
在打包的模型镜像内容中,我们将所有的有价值信息进行提取到一个文件夹中,即可得到下图所示的几个文件:
当然,根据文件的大小,可以猜测:最大的那个文件是Gemma 7B全量模型。
但是,其它几个小文件呢?而且它们的大小,是否有相应的意义?以及它们的文件名是否就是对应着它们的SHA256校验值?
在命令指示符中使用下述命令对最大的文件进行SHA256校验[13]:
certutil -hashfile 文件 校验方法
校验结束,根据命令指示符反馈的结果可以发现,SHA256的校验结果和文件名所带的SHA256校验值是一致的。
那么,这里就有新的疑问了——Ollama是如何确定这个大文件是属于Gemma 7B全量模型的?为什么不是属于Gemma 2B模型?
当然,这个问题的答案就存在于图25所示的那几个小文件当中。此外,为方便本教程的阅读,编者此处将使用浏览器打开,并配合JSONVue插件[14, 15]自动调整格式。
打开7b-instruct-fp16这个文件,就可以发现:在这个文件中,包含了剩下的所有文件信息,并且也标明了配置文件、以及相应文件的属性。
至此,搭配7b-instruct-fp16文件或通过官方模型资源库的相关说明,也就可以将这些文件进行作用上的区分:
综上,我们就可以总结得出:Ollama能够实现本地运行相应的模型镜像,其依赖于
~models\manifests\registry.ollama.ai\library\gemma文件夹下相对应的模型信息文件。根据这个信息文件,Ollama会核对相应文件的SHA256值并与文件名进行比对——确保文件在运行前是正确的。
5.3 深入探究:通过修改配置文件控制启动的模型
在前述部分中,我们得出:Ollama是根据文件夹中相应的模型信息文件,进而核对文件的SHA256值并与文件名进行比对,进而确定模型。
那么——是否会有种可能:通过修改相应的模型文件,后续我们在命令指示符中调用修改后的Gemma 7B全量版,而实际上却是调用Gemma 2B?
在进行测试之前,编者建议:请读者将已有的模型文件夹进行备份——接下去的操作会修改到文件内容,并且写入保存之后恢复到原始版本较为复杂……总而言之,请做好备份!
以下与写入文件相关的内容,编者将直接使用Windows自带的记事本(notepad)进行编辑。
在暂时不考虑配置文件、许可文件、模板文件、参数文件对模型镜像的前提下,将模型文件名进行修改(不包括文件大小size),如下图所示:
修改并保存后,在命令指示符中输入ollama list查看模型信息,并使用ollama run gemma:7b-instruct-fp16运行修改后的“Gemma 7B全量版”。
可以发现,Ollama是可以正常运行这个修改之后的“Gemma 7B全量版”。并且通过任务管理器的内存占用,也可以看出确实是Gemma 2B模型的内存占用(参考图10)。
通过这一步骤,我们可以得出:Ollama的运行只依赖于~models\manifests\
registry.ollama.ai\library\gemma文件夹下相对应的模型信息文件,运行模型时也不会检验信息文件中所对应的模型文件大小。
除此以外,前面我们也提及了:这些文件是使用SHA256校验值作为文件名进行保存的。那么,如果我们修改文件名,并修改相应的信息文件中保存的文件名,使之无法与真实的SHA256校验值匹配——是否还能成功运行模型?
由于SHA256校验值使用的是十六进制,因此,编者这里将文件名的SHA256校验部分设置为:“abcdef20240413abcdef”。
保存文件,并打开命令指示符,分别使用ollama list和ollama run gemma:7b-instruct-fp16查看模型和运行模型。
可以发现,这边的ollama list,与前述内容的图30的ID出现了不同。编者使用计算器进行计算,这个ID也无法与原本的文件大小进行匹配,这里应该存在其它的算法。时间原因,编者暂时无法在这里进一步深入探究——这些内容可以额外再开一个内容详细聊聊。
到目前为止,从以上的实践探究,不难得出以下结论:
1. Ollama在下载模型时会进行SHA256校验,避免文件出现错误;
2. 在调用本地模型时,Ollama会通过读取~models\manifests\registry.ollama.ai\
library\gemma下的模型信息文件对模型进行调用;
3. 但在调用本地模型这个过程中,Ollama严重依赖模型信息文件的内容——可以说,只要修改了这个模型信息文件,相应的模型就无法启动,或者“借尸还魂”;
4. 本地模型的size信息不会进行检验,但是修改文件、修改文件名均会导致ID信息出现变化。
当然,上述的几点结论是通过本章节的操作得出的,编者水平有限,也需要一些时间进行更加深入的研究。如有不足之处,恳请读者指出,感激不尽!
------- 一条朴实无华的分割线 -------
参考资料
[1] Ollama, Ollama支持的模型库[EB/OL], (2024-04-11), https://ollama.com/library.
[2] Ollama, Download Ollama[EB/OL], (2024-04-11), https://ollama.com/download.
[3] Ollama, ollama: Get up and running with Llama 2, Mistral, Gemma, and other large language models.[EB/OL], (2024-04-11), https://github.com/ollama/ollama.
[4] Ollama, Ollama FAQ[EB/OL], (2024-04-11), 查看链接
[5] WilliamBear, 小白Windows下通过Ollama部署使用本地模型[EB/OL], (2024-04-11), https://www.cnblogs.com/WilliamB/p/18069441.
[6] Ollama, Ollama now supports AMD graphics cards[EB/OL], (2024-04-13), https://ollama.com/blog/amd-preview.
[7] open-webui, User-frendly WebUI for LLMs (Formerly Ollama WebUI)[EB/OL], (2024-04-13), https://github.com/open-webui/open-webui.
[8] open-webui, Getting Started | Open WebUI[EB/OL], (2024-04-13), 查看链接
[9] Jan, Turn your computer into an AI computer[EB/OL], (2024-04-13), https://jan.ai/.
[10] Jan, Jan - Overview[EB/OL], (2024-04-13), https://jan.ai/docs.
[11] Ollama, OpenAI compatibility[EB/OL], (2024-04-13), https://ollama.com/blog/openai-compatibility.
[12] JamesYou, Ollama-Gemma模型镜像下载地址[EB/OL], (2024-04-13), https://fzuzcc-my.sharepoint.com/:f:/g/personal/jamesyoublog_fzuzcc_onmicrosoft_com/Et1elP3poVdFlPYLnbSvthIB76HwCwPG3NWP3Gu1MUraAQ?e=aBh9hB.
[13] ChingDawn, 使用Windows 10自带工具校验MD5 SHA1 SHA256类型文件[EB/OL], (2024-04-13), https://blog.csdn.net/ThinkAboutLife/article/details/110384620.
[14] gildas-lormeau, JSONVue: Fork of JSONView for Chromium-based browsers[EB/OL], (2024-04-13), https://github.com/gildas-lormeau/JSONVue.
[15] 奔跑吧邓邓子, 谷歌浏览器JSON格式化插件JSONVue安装使用[EB/OL], (2024-04-13), https://blog.csdn.net/u012069313/article/details/123065389.









模型, 文件, 编者

James_You
OP
  
[斗鸡眼滑稽]特地做一些补充声明(240415)
1. 为啥是说GDG首发,然后因为本人是“编辑”就抄过来?
A:[受虐滑稽]因为是大佬约稿指导咱写的,这波啊,这波是要狠狠蹭每个地方的流量啊!([受虐滑稽]顺带给大佬他们做一下牛马,到处宣传涨个粉)
2. 在哔哩哔哩怎么没看到?
A:别问,别问!问就是懒得改格式[喝酒]或者就直接丢个操作教程视频抵债了[受虐滑稽]
3. 佬你这是在写论文啊[流汗滑稽]
A:大四狗[受虐滑稽]勿cue[喝酒]
4. 暂时想不到要补充啥了,下次再说 or 置顶然后贴评论去[流汗滑稽]
您需要登录后才可以回帖 登录 | 立即注册

返回顶部