Ollama 简单使用
科技进步真快,随着AMD股价大涨,越来越多高手加入AMD阵营。最近,小编发现,大神魔改了ROCm,让580矿卡也能在本地跑大模型了。现在用如下配置的电脑跑跑大模型,CPU是七代I7,内存24G,固态硬盘120G。
Ollama安装步骤
Ollama安装步骤比较复杂。
在 GitHub 上有一个 ollama-for-amd 项目,专门用来解决使用AMD显卡进行大语言模型推理的问题。综合该项目的描述,按照以下步骤进行安装,安装的 ollama-for-amd 版本是 v0.5.4:
- 系统盘不大的用户,建议别直接点击安装。非C盘安装是在命令行执行,例如
.\OllamaSetup.exe /DIR=H:\OLLAMA
。直接安装的也可以移动到其它分区。 - 安装 AMD HIP SDK for Windows,Windows 10 & 11 -> ROCm 5.7.1,下载链接AMD-Software-PRO-Edition-23.Q4-Win10-Win11-For-HIP.exe
-
- 安装 v0.5.4 的 OllamaSetup.exe;
- 此安装包是全量安装包,安装后可以在windows上设置自动启动,在系统右下角有小图标,方便管理以及查看日志。
- 通过 OllamaSetup.exe 完成 Ollama 安装后,需要替换部分二进制文件;在 ROCmLibs-for-gfx1103-AMD780M-APU 项目中,下载需要替换的 ROCm 的相关二进制文件。我下载的是 rocblas 3.1.0 for ROCm 5.7.0 ( for Windows) 版本的 rocblas.for.gfx803.override.with.vega10.7z;
- 找到 Ollama 的安装目录,通常地址为
C:\Users\${USER}\AppData\Local\Programs\Ollama
,注意${USER}
是你实际的用户名; - 解压rocblas.for.gfx803.override.with.vega10.7z压缩文件,使用里面的
rocblas.dll
替换C:\Users\${USER}\AppData\Local\Programs\Ollama\lib\ollama\rocblas.dll
文件; - 解压rocblas.for.gfx803.override.with.vega10.7z压缩文件,使用里面的
library
文件夹,替换C:\Users\${USER}\AppData\Local\Programs\Ollama\lib\ollama\rocblas\library
文件夹;
- 找到 Ollama 的安装目录,通常地址为
- 至此,安装和修改过程结束,下面验证是否启用了GPU进行大语言模型的部署.打开 PowerShell 终端,执行
ollama serve
命令,如果能看到source=types.go:131 msg="inference compute" id=0 library=rocm variant="" compute=gfx803 driver=5.7 name="Radeon RX 580 Series" total="8.0 GiB" available="7.9 GiB"
的日志信息,基本可以确定 Ollama 可以使用 AMD 的 GPU 进行推理了
下载模型
# 下载模型
$ ollama pull deepseek-r1:7b
# 查看版本信息
$ ollama --version
ollama version is 0.3.2-0-g63a5f50
# 查看本地模型列表
$ ollama list
# 简单输出
ollama run deepseek-r1:7b
# 详细输出
ollama run deepseek-r1:7b --verbose
模型使用
判断质数
以下是一段可以判断100以内的质数的JavaScript代码:
function isPrime(num) {
if (num <= 1) return false;
if (num === 2) return true; // 2是质数
if (num % 2 === 0) return false; // 偶数大于2不是质数
const limit = Math.sqrt(num);
for (let i = 3; i <= limit; i += 2) { // 只检查奇数
if (num % i === 0) {
return false;
}
}
return true;
}
console.log(isPrime(5)); // 输出:true(5是质数)
console.log(isPrime(9)); // 输出:false(9不是质数,因为3×3=9)
代码解释:
isPrime
函数接受一个数字参数num
。- 首先判断
num
是否小于等于1,如果是则返回false
。 - 如果
num
是2,则直接返回true
(2是最小的质数)。 - 接着检查
num
是否为偶数(除了2之外),如果是则返回false
。 - 计算
num
的平方根,作为循环上限。这样可以减少需要判断的次数。 - 从3开始,每隔一个数(奇数)进行判断,如果能被
i
整除,则返回false
。 - 如果所有检查都通过,则返回
true
。
你可以使用这段代码来判断100以内的任意数字是否是质数。例如:
isPrime(5)
返回true
isPrime(9)
返回false
isPrime(23)
返回true
判断完全数
>>> 请写一段JS代码,判断一个数是否是完全数。
>>> <think>
>>> 好的,我现在需要帮用户写一段JavaScript代码来判断一个数是否是完全数。首先,我得明确什么是完全数。完全数是指所有真因数(除了自身)之和等于它本身的数字。
那我可以从头开始想这个问题。首先,我需要找出一个数的所有真因数,也就是小于该数且能整除它的数。然后把这些因数加起来,看看总和是否等于原数。
具体来说,步骤如下:
- 对于给定的数n,找到所有小于n的正整数i,使得i能整除n。
- 将这些i相加得到总和sum。
- 比较sum是否等于n。如果相等,则是完全数;否则不是。
接下来,我需要把这个思路转化为JavaScript代码。首先,我会写一个函数isPerfectNumber来判断一个数是否是完全数。这个函数接受一个参数num,并返回布尔值。
在函数内部:
- 使用一个循环从1遍历到num-1。
- 对于每个i,检查num能否被i整除(即num % i === 0)。
- 如果能,则将i加到sum上。
- 最后比较sum是否等于num。如果是,则返回true;否则返回false。
然后,在主函数中,我可以调用isPerfectNumber来判断具体的数字,并输出结果。例如:
console.log(isPerfectNumber(6)); // 输出:true
console.log(isPerfectNumber(8128)); // 输出:true
console.log(isPerfectNumber(496)); // 输出:true
console.log(isPerfectNumber(5000)); // 输出:false
这样,用户就可以通过简单的调用来测试不同的数字是否为完全数了。此外,考虑到性能问题,我可以考虑优化因数查找的范围。实际上,寻找因数只需要遍历到num的一半(num / 2)以减少计算量。
同时,为了提高效率,可以进一步优化循环的上限为Math.sqrt(num),因为大于平方根的因数都会对应一个小于平方根的因数。但这里我先保持简单的实现,以便理解基础逻辑。
最后,测试一下代码是否正确:
- 对于6来说,真因数有1、2、3,总和是6,所以返回true。
- 对于8128和496,这些都是已知的完全数。
- 对于5000,其真因数之和不等于5000,因此返回false。
这样,整个逻辑就完成了。用户如果需要更大的优化或更高效的算法,我可以进一步改进代码,例如使用预先筛选的方法来预计算部分因数等。
</think>
当然可以!以下是判断一个数是否为完全数的JavaScript代码:
function isPerfectNumber(num) {
if (num <= 1) return false;
let sum = 1; // 1是所有数的真因数之和
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) {
sum += i;
if (i !== num / i) {
sum += num / i;
}
}
}
return sum === num && num !== 1;
}
// 测试用例
console.log(isPerfectNumber(6)); // 输出:true
console.log(isPerfectNumber(28)); // 输出:true
console.log(isPerfectNumber(496)); // 输出:true
console.log(isPerfectNumber(5000)); // 输出:false
这段代码的逻辑如下:
isPerfectNumber
函数接受一个参数num
,并检查它是否是完全数。- 首先排除小于等于1的数字,因为它们不是完全数。
- 初始化
sum
为1,因为所有数都至少有一个真因数1。 - 循环从2到
num
的平方根(使用Math.sqrt(num)
)遍历。 - 对于每个
i
,检查是否是num
的因数。如果是,则将i
和对应的另一个因数num/i
加到sum
中。 - 需要确保
i
和num/i
不相同(避免重复添加平方根的情况)。 - 最后判断
sum
是否等于num
,并且num
不是1。
这样可以高效地判断一个数是否为完全数。
total duration: 4m0.5339922s
load duration: 18.245ms
prompt eval count: 559 token(s)
prompt eval duration: 1.665148s
prompt eval rate: 335.71 tokens/s
eval count: 960 token(s)
eval duration: 3m58.828585s
eval rate: 4.02 tokens/s
逻辑题——老虎为什么可以在天上飞,不在地上走
根据以上思考过程,可以得出以下逐步的结论和答案:
-
确认问题:明确问题的核心是“老虎为什么可以在天上飞,不在地上走?”。
-
了解老虎的基本特征:老虎属于猫科动物,陆地生,没有翅膀,无法飞翔。
-
分析可能的原因:
- 混淆其他飞行动物(如 Hawk)与老虎。
- 文化或艺术中的象征和想象。
- 语言上的误解或错觉。
-
生理结构的限制:缺乏翅膀和其他飞行器官,无法进行空中飞行。
-
进化适应性:演化为了陆地活动,适合捕猎和生存于森林中。
-
物理限制:在地球自然环境中,没有足够的空气动力学支持来飞行。
-
文化与艺术的影响:可能在某些艺术作品或神话中描绘老虎具有飞行能力,用于象征或其他目的。
-
总结:如果问题基于现实生物学事实,则答案是老虎无法飞翔。若涉及艺术或超自然想象,则需要具体上下文解释。
-
延伸思考:如果有超自然的飞行能力,可能涉及科幻或外星科技等概念。
-
最终答案:根据自然界的事实,老虎是陆地上的大型猫科动物,没有翅膀,因此无法飞翔。问题中的描述可能是基于误
解、艺术想象或其他特定语境下的比喻。
total duration: 2m7.2153989s
load duration: 17.8207ms
prompt eval count: 13 token(s)
prompt eval duration: 5.25608s
prompt eval rate: 2.47 tokens/s
eval count: 1068 token(s)
eval duration: 2m1.940593s
eval rate: 8.76 tokens/s
判断题——蓝牙坏了是要去看牙科,还是眼科
蓝牙坏了是指设备连接问题,与牙科和眼科没有直接关系。如果您需要去看牙科医生或眼科医生,应是因为牙齿或眼睛出现相关
问题。如果您的蓝牙设备出现问题,请联系制造商或技术支持获取帮助。
total duration: 49.6947238s
load duration: 17.3549ms
prompt eval count: 12 token(s)
prompt eval duration: 5.284984s
prompt eval rate: 2.27 tokens/s
eval count: 434 token(s)
eval duration: 44.39124s
eval rate: 9.78 tokens/s
称重问题
>>> 一共有12个一样的小球,其中只有一个重量与其他的小球不一样(未知重量),给你一个天平,只称三次,找出重量不同的小球。
<think>
首先,将12个小球分成三组,每组4个。
第一次称量时,将第一组和第二组放在天平的两边进行比较。
如果天平平衡,则重量不同的小球在第三组中,并进一步分成两组各有两个小球进行第二次称量。
继续比较这两个小球,找出重量不同的那个。
如果不平衡,较重或较轻的一侧含有不同重量的小球,将三个可能的小球与已知正常的小球进行第二次称量以确定具体是哪一个。
</think>
要从12个重量相同的乒乓球中找到一个重量不同的乒乓球,并只用三次称量来完成,请按照以下步骤操作:
步骤一:第一次称量
-
将12个小球分成三组,每组4个。
- 组A:小球1、小球2、小球3、小球4
- 组B:小球5、小球6、小球7、小球8
- 组C:小球9、小球10、小球11、小球12
-
将组A和组B放在天平的两边进行比较。
-
如果天平平衡:
- 重量不同的小球在组C中。
-
如果不平衡(假设组A较轻):
- 重量不同的小球在组A或组B中,且比正常球轻。具体是在组A中有轻球还是在组B中有重球。
步骤二:第二次称量
根据第一次的结果:
-
如果第一次平衡:
- 将组C中的小球9、10与组A中的小球1、2进行比较。
- 如果天平平衡,则重量不同的小球在11或12中,继续将它们单独称量。
- 如果天平不平衡,则较轻的一边即为重量不同的小球。
- 将组C中的小球9、10与组A中的小球1、2进行比较。
-
如果不平衡(假设第一次称量组A较轻):
- 将组A中的小球1、2、3与组B中的小球5、6、7进行比较。
- 如果天平平衡,重量不同的小球在组A的4号或组B的8号中。接下来将它们单独称量以确定具体是哪一个。
- 如果天平仍然不平衡,较轻的一边有重量不同的小球。
- 将组A中的小球1、2、3与组B中的小球5、6、7进行比较。
步骤三:第三次称量
根据第二次的结果:
-
如果在第二次已经确定了是单个异常小球:
- 将该小球与正常球进行比较,即可确定它是比正常球轻还是重。
-
如果需要进一步确定(例如第一次平衡时组C中没有明确结果):
- 取出已知正常的小球(如组A或组B中的任意一个),将其中一个异常候选小球与之比较。
- 如果天平不平衡,即可确定该小球的重量是否不同。
- 取出已知正常的小球(如组A或组B中的任意一个),将其中一个异常候选小球与之比较。
通过以上步骤,三次称量便能准确找出重量不同的小球。
最终答案
\boxed{12个小球中找到重量不同的那个需要三次称量。}
total duration: 1m23.4061786s
load duration: 17.2863ms
prompt eval count: 38 token(s)
prompt eval duration: 13.516655s
prompt eval rate: 2.81 tokens/s
eval count: 674 token(s)
eval duration: 1m9.871663s
eval rate: 9.65 tokens/s
其它
启动如果报错,等一会再运行,或者重启一下电脑即可。
Error: llama runner process has terminated: exit status 0xc0000005
参考资料
AMD RX580 AI部署记录:Ollama
AMD显卡救星!RX580也能流畅跑AI大模型 - Ollama+Deepseek本地部署实战
AMD RX580-ollama显卡调用方案
关于ollama非C盘安装以及模型非C盘存放方式