百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

【从零开始】1. 一切从硬件升级开始

liebian365 2024-11-20 18:22 21 浏览 0 评论

一转眼 2024 就只剩下 3 个月了,回过头看看今年的“成绩单”...虽人工智能和 Python 都略有见长,但能公开的内容却非常有限(因大部分内容会与公司业务“强耦合”,数据脱敏后内容将无法自证,因此这部分内容暂时无法公开)。Java 方面,基于 Vert.x 的 vtx_fw 框架已有较长时间没有更新维护了(Github 给我的安全警告都还没修复)。另外,区块链和隐私计算方面本想 3 月做一次大规模升级的,但到现在都还没有动手...

今年实在有太多事情打乱了原有计划(干了很多事又没什么结果)。时至今日,趁着给自己的老爷机升级之际,下定决心逐步完成剩下的 “2024计划” 。

接下来“2024 计划”的所有成果将会在【从零开始】系列文章中体现。系列共分三部分:

第一部,分将从硬件升级开始到手搓 RAG 生成式人工智能结束;

第二部,分将会对 vtx_fw 框架进行重构升级;

第三部,分将会对 Hyperledger Besu 区块链进行升级并完成隐私计算核心代码的编写;

以上三部分都将会结合代码进行详解,过程遇到的问题也会详细说明(避免各位看官再次踩坑)。此外,文章中出现的代码也会同步上传到 Github ,有需要的可以自取。

好了,话不多说正式进入正题。

本章作为第一章将从升级硬件开始说起,先上一张配置图:

这台机原本是买来处理文档使用,现在要用它去搞人工智能属实有点牵强。

无奈今年赚不到钱,要重组一台高性能 PC 财力不允许,最后只能向现实低头在现有基础上进行升级。

既然后续需要做人工智能相关工作,那么算力是必不可缺的,最起码也要弄个显卡...最好还是 NVIDIA 。毕竟transformers 架构用 CUDA 做实时推理是目前最成熟的解决方案了。那么第一个问题来了,基于 H81M-K 小主板,且能与 i5-4590 CPU 相匹配的显卡有那些呢?其实可选的并不多,无非就是 750 Ti、960、1050 Ti、1060 这些,而且价格都符合心里预期(毕竟二手卡价格也就那么回事)。

那么第二个就是显存问题了,显存太少没有意义。像 750、960 这些就 Pass 掉了,剩下的就是从 1050 Ti 和1060 之间选择了。结果发现多花了 100 块就能有多 2G 的显存...于是最后入手了一张 1060,如下图:

由于 1060 还需要额外供电,靠原配电源(230w)是不够的。再咬一咬牙将电源也换一下吧,如下图:

等全部硬件支付完成后,不知为什么突然有种莫名的违和感。“我是不是漏了什么没有想清楚”这种想法一直萦绕着我,直到我看到了到货的 1060...

除了主板是小主板外,我的机箱也是小机箱(当初买的时候特意挑小机箱比较好卡位...)。这导致 1060 居然放不进去...晕死。无奈之下只好将 1060 塑料外壳剪掉一部分,如下图:

这样才能勉强放得进去

此外,由于需要预留空间给显卡,原来机械硬盘只能钉到“墙”上(拆掉开机面板,另外再买个外置开关),最后整个机箱布局是这样的,如下图:

考虑到内部散热问题在原开机面板位置增设了风扇,风向与机箱内所有风扇风向一致,如下图:

直接将空间利用率拉满。

硬件安装完毕后接下来到操作系统了。

对于这种老爷机 Windows 10 不再是首选(资源消耗严重),另外,我对界面也没有什么要求,那么 Deepin、Manjaro 等也可以放弃了。现在最需要考虑的是硬件适配和操作系统对于驱动的支持程度...这方面 Debian 系列就非常不错。但在 Debian 系谱中数用户体验最好的还得是 Linux Mint(个人认为)。

安装 Linux Mint 几乎没有遇到什么问题,而且系统升级和驱动安装都非常丝滑。这 NVIDIA 和 CUDA 驱动直接通过“驱动管理器”安装即可

安装完驱动后可以安装 Ollama 进行实时推理的测试(毕竟这显卡买的就是为了这个),如下图:

访问地址:https://github.com/ollama/ollama/releases/

在 Github Ollama 仓库中找到对应平台压缩包进行下载(由于国内“墙”的原因,不建议使用官网推荐的脚本安装,还是老老实实下载离线安装版本)

下载完成后解压,最终 ollama 执行文件存放在 ./bin 目录下,将其进行复制

sudo mv ollama /usr/local/bin/ollama

之后就可以尝试启动 ollama

yzh@yzh-mint:~/Documents$ ollama serve
Couldn't find '/home/yzh/.ollama/id_ed25519'. Generating new private key.
Your new public key is: 

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGxEab8HDq5EVKR3Ody+NiaE/VhhB0ZElMjMTCZTOknn

2024/10/22 01:17:17 routes.go:1158: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: HTTPS_PROXY: HTTP_PROXY: NO_PROXY: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0 OLLAMA_HOST:http://127.0.0.1:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_LLM_LIBRARY: OLLAMA_LOAD_TIMEOUT:5m0s OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:/home/yzh/.ollama/models OLLAMA_MULTIUSER_CACHE:false OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES: http_proxy: https_proxy: no_proxy:]"
time=2024-10-22T01:17:17.126+08:00 level=INFO source=images.go:754 msg="total blobs: 0"
time=2024-10-22T01:17:17.126+08:00 level=INFO source=images.go:761 msg="total unused blobs removed: 0"
time=2024-10-22T01:17:17.126+08:00 level=INFO source=routes.go:1205 msg="Listening on 127.0.0.1:11434 (version 0.3.14)"
time=2024-10-22T01:17:17.127+08:00 level=INFO source=common.go:135 msg="extracting embedded files" dir=/tmp/ollama2543868661/runners
time=2024-10-22T01:17:35.451+08:00 level=INFO source=common.go:49 msg="Dynamic LLM libraries" runners="[cpu cpu_avx cpu_avx2 cuda_v11 cuda_v12 rocm_v60102]"
time=2024-10-22T01:17:35.451+08:00 level=INFO source=gpu.go:221 msg="looking for compatible GPUs"
time=2024-10-22T01:17:35.452+08:00 level=WARN source=gpu.go:728 msg="unable to locate gpu dependency libraries"
time=2024-10-22T01:17:35.452+08:00 level=WARN source=gpu.go:728 msg="unable to locate gpu dependency libraries"
time=2024-10-22T01:17:35.452+08:00 level=WARN source=gpu.go:728 msg="unable to locate gpu dependency libraries"
time=2024-10-22T01:17:35.597+08:00 level=INFO source=types.go:123 msg="inference compute" id=GPU-f52987a4-8dca-da1f-c16b-2f533d3b7663 library=cuda variant=v12 compute=6.1 driver=12.4 name="NVIDIA GeForce GTX 1060 6GB" total="5.9 GiB" available="5.5 GiB"

从输出可以看出 ollama 启动时已经能够识别 1060 显卡。但由于 1060 显存只有 6G,因此这次就选择 llama 3.2:3b 进行测试。

yzh@yzh-mint:~/Documents$ ollama pull llama3.2:3b-instruct-q5_K_M
pulling manifest 
pulling 05fc42664a93... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 2.3 GB                         
pulling 966de95ca8a6... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.4 KB                         
pulling fcc5a6bec9da... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 7.7 KB                         
pulling a70ff7e570d9... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 6.0 KB                         
pulling 56bb8bd477a5... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   96 B                         
pulling e32efebd9779... 100% ▕██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  561 B                         
verifying sha256 digest 
writing manifest 
success

模型下载完成后就可以运行了,但是运行前先打开 nvtop 来监控一下显卡的运行情况

感觉响应速度还是挺快的,并且通过 nvtop 和 nvidia-smi 可知 GPU 使用率和温度都在安全范围之内(这里只做了 15 分钟的连续性测试,可能对于显卡发热情况描述并不准确,但 GPU 的使用情况还是比较稳定的)。如下图:

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.107.02             Driver Version: 550.107.02     CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce GTX 1060 6GB    Off |   00000000:01:00.0  On |                  N/A |
| 39%   46C    P8             11W /  120W |    4036MiB /   6144MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

