在Intel平台上跑LLM的尝试

最近LLM(大语言模型)发展日新月异。抽空研究了一下在本地跑LLM的可行性。

如果我有一张Nvidia显卡,那么一切都会十分顺利。不巧地是我只有一个Intel处理器(Lunar Lake)和它自带的Intel Arc 140V核显。这个处理器还自带了一个“神经处理单元”(NPU),说是有40+ TFlops 的算力,结果根本没有什么软件支持,白白躺在硅片上浪费面积。

这就是所谓的 Copilot+ “AI计算机”。我问了ChatGPT,它回答我说这纯粹就是营销噱头。切记:产品再美好,没有生态的支持全是白费。

NPU先不管了。理论上讲,核显也是显卡,应该也可以用来加速LLM。我做了一些尝试,但是没有找到满意的答案。

  • Ollama官方发布版本只能跑在CPU上。
    • Intel的IPEX-LLM项目有一个支持硬件加速的Ollama,但是有很多问题。
  • Jan也只能跑在CPU上。
  • LM Studio目前有一个基于Vulkan的后端,可以跑在GPU上。这是目前我能找到的最好方案了。

这些项目都是基于llama.cpp。既然IPEX-LLM可以做硬件加速,那么它们应该都可以。可惜目前Intel的技术栈实在太不成熟了,所以支持很有限。

LM Studio 方案

LM Studio 用起来是最简单的。安装后直接下载想要运行的模型即可。我尝试过下面几个模型:

LM Studio 的开发者可以设置一个API端口,和OpenAI的API兼容。这样就可以让别的前端也使用它了。

Open WebUI 前端

Open WebUI是一个LLM聊天工具的前端,做的有点像ChatGPT。它要结合LLM后端(引擎)使用,支持Ollama和OpenAI API。

因为LM Studio可以作为OpenAI API的服务端。我可以把LM Studio和Open WebUI结合起来用。从我的体验来看Open WebUI的用户体验远远超过LM Studio, Jan等等。前端工程师花了不少心血。

令人意外的是,Open WebUI支持“联网搜索”功能(和ChatGPT的搜索功能类似)。需要一个搜索引擎后端(可以用Google的CSE Service。个人用户每天有10000次的搜索额度)。我觉得它的原理是通过一些特殊的提示词让LLM生成搜索关键词,联网搜索之后,把搜到的网页结果反馈给LLM,让它生成回答。理想很丰满,但是现实情况是我在本地跑的LLM太慢(生成提示词和总结内容耗时过长),且受内存容量限制,处理大量搜索结果时会出错,用户得到一个空的回复,体验极差。即使一切顺利,大概也需要几分钟才能得到结果。

IPEX-LLM Ollama

这个方案原本是最理想的,因为Intel的官方实现应该对Intel的设备做了优化,兼容性和性能都应该更好。但是Intel发布的软件有非常多的问题。

目前为止,最新的版本是 2.3.0-nightly。我试过:

  • ollama-ipex-llm-2.3.0b20250429-win.zip - 不能正常运行,因为程序参数传递有问题(传了一个不存在的-ngl参数)。
  • ollama-ipex-llm-2.3.0b20250415-win.zip - 可以运行,但是有很多模型不支持(如Gemma3, Phi4)。跑支持的模型时,有时会在 llama.cpp 的 SYCL 后端里报错,导致得不到结果。

现在已经是2025年了,生态落后,会造成整个平台被人抛弃。Intel的软件团队要好好反思。

不过我看 IPEX-LLM 这个软件仓库的更新还算比较频繁。我可以过几个月再回来看看有没有进展。

和本地LLM的对话

以下对话来自Phi 4 Mini Reasoning。问题是:


已知大于1的整数a,b,c满足abc=40。正数x,y,z满足ax+by+cz=1。那么a^3/x+b^3/y+c^3/z的最小值是多少?


回答是:


已思考4分37秒

嗯,好的,我现在要解决的问题是:给定大于1的整数a,b,c满足abc=40。然后有一些正数x,y,z满足ax + by + cz = 1。那么,我们需要找到a³/x + b³/y + c³/z的最小值是多少。这个问题看起来像是一个优化问题,可能需要用到不等式,比如柯西-施瓦茨不等式或者其他类型的不等式。我得仔细分析一下。

首先,题目中给出的条件有三个:a,b,c都是大于1的整数,且它们的乘积abc=40。接着x,y,z是正数,满足ax + by + cz = 1。目标函数是求a³/x + b³/y + c³/z的最小值。我的任务就是找到这个最小值。

首先,我应该考虑可能的a,b,c的组合,因为它们都是大于1的整数,乘积为40。所以我要先找出所有满足条件的三个整数的组合,然后分别分析每一种情况,再确定哪种情况下目标函数取得最小值。不过,也有可能不用穷举法,而是找到一个一般性的解法,通过不等式来求解。

