大模型私有化部署

私有大模型

为什么要有私有大模型?

随着AI技术的不断普及,人们也积极拥抱其带来的变化,在生活或者工作中亦使用AI技术来帮助我们更高效的完成某些事件,但是在这个过程中,也暴露出AI技术当前下存在在的系列问题,其中最严重的就是安全问题,比如:最典型的是三星员工使用ChatGPT泄露公司机密的案例。
在这里插入图片描述

其实上述案例表现的就是企业数据隐私与安全的问题,在许多行业,如金融、医疗、政府等,数据隐私和安全是至关重要的。使用公共大模型可能涉及敏感数据的泄露风险,因为公共模型在训练过程中可能接触到了来自不同来源的敏感数据。因此就有了私有大模型的市场需求,私有大模型允许企业或机构在自己的数据上训练模型,而且训练的结果只供内部或合作伙伴使用,从而确保了数据隐私和安全。

当然除了数据隐私问题原因之外,还存有便于内部员工工作提效、大模型开发的投入等诸多原因综合,直接推动私有大模型成为未来AI发展的新方向之一。

私有大模型解决方案

随着AI的发展,越来越多的开发者投入到大模型开发中,他们期望能自身笔记本上运行大模型,以便开发。越来越多的企业积极改造自身产品,融入AI技术,他们期望能私有化大模型以保证数据安全。这些诉求直接推动社区出现了两个这方面的产品Ollama和LMstudio。

这两个产品各有优势:

Ollama LM Studio
产品定位 开源的大型语言模型本地运行框架 闭源的本地大型语言模型工作站,集模型训练、部署、调试于一体
技术特点 - 高度智能化,自主学习和适应能力强 - 便捷性高,操作简单易懂 - 安全性强,数据传输和存储严格保护 - 高性能,采用先进计算架构和算法优化 - 可定制化,支持用户定制模型结构和训练策略 - 易用性,友好的用户界面和丰富的文档支持
功能 - 提供预训练模型访问和微调功能 - 支持多种模型架构和定制模型 - 用户友好界面,简化模型实验和部署过程 - 丰富的训练数据和算法库 - 可视化训练监控界面 - 强大的调试工具,支持模型性能优化
应用场景 - 学术研究 - 开发者原型设计和实验 - 创意写作、文本生成等 - 智能客服 - 自然语言处理(如文本分类、情感分析、机器翻译) - 学术研究
用户友好性 - 界面化操作,适合不同水平的用户 - 支持多种设备和平台 - 友好的用户界面,适合初学者和非技术人员 - 提供全面的工具组合,易于上手
定制性 - 提供一定程度的定制选项,但可能有限制 - 高度可定制化,满足用户个性化需求
资源要求 - 需要一定的内存或显存资源来运行大型模型 - 支持跨平台(macOS、Linux,Windows预览版) - 构建和训练复杂模型可能需要大量计算资源和专业技能
成本 - 成本可能根据使用量和资源需求变化 - 开源项目,可能涉及较少的直接成本 - 闭源产品,成本可能包括软件许可和可能的云服务费用
社区生态 - 社区生态活跃,开发者主流本地运行时 - 快速适配新发布的模型 - 未知(未提及具体社区生态活跃度)

Ollama 作为一个开源的轻量级工具,适合熟悉命令行界面的开发人员和高级用户进行模型实验和微调。它提供了广泛的预训练模型和灵活的定制选项,同时保持了高度的便捷性和安全性。最重要它是开源的,同时还提供API,对于开发有先天优势,因此在企业中备受欢迎和使用,因此本课程也才主要学习Ollama技术。

Ollama 入门

什么是Ollama?

Ollama提供了一个轻量级、易于扩展的框架,让开发者能够在本地机器上轻松构建和管理LLMs(大型语言模型)。通过Ollama,开发者可以访问和运行一系列预构建的模型,或者导入和定制自己的模型,无需关注复杂的底层实现细节。

Ollama的主要功能包括快速部署和运行各种大语言模型,如Llama 2、Code Llama等。它还支持从GGUF、PyTorch或Safetensors格式导入自定义模型,并提供了丰富的API和CLI命令行工具,方便开发者进行高级定制和应用开发。

