Linux

在Jetson Orin Nano上基于Ollama私有化部署OpenClaw

媳妇工作需要调研AI,尤其OpenClaw在工作场景中的应用。不少帖子建议买个Mac Mini小巧省电24小时待机,我手头正好有个闲置的Nvidia Jetson Orin Nano 开发板,性能也强的很67 TOPS,打算拿来用作本地部署的载体。在此记录一下过程,小伙伴有闲置Jetson也可以参考一下利用起来。 对于一个新拿到手的Jetson Orin Nano Developer Kit,官方的NVIDIA SDK Manaer真是好使用,媲美树莓派的官方系统烧录工具,基本上就说鼠标点点点就行了。如果硬盘足够的话建议在工具页面将所有的依赖都一次性都勾上都安装好,省的系统装好后再费劲解决CUDA、cuCNN等依赖。 系统装好后,插上网线,从路由器端找一下IP,登录就可以开始装OpenClaw和基于Ollama的本地大模型了。先使用Ollama本地部署大模型,目前Ollama已经给Jetson适配过了从而调用GPU,如果看脚本中也可以看到对于Jetson使用的是Jetpack的环境而不是自己装的CUDA环境,直接运行就OK: curl -fsSL https://ollama.com/install.sh | sh 从安装进度可以看到过程中下载安装了Jeston独有的一些库: jetson@ubuntu:~$ curl -fsSL https://ollama.com/install.sh | sh >>> Cleaning up old version at /usr/local/lib/ollama >>> Installing ollama to /usr/local >>> Downloading ollama-linux-arm64.tar.zst ######################################################################## 100.0% >>> Downloading ollama-linux-arm64-jetpack6.tar.zst ######################################################################## 100.0% >>> Creating ollama user… >>> Adding […]

在Jetson Orin Nano上基于Ollama私有化部署OpenClaw Read More »

Jetson Orin Nano安装Pytorch CUDA环境

