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

news2024/11/20 2:33:11

一、前言

    在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 HTTPAdapter

logging.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=100

class 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 = his

                    user_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 content
                        else:
                            str = str + decode_msg
                            obj = json.loads(str)
                            if 'message' in obj:
                                content = obj['message']['content']
                                if content is not None:
                                    str=''
                                    yield content
                    else:
                        str = str + decode_msg
        except 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.coloradmin.cn/o/1500584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

llama factory学习笔记

模型 模型名模型大小默认模块TemplateBaichuan27B/13BW_packbaichuan2BLOOM560M/1.1B/1.7B/3B/7.1B/176Bquery_key_value-BLOOMZ560M/1.1B/1.7B/3B/7.1B/176Bquery_key_value-ChatGLM36Bquery_key_valuechatglm3DeepSeek (MoE)7B/16B/67Bq_proj,v_projdeepseekFalcon7B/40B/18…

寻找数组的中心索引

给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点…

跨网络传输的大致过程+图解(软件虚拟层),ip地址介绍,ip地址和mac地址对比

目录 跨网络传输 引入​​​​​​​ 举例 -- 唐僧西天取经 结论 介绍 ip地址 引入 介绍 类型 公有ip 私有ip 版本 ipv4 ipv6 ip地址和mac地址的唯一性问题 数据包转发的过程 引入 思考 -- 如何跨子网 过程 图解 封装和解包 去掉差异 ip地址/协议的重要…

Nginx正向代理域名的配置

目录 前言 1.打开文件 2. 启用代理 3. 指定代理服务器 4. 保存配置文件并重新加载Nginx。 5. 添加域名解析。 6. 配置客户端。 总结 前言 Nginx是一个高性能、开源的Web服务器软件,不仅可以作为反向代理服务器使用,还可以作为正向代理服务器使用…

IDEA启动项目读取nacos乱码导致启动失败

新安装的2023社区版IDEA,启动项目报错。 forest: interceptors: - com.gdsz.b2b.frontend.api.Interceptors.ApiInterceptor org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length 1 at org.yaml.snakeyaml.reader.S…

Zabbix(四)

Zabbix Proxy zabbix作为一个分布式监控系统(分布式监控解决方案),支持通过代理(proxy)收集zabbix agent的监控数据,然后由zabbix proxy再把数据发送给zabbix server,也就是zabbix proxy 可以代替zabbix server收集监控数据,然后…

VBA中类的解读及应用第十讲:限制文本框的输入,使其只能输入数值(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。 类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

React-父传子

1.概念 说明:父组件传递数据子组件标签身上绑定属性;子组件接受数据props的参数。props是一个对象,包含父组件传递的所有数据。例如数字、字符串、布尔值、数组、对象、函数、JSX。不允许直接修改父组件传递的数据。 2.例子 // 父传子 // …

YOLO建筑物损伤评估数据集

YOLO建筑物损伤评估数据集,重度损伤,轻微损伤,中度损伤,未损伤4类,近五千张图像,yolo标注完整,应用数据增强。 适用于CV项目,毕设,科研,实验等 需要此数据集…

抖店月销过万的爆单技巧,新手轻松月入1w+,附抖店学习资料!

我是电商珠珠 抖店开通之后,怎么才能快速出单是很多新手小伙伴困扰的问题。其实想要运营好抖店一点都不难,我做抖店也有三年多时间了,接下来我说的每一步,不管是有货源还是无货源的都适用。 1、铺货低价福利款 店铺开好之后&am…

【C++第三课 - 类和对象中】构造函数、析构函数、拷贝构造函数、赋值重载、取地址重载、Date类的完善、const成员

目录 类的6个默认成员函数构造函数自己写的构造函数默认生成的构造函数 析构函数概念特征 拷贝构造函数特征 运算符重载 、 >、 <赋值重载Date类的完善构造函数的完善、-的完善用复用-、-以及-和-的相互复用 前置、--后置、--流插入、流提取 取地址重载 const成员 类的6个…

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

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

TensorRT是什么,有什么作用,如何使用

TensorRT 是由 NVIDIA 提供的一个高性能深度学习推理&#xff08;inference&#xff09;引擎。它专为生产环境中的部署而设计&#xff0c;用于提高在 NVIDIA GPU 上运行的深度学习模型的推理速度和效率。以下是关于 TensorRT 的详细介绍&#xff1a; TensorRT 是 NVIDIA 推出的…

容器: string

引言: 为什么要有string类型, 就使用字符数组表示字符串不行吗? 原因: 使用字符数组描述文本信息, 无法确定开多大空间, 开多了浪费,开少了不够用使用string封装: 扩容机制:减少了空间的浪费各种接口:方便修改等操作 string的使用 容量相关 size:获取字符个数,不包含\0 (C语言…

IOS苹果通话记录在线生成网站源代码,直接上传就可使用

一键生成&#xff0c;PHP的上传到网站根目录打开域名访问即可 源码免费下载地址专业知识分享社区-专业知识笔记免费分享 (chaobiji.cn)

Mocha and Railgun(几何规律)

链接&#xff1a;https://ac.nowcoder.com/acm/contest/33186/D 来源&#xff1a;牛客网 题目描述 There is a candy store near Mochas school. Its said that the storekeeper, Dagashiya, can cast the railgun spell. To be the most powerful Mahou Shoujo, Mocha ask…

118.龙芯2k1000-pmon(17)-制作ramdisk

目前手上这个设备装系统不容易&#xff0c;总是需要借助虚拟机才能实现。 对生产就不太那么友好&#xff0c;能否不用虚拟机就能装Linux系统呢&#xff1f; 主要是文件系统的问题需要解决&#xff0c;平时我们一般是用nfs挂载后&#xff0c;然后对硬盘格式化&#xff0c;之后…

社区服务类创业项目推荐:抓住社区商业新机遇

大家好&#xff0c;我是一名90后鲜奶吧创业者&#xff0c;目前在社区经营5年时间&#xff0c;今天我想和大家分享一些关于社区服务类创业项目的推荐&#xff0c;都是这么多年我见证过生意最好的店面。 1、社区便利店&#xff1a; 随着人们生活节奏的加快&#xff0c;对便利购…

【Linux实践室】Linux常用命令:文件操作|文件夹操作

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux文件操作2.1.1 &#x1f47b;创建文件2…

数组连续和 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一个含有N个正整数的数组&#xff0c;求出有多少连续区间&#xff08;包括单个正整数&#xff09;&#xff0c;它们的和大于等于 x。 输入描述 第一行为两个…