在这里插入图片描述

特点:

  • 一站式管理:Ollama将模型权重、配置和数据捆绑到一个包中,定义成Modelfile,从而优化了设置和配置细节,包括GPU使用情况。这种封装方式使得用户无需关注底层实现细节,即可快速部署和运行复杂的大语言模型。

  • 热加载模型文件:支持热加载模型文件,无需重新启动即可切换不同的模型,这不仅提高了灵活性,还显著增强了用户体验。

  • 丰富的模型库:提供多种预构建的模型,如Llama 2、Llama 3、通义千问等,方便用户快速在本地运行大型语言模型。

  • 多平台支持:支持多种操作系统,包括Mac、Windows和Linux,确保了广泛的可用性和灵活性。

  • 无复杂依赖:通过优化推理代码并减少不必要的依赖,Ollama能够在各种硬件上高效运行,包括纯CPU推理和Apple Silicon架构。

  • 资源占用少:Ollama的代码简洁明了,运行时占用资源少,使其能够在本地高效运行,不需要大量的计算资源。

下载与安装

手动安装
  • window:https://ollama.com/download/OllamaSetup.exe

  • mac:https://ollama.com/download/Ollama-darwin.zip

  • linux:curl -fsSL https://ollama.com/install.sh | sh
    window和mac版本直接下载安装或解压即可使用。这里由于Ollama需要安装在linux中,因此在这里主要学习如何在Linux上安装:

在虚拟机/root/resource目录中已经下载好Linux版本所需的ollama-linux-amd64.tgz文件,则执行下面命令开始安装:

tar -C /usr -xzf ollama-linux-amd64.tgz

操作成功之后,可以通过查看版本指令来验证是否安装成功

[root@bogon resource]# ollama -v
Warning: could not connect to a running Ollama instance
Warning: client version is 0.3.9

创建服务文件/etc/systemd/system/ollama.service,并写入文件内容:

[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/bin/ollama serve
User=root
Group=root
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

生效服务:

sudo systemctl daemon-reload
sudo systemctl enable ollama

启动服务:

sudo systemctl start ollama
一键安装

Ollama在Linux上也提供了简便的安装命令,但是过程中需要下载400M左右的数据,比较慢,因此课堂上采用第一种方式安装,但在工作中一般采用下面命令进行安装:

curl -fsSL https://ollama.com/install.sh | sh
Docker安装(当前虚拟机所使用方式)
  • 运行容器(CPU)
docker run -d -p 11434:11434 --name ollama -e OLLAMA_ORIGINS="*" --restart=always ollama/ollama
  • 进入容器内部操作ollama
 docker exec -it ollama bash

运行大模型

首次运行

在终端输入一下命令即可运行通义千问大模型: ollama run qwen2:0.5b

[root@bogon resource]# ollama run qwen2:0.5b
pulling manifest 
pulling 8de95da68dc4... 100% ▕█████████████████████████████████████████████████████████████████████████████████▏ 352 MB                         
pulling 62fbfd9ed093... 100% ▕█████████████████████████████████████████████████████████████████████████████████▏  182 B                         
pulling c156170b718e... 100% ▕█████████████████████████████████████████████████████████████████████████████████▏  11 KB                         
pulling f02dd72bb242... 100% ▕█████████████████████████████████████████████████████████████████████████████████▏   59 B                         
pulling 2184ab82477b... 100% ▕█████████████████████████████████████████████████████████████████████████████████▏  488 B                         
verifying sha256 digest 
writing manifest 
removing any unused layers 
success 
>>> 您好
你好!有什么可以帮助你的?

>>> 你是什么大模型
我是来自于阿里云的预训练模型,我叫通义千问。我可以回答您关于计算机科学、机器学习等领域的各种问题,也可以进行自然语言处理、聊天机器人、智能问答等任务。我的设计目的是让计算机能够像人类一样思考和解决问题。

命令解释:

ollama run 模型名称:模型规模
对话指令详解

在Ollama终端中提供了一系列指令,可以用来调整和控制对话模型:

在这里插入图片描述

/? 指令
[root@bogon ~]#  ollama run qwen2:0.5b
>>> /?
Available Commands:
  /set            Set session variables
  /show           Show model information
  /load <model>   Load a session or model
  /save <model>   Save your current session
  /clear          Clear session context
  /bye            Exit
  /?, /help       Help for a command
  /? shortcuts    Help for keyboard shortcuts

Use """ to begin a multi-line message.
/bye 指令
[root@bogon ~]#  ollama run qwen2:0.5b
>>> 您好
你好!有什么可以帮助您的吗?

>>> /bye
[root@bogon ~]# 
/show 指令
[root@bogon ~]#  ollama run qwen2:0.5b
>>> /show
Available Commands:
  /show info         查看模型的基本信息
  /show license      查看模型的许可信息
  /show modelfile    查看模型的制作源文件Modelfile
  /show parameters   查看模型的内置参数信息
  /show system       查看模型的内置Sytem信息
  /show template     查看模型的提示词模版
>>> /show info
Model details:
Family              qwen2                模型名称
Parameter Size      494.03M                模型大小
Quantization Level  Q4_0                模型量化级别
>>> /show license

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
   ............................................................
>>> /show modelfile
# Modelfile generated by "ollama show"
# To build a new Modelfile based on this, replace FROM with:
# FROM qwen2:0.5b

FROM /root/ollama/blobs/sha256-8de95da68dc485c0889c205384c24642f83ca18d089559c977ffc6a3972a71a8
TEMPLATE "{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ .Response }}<|im_end|>
"
PARAMETER stop <|im_start|>
PARAMETER stop <|im_end|>
LICENSE """
......................................................................
>>> /show parameters
Model defined parameters:
stop                           "<|im_start|>"
stop                           "<|im_end|>"
>>> /show system
No system message was specified for this model.
>>> /show template
{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ .Response }}<|im_end|>
/? shortcuts 指令
>>> /? shortcuts
Available keyboard shortcuts:
  Ctrl + a            移动到行头
  Ctrl + e            移动到行尾
   Alt + b            移动到单词左边
   Alt + f            移动到单词右边
  Ctrl + k            删除游标后面的内容
  Ctrl + u            删除游标前面的内容
  Ctrl + w            删除游标前面的单词

  Ctrl + l            清屏
  Ctrl + c            停止推理输出
  Ctrl + d            退出对话(只有在没有输入时才生效)