最近在学习大模型在机器人上边的应用,想着通过一个能够自己设备训练的模型以及Jetson来体验一遍整个模型从训练到部署的全流程。前期都是在一台高性能工作站上边学习的,X86下对于配置环境以及解决依赖等问题相对还是好解决的,毕竟用户基数大。多数情况遇到的一些运行问题,结合大模型以及Github的评论区,很快就有解决方案的。之前了解到Jetson是英伟达自己出的产品,CUDA环境方面应该不是啥大问题,可事实真的很打脸,在我将模型训练摸索差不多,在服务器可以稳定运行后,打算挪到Jetson上边运行过程中真的费了好大的劲。于是我记录一下,说不定有其他朋友遇到同样的问题。 我拿来学习的是SmolVLA这个机器人大模型,使用的是最最常用的Pytorch框架,这个在Jetson上安装CPU版本很顺利,基本上从pip或者conda直接安装都OK,关键在对于Jetson的CUDA加速版本的Pytorch,由于是ARM架构而不是常见的X86, pip及conda库默认是没有的。想完全按照大模型指导推荐的版本安装几乎是不可能,我摸索了几天终于是找到了行得通的解决方案。 首先安装Jetson 平台专用的软件开发套件(SDK),通过这个过程可以装上绝大多的依赖库: sudo apt install nvidia-jetpack 然后通过命令检查当下的CUDA版本: nvidia-smi 最后在半官方的论坛安装编译好的适配Jetson ARM架构的Pytorch以及Torchvision包: pip install torch torchvision –index-url https://pypi.jetson-ai-lab.io/jp6/cu126 在上边步骤完成后,Python导入torch会提示有一个cuDSS相关的动态链接库找不到,从Nvidia官方论坛下载: https://developer.nvidia.com/cudss-downloads 至此已经可以在Jetson上使用CUDA加速版本的Torch来运行模型了。总结下来简单的几步,但是卡了我好几天,反思下来就说对大模型太过于依赖,甚至是过于信任大模型实时网页搜索的能力。可能是由于Jetson资源相对较少,被多数X86环境配置帖子稀释的原因,大模型给的绝大多数链接都是不能用的,要不货不对板好不失效。并且解决方向也有问题,遇到Pytorch 2.6找不到就推荐降级,而低版本的ARM版本CUDA Torch Torchvision也全网很难找到资源。可能Torch还好,对于Torchvision编译好的wheel包真的很少很少。在我找到https://pypi.jetson-ai-lab.io/jp6/ 半官方的资源站后,提供的是最新版Pytorch 2.10版本,安装后提示缺cuDSS相关的包,此时大模型给出的强烈建议是不要用最新的2.10版本torch,说唯一可行的就说用旧版本,因为2.10太新了缺乏的包绝大多数情况需要自己编译,这个在jetson本身条件下几乎不可能。我被说服了用了一整天时间找旧版本的包,真是找不到。没辙我去到了Nvidia官网看论坛,想着是这么常见的问题,不应该只有我遇到。果然翻了几个帖子就看到Nvidia官网已经提供了最新的cuDSS编译好的安装包。 想在这里感慨以下就是大模型用多了对于搜索引擎的使用能力都快倒退了。很多时候大模型对于网络资源搜索很有限,搜出来结果很肤浅,并且一些论坛似乎对于大模型也不友好,很多搜不到或者说需要登陆才能查看。对于一些相对小众的领域,感觉逛论坛寻找解决方案还是必不可少的,大模型并不是每个细枝末节都是专家,尤其涉及软硬件结合的,感觉coding工具发挥能力就被很大限制了。     Reference: https://pypi.jetson-ai-lab.io/ https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html https://forums.developer.nvidia.com/t/jp-6-1-torchvision-error-when-built-from-source/314940 https://forums.developer.nvidia.com/t/problem-with-installing-torchvision-on-jetson-orin-nano/312860 https://forums.developer.nvidia.com/t/https-forums-developer-nvidia-com-t-installing-torch-and-torchvision-on-orin-nano-335317-u-joel-alejandro11366/346925/2 https://pypi.jetson-ai-lab.io/jp6/cu126 https://developer.nvidia.com/cudss-downloads?target_os=Linux&target_arch=aarch64-jetson&Compilation=Native&Distribution=Ubuntu&target_version=22.04&target_type=deb_local https://forums.developer.nvidia.com/t/help-me-with-correct-pytorch-and-torchvision-versions-requirement-for-jetpack-6-2-1-orin-super/343688/15 https://forums.developer.nvidia.com/t/pytorch-and-torvision-version-issue-runtimeerror-operator-torchvision-nms-does-not-exist/312446  

Jetson Orin Nano安装Pytorch CUDA环境 Read More »

深度学习工作站系统重装步骤记录