最后再看看模型参数和每次会话 token 的生成情况

INFO [main] HTTP server listening | hostname="127.0.0.1" n_threads_http="6" port="37293" tid="123776269340672" timestamp=1729532292
time=2024-10-22T01:38:12.501+08:00 level=INFO source=server.go:621 msg="waiting for server to become available" status="llm server loading model"
...
INFO [main] model loaded | tid="123776269340672" timestamp=1729532296
time=2024-10-22T01:38:16.516+08:00 level=INFO source=server.go:626 msg="llama runner started in 4.27 seconds"
[GIN] 2024/10/22 - 01:38:16 | 200 |  4.554398356s |       127.0.0.1 | POST     "/api/generate"
[GIN] 2024/10/22 - 01:38:53 | 200 |      22.169μs |       127.0.0.1 | HEAD     "/"
[GIN] 2024/10/22 - 01:38:53 | 200 |    22.58911ms |       127.0.0.1 | POST     "/api/show"
[GIN] 2024/10/22 - 01:38:53 | 200 |   21.247098ms |       127.0.0.1 | POST     "/api/generate"
[GIN] 2024/10/22 - 01:39:36 | 200 | 10.955631799s |       127.0.0.1 | POST     "/api/chat"
[GIN] 2024/10/22 - 01:40:37 | 200 | 13.824691233s |       127.0.0.1 | POST     "/api/chat"
[GIN] 2024/10/22 - 01:41:22 | 200 | 15.508863231s |       127.0.0.1 | POST     "/api/chat"

就目前来看 llama 3.2:3b 对于我这种小显存的显卡来说还是比较友好的。

By the way...在安装系统的过程中遇到了一个小插曲 - NTFS 格式磁盘无法挂载到 Linux Mint。

因为之前系统使用的是 Windows,磁盘就顺理成章地使用了 NTFS 格式。本来这个也不是什么大事请,Linux Mint 在系统安装的时候就已经默认将 NTFS 适配驱动安装的了。但是这次的情况有点特殊死活都挂载不了,没有办法之能够使用 sudo dmesg | tail 命令进行排查,如下图:

yzh@yzh-mint:~$ sudo dmesg | tail
[sudo] password for yzh:           
[ 1992.351113] sd 4:0:0:1: [sdd] Attached SCSI disk
[ 1992.380221]  sdc: sdc1 sdc2
[ 1992.380481] sd 4:0:0:0: [sdc] Attached SCSI disk
[ 1992.923979] ntfs3: Enabled Linux POSIX ACLs support
[ 1992.923983] ntfs3: Read-only LZX/Xpress compression included
[ 1992.930243] ntfs3: sdc2: It is recommened to use chkdsk.
[ 1992.974849] EXT4-fs (sdd1): mounted filesystem e8a9dbb5-62c0-4218-92b0-e7c6eca9cca5 r/w with ordered data mode. Quota mode: none.
[ 1993.454755] ntfs3: sdc2: volume is dirty and "force" flag is not set!
[ 2215.187804] ntfs3: sdc2: It is recommened to use chkdsk.
[ 2215.382326] ntfs3: sdc2: volume is dirty and "force" flag is not set!

搜索发现这是因为 /dev/sdc2 这个 volume 被标记为 dirty 了,这时可以通过 ntfsfix 命令去修复,如下图:

yzh@yzh-mint:~$ sudo ntfsfix -d /dev/sdc2
Mounting volume... OK
Processing of $MFT and $MFTMirr completed successfully.
Checking the alternate boot sector... OK
NTFS volume version is 3.1.
NTFS partition /dev/sdc2 was processed successfully.

之后就能够顺利挂载了,估计是之前在正在做备份的时候断电引起的,真的吓出一身冷汗。

(未完待续...)

相关推荐

go语言也可以做gui,go-fltk让你做出c++级别的桌面应用

大家都知道go语言生态并没有什么好的gui开发框架,“能用”的一个手就能数的清,好用的就更是少之又少。今天为大家推荐一个go的gui库go-fltk。它是通过cgo调用了c++的fltk库,性能非常高...

旧电脑的首选系统:TinyCore!体积小+精简+速度极快,你敢安装吗