“”" 指令
>>> """
... 您好
... 你是什么模型?
... """ 
我是一个计算机程序,可以回答您的问题、提供信息和执行任务。请问您有什么问题或者指令想要我帮助您?
/set 指令
>>> /set
Available Commands:
  /set parameter ...     设置对话参数
  /set system <string>   设置系统角色
  /set template <string> 设置推理模版
  /set history           开启对话历史
  /set nohistory         关闭对话历史
  /set wordwrap          开启自动换行
  /set nowordwrap        关闭自动换行
  /set format json       输出JSON格式
  /set noformat          关闭格式输出
  /set verbose           开启对话统计日志
  /set quiet             关闭对话统计日志
>>> /set parameter
Available Parameters:
  /set parameter seed <int>             Random number seed
  /set parameter num_predict <int>      Max number of tokens to predict
  /set parameter top_k <int>            Pick from top k num of tokens
  /set parameter top_p <float>          Pick token based on sum of probabilities
  /set parameter num_ctx <int>          Set the context size
  /set parameter temperature <float>    Set creativity level
  /set parameter repeat_penalty <float> How strongly to penalize repetitions
  /set parameter repeat_last_n <int>    Set how far back to look for repetitions
  /set parameter num_gpu <int>          The number of layers to send to the GPU
  /set parameter stop <string> <string> ...   Set the stop parameters
Parameter Description Value Type Example Usage
num_ctx 设置上下文token大小. (默认: 2048) int num_ctx 4096
repeat_last_n 设置模型要回顾的距离以防止重复. (默认: 64, 0 = 禁用, -1 = num_ctx) int repeat_last_n 64
repeat_penalty 设置惩罚重复的强度。较高的值(例如,1.5)将更强烈地惩罚重复,而较低值(例如,0.9)会更加宽容。(默认值:1.1) float repeat_penalty 1.1
temperature 模型的温度。提高温度将使模型的答案更有创造性。(默认值:0.8) float temperature 0.7
seed 设置用于生成的随机数种子。将其设置为特定的数字将使模型为相同的提示生成相同的文本。(默认值:0) int seed 42
stop 设置停止词。当遇到这种词时,LLM将停止生成文本并返回 string stop “AI assistant:”
num_predict 生成文本时要预测的最大标记数。(默认值:128,-1 =无限生成,-2 =填充上下文) int num_predict 42
top_k 减少产生无意义的可能性。较高的值(例如100)将给出更多样化的答案,而较低的值(例如10)将更加保守。(默认值:40) int top_k 40
top_p 与Top-K合作。较高的值(例如,0.95)将导致更多样化的文本,而较低的值(例如,0.5)将产生更集中和保守的文本。(默认值:0.9) float top_p 0.9
num_gpu 设置缓存到GPU显存中的模型层数 int 自动计算

JSON格式输出

>>> /set format json
Set format to 'json' mode.
>>> 您好
{"response":"你好,欢迎光临,请问有什么我可以帮助您的吗?"}

>>> /set noformat
Disabled format.
>>> 您好
Hello! How can I assist you?

输出对话统计日志

>>> /set verbose
Set 'verbose' mode.
>>> 您好
您好!我需要您的信息,以便回答您的问题。请问您能告诉我更多关于这个主题的信息吗?

total duration:       1.642906162s                        总耗时
load duration:        3.401367ms                        加载模型数据耗时
prompt eval count:    11 token(s)                        提示词token消耗数量
prompt eval duration: 196.52ms                                提示词处理耗时
prompt eval rate:     55.97 tokens/s                提示词处理速率
eval count:           24 token(s)                        响应token消耗数量
eval duration:        1.304188s                                响应处理耗时
eval rate:            18.40 tokens/s                响应处理速率
/clear 指令

在命令行终端中对话是自带上下文记忆功能,如果要清除上下文功能,则使用/clear指令清楚上下文内容,例如:

前2个问题都关联的,在输入/clear则把前2个问题的内容给清理掉了,第3次提问时则找不到开始的上下文了。

>>> 请帮我出1道java list的单选题 
以下是一些关于Java List的单选题:

1. 在Java中,List是哪一种数据结构?
2. Java中的顺序存储方式(例如:使用数组)主要用来做什么?
3. 一个列表对象可以包含哪些类型的元素?

>>> 再出1道
以下是一些关于Java List的单选题:

4. 在Java中,List接口用于创建和操作集合。
5. Java中的顺序存储方式(如:使用数组)的主要优势有哪些?
6. 一个列表对象可以包含哪些类型?

>>> /clear
Cleared session context
>>> 在出1道
很抱歉,我无法理解您的问题。您能否提供更多的背景信息或者问题描述,以便我能更好地帮助您?
/load 指令
>>> 你是什么大模型
我是一个基于开放AI平台的模型,拥有一个强大的数学推理能力,并且在各种自然语言处理任务上都表现优秀。我可以回答您提出的问题,也可以提供与主题相关的信息和建议。如果您有任何问题或需要帮助,
请随时告诉我!

>>> /load deepseek-coder
Loading model 'deepseek-coder'
>>> 你是什么大模型
我是由中国的深度求索(DeepSeek)公司开发的编程智能助手,名为 Deepseek Coder。我主要用于解答和协助计算机科学相关的问题、问题解决方案等任务。我的设计目标是提供最全面准确的高质量服务来帮
助用户理解复杂的新技术或概念并迅速找到它们在实际应用中的实现方法或者原理所在的地方。
/save 指令
>>> /save test
Created new model 'test'

保存的模型存储在ollama的model文件中,进入下面路径即可看见模型文件test:

[root@bogon library]# pwd
/root/.ollama/models/manifests/registry.ollama.ai/library
[root@bogon library]# ls
deepseek-coder  qwen2  test

客户端命令详解

Ollama客户端还提供了系列命令,来管理本地大模型,接下来就先了解一下相关命令:

在这里插入图片描述

run 命令
ollama run MODEL[:Version] [PROMPT] [flags]
比如,运行通义千问命令:
ollama run qwen2:0.5b
ollama run qwen2
等同
ollama run qwen2:latest
[root@bogon ~]#  ollama run qwen2:0.5b 您好
您好!有什么问题我可以帮助您?

[root@bogon ~]# 
Flags:
      --format string      指定运行的模型输出格式 (比如. json)
      --insecure           使用非安全模,比如在下载模型时会忽略https的安全证书
      --keepalive string   指定模型在内存中的存活时间
      --nowordwrap         关闭单词自动换行功能
      --verbose            开启统计日志信息

例如,在启动时增加 --verbose参数,则在对话时,自动增加统计token信息:

[root@bogon ~]# ollama run qwen2:0.5b --verbose
>>> 您好
欢迎光临,我可以为您提供帮助。有什么问题或需要帮助的地方?

total duration:       1.229917477s
load duration:        3.027073ms
prompt eval count:    10 token(s)
prompt eval duration: 167.181ms
prompt eval rate:     59.82 tokens/s
eval count:           16 token(s)
eval duration:        928.995ms
eval rate:            17.22 tokens/s
show 命令
[root@bogon ~]# ollama show -h
Show information for a model

Usage:
  ollama show MODEL [flags]

Flags:
  -h, --help         查看使用帮助
      --license      查看模型的许可信息
      --modelfile    查看模型的制作源文件Modelfile
      --parameters   查看模型的内置参数信息
      --system       查看模型的内置Sytem信息
      --template     查看模型的提示词模版

例如,查看提示词模版:

[root@bogon ~]# ollama show qwen2 --template
{{ if .System }}<|im_start|>system
{{ .System }}<|im_end|>
{{ end }}{{ if .Prompt }}<|im_start|>user
{{ .Prompt }}<|im_end|>
{{ end }}<|im_start|>assistant
{{ .Response }}<|im_end|>
pull 命令

查询模型名称的网站:https://ollama.com/

ollama pull MODEL[:Version] [flags]
ollama pull qwen2
等同
ollama pull qwen2:latest
ollama pull qwen2 --insecure
list/ls 命令
[root@bogon ~]# ollama list
NAME                    ID              SIZE    MODIFIED       
qwen2:latest            e0d4e1163c58    4.4 GB  10 minutes ago  
deepseek-coder:latest   3ddd2d3fc8d2    776 MB  3 hours ago     
qwen2:0.5b              6f48b936a09f    352 MB  8 hours ago     
[root@bogon ~]# ollama ls
NAME                    ID              SIZE    MODIFIED       
qwen2:latest            e0d4e1163c58    4.4 GB  10 minutes ago  
deepseek-coder:latest   3ddd2d3fc8d2    776 MB  3 hours ago     
qwen2:0.5b              6f48b936a09f    352 MB  8 hours ago   

列表字段说明:

  • NAME:名称

  • ID:大模型唯一ID

  • SIZE:大模型大小

  • MODIFIED:本地存活时间

注意:在ollama的其它命令中,不能像docker一下使用ID或ID缩写,这里只能使用大模型全名称。

ps 命令
[root@bogon ~]# ollama ps
NAME                    ID              SIZE    PROCESSOR       UNTIL                   
deepseek-coder:latest   3ddd2d3fc8d2    1.3 GB  100% CPU        About a minute from now 

列表字段说明:

  • NAME:大模型名称

  • ID:唯一ID

  • SIZE:模型大小

  • PROCESSOR:资源占用

  • UNTIL:运行存活时长

rm 命令
[root@localhost system]# ollama ls
NAME                    ID              SIZE    MODIFIED     
qwen2:latest            e0d4e1163c58    4.4 GB  16 hours ago    
deepseek-coder:latest   3ddd2d3fc8d2    776 MB  19 hours ago    
qwen2:0.5b              6f48b936a09f    352 MB  24 hours ago    
[root@localhost system]# ollama rm qwen2:0.5b
deleted 'qwen2:0.5b'
[root@localhost system]# ollama ls
NAME                    ID              SIZE    MODIFIED     
qwen2:latest            e0d4e1163c58    4.4 GB  16 hours ago    
deepseek-coder:latest   3ddd2d3fc8d2    776 MB  19 hours ago    
[root@localhost system]# 
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