开源模型应用落地-工具使用篇-Ollama(六)

一、前言

    在AI大模型百花齐放的时代,很多人都对新兴技术充满了热情,都想尝试一下。但是,实际上要入门AI技术的门槛非常高。除了需要高端设备,还需要面临复杂的部署和安装过程,这让很多人望而却步。不过,随着开源技术的不断进步,使得入门AI变得越来越容易。通过使用Ollama,您可以快速体验大语言模型的乐趣,不再需要担心繁琐的设置和安装过程。


二、术语

2.1、Ollama

    是一个强大的框架,用于在 Docker 容器中部署 LLM(大型语言模型)。它的主要功能是在 Docker 容器内部署和管理 LLM 的促进者,使该过程变得简单。它可以帮助用户快速在本地运行大模型,通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型。

    Ollama 支持 GPU/CPU 混合模式运行,允许用户根据自己的硬件条件(如 GPU、显存、CPU 和内存)选择不同量化版本的大模型。它提供了一种方式,使得即使在没有高性能 GPU 的设备上,也能够运行大型模型。

2.2、Qwen1.5

    Qwen1.5 is the beta version of Qwen2, a transformer-based decoder-only language model pretrained on a large amount of data. In comparison with the previous released Qwen, the improvements include:

  • 6 model sizes, including 0.5B, 1.8B, 4B, 7B, 14B, and 72B;
  • Significant performance improvement in human preference for chat models;
  • Multilingual support of both base and chat models;
  • Stable support of 32K context length for models of all sizes
  • No need of trust_remote_code.

三、前置条件

3.1、Ollama安装

    下载地址:Download Ollama on macOS

   

    支持macOS、Linux以及windows,此处以windows操作系统为例:

    点击OllmaSetup.exe进行安装,当前安装版本为0.1.27

    安装完成后,在C:\Users\用户名\AppData\Local\Ollama目录下,有Ollama的配置及日志文件

    也可以在右下角快速点开

    

    查看版本

    


四、使用方式

4.1、运行Qwen1.5-1.8B-Chat模型

ollama run qwen:1.8b


五、测试

5.1、命令行方式测试

5.2、代码方式测试

   默认Ollama api会监听11434端口,可以使用命令进行查看

    

netstat -ano | findstr 11434

    安装requests库

pip install requests -i https://pypi.douban.com/simple
# -*-  coding = utf-8 -*-
import json
import sys
import traceback
import logging#######################日志配置#######################
import requests
from requests.adapters import HTTPAdapterlogging.basicConfig(level=logging.INFO,format='%(asctime)s [%(levelname)s]: %(message)s',  # 指定日志输出格式datefmt='%Y-%m-%d %H:%M:%S'  # 指定日期时间格式
)# 创建一个日志记录器
formatter = logging.Formatter('%(asctime)s [%(levelname)s]: %(message)s')  # 指定日志输出格式
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)if sys.platform == "linux":# 创建一个文件处理器,将日志写入到文件中file_handler = logging.FileHandler('/data/logs/app.log')
else:# 创建一个文件处理器,将日志写入到文件中file_handler = logging.FileHandler('E:\\logs\\app.log')file_handler.setFormatter(formatter)
# 创建一个控制台处理器,将日志输出到控制台
# console_handler = logging.StreamHandler()
# console_handler.setFormatter(formatter)# 将处理器添加到日志记录器中
logger.addHandler(file_handler)
# logger.addHandler(console_handler)DEFAULT_MODEL = "qwen:1.8b-chat"
DEFAULT_IP='127.0.0.1'
DEFAULT_PORT=11434
DEFAULT_MAX_TOKENS = 32768
DEFAULT_CONNECT_TIMEOUT=3
DEFAULT_REQUEST_TIMEOUT=60
DEFAULT_MAX_RETRIES=0
DEFAULT_POOLSIZE=100class Model:def __init__(self):self.headers = {"User-Agent": "Test Client"}self.s = requests.Session()self.s.mount('http://', HTTPAdapter(pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_MAX_RETRIES))self.s.mount('https://', HTTPAdapter(pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_MAX_RETRIES))def chat(self, message, history=None, system=None, config=None, stream=True):if config is None:config = {'temperature': 0.45, 'top_p': 0.9, 'repetition_penalty': 1.2, 'max_tokens': DEFAULT_MAX_TOKENS,'n':1}logger.info(f'config: {config}')messages = []if system is not None:messages.append({"role": "system", "content": system})if history is not None:if len(history) > 0 and len(history) % 2 == 0:for his in history:user,assistant = hisuser_obj = {"role": "user", "content": user}assistant_obj = {"role": "assistant", "content": assistant}messages.append(user_obj)messages.append(assistant_obj)if message is None:raise RuntimeError("prompt不能为空!")else:messages.append({"role": "user", "content": message})logger.info(messages)try:merge_pload = {"model": DEFAULT_MODEL, "messages": messages, **config}logger.info(merge_pload)response = self.s.post(f"http://{DEFAULT_IP}:{DEFAULT_PORT}/api/chat", headers=self.headers,json=merge_pload, stream=stream, timeout=(DEFAULT_CONNECT_TIMEOUT, DEFAULT_REQUEST_TIMEOUT))str = ''for msg in response:# logger.info(msg)if msg and len(msg) > 0:decode_msg = msg.decode('UTF-8')if '\n' in decode_msg :if len(str) == 0:obj = json.loads(decode_msg)if 'message' in obj:content = obj['message']['content']if content is not None:yield contentelse:str = str + decode_msgobj = json.loads(str)if 'message' in obj:content = obj['message']['content']if content is not None:str=''yield contentelse:str = str + decode_msgexcept Exception as e:traceback.print_exc()if __name__ == '__main__':model = Model()message = '我家有什么特产?'system = 'You are a helpful assistant.'history = [('hi,你好','你好!有什么我可以帮助你的吗?'),('我家在广州,很好玩哦','广州是一个美丽的城市,有很多有趣的地方可以去。'),]config = {'temperature': 0.45, 'top_p': 0.9, 'repetition_penalty': 1.2, 'max_tokens': 8192}gen = model.chat(message=message, history=history, system=system, config=config, stream=True)results = []for value in gen:results.append(value)str = ''.join(results)logger.info(str)

  模型参数:

 Ollama Api返回的数据格式以\n结尾,但由于流式返回,可能存在多行输出再返回\n的情况:

测试结果:


六、附带说明

6.1、各操作系统下的安装步骤

    https://github.com/ollama/ollama

6.2、Ollama支持的模型库

    https://ollama.com/library

    

6.3、运行各规格qwen模型的命令

https://registry.ollama.ai/library/qwen/tags

   

6.4、问题

  # 重试几次或者换另外规格的模型

6.5、代码中传递给Ollama Api的模型参数,要和运行的模型一致,即

6.6、Ollama常用命令

# list

# show

# delete

等等,可以查阅:https://github.com/ollama/ollama/blob/main/cmd/cmd.go

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/271635.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RFID-科技的“隐秘耳语者”

RFID-科技的“隐秘耳语者” 想象一下,你身处一个光线昏暗的环境中,周围的一切都被厚厚的阴影笼罩。这时,你需要识别并获取一个物体的信息,你会选择怎么做?是点亮灯光,用肉眼仔细观察,还是打开扫…

神经网络的矢量化,训练与激活函数

我们现在再回到我们的神经元部分,来看我们如何用python进行正向传递。 单层的正向传递: 我们回到我们的线性回归的函数。我们每个神经元通过上述的方法,就可以得到我们的激发值,从而可以继续进行下一层。 我们用这个方法就可以得…

智慧城市如何助力疫情防控:科技赋能城市安全

目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来,全球范围内…

Platformview在iOS与Android上的实现方式对比

Android中早期版本Platformview的实现基于Virtual Display。VirtualDisplay方案的原理是,先将Native View绘制到虚显,然后Flutter通过从虚显输出中获取纹理并将其与自己内部的widget树进行合成,最后作为Flutter在 Android 上更大的纹理输出的…

链表|206.反转链表

力扣题目链接 struct ListNode* reverseList(struct ListNode* head){//保存cur的下一个结点struct ListNode* temp;//pre指针指向前一个当前结点的前一个结点struct ListNode* pre NULL;//用head代替cur,也可以再定义一个cur结点指向head。while(head) {//保存下…

测试常用的Linux命令

前言 直接操作硬件 将把操作硬件的代码封装成系统调用,供程序员使用 虚拟机软件 可以模拟的具有完整硬件系统的功能 可以在虚拟机上安装不同的操作系统 Linux内核只有一个,发行版有很多种 内核来运行程序和管理像磁盘和打印机等硬件设备的核心程序 终端…

高清数学公式视频素材、科学公式和方程式视频素材下载

适用于科普、解说的自媒体视频剪辑素材,黑色背景数学、科学公式和方程式视频素材下载。 视频编码:H.264 | 分辨率:3840x2160 (4K) | 无需插件 | 文件大小:16.12MB 来自PR视频素材,下载地址:https://prmuban…

NTFS Disk by Omi NTFS for mac v1.1.4中文版

NTFS Disk by Omi NTFS for Mac:NTFS文件系统的无缝桥梁 软件下载:NTFS Disk by Omi NTFS for mac v1.1.4中文版 🌐 跨平台访问,文件无阻 NTFS Disk by Omi NTFS for Mac 为您的Mac提供了对NTFS文件系统的无缝访问。无论您是在Win…

Crow 编译和环境搭建

Crow与其说是编译,倒不如说是环境搭建。Crow只需要包含头文件,所以不用编译生成lib。 Crow环境搭建 boost(可以不编译boost,只需要boost头文件即可)asio (可以不编译,直接包含头文件。不能直接…

Ethersacn的交易数据是什么样的(2)

分析 Raw Transanction RLP(Recursive Length Prefix)是一种以太坊中用于序列化数据的编码方式。它被用于将各种数据结构转换为二进制格式,以便在以太坊中传输和存储。RLP 是一种递归的编码方式,允许对复杂的数据结构进行编码。所…

typeorm-入门

简述 typeorm是一个数据库orm框架,在nestjs官网中有提到,可以充分发挥利用typescript的特性,当然也支持js其中涉及的概念包括 DataSource 数据源,Connection 连接数据库Entity 实体,实体类映射数据库表Relation 关系…

redis实现分布式全局唯一id

目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1 使用 Redis 计数器实现2.2 使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1 导入依赖配置3.2 配置yml文件3.3 序列化配置3.4 编写获取工具3.5 测试获取工具 四、运行结果 一、前言 在很…

安康杯安全知识竞赛上的讲话稿

各位领导、同志们: 经过近半个月时间的准备,南五十家子镇平泉首届安康杯安全生产知识竞赛初赛在今天圆满落下帏幕,经过紧张激烈的角逐, 代表队、 代表队和 代表队分别获得本次竞赛的第一、二、三名让我们以热烈的掌声表示祝…

LLM PreTraining from scratch -- 大模型从头开始预训练指北

最近做了一些大模型训练相关的训练相关的技术储备,在内部平台上完成了多机多卡的llm 预训练的尝试,具体的过程大致如下: 数据准备: 大语言模型的训练依赖于与之匹配的语料数据,在开源社区有一群人在自发的整理高质量的…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比,实在是太短暂了,大约相当于几分钟和一年的关系。人类已经走过的路,相比今后要走的漫漫长路,只能算是刚刚起步。如果跳出一个个具体事件,站在历史的高度去看,我们会发现…

前端实现一个绕圆心转动的功能

得知了转换关系,我们就可以定义一个变量 angle 来表示我们这个 div 做圆周运动时绕圆心转过的角度,则弧度(radian) 为 radian (angle*π)/180 我们先在草稿纸上演练一遍我们的逻辑是否可行。让我们先准备一…

货运物流小程序开发功能 发货运输更简单

随着互联网的快速发展,线上接单已经成为物流行业的主流趋势。货运物流接单小程序作为物流企业的得力助手,能够提高运输效率、降低成本、提升服务质量,成为物流行业的发展新方向。 1. 用户注册与登录功能:用户可以通过手机号、邮箱…

光谱下的养殖业:数据可视化的现代变革

在数字化时代,数据可视化在养殖业中崭露头角,为这一传统行业注入了新的活力。无论是家禽养殖还是水产养殖,数据可视化都以其直观、高效的特点,为养殖业带来了全新的发展机遇。下面我就以可视化从业者的角度,简单聊聊这…

华为od机试C卷-开源项目热度榜单

1、题目描述 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。 对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue…

【自然语言处理六-最重要的模型-transformer-上】

自然语言处理六-最重要的模型-transformer-上 什么是transformer模型transformer 模型在自然语言处理领域的应用transformer 架构encoderinput处理部分(词嵌入和postional encoding)attention部分addNorm Feedforward & add && NormFeedforw…