最近需要配置一台CUDA环境深度学习工作站,打算把流程都记录一下,以防每次都得现查。 首先下载Linux镜像,我这里用的是Ubuntu24.04: https://ubuntu.com/download/desktop 然后制作一个USB镜像启动盘,这次我用的Ubuntu官网推荐的小工具,免安装并且只有3个按钮:选择镜像,选择U盘,烧录! 挺好用的推荐! balenaEtcher:https://github.com/balena-io/etcher/releases 接下来就是将BIOS选择U盘启动了,各个品牌电脑差异挺大的,按照自己实际情况去操作。然后选择全新安装Ubuntu,多数情况下直接默认选项安装就好。 系统装好后,我习惯先把当前版本的系统软件更新到最新: 当前这台工作站是公共的,需要给每个人分配一个帐号,可以在桌面环境操作,也可以通过命令完成,可以参考下边一篇记录: Ubuntu添加新用户并加入sudo组 如果工作站有中文输入需求的话,比如我目前记录这篇博文,还需要加一个中文输入法,可以看我这篇记录: Linux 安装中文输入法 接下来安装Python环境,不建议直接使用系统的Python来配置各种库,出现了问题太难修复了。建议使用Anaconda,各个环境相互不干扰。Anaconda的安装是通过官网的一个sh脚本: https://www.anaconda.com/download/success 下载后对其赋予一个执行权限,然后在终端里运行: 根据交互一步一步安装,最后一步询问要不要将Conda加入到开机初始化列表中,建议yes,不然后边每次使用Conda切环境需要手动找Anaconda安装文件夹,很麻烦。 安装完毕后,熟悉Anaconda的可以直接使用Conda来管理Python环境,若不太熟悉的话可以使用图形化的一个工具,在终端输入:anaconda-navigator 建议不要在base环境做开发,最好是每个项目有一个单独的环境,再使用conda安装pytorch,我个人没有按照Pytorch官网指导的使用pip安装,我个人经验是既然使用了Conda就尽量全Conda环境,尽量避免和pip混着用,以免一些未知的问题。在这里需要看下本机CUDA的版本,要做到Python版本、CUDA版本以及Pytorch版本相互保持一致。对应关系表在Pytorch官网可以查到。 经查询我需要安装2.5.1版本的Pytorch:conda install pytorch=2.5.1 接下来我们装个IDE,运行个实例看一看。官网下载VS Code然后使用下列命令安装: sudo dpkg -i ‘/home/v2x/Downloads/code_1.102.0-1752099874_amd64.deb’ 将自己用Anaconda建立的Python环境设为VSCode的默认解释器,按照Anaconda官方指导操作一下: https://www.anaconda.com/docs/tools/working-with-conda/ide-tutorials/vscode 之后运行一个示例程序,看下pyTorch以及CUDA是否都已经OK: 从Terminal的输出若看到True以及对应的网卡型号,那么说明基础环境已经完毕。 当需要远程连接到这台设备的话,发现SSH连不上,这是由于Ubuntu安装后默认没有sshd服务端。按照下列指导操作一下即可: Ubuntu 开启SSH连接 一些其他可能必备的工具: 最后再记录一下将U盘烧录成一个启动盘后,怎样恢复。按照通常的格式化format不管在windows还是linux都是解决不了的,可以参考下列记录解决: https://blog.shuspieler.com/1223/ 大致就这些了,祝炼丹顺利!

深度学习工作站系统重装步骤记录 Read More »

华硕路由器梅林固件设置IPv6防火墙

之前在家里设置了一个影音库,与公网通过IPv6连接,实现pt上传积分和从外部对家里的多媒体资源访问的需求,我的家庭影音库。当时对于家庭路由器防火墙的设置,是通过静态唯一地址设置的,后来发现一个问题,在路由器重新拨号,或者时间够久的情况下中国移动端会改变IPv6前缀,这就出现了一个问题,我们通过上篇文章操作的防火墙设置,其中的IP地址已经不正确了,造成pt上传赚积分也赚不到了,从外网也连不到我家里的NAS媒体资源。所以使用了半年多以来,几乎每一两个月都得重新设置一遍IPv6防火墙,挺烦的。 于是我查好资料看有没有通过类似于通配符的方式设置防火墙,这样子及时前缀变了,但是依旧能映射到唯一的硬件设备。还真有解决方案,不过由于我是使用的梅林版的华硕路由器,有一些查出来的对原版梅林固件好使的方法,在我这里不适用,我找啊找终于到到适合我的方式。如果也有小伙伴使用华硕路由器结合梅林固件,需要在动态IPv6的情况下设置防火墙,可以参考一下我的方法。 首先IPv6设置里边对于子网的IP选择Stateless,这样子路由器给设备分配的IP后边4段会根据路由器的Mac地址结EUI-64算法生成唯一设备后缀地址。然后我们在NAS设备里看下实际分配的地址,然后在华硕路由器里边IPv6防火墙本地 IP 地址要按 0::a:b:c:b/0::ffff:ffff:ffff:ffff 的格式进行填写,其中 a:b:c:d 部分替换为实际设备 IP 地址的后四段。端口部分可以一次填入多个,使用英文逗号分隔,例如:5000,5001,5006,5999,8096,16681。 查询各种帖子了解到,对于华硕路由器,可以设置为 ::a:b:c:d/::ffff:ffff:ffff:ffff格式。也有帖子提到对于梅林改版固件,不能留空双冒号,即为0:0:0:0:a:b:c:d/0:0:0:0:ffff:ffff:ffff:ffff 格式。这几种方式在我这里会使iptable配置报错,造成公网的IP地址丢失,从而整体IPv6都不可用了。有帖子说这是特定版本梅林的Bug,第一位的0不能省略,确实在我这里实践好使。 设置后保存重启我们试一下,路由器拿到了新的前缀,然后pt工具也可以看到与公网联通了,上传通路正常。 觉得有帮助的小伙伴来点个赞啊。   Reference: https://post.smzdm.com/p/a2xx273n/ https://www.right.com.cn/forum/thread-8417643-1-1.html https://www.cnblogs.com/osnosn/p/11781359.html https://post.smzdm.com/p/a25gmdoq/ https://zhuanlan.zhihu.com/p/665423070 https://www.zhihu.com/question/363164098 https://www.right.com.cn/FORUM/thread-4108336-1-1.html  

华硕路由器梅林固件设置IPv6防火墙 Read More »

OpenWrt路由器通过CLI命令修改Wifi无线设置

我爸菜园子怕别人偷菜让我帮忙给装一个监控,这样有人进入就会报警,并且实时可以看到菜园子情况。 平房没有网络我打算给那里放一个CPE,插一张副卡用来给监控提供网络。手头有一个之前帮忙测评用的工程版CPE,想着物尽其用,设置了一下发现不能改变SSID,可能是工程版原因软件还不完善,也凑合着能用可是特别挑战我的强迫症。由于我知道这个CPE的固件是通过OpenWrt魔改过来的,于是我尝试能不能通过命令的方式来改一下SSID,结果还真做到了。这里简单记录一下步骤: 首先打开NRadio的ssh开关,浏览器打开: http://192.168.66.1/cgi-bin/luci/admin/system/security 然后使用uci命令来修改OpenWrt的网络设置。可以先用uci show network 和uci show wireless来看下当前设置: 从中可以看到我们比较关心的是wireless.wlan0.ssid=NRadio-0CBE-2.4G 和wireless.wlan1.ssid=NRadio-0CBE这两项,这和网页里看到的内容是相同的,但是网页配置端由于未知bug修改不了。我在这里尝试用uci命令修改: 然后保存更改: 重启后生效。 Reference:https://blog.csdn.net/qq_35718410/article/details/53113894

OpenWrt路由器通过CLI命令修改Wifi无线设置 Read More »

华硕AC86U路由器改装散热

家中路由器放在弱电箱里,由于封闭环境空气不流通,芯片过热路由器经常挂掉,表象就是WiFi信号能搜到但是连不上,只能重启解决。到了夏天比较热那段时间,以及到了冬天地暖开始供热,这种现象更加频繁,非常非常地影响正常使用。网上搜索信息了解到AC86U这款路由器芯片和散热片之间是用导热垫连接的,热传导性能相对较差,芯片的热量并不能有效通过厚厚导热垫传给金属散热片。同时我的AC86U又放在密闭空间,空气对流差,更加不利于路由器芯片散热。于是我将AC86U做一定程度的改造,将导热垫换成导热铜片,并添加硅胶增强贴合性,同时去掉外壳直接将AC86U的PCB板放在弱电箱使用,从而有效缓解了芯片温度过高路由器死机问题。 首先将AC86U外壳打开,有两个螺丝需要拧下,在下图的背面红框处。 然后慢慢撬开前后壳塑料勾子,取下前壳。 PCB板正面有几个螺丝与路由器后壳固定,拆掉螺丝同时卸掉天线和螺丝,就可以拿下路由器后板,如下图PCB正反面。 拆掉导热板中间和四周的螺丝,就可以将导热板拿下了,此时可以看到芯片和导热板之间,是用厚厚的导热垫连一块的,就在这一块瓶颈,让整个AC86U散热很差。我们要做的就是将这三个导热垫换成铜片和导热硅胶,加强导热性能,就像电脑CPU散热器的一样。 准备好导热铜片和硅胶,铜片是我经过测量后在淘宝订做的,两颗小芯片用的是12mm*12mm*2mm尺寸,大芯片用的是15mm*15mm*2mm尺寸,放在那个方框里刚刚好。 先在芯片上涂上硅胶,然后将导热铜片放在芯片上,如下图。然后再在铜片上涂上硅胶,装回金属散热片。 由于我的AC86U是放在家中的弱电箱里,可以关门是个密闭空间,同时也没太多灰层,我决定不装外壳,直接裸奔使用。找了一个架子与地面隔开,减少冬天地暖的影响,还挺合适。 经过了一段时间的观察,可以说效果惊艳。长期使用三颗芯片温度甚至都没有超过55°,也没再出现过死机的现象,至此AC86U散热改造就完成了,效果非常满意。 随手测了一下网速,家中宽带也很给力,500M宽带能跑满。 之后有空再记录一下出门在外连回家中内网的方案,也是挺好玩的,占坑。

华硕AC86U路由器改装散热 Read More »

Linux内核升级失败原因找到

之前在这个贴子(Linux内核升级失败后回退)提到我升级内核遇到了问题,导致系统无法启动。后边又尝试了几次依旧同样的报错。最近又有了新的内核版本,现在跨版本升级,还是失败。研究好久才搞明白根本原因。原来是升级过几次后服务器/boot分区满了,所以当再次升级适合就遇到奇怪的报错。 Filesystem Size Used Avail Use% Mounted on udev 445M 0 445M 0% /dev tmpfs 98M 1.1M 97M 2% /run /dev/sda3 20G 5.8G 13G 32% / tmpfs 490M 0 490M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 490M 0 490M 0% /sys/fs/cgroup /dev/sda2 371M 309M 35M 91% /boot /dev/loop1 56M 56M 0 100%

Linux内核升级失败原因找到 Read More »

Linux内核升级失败后回退

今天在不定期检查服务器运行状态时候,看到提示说有很多个包可以更新,于是想着今天相对不那么忙,顺便更新一下服务器的软件包吧。这样的操作经常做的,很多时候是为了安全的考虑,在功能使用上没啥特别大的需求,整个过程也没啥特别的地方,于是熟练地输入下列命令更新软件包列表: sudo apt update Hit:1 http://archive.ubuntu.com/ubuntu focal InRelease Get:2 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB] Get:3 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB] Get:4 http://archive.ubuntu.com/ubuntu focal-security InRelease [114 kB] Get:5 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2,465 kB] Get:6 http://archive.ubuntu.com/ubuntu focal-updates/main Translation-en [420 kB] Fetched 3,221 kB in 1s (2,312 kB/s) Reading package lists… Done Building dependency tree Reading state

Linux内核升级失败后回退 Read More »

Merlin梅林cfddns重启后自动更新失效

我是用koolshare软件中心的cfddns插件来实现动态域名的需求,用来连接家中设备。在配置页面设置了60分钟自动更新一次,在保存后通过日志检查自动更新命令允许正常,能够按照预设的周期看到如下Log: Jan 21 14:10:00 crond[546]: USER admin pid 1438 cmd /koolshare/scripts/cfddns_update.sh 可是当路由器重启后,cfddns定时更新并不能正确执行,看作者Github的issue,也有其他人遇到类似的问题,应该是插件开发中还有缺陷。于是我查了查cfddns是通过crontab将定时脚本记录在了/tmp/var/spool/cron/crontabs/admin中,而根据Merlin的帮助Wiki,这个位置是记录在RAM里的,重启就失效了,建议将脚本保存在jffs分区,并通过init-start脚本实现开机再次写入。所以对于我遇到的这个cfddns可以用这个办法解决,通过vi /jffs/scripts/init-start 创建一个新文本,填入以下内容,其意义是每次重启会自动同步一次,然后每隔1440分钟(一天)再自动同步一次。 #!/bin/sh /koolshare/scripts/cfddns_update.sh echo “*/1440 * * * * /koolshare/scripts/cfddns_update.sh #cfddns_update#” >> /tmp/var/spool/cron/crontabs/admin 之后将文件赋予执行权限: chmod a+rx /jffs/scripts/init-start 注意通过这样子设置的更新周期不会反向同步到cfddns网页设置的那个窗口中,实际定时任务间隔以上边脚本中数字为准。到此cfddns脚本自动更新任务就设置完成了,重启一下,试试吧!   Reference: https://github.com/RMerl/asuswrt-merlin.ng/wiki/Scheduled-tasks-(cron-jobs) https://bugxia.com/946.html https://github.com/geek5nan/koolshare-cfddns/issues/5      

Merlin梅林cfddns重启后自动更新失效 Read More »