技术背景

大模型性能调优是一个很复杂的工程,涉及到很多细节,如果真要对模型动刀子,还需要对模型和数据集本身有非常好的理解。这里我们仅仅考虑模型加载过程中,可以优化的一些参数配置。关于DeepSeek在本地的部署,以及PageAssist插件的使用,可以参考DeepSeek合集

调优思路

一句话总结一下调优思路,如果你已经尝试过了,那么可以略过本文:

GPU内存 > 多GPU内存 > CPU > 共享内存

遵循这个逻辑,对模型的加载层数进行配置,从而达到本地性能优化的目的。

DeepSeek-R1-32B-Q4_0测试

首先尝试用命令行启动,作为一个基线:

PS A:\DeepSeek\models> ollama run deepseek-r1-32B-Q4:latest --verbose
>>> 简述拉格朗日乘子法在生物学中的应用场景。 </think> 拉格朗日乘子法是一种优化技术,用于在有约束条件下寻找函数的极值。在生物学中,该方法可以应用于以下场景: 1. **生态模型**:在研究生态系统时,可能需要在资源有限的情况下最大化物种数量或最小化灭绝风险。拉格朗日乘子法可以帮助
找到这些条件下的最优解。 2. **基因表达分析**:在基因调控网络中,优化基因表达水平以满足特定的生物目标(如蛋白质产量最大化)时,可以使用拉格朗
日乘子法来处理约束条件。 3. **资源分配问题**:例如,在种群动态模型中,如何在有限的食物资源下分配给不同物种以达到某种平衡状态,拉格朗日乘子法
可以帮助找到最优的资源分配方案。 4. **进化生物学中的适应性优化**:研究生物体在环境压力下的最佳适应策略时,可以利用拉格朗日乘子法来求解在特定约束条件
下的最优适应度。 总之,拉格朗日乘子法为生物学中涉及优化和约束的问题提供了一种有力的工具。 total duration: 54.8643183s
load duration: 16.1375ms
prompt eval count: 21 token(s)
prompt eval duration: 5.23s
prompt eval rate: 4.02 tokens/s
eval count: 241 token(s)
eval duration: 49.611s
eval rate: 4.86 tokens/s

速度大约是4.86t。默认参数下的内存占用情况如下:

PS C:\Users\dechin> ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1-32B-Q4:latest d4a2da196dc7 19 GB 23%/77% CPU/GPU 4 minutes from now

Windows平台还可以用任务管理器查看资源占用:

这里我们发现一个问题:Ollama默认的加载配置是GPU > CPU的策略。也就是说:

GPU内存 > 多GPU内存 > 共享内存 > CPU

如果说,你的本地有众多的显卡,可以完全的把模型加载到显存里面,那么毫无疑问这个策略是对的。问题就在于,现在是大语言模型有小型化、本地化的趋势,所以如何让大模型在本地有限的硬件条件下跑起来,能用,才是最关键的。我们尝试去修改参数num_gpu:

这里使用的是PageAssist来进行加载了,可以用终端查看一下资源分配的情况:

PS C:\Users\dechin> ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1-32B-Q4:latest d4a2da196dc7 20 GB 23%/77% CPU/GPU 4 minutes from now

需要提醒的是,不论是内存还是共享内存,在Ollama这里就是属于CPU那一列。虽然跟默认配置都是23%/77% CPU/GPU,但是如果我们用系统资源管理器来查看,就会发现此时没有占用共享内存:

tokens表现:

在这个配置下,tokens速度达到了6.45t,比默认配置的速度4.86t要优化了一些。再者考虑到这里显存并没有占满,所以还有优化的空间,可以再把层数拉大:

再次运行起来,我们可以看到显存资源基本上是占满了,再加大有可能报OOM错误:

tokens表现:

此时tokens速度来到了7.54,进一步优化了模型的性能。此时模型加载的比例有一点点变化:

PS C:\Users\dechin> ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1-32B-Q4:latest d4a2da196dc7 20 GB 22%/78% CPU/GPU 4 minutes from now

虽然CPU的比例只是降了1%,但是因为不涉及到共享内存的使用,性能反而得到了优化。

DeepSeek-R1-70B-Q2_K测试

其实原本以为70B-Q2K已经是我的本地可以运行的模型的极限了,所以甚至没有使用Q4_0。首先我们使用70B num_gpu=64进行测试:

此时资源的占用比例为:

PS C:\Users\dechi> ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1-70B-Q2K:latest eb199ae0e147 28 GB 45%/55% CPU/GPU 4 minutes from now

tokens表现:

这里tokens速度仅有0.28,说实话已经是一个不太能接受的性能了,不如直接用API。不过我们这里以优化性能为主要考量,继续考虑调参方向。如果设置num_gpu=56:

PS C:\Users\dechi> ollama ps
NAME ID SIZE PROCESSOR UNTIL
deepseek-r1-70B-Q2K:latest eb199ae0e147 29 GB 46%/54% CPU/GPU 4 minutes from now

比例有一点点微小的变化,但是主要还是得从资源管理器里面去查看共享内存的使用情况:

可以看到GPU内存基本占满,共享内存接近于0,这里把CPU也拉起来了:

tokens表现:

这里我们优化后的tokens性能在3.09t,说实话吐字速度勉强是可以接受的,比默认配置优化了10倍的性能。不过这里Q2_K模型的语言能力实在是有点一言难尽,建议还是使用Q4_0以上的模型。

总结概要

对于本地模型的加载来说,除了使用KTransformer等工具进行指令集层面的优化之外,还可以调整模型加载层数,做一个简单的优化。这里提供了一个num_gpu和num_ctx参数调整的策略,实测Tokens性能最大可优化10倍左右。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/share-memory.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

DeepSeek本地性能调优的更多相关文章

  1. hadoop 性能调优与运维

    hadoop 性能调优与运维 . 硬件选择 . 操作系统调优与jvm调优 . hadoop运维 硬件选择 1) hadoop运行环境 2)  原则一: 主节点可靠性要好于从节点 原则二:多路多核,高频 ...

  2. iOS-------应用性能调优的25个建议和技巧

    性能对 iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论.然而由于iOS设备的限制,有时搞好性能是一件难事.开发过程中你会有很多需要注意的 ...

  3. iOS应用性能调优建议

    本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...

  4. Java 应用性能调优实践

    Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具和思路,给出搜狗商业平台的性 ...

  5. iOS应用性能调优的25个建议和技巧

    本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/,你还可以 ...

  6. Advacned Puppet: Puppet Master性能调优

    本文是Advanced Puppet系列的第一篇:Puppet master性能调优,谈一谈如何优化和提高C/S架构下master端的性能. 故事情节往往惊人地类似:你是一名使用Puppet管理线上业 ...

  7. linux概念之性能调优

    目前,对系统进行性能调试的工具有很多,这些可以两大类:一类是标准的分析工具,即所有的UNIX都会带的分析工具: 另一类是不同厂商的UNIX所特有的性能分析工具,比如HP-UX就有自己的增值性能分析工具 ...

  8. [转]iOS应用性能调优的25个建议和技巧

    写在前面 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/ ...

  9. JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码

    本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...

  10. 成为Java GC专家(5)—Java性能调优原则

    并不是每个程序都需要调优.如果一个程序性能表现和预期一样,你不必付出额外的精力去提高它的性能.然而,在程序调试完成之后,很难马上就满足它的性能需求,于是就有了调优这项工作.无论哪种编程语言,对应用程序 ...

随机推荐

  1. arthas 通过stack 命令查看堆栈调用

    https://arthas.gitee.io/stack.html 很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 sta ...

  2. IEDA 控制台乱码解决

    1.修改idea 目录下的文件 idea64.exe.vmoptions idea.exe.vmoptions 在这个文件尾部增加 -Dfile.encoding=UTF-8 2.编辑ieda 文件配 ...

  3. Electron(1) - 快速入门

    1.前言 本节主要讲述Electron的环境搭建以及如何快速创建一个应用 官方文档 2.环境搭建 (1)安装node.js (2)创建项目目录,初始化配置文件 //进入项目目录 并在此目录打开cmd窗 ...

  4. 使用Tesseract进行图片文字识别

    Tesseract介绍 Tesseract 是一个开源的光学字符识别(OCR)引擎,最初由 HP 在 1985 年至 1995 年间开发,后来被 Google 收购并开源.Tesseract 支持多种 ...

  5. AE对象序列化

    当我们编写AE程序时,通常会遇到需要存储某个AE对象的情况,比如Layer,Element,Map,Legend,NorthArrow等等这些.举个例子说明一下:在我们编辑Featurelayer时, ...

  6. cas5配置redis

    ​POM文件加载redis依赖,重新maven clean package <dependency> <groupId>org.apereo.cas</groupId&g ...

  7. SQLServer单表无缝转换到MySQL

    场景:SQLServer 单表结构,无缝转换到MySQL 方法: 1. Navicat-右键需要导出的数据表-逆向表到模型 2. 弹出来的模型窗口里,选择 转换模型为  默认MySQL8.0 确认 3 ...

  8. Flutter ListView报错RenderBox was not laid out: RenderViewport#680c1 NEEDS-LAYOUT NEEDS-PAINT

    RenderBox was not laid out: RenderViewport#680c1 NEEDS-LAYOUT NEEDS-PAINT 使用ListView.builder()布局时,如果 ...

  9. Qt编写地图综合应用42-离线轮廓图

    一.前言 离线轮廓图使用起来,就没有在线轮廓图方便了,在线的可以直接传入名称拿到,离线的只能自己绘制了,一般需要用区域轮廓图下载器将你需要的区域下载好对应的js文件,其实就是一堆坐标点集合数组,这些数 ...

  10. JVM实战—3.JVM垃圾回收的算法和全流程

    大纲 1.JVM内存中的对象何时会被垃圾回收 2.JVM中的垃圾回收算法及各算法的优劣 3.新生代和老年代的垃圾回收算法 4.避免本应进入S区的对象直接升入老年代 5.Stop the World问题 ...