这几天老毛桃整理了几个微型Linux发行版,准备分享给大家。要知道可供我们日常使用的Linux发行版有很多,但其中的一些发行版经常会被大家忽视。其实这些微型Linux发行版是一种非常强大的创新:在一台...

codeblocks和VS2019下的fltk使用中文

在fltk中用中文有点问题。英文是这样。中文就成这个样子了。我查了查资料,说用UTF-8编码就行了。edit->Fileencoding->UTF-8然后保存文件。看下下边的编码指示确...

FLTK(Fast Light Toolkit)一个轻量级的跨平台Python GUI库

FLTK(FastLightToolkit)是一个轻量级的跨平台GUI库,特别适用于开发需要快速、高效且简单界面的应用程序。本文将介绍Python中的FLTK库,包括其特性、应用场景以及如何通过代...

中科院开源 RISC-V 处理器“香山”流片,已成功运行 Linux

IT之家1月29日消息,去年6月份,中科院大学教授、中科院计算所研究员包云岗,发布了开源高性能RISC-V处理器核心——香山。近日,包云岗在社交平台晒出图片,香山芯片已流片,回片后...

Linux 5.13内核有望合并对苹果M1处理器支持的初步代码

预计Linux5.13将初步支持苹果SiliconM1处理器,不过完整的支持工作可能还需要几年时间才能完全完成。虽然Linux已经可以在苹果SiliconM1上运行,但这需要通过一系列的补丁才能...

Ubuntu系统下COM口测试教程(ubuntu port)

1、在待测试的板上下载minicom,下载minicom有两种方法:方法一:在Ubuntu软件中心里面搜索下载方法二:按“Ctrl+Alt+T”打开终端,打开终端后输入“sudosu”回车;在下...

湖北嵌入式软件工程师培训怎么选,让自己脱颖而出

很多年轻人毕业即失业、面试总是不如意、薪酬不满意、在家躺平。“就业难”该如何应对,参加培训是否能改变自己的职业走向,在湖北,有哪些嵌入式软件工程师培训怎么选值得推荐?粤嵌科技在嵌入式培训领域有十几年经...

新阁上位机开发---10年工程师的Modbus总结

前言我算了一下,今年是我跟Modbus相识的第10年,从最开始的简单应用到协议了解,从协议开发到协议讲解,这个陪伴了10年的协议,它一直没变,变的只是我对它的理解和认识。我一直认为Modbus协议的存...

创建你的第一个可运行的嵌入式Linux系统-5

@ZHangZMo在MicrochipBuildroot中配置QT5选择Graphic配置文件增加QT5的配置修改根文件系统支持QT5修改output/target/etc/profile配置文件...

如何在Linux下给zigbee CC2530实现上位机

0、前言网友提问如下:粉丝提问项目框架汇总下这个网友的问题,其实就是实现一个网关程序,内容分为几块:下位机,通过串口与上位机相连;下位机要能够接收上位机下发的命令,并解析这些命令;下位机能够根据这些命...

Python实现串口助手 - 03串口功能实现

 串口调试助手是最核心的当然是串口数据收发与显示的功能,pzh-py-com借助的是pySerial库实现串口收发功能,今天痞子衡为大家介绍pySerial是如何在pzh-py-com发挥功能的。一、...

为什么选择UART(串口)作为调试接口,而不是I2C、SPI等其他接口

UART(通用异步收发传输器)通常被选作调试接口有以下几个原因:简单性:协议简单:UART的协议非常简单,只需设置波特率、数据位、停止位和校验位就可以进行通信。相比之下,I2C和SPI需要处理更多的通...

同一个类,不同代码,Qt 串口类QSerialPort 与各种外设通讯处理

串口通讯在各种外设通讯中是常见接口,因为各种嵌入式CPU中串口标配,工业控制中如果不够还通过各种串口芯片进行扩展。比如spi接口的W25Q128FV.对于软件而言,因为驱动接口固定,软件也相对好写,因...

嵌入式linux为什么可以通过PC上的串口去执行命令?

1、uboot(负责初始化基本硬bai件,如串口,网卡,usb口等,然du后引导系统zhi运行)2、linux系统(真正的操作系统)3、你的应用程序(基于操作系统的软件应用)当你开发板上电时,u...

取消回复欢迎 发表评论: