• 开源模型应用落地-工具使用篇-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
    1. # -*- coding = utf-8 -*-
    2. import json
    3. import sys
    4. import traceback
    5. import logging
    6. #######################日志配置#######################
    7. import requests
    8. from requests.adapters import HTTPAdapter
    9. logging.basicConfig(
    10. level=logging.INFO,
    11. format='%(asctime)s [%(levelname)s]: %(message)s', # 指定日志输出格式
    12. datefmt='%Y-%m-%d %H:%M:%S' # 指定日期时间格式
    13. )
    14. # 创建一个日志记录器
    15. formatter = logging.Formatter('%(asctime)s [%(levelname)s]: %(message)s') # 指定日志输出格式
    16. logger = logging.getLogger(__name__)
    17. logger.setLevel(logging.INFO)
    18. if sys.platform == "linux":
    19. # 创建一个文件处理器,将日志写入到文件中
    20. file_handler = logging.FileHandler('/data/logs/app.log')
    21. else:
    22. # 创建一个文件处理器,将日志写入到文件中
    23. file_handler = logging.FileHandler('E:\\logs\\app.log')
    24. file_handler.setFormatter(formatter)
    25. # 创建一个控制台处理器,将日志输出到控制台
    26. # console_handler = logging.StreamHandler()
    27. # console_handler.setFormatter(formatter)
    28. # 将处理器添加到日志记录器中
    29. logger.addHandler(file_handler)
    30. # logger.addHandler(console_handler)
    31. DEFAULT_MODEL = "qwen:1.8b-chat"
    32. DEFAULT_IP='127.0.0.1'
    33. DEFAULT_PORT=11434
    34. DEFAULT_MAX_TOKENS = 32768
    35. DEFAULT_CONNECT_TIMEOUT=3
    36. DEFAULT_REQUEST_TIMEOUT=60
    37. DEFAULT_MAX_RETRIES=0
    38. DEFAULT_POOLSIZE=100
    39. class Model:
    40. def __init__(self):
    41. self.headers = {"User-Agent": "Test Client"}
    42. self.s = requests.Session()
    43. self.s.mount('http://', HTTPAdapter(pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_MAX_RETRIES))
    44. self.s.mount('https://', HTTPAdapter(pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_MAX_RETRIES))
    45. def chat(self, message, history=None, system=None, config=None, stream=True):
    46. if config is None:
    47. config = {'temperature': 0.45, 'top_p': 0.9, 'repetition_penalty': 1.2, 'max_tokens': DEFAULT_MAX_TOKENS,'n':1}
    48. logger.info(f'config: {config}')
    49. messages = []
    50. if system is not None:
    51. messages.append({"role": "system", "content": system})
    52. if history is not None:
    53. if len(history) > 0 and len(history) % 2 == 0:
    54. for his in history:
    55. user,assistant = his
    56. user_obj = {"role": "user", "content": user}
    57. assistant_obj = {"role": "assistant", "content": assistant}
    58. messages.append(user_obj)
    59. messages.append(assistant_obj)
    60. if message is None:
    61. raise RuntimeError("prompt不能为空!")
    62. else:
    63. messages.append({"role": "user", "content": message})
    64. logger.info(messages)
    65. try:
    66. merge_pload = {"model": DEFAULT_MODEL, "messages": messages, **config}
    67. logger.info(merge_pload)
    68. response = self.s.post(f"http://{DEFAULT_IP}:{DEFAULT_PORT}/api/chat", headers=self.headers,
    69. json=merge_pload, stream=stream, timeout=(DEFAULT_CONNECT_TIMEOUT, DEFAULT_REQUEST_TIMEOUT))
    70. str = ''
    71. for msg in response:
    72. # logger.info(msg)
    73. if msg and len(msg) > 0:
    74. decode_msg = msg.decode('UTF-8')
    75. if '\n' in decode_msg :
    76. if len(str) == 0:
    77. obj = json.loads(decode_msg)
    78. if 'message' in obj:
    79. content = obj['message']['content']
    80. if content is not None:
    81. yield content
    82. else:
    83. str = str + decode_msg
    84. obj = json.loads(str)
    85. if 'message' in obj:
    86. content = obj['message']['content']
    87. if content is not None:
    88. str=''
    89. yield content
    90. else:
    91. str = str + decode_msg
    92. except Exception as e:
    93. traceback.print_exc()
    94. if __name__ == '__main__':
    95. model = Model()
    96. message = '我家有什么特产?'
    97. system = 'You are a helpful assistant.'
    98. history = [('hi,你好','你好!有什么我可以帮助你的吗?'),('我家在广州,很好玩哦','广州是一个美丽的城市,有很多有趣的地方可以去。'),]
    99. config = {'temperature': 0.45, 'top_p': 0.9, 'repetition_penalty': 1.2, 'max_tokens': 8192}
    100. gen = model.chat(message=message, history=history, system=system, config=config, stream=True)
    101. results = []
    102. for value in gen:
    103. results.append(value)
    104. str = ''.join(results)
    105. 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

  • 相关阅读:
    某网站X-Signature签名破解
    Cannot find module ‘./assets/empty-module.js‘
    如何在WPF中设置Grid ColumnDefinitions的样式
    简单聊聊Innodb崩溃恢复那些事
    fscan使用方法:一键自动化、全方位漏洞扫描的开源工具
    单片机实物焊接器件识别
    谷歌护眼插件Dark Reader下载安装使用
    深度学习入门(三十五)计算性能 编译器和解释器
    阿里技术风险与效能部负责人张瓅玶:从底层资源到核心竞争力 阿里巴巴的深度用云实践
    MySQL高可用集群解决方案之:lvs+keepalived+mysql cluster实现负载均衡
  • 原文地址:https://blog.csdn.net/qq839019311/article/details/136474207