ollama本地部署大语言模型记录
目录
- 安装Ollama
- 更改模型存放位置
- 拉取模型
- Gemma
- Mistral
- Qwen1.5(通义千问)
- codellama
- 部署Open webui
- 测试性能
- 知识广度
- 问题1
- 问题2
- 代码能力
- 总结
最近突然对大语言模型感兴趣
同时在平时的一些线下断网的CTF比赛中,大语言模型也可以作为一个能对话交互的高级知识检索库
本篇文章旨在记录我在本地部署大语言模型的过程
安装Ollama
Ollama是一个轻量级、可扩展的框架,旨在帮助用户在本地机器上构建、运行和分享大语言模型。
前往Ollama的官网Ollama下载最新版本的安装包
需要注意的是,该软件默认安装在C盘下,所以如果有精神洁癖的小伙伴也可以使用docker部署Ollama
在终端中输入ollama --version
返回版本信息,说明安装成功
更改模型存放位置
前往系统环境变量设置,添加如下系统变量
重启Ollama
拉取模型
Gemma
目前在Ollama上,Gemma模型已经拥有超过430K的拉取次数。基本上Gemma可以算是Ollama最热门的模型了
Gemma提供了不同参数规模的版本,2b(20亿参数)和7b(70亿参数)。参数的数量直接影响了模型对语言的理解能力,更多的参数通常意味着更好的理解、生成和预测能力,但同时也需要更强大的计算资源和更长的处理时间
每个参数版分为轻量版和全量版,2b模型即便是在没有独显的笔记本电脑上都能尝试运行,而规模更大的7b、7b全量版分别需要8GB和16GB显存。
因为本人的笔记本显卡是RTX 3070Laptop,为了防止显卡撑爆,选择部署2b全量版
首先确保Ollama框架有在运行,在终端中输入ollama pull gemma:2b-instruct-fp16
拉取模型
gemma后跟的是参数版本
拉取模型的过程中尽量开代理,因为Ollama的数据库在海外
提示success
说明拉取成功
Mistral
Mistral 7B 是一款拥有70亿参数的精心设计的语言模型,旨在实现卓越性能和高效运行。它在各类基准测试中表现出色,超越了当前最佳的开源13B模型——Llama 2,并在推理能力、数学计算精准度以及代码生成任务上均超越了已公开的34B模型——Llama 1
执行ollama pull qwen:7b
拉取模型
Qwen1.5(通义千问)
考虑到本地部署时对硬件的要求,我们不得不选取参数量较小的模型
通常的游戏笔记本的显卡内存在4G到8G之间,对应的模型参数量范围在20亿到70亿间
而今年年初阿里巴巴开源的Qwen1.5恰好有一个70亿参数量的版本,显存占用在7G左右,非常适合在中高端游戏本上部署
执行ollama pull mistral:latest
拉取模型
codellama
code llama在llama2模型的基础上,利用代码数据进行训练和微调,提高了llama2在代码生成上的能力
code llama提供了三种模型,每种模型包含7B,13B,34B三个尺寸,支持多种编程语言,如Python, C++, Java, PHP, Typescript (Javascript), C#, Bash等。
- Code Llama,代码生成的基础模型;
- Code Llama-Python,单独针对于python的模型;
- Code Llama-Instruct,根据人工指令微调的模型。
这里我们选用基础模型,执行ollama pull codellama:7b
拉取模型
部署Open webui
Open WebUI是目前GitHub上开源的类Chatgpt前端界面中,star数量最多的框架之一
而更重要的是Open WebUI的前身即Ollama WebUI,所以它对于Ollama的支持非常好
执行下面的指令来拉取并部署Open WebUI的docker容器
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
在浏览器上访问https://localhost:3000
点击加号添加刚刚拉取的所有模型,方便后续同时测试多个模型
测试性能
在本文章中,会对部署在本地的模型进行相同的提问测试,包括知识广度和代码能力
知识广度
首先是知识广度上的测试,我们询问2道安全岗的面试题
问题1
- 请向我介绍一下蜜罐技术
Mistral从原理和应用上全方位介绍了蜜罐技术,它的回答不仅准确,用词也非常专业。
Qwen的回答非常模板化,使用总分总的形式展开回答,但相比Mistral的回答少一些实用细节
Gemma的回答虽然详细但完全不适用,因为它误解了蜜罐技术的定义,说明它在知识广度上和其他模型存在差距
Codellama的回答提供了一个与网络安全不同的视角,专注于使用蜜罐收集用户行为数据的概念。虽然这种用法在市场研究和用户行为分析中可能有其价值,但它与蜜罐技术在网络安全领域的典型应用相去甚远。
问题2
- 信息收集如何处理子域名爆破的泛解析问题?
MIstral回答如下
During information gathering or subdomain enumeration, an attacker may use techniques like DNS brute-forcing or subdomain enumeration tools to discover potential subdomains of a target domain. One common issue they might encounter is the presence of Zone Transfer (MX) records or CNAME records pointing to IP addresses with open resolver servers or to other domains, which can facilitate the discovery of additional subdomains through a process called transitive name resolution, also known as “glue” or “tied” records.
To mitigate this issue, organizations can take several steps when handling subdomain enumeration:
- Disable Open Resolver Servers: Ensure that your DNS servers are not configured to respond to unsolicited recursive queries from external sources. This will prevent attackers from using them as a means to discover additional subdomains through transitive name resolution.
- Configure Response Rate Limiting (RRL): Implement RRL on your DNS servers to limit the number of requests that can be sent by a single source in a given time frame. This will help prevent attackers from quickly enumerating multiple subdomains using brute-forcing tools.
- Filter Out Undesired Records: Use firewalls and access control lists (ACLs) to block or filter out unnecessary DNS records, such as MX records that contain open resolver servers or CNAME records pointing to external domains.
- Monitor for Anomalous Activity: Set up intrusion detection systems (IDS) and security information and event management (SIEM) solutions to monitor and alert on anomalous DNS queries, such as rapid subdomain enumeration attempts.
- Implement Honeypots and Decoys: Use Honeypot technologies and decoy domains to misdirect attackers from the real infrastructure. This can help protect sensitive information and resources while also providing valuable intelligence about the attacker’s tactics, techniques, and procedures (TTPs).
- Regularly Update DNS Records: Ensure that your subdomain records are updated regularly to minimize the exposure of old or outdated services or applications. This will help reduce the likelihood of discovery through enumeration attempts.
- Implement DNS Security Extensions: Use DNS security extensions such as DNSSEC and DANE to secure your DNS infrastructure and prevent attackers from manipulating or poisoning your records.
Gemma回答如下
信息收集如何处理子域名爆破的泛解析问题取决于具体情况,以下是一些常见解决方案:
1. 分析泛解析结果
- 首先,需要确认子域名是否真正属于您。您可以通过域名注册页面或 DNS 管控器的 DNS 查询来查询子域名是否指向您指定的服务器。
- 您可以分析泛解析结果的来源,例如,如果子域名来自根域名注册服务器,那么它可能被恶意攻击者通过 DNS poisoning攻击。
- 您可以分析泛解析结果的记录,例如,如果记录中存在一个指向恶意网站的记录,则可能是一个恶意攻击者的攻击目标。
2. 识别恶意记录
- 恶意记录通常包含以下特征:
- 与您网络相关的名称,例如子域名或 IP 地址。
- 与您的网站或服务相关的名称。
- 与其他恶意记录相同的语法或内容。
- 与您服务器连接的端口或协议。
- 与您网站上部署的软件或工具相关的名称。
- 您可以使用工具,例如 iRule 或 Nessus,来分析网络记录并识别恶意记录。
3. 阻止恶意记录
- 您可以使用 DNS 过滤器或其他安全工具来阻止恶意记录的创建或更新。
- 您可以使用 DNS 记录过滤技术来阻止特定子域名或 IP 地址访问特定网站或服务。
- 您可以使用反恶意软件扫描工具来扫描您的网络,以识别并删除恶意软件。
4. 监控子域名的变化
- 定期检查子域名的 DNS 记录,以确保它们仍然指向您的服务器。
- 如果您发现子域名已改变指向恶意网站,请立即采取行动。
5. 考虑实施安全措施
- 使用 SSL 证书来加密您的网站连接。
- 使用防火墙和入侵检测系统 (IDS) 来保护您的网络。
- 使用安全软件,例如恶意软件扫描工具和 DNS 过滤工具,来保护您的设备和数据。
- 确保您的设备和软件的更新及时完成。
请注意,处理子域名爆破的泛解析问题需要专业技能和经验,建议您寻求安全专家或安全团队的帮助。
在这个问题上,Codellama的回答显然优于其他三种模型,因为他理解了信息收集的含义,所以提出了攻击建议而不是防御建议
代码能力
在代码能力上,我们让模型进行代码审计,来测试它们对代码的理解能力
问题如下
<?php // 获取用户提交的用户名 $username = $_GET['username'];// 连接到数据库 $conn = new mysqli('localhost', 'user', 'password', 'database');// 检查连接 if ($conn->connect_error) {die("连接失败: " . $conn->connect_error); }// 构造SQL查询,这里存在SQL注入的风险 $sql = "SELECT * FROM users WHERE username = '$username'";$result = $conn->query($sql);if ($result->num_rows > 0) {// 输出每一行数据while($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - Name: " . $row["name"]. " - Email: " . $row["email"]. "<br>";} } else {echo "0 结果"; }$conn->close(); ?>
请识别上述PHP代码中存在的安全漏洞,并解释为什么这些部分是脆弱的。如果有的话,请提出对上述代码进行优化的建议,以提高其效率和安全性。
这段代码存在SQL注入漏洞
Mistral回答如下
The given PHP code has several security vulnerabilities:
- SQL Injection: The code uses user-supplied input ($username) directly in the SQL query without any form of validation or sanitization. This makes it vulnerable to SQL injection attacks where an attacker can inject malicious SQL statements and potentially gain unauthorized access to sensitive data, modify or delete data, or even take control of the database server. To mitigate this risk, it’s recommended to use prepared statements with parameterized queries instead of directly inserting user input into the query string. This will help ensure that any user input is treated as literal values rather than SQL code.
- Lack of Input Validation: The code does not check if the user-supplied ‘username’ parameter is valid or within expected format. This can lead to unexpected behavior and potential security issues. It’s important to validate user input, for example by checking its length, character set, or using regular expressions.
- Lack of Error Handling: The code does not have proper error handling mechanisms in place. If the query fails due to an SQL syntax error, the code will simply display a generic error message “连接失败:”. It’s important to handle errors gracefully and provide informative error messages to the user.
- Insecure Database Credentials: The database credentials are hardcoded in the script which is not recommended as it can expose sensitive information if the source code gets compromised. Instead, use environment variables or configuration files that are not accessible to the public.
- Use of mysqli_ instead of PDO: While both are PHP extensions for interacting with databases, MySQLi is considered less secure than PDO since it does not support prepared statements by default and lacks some advanced features like statement binding. It’s generally recommended to use PDO over MySQLi for better security and ease-of-use.
To improve the code, consider the following suggestions:
- Use Prepared Statements with Parameterized Queries: Replace the current SQL query construction method with prepared statements and parameterized queries which will help prevent SQL injection attacks by ensuring that user input is treated as literal values.
- Input Validation: Validate user input before processing it to ensure that it meets expected format and length requirements. Use regular expressions or other validation functions to check the input.
- Proper Error Handling: Implement error handling to provide informative error messages to the user in case of any SQL query failures. This will help prevent potential attacks by providing minimal information to attackers.
- Keep Database Credentials Secure: Do not hardcode database credentials in the script. Instead, use environment variables or configuration files that are not accessible to the public.
- Use PDO instead of MySQLi: Consider using PHP Data Objects (PDO) extension for better security and ease-of-use since it supports prepared statements by default and has advanced features like statement binding which can help prevent SQL injection attacks.
Mistral准确地识别了SQL注入漏洞,并提供了标准的解决方案,即使用预处理语句和参数化查询。同时Mistral正确指出了缺乏输入验证和错误处理的问题。
Qwen的回答依然非常简短,虽然它正确识别出了SQL注入的漏洞并给出了优化建议,但它提到了未正确关闭数据库,很明显是对代码的误解
Gemma识别出了SQL注入漏洞,并提出了一系列防御措施。然而,一些建议表述可能不够精确,特别是关于用户输入处理的部分。
Codellama的回答中,对代码的优化建议最为全面
总结
模型 | 知识广度 | 代码理解能力 |
---|---|---|
Mistral | 高 | 高 |
Qwen | 中 | 中 |
Gemma | 中 | 中 |
Codellama | 高 | 高 |
经过简单的测试,Mistral和Codellama的表现相对来说更加出色,能够部分满足我们对本地大模型的需求
相关文章:

ollama本地部署大语言模型记录
目录 安装Ollama更改模型存放位置 拉取模型GemmaMistralQwen1.5(通义千问)codellama 部署Open webui测试性能知识广度问题1问题2 代码能力总结 最近突然对大语言模型感兴趣 同时在平时的一些线下断网的CTF比赛中,大语言模型也可以作为一个能对话交互的高级知识检索…...

【C++红黑树应用】模拟实现STL中的map与set
目录 🚀 前言一: 🔥 红黑树的修改二: 🔥 红黑树的迭代器 三: 🔥 perator() 与 operator--() 四: 🔥 红黑树相关接口的改造✨ 4.1 Find 函数的改造✨ 4.2 Insert 函数的改…...
前端实习手计(5):班味十足?!
自我感觉没有班味!!!每天还是快快乐乐上班哇,是愉快的一周~这周没有太多活咯,基本就是修修改改改代码学习。真的感觉自己写的代码就是乱七八糟,只要能跑起来有效果就行(我不是合格的处女座哈哈哈…...

Duix AI 太上瘾,让我熬夜体验的AI女友
✨点击这里✨:🚀原文链接:(更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号!) Duix AI 太上瘾,让我熬夜体验的AI女友 开启 Duix AI 女友的奇妙之旅_ Hi,这…...
php判断某个目录下是否存在文件
/*** 判断字符串是否以什么结尾* param String $haystack 字符串* param String $needle 结尾* return Boolean*/ function endWith($haystack, $needle) {$length strlen($needle);if ($length 0) {return true;}return (substr($haystack, -$length) $needle); } /***…...
重塑互联网生态:探索Web 3.0、大数据与隐私保护的新篇章
引言:互联网的新纪元 随着互联网技术的日新月异,我们正迈入一个全新的时代,其中Web 3.0、大数据以及隐私保护成为塑造未来互联网生态的三大核心力量。它们不仅改变了我们与互联网交互的方式,更深刻地影响着社会的方方面面。 Web…...
HR模块中PA信息类型的相关函数
目录 1、新增、删除,修改:HR_INFOTYPE_OPERATION新增:INS删除:DEL修改:MOD 2、读取PA信息类型:HR_READ_INFOTYPE3、入职,生成新工号用:HR_PAD_HIRE_EMPLOYEE4、加锁:BAPI…...
c# 日期类型变量默认值
DateTime类型是比较常用的变量类型,但是以前处理都比较业余,下面总结2中常用方式 这次把它总结下: DateTime t1 default(DateTime); DateTime t2 DateTime.MinValue; 这样t1,t2 的值都是 {0001/1/1 0:00:00} PS: 由于DateTi…...
设计模式实战:任务调度系统的设计与实现
问题描述 设计一个任务调度系统,支持任务的创建、调度、执行和状态管理。系统需要确保任务的执行过程可以被灵活调度,并且支持任务状态的跟踪和通知功能。 设计分析 命令模式 命令模式用于将请求封装成对象,从而使我们可以用不同的请求、队列或日志来参数化其他对象。任…...
代码中的特殊注释
代码中特殊注释——TODO、FIXME、XXX、HACK_fix me todo hack-CSDN博客 代码中特殊注释——TODO、FIXME、XXX、HACK TODO:英语翻译为待办事项,备忘录。如果代码中有该标识,说明在标识处有功能代码待编写,待实现的功能在说明中会…...

ubuntu20.04.6 安装Skywalking 10.0.1
1.前置准备 1.1. **jdk17(Skywalking10 jdk22不兼容,用17版本即可)**安装: https://blog.csdn.net/CsethCRM/article/details/140768670 1.2. elasticsearch安装: https://blog.csdn.net/CsethCRM/article/details…...

C++:map和set
hello,各位小伙伴,本篇文章跟大家一起学习《C:map和set》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!!…...
深入理解二叉搜索树:定义、操作及平衡二叉树
引言 二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树结构,每个节点的左子树节点值小于根节点值,而右子树节点值大于根节点值。二叉搜索树在计算机科学中有着广泛的应用,尤其在动态查找表和优先队列…...
vue3组件通信(二)
组件通信 一.$attrs(祖>孙间接)二、$refs()父>子, $parent()子>父三.provide,inject(祖>孙直接)四.pinia五.slot1.默认插槽2.具名插槽3.作用域插槽 一.$attrs(祖>孙间接) $attrs用于实现当前组件的父组…...

关键词查找【Boyer-Moore 算法】
1、【Boyer-Moore 算法】 【算法】哪种算法有分数复杂度?- BoyerMoore字符串匹配_哔哩哔哩_bilibili BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较,而…...
【前端手写代码】手写Object.create
思路:将传入的对象作为原型 // 思路:将传入的对象作为原型 function create(obj) {function F() { }F.prototype objreturn new F() }...

速通JS模块化规范
目录 1模块化概述 1.1什么是模块化? 1.2为什么需要模块化? 2有哪些模块化规范? 3导入与导出的概念 4CommonJS 规范 4.1初步体验 4.2导出数据 4.3导入数据 4.4扩展理解 4.5浏览器端运行 5ES6 模块化规范 5.1初步体验 5.2Node 中运…...

HamonyOS性能优化工具和方法
性能优化,如何做到更快的启动、更流畅的使用,概括图如下 ArkTS高性能编程: 1. ArkTS规则:有利于方舟编译运行时进行编译优化 2. 使用AOT(Ahead Of Time)模式对应用进行编译优化:方舟编译运行时通过采用PGO(Profile-Gui…...
前端实现边下载文件边上传
问题记录原因: 因为需要实现网络文件的上传,结果是由前端实现,方式是一边下载,一遍上传文件,小文件直接上传,大文件进行切片,切片大小和下载大小有关,特此记录。 1.实现方案 fetc…...

滑线变阻器的优缺点是什么?
滑线变阻器是常见的电子元件,主要用于调节电路中的电阻值,从而达到改变电流、电压的目的。它的主要优点是结构简单、操作方便、成本低,因此在各种电子设备中都有广泛的应用。然而,滑线变阻器也存在一些缺点,主要表现在…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...