首先,列举a,b,c的可能组合。因为都是大于1的整数,所以可能的因数分解需要考虑40的三因数分解。40=2³×5。所以可能的三个数a,b,c的组合有:

  1. 1,1,40:但题目中说都是大于1的整数,所以排除。
  2. 1,2,20:同样包含1,排除。
  3. 1,4,10:同样不行。
  4. 1,5,8:同样有1,不行。 接下来考虑没有1的情况: 可能的组合需要三个数都大于1,所以乘积为40。可能的分解方式:
  • 2×2×10=40
  • 2×4×5=40
  • 5×4×2=40(这其实和上面的一样)
  • 其他可能的吗?比如3的话,但40不能被3整除,所以不行。所以可能的组合只有两种:{2,2,10} 和 {2,4,5}。

所以a,b,c只能是这两个组合中的一种,或者不同的排列组合。不过,因为题目中没有规定顺序,所以不同的排列可能会对结果有影响吗?比如,对于目标函数来说,不同的排列是否会导致不同的最小值呢?我需要进一步分析。

接下来,我需要分别考虑这两种情况,然后看看哪一种情况下目标函数a³/x + b³/y + c³/z的最小值更小。不过,也可能还有其他的方法,比如使用不等式来处理,而无需具体确定a,b,c的值,但这里因为a,b,c是给定的整数,且乘积固定,所以可能需要结合具体数值进行计算。

首先考虑第一种情况:{2,2,10}。假设a=2,b=2,c=10。那么它们的乘积是2×2×10=40,符合条件。这时候,需要求的是2³/x + 2³/y +10³/z =8/x +8/y +1000/z,其中x,y,z都是正数,并且满足2x +2y +10z=1。不过这里出现矛盾,因为a,b,c都大于1,而ax+by+cz=1,这里每个项都是正数,所以比如当a=2,b=2,c=10时,每个项至少是2* x, 2y, 10z,但它们的和等于1。然而,如果x,y,z都是正数的话,那么每个乘积ax、by、cz都会大于0,而它们的和等于1。但因为a,b,c都是至少2,所以比如ax=2x ≤1 → x≤0.5,同理y≤0.5,z≤0.01。这时候目标函数中的每一项都是8/x, 8/y, 1000/z,这些项就会非常大,比如当x接近0的时候,8/x趋向于无穷大,所以这样的情况下目标函数的值可能很大。因此这可能不是最小值。

不过可能我哪里错了?因为题目中说a,b,c都是大于1的整数,但ax + by + cz=1,而每个项都是正数,那是否存在这样的x,y,z呢?

比如,对于情况{2,2,10},即a=2,b=2,c=10,那么方程是2x + 2y +10z =1,其中x,y,z>0。这时候,每个变量都必须满足非负,并且和为正。因此,例如,如果设x=y=ε(非常小的正数),那么10z≈1 → z≈0.1,这样目标函数中的8/x ≈8/(ε) 和 8/y≈8/ε,以及1000/z≈10000/(0.1)=100000,所以总和会很大,不管怎么选择x,y,z,这时候的最小值可能并不存在,或者说需要满足某种约束条件?

但题目中说“正数x,y,z满足ax+by+cz=1”,所以是否存在这样的解呢?例如,当a,b,c都是较大的整数时,是否会导致方程没有解?比如,在这个例子中,如果a=2,b=2,c=10,那么最小可能的ax+by+cz是当x,y,z趋近于0时,但此时它们必须满足非负且和为1,所以理论上只要存在这样的x,y,z即可,只要他们足够小。例如,当x=y=z接近某个值,使得2x + 2y +10z=1,例如,设x = y = t,那么方程变为4t +10z=1 → z=(1-4t)/10. 因为z必须大于0,所以1-4t>0→t<0.25。然后目标函数是8/x +8/y +1000/z = 16/t +1000/((1-4t)/10) =16/t +10000/(1-4t)。这时候,当t趋近于0时,16/t趋向于无穷大,而10000/(1-4t)≈10000,因为分母接近1。所以当t趋近于0时,总和也会趋向于正数的无穷大。而当t增大时,比如t=0.02,那么z=(1-0.08)/10=0.92/10=0.092,此时目标函数是16/0.02 +10000/(0.92)≈800 +10869.565≈11669.565,这仍然很大。因此,可能在这种情况下,最小值并不存在或者非常大,但题目中要求的是“正数x,y,z满足ax+by+cz=1”,所以这样的解是存在的,但是目标函数可能趋向于无穷大,因此这时候的最小值可能不会成立?

但显然,这里有问题,因为如果对于某些a,b,c的组合,方程ax + by + cz =1在x,y,z>0时没有解,那么对应的情况就不存在,所以必须排除这些组合。不过根据题目中的条件,大于1的整数a,b,c乘积为40,并且存在正数x,y,z满足ax+by+cz=1,这时候是否可能?

例如,当a,b,c取较大的值,比如c=10,a=b=2时,那么最大的项是10z,而其他两个项是2x和2y,因此为了使得总和不超过1,必须有z ≤0.1,同时x和y都≤0.5。因此存在这样的解,所以这个情况是允许的,但目标函数可能很大。

接下来考虑第二种组合{2,4,5},即a=2,b=4,c=5。乘积为40。这时候方程是2x +4y +5z =1,其中x,y,z>0。同样,每个变量必须满足非负,并且和为1。例如,当x=y=z接近某个值时,但需要满足2x +4y +5z=1,这可能比较困难,因为三个变量相加要等于1,而每个系数都大于1,所以至少有一个变量必须非常小,甚至趋近于0。但这时候目标函数中的项会是8/x, 64/y, 125/z,当这些变量趋近于0时,对应的分式可能趋向于无穷大。因此,这种情况下也存在问题,即是否存在这样的解使得目标函数有最小值?

但题目中说“正数x,y,z满足ax+by+cz=1”,所以只要存在这样的x,y,z即可,但需要找到它们的最小可能的a³/x + b³/y + c³/z。这时候,或许可以用不等式来求解,比如柯西-施瓦茨不等式或者Cauchy-Schwarz不等式。

让我回忆一下:对于满足kx + ky = constant的情况下,不等式可能适用,但这里有三个变量和三个方程,所以可能需要不同的方法。例如,考虑使用拉格朗日乘数法来求最小值。目标函数是f(x,y,z)=a³/x + b³/y + c³/z,而约束条件是g(x,y,z)=ax + by + cz -1=0。

构造拉格朗日函数L = a³/x + b³/y + c³/z - λ(ax + by + cz -1)

然后对x、y、z求偏导,并令其等于零:

∂L/∂x = -a³/x² - λa = 0 → -a³/x² = λ a → λ = -a² / x²

同理,

∂L/∂y = -b³/y² - λ b = 0 → λ = -b² / y²

∂L/∂z = -c³/z² - λ c = 0 → λ = -c² / z²

因此,由这三个方程可得:

-a²/x² = -b²/y² = -c²/z² → a²/x² = b²/y² = c²/z² → x = a y / b = (a/b) y,x = a/c z / ?

等式应该是:a²/x² = b²/y² ⇒ y = b x /a,同理,a²/x² = c²/z² ⇒ z = c x /a.

所以,可以用比例关系来表达x,y,z之间的关系。例如,设y = (b/a)x,那么z = (c/a)x。将这些代入约束方程ax + by + cz =1:

ax + b*(b/a)x + c*(c/a)x = 1 → ax [1 + (b²)/a² + (c²)/a²] =1 → a x [ (a² + b² + c²)/a² ] =1 → x * (a² + b² + c²)/a =1 → x= a / (a² + b² + c² )

同理,y= (b/a)x = (b/a)*(a/(a² + b² + c²)) )= b/(a² + b² + c² )

z= (c/a)x = c/(a² + b² + c² )

这样代入目标函数:

a³/x + b³/y + c³/z = a³ / [a/(S)] + b³/[b/S] + c³/[c/S] ],其中S = a² + b² + c².

计算每一项:

a³ / (a/S) )= a³ * S/a = a² S

同理,第二项是 b² S,第三项是 c² S,因此总和为 S(a² + b² + c² ) = S^2.

所以,当约束条件ax + by + cz =1下,目标函数a³/x + b³/y + c³/z的最小值为S²,即(a² + b² + c²)^2,其中S = a² + b² + c²。

不过,这里需要注意的是,这是通过拉格朗日乘数法得到的条件,当且仅当约束条件和目标函数满足某些可行条件,比如x,y,z>0。这时候,我们得出在这个情况下,最小值是(a² + b² + c²)^2。不过,我需要验证这个结果是否正确,以及是否适用于所有情况。

例如,对于第二种情况{2,4,5},那么a=2,b=4,c=5,那么S = 4 + 16 +25 =45,所以最小值是45²=2025。这时候对应的x,y,z为:

x= a/S =2/45 ≈0.0444,

y= b/S=4/45≈0.0889,

z= c/S=5/45≈0.1111.

然后检查约束条件:2*(2/45) +4*(4/45)+5*(5/45)= (4 +16 +25)/45 =45/45=1,符合条件。

而目标函数值为:

8/(2/45) +64/(4/45) +125/(5/45)= 8*(45/2) +64*(45/4) +125*(45/5)= (822.5)+(6411.25)+(125*9)=180 +720 +1125=2025,确实符合结果。

同样,对于第一种情况{2,2,10},S =4 +4 +100=108,所以最小值为108²=11664。这时候x=2/108≈0.0185,y=2/108≈0.0185,z=10/108≈0.0926。代入约束条件:2*(2/108) +2*(2/108)+10*(10/108)= (4 +4 +100)/108=108/108=1。目标函数值为:

8/(2/108) +8/(2/108)+1000/(10/108)= 8*(54) +854 +1000(10.8)=432+432+10800=11664,同样正确。

所以,这说明无论a,b,c的组合如何,只要满足条件,最小值都是(a² + b² + c²)^2。因此,对于这个问题,不管a,b,c具体是什么,只要abc=40且是大于1的整数,那么对应的最小值就是(a² + b² + c²)^2。但是题目可能需要根据不同的a,b,c组合计算不同的结果,然后比较哪一个更小。不过,根据前面的例子,当{2,4,5}时,S=45,所以最小值是2025,而当{2,2,10}时,S=108,最小值为11664。显然,2025比11664小很多,因此正确的答案应该是2025,对应的是组合{2,4,5}。

不过,我需要确认是否存在其他可能的a,b,c的组合。例如,之前我列出的可能的组合只有两种:{2,2,10}和{2,4,5}。有没有遗漏的?

再仔细检查一遍40的三因数分解:

由于a,b,c都是大于1的整数,所以每个至少是2。那么,三个数相乘等于40,所以可能的组合应该满足:

考虑分解方式:

40=2×2×10

40=2×4×5

是否有其他可能?例如,3不行,因为40除以3不是整数。5的话,如果其中一个数为5,那么另外两个数需要乘积8,即1和8,但都必须大于1,所以不存在。因此只有这两种组合。

因此,对于这两种情况,对应的最小值分别是11664和2025,其中较小的是2025。所以答案应该是2025。

不过,我需要确认是否存在其他可能的a,b,c组合,比如不同的排列顺序,例如{2,5,4},或者{4,2,5}等,但由于目标函数中的每个项都是关于各自变量的立方,所以无论顺序如何,总和都是一样的,因此不管怎么排列,这两个组合对应的最小值分别是11664和2025,其中较小的是2025。

因此,问题所求的答案应该是2025,即当a=2,b=4,c=5时取得这个最小值,对应的(a² + b² + c²)^2=45²=2025。

不过,我需要再次确认是否所有可能的组合都被考虑到了。例如,有没有其他三个数大于1,乘积为40的情况?

比如,有没有可能是3, 其中一个数,但3×什么等于40?显然不行,因为40除以3不是整数。所以确实只有两种分解方式。

因此,最终答案应该是2025,对应的组合{2,4,5},即a=2,b=4,c=5时取得最小值2025。

已知大于1的整数\(a, b, c\)满足\(abc = 40\),且正数\(x, y, z\)满足\(ax + by + cz = 1\)。需要求函数\( \frac{a^3}{x} + \frac{b^3}{y} + \frac{c^3}{z} \)的最小值。

分析步骤:

  1. 确定\(a, b, c\)的可能组合:

    • 由于\(a, b, c > 1\)且乘积为40,可能的三因数分解有:
      • \(2 \times 2 \times 10 = 40\)
      • \(2 \times 4 \times 5 = 40\)
  2. 应用拉格朗日乘数法求最小值:

    • 构造拉格朗日函数,利用约束条件\(ax + by + cz = 1\)和目标函数\(f(x, y, z) = \frac{a^3}{x} + \frac{b^3}{y} + \frac{c^3}{z}\),通过偏导并求解得:
      • \(x = \frac{a}{S}\), \(y = \frac{b}{S}\), \(z = \frac{c}{S}\),其中\(S = a^2 + b^2 + c^2\)
    • 代入目标函数,最小值为: \[ f_{\text{min}} = S^2 = (a^2 + b^2 + c^2)^2 \]
  3. 计算具体组合的结果:

    • 对于\(a=2, b=4, c=5\),计算得:
      • \(S = 2^2 + 4^2 + 5^2 = 45\)
      • 最小值为\(45^2 = 2025\)
    • 对于\(a=2, b=2, c=10\),计算得:
      • \(S = 2^2 + 2^2 + 10^2 = 108\)
      • 最小值为\(108^2 = 11664\)
  4. 比较结果并确定最小值:

    • 两种组合中,\(2025 < 11664\),故最小值为2025。

答案:

\[\boxed{2025}\]


共计输出4282个token,首个token延迟1.55s,输出速度13.23 token/s。可见这个速度并不快,不过我这可是一个只有核显的、1kg多一点的笔记本电脑而已,能跑出这样的结果已经很满意了。

上面这个数学问题,用Qwen3也能得到同样的结果,不过它用的是柯西-施瓦茨不等式,看来14B的模型还是要更聪明一点😄。


分享