PVE的备份和恢复
进入pve管理后台,在各虚拟机的备份选项点击备份
备份文件路径是Var/lib/vz/dump,下载到其他地方保持
需要恢复时将备份文件上传到Var/lib/vz/dump,在存储 local里点击对应的备份文件进行还原,然后启动虚拟机
!!!如果启动虚拟机时提示找不到iso镜像,找到硬件选项,编辑CD/DVD驱动器重新选择一下iso镜像文件
pve直通amd核显没法玩
直接装fedora,然后用fedora的虚拟机装pve
铭凡nas os会检查bios的序列号对不对,不对的话是无法启动的,所以我们需要给虚拟机注入正确的序列号
进入Pve的命令终端
1 | dmidecode -s system-serial-number |
这一串就是我们的序列号了
不要任何的系统,选q35和efi。创建完成后把虚拟机硬件的全部硬盘分离并移除
然后继续回到命令行终端
1 | nano /etc/pve/qemu-server/xxx.conf |
1 | agent: 1 |
在bios: ovmf上面添加一行,xxxxxxx就是第一步获得的序列号
注意,上传铭凡nas os之前,需要把它解压成img格式,再压缩成gz格式上传
因为img2kvm只支持gz,我也不想去改源码,就这么用吧
回到Pve的命令终端
1 | chmod +x ./img2kvm |
1 | ./img2kvm nasos-2.1.10.0002.img.gz xxx |
没有第二块硬盘是无法创建存储池进入系统的,所以需要创建一块硬盘
在硬件—>添加—>硬盘 大小自定义,其他默认
如果显示的是未使用的磁盘,双击然后点添加
在这一过程,虚拟机可能会自动关机,这是正常,只需要再次启动即可
如果创建存储池一直错误,就把原来创建的硬盘分离并移除,然后重新建一块硬盘
之前的文章 逆向api通过外挂解锁特殊功能 | leioukupo的博客
直接构建一个带tool_calls的completion发送没太大问题,但是不能流式
后续写流式tool调用时一直不行,直到和ai一起看cherry studio的源码关于tool调用这一部分时
才发现我一直套用的chat的流式生成函数,其中的finish_reason一直是None,所以各个客户端才不响应我的工具请求,让ai根据我之前的chat流式生成器写了一个tool流式生成器
1 | async def generate_tool_call_chunks( |
使用这个新的tool流式生成器果然测试成功
使用的是miloco和自带的米家设备控制的mcp测试成功
重新捋一遍2api要模拟fc以及mcp,各位佬友可以把它当作一个模板
1 | # 首先需要一些必须的全局变量标识状态和一个异步的定时器(长时间得不到tool响应,就重置tools_use) |
目前的话,还是有几个点需要去进一步优化
1.当tool的数量很多的时候全部调用一次时间会很长
需要优化,提前判断要调用哪些tool, 这需要提示词专家重新编写一个提示词让大模型去判断并返回tool_json
2.还有参数不够的情况, 怎么去处理
演示里有一种情况就是一个tool需要三个参数,第一次只给了一个参数,然后需要大模型去问用户其他的参数,这个暂时没想到解决办法去模拟
3.工具的返回值可能是图片 文件 音频或者文字
目前只考虑了文字,因为其他的我不知客户端发过来的内容是啥样的,图片可能是base64,但文件或者音频就不知道了
首要的就是tools_prompt的改进
Pascal-vllm原版镜像报错aimv2被占用
通过挂载/usr/local/lib/python3.12/dist-packages/vllm/transformers_utils/configs/ovis.py
进行修改
分别是
1 | 31: model_type: str = "aimv3" |
参考的docker compose.yaml
1 | networks: |
关于An error occurred while downloading using hf_transfer. Consider disabling HF_HUB_ENABLE_HF_TRANSFER for better error handling.
设置环境变量HF_HUB_ENABLE_HF_TRANSFER=0即可
很多时候逆向得到的api只能进行文本对话,不能实现最新的ai特性或者协议。比如function call功能 MCP协议 谷歌最新的a2a协议
我经过实践和尝试,提炼了一套可行的思路和代码,使得逆向api一样可以支持最新的ai相关的特性或协议(目前仅仅尝试了function call和mcp,a2a还需要了解)
是llm的具体能力,专注于单个外部工具的调用生成
一种更上层的宏观的系统设计,通常包含多个function call
打个比方,function call是锤子,剪刀等工具,而Mcp就是说明书之类的东西,指导如何用锤子剪刀等工具制造东西
MCP负责决定在什么时候、为什么以及如何组合使用这些“动作”(包括Function Calling、内部思考、信息检索等)来达成最终目标
fc(function call简称)或者Mcp说通俗点就是,llm根据tools参数和上下文判断要不要从上下文中提取参数执行fc或者Mcp.
不管是fc还是Mcp,最终的执行都不是说ai做的,而是ai返回一个结构化(通常是JSON格式)的指令,然后客户端或者别的什么端进行运算.而ai恰好就可以通过**prompt(提示词)**做到这种效果。
因为我们的思路时,在中转或者2api的服务端先过滤判断一次.
如果需要fc或者mcp,通过另外一轮ai对话提炼参数,把返回的参数加入之前的ai对话中,返回进行fc或者Mcp的运算结果.
接收到运算结果后得把结果重新编排并再进行一次对话,添加一个简单的提示词—–比如:根据上下文回答问题
大致思路流程如图
需要一个question变量存储用户的问题,一个标志变量tools_use表示是用过了工具
是否需要使用工具我是通过提示词让ai不需要使用工具的时候就输出no
1 | # 我的判断是否需要使用工具的提示词 |
1 | tools_use = False |
我也写了一个粗略的提示词想要达成这种效果,但由于我的提示词功力不够以及逆向的模型过于垃圾,导致效果不理想
这样做了以后就可以让逆向api支持mcp协议了
经过openwebui几个简单的工具测试可以达成效果
总结一下,MCP并不是什么困难的东西,只不过批了一层外衣,MCP的模拟过程实质还是用提示词的使用,只要了解了MCP过程中的api返回值接受值的格式就可以轻松地给任意模型加上MCP
未来的llm发展我猜测为两个方向
融合和外挂
就是MOE模型里进一步增加从对话中提取参数结构化输出的能力
就是主模型增强关于是否需要MCP的判断能力,需要的话交给一个极致轻量的次生模型提取参数并结构化输出。由于次生模型只需要提取参数结构化输出,是可以做到轻量且高效准确的,主模型就可以完全抛弃这部分能力,增强其他能力
下一步了解下谷歌的a2a协议
其他X86多网口设备均可以参考
PVE做底层,其他全部用虚拟机解决
直通核显屡次尝试失败,要么开始就不能用,要么用一会就不行了
要么直通成功,没问题了,但是测试虚拟机里安装rocm,无法使用780m核显,且vram占用一直为0
PVE直通核显失败
于是我用fedora做实体机,然后虚拟机里运行PVE
需要gpu的服务都放fedora实体机上
不需要的都放虚拟机里的PVE,这样即使重装也只需要恢复使用gpu的服务
我需要使用gpu的服务有comfyui, 影视(jellyfin或者emby等选一个,其实用的也不多,基本上看alist就行了)
必须双网口及以上才行
1 | # 我的两个网口分别是 enp2s0 enp3s0 使用enp2s0作为网桥 切换到root设置更方便 |
使用fedora的libvirt创建PVE虚拟机
1 | dnf install @virtualization |
可以使用virt-manager以gui方式创建虚拟机
网络源选桥接设备 设备名称填网桥名称
直通需要的设备
pci设备直通到PVE虚拟机后,无法再直通到PVE下的虚拟机,因为PVE无法开启iommu
但我要直通的pci设备只有m2转sata的转接卡
只需要把它直通给PVE就行了
然后通过scsi把硬盘块直通给虚拟机就行
1 | scsi1: /dev/sdb,cache=directsync,discard=on,iothread=1 |
至此,all in one完成,后续需要加服务,不需要gpu添加到虚拟机PVE
需要GPU的直接添加到宿主机,把宿主机服务的部署整理成脚本,重置后一键恢复服务
GPU失败是因为驱动问题
解决驱动问题
1 | WHITE_WEBDEV_ENDPOINTS=https://alist.leioukupo.top/机械盘 |
1 | 机械盘/ |
1 | # 必须启用代理 |
Rock 5b卖掉后在咸鱼重新入手了一块3588,8+32的配置
需要debian系统
1 | curl -L https://mirrors.apqa.cn/proxmox/debian/pveport.gpg | sudo tee /usr/share/keyrings/pveport.gpg >/dev/null |
1 | echo "deb [deb=arm64 signed-by=/usr/share/keyrings/pveport.gpg] https://mirrors.apqa.cn/proxmox/debian/pve bookworm port" | sudo tee /etc/apt/sources.list.d/pveport.list |
1 | 127.0.0.1 localhost |
1 | sudo apt install ifupdown2 |
最后要记得重启,在访问ip+8006就可以访问pve管理界面了,密码和账号是root和对应的密码
使用非lxc容器方式
注意点
1 | apt download pve-edk2-firmware-aarch64=3.20220526-rockchip |
如果apt下载失败,复制pve-edk2到浏览器下载
虚拟机硬件里的显示需要选择ramfb方式
使用虚拟机安装
1 | qemu-img convert -f raw -O qcow2 istoreos-22.03.7-2024122712-h88k-squashfs-combined.img vm-101-disk-1.qcow2 |
打开刚才创建的虚拟机的硬件,会看到有个未使用的磁盘,双击打开,点确认即可
对应编辑一下引导顺序。
启动后,是uefi shell,没有进入istore界面,需要带efi的istore固件
1.先上传lxc模板,再执行下面的命令
1 | pct create 101 \ |
1 | 101是id号 |
2.修改lxc容器配置文件
1 | nano /etc/pve/lxc/101.conf |
1 | arch: arm64 |
3.在pve的web页面找到这个lxc容器,选项—》功能 —-》勾选嵌套
4.启动
1 | pct start 101 |
4.1修改/etc/config/firewall,后面新增
1 | lxc-attach 101 |
1 | config rule |
4.2.重启防火墙
1 | /etc/init.d/firewall restart |
1 | ifconfig |
根据ifconfig显示的ip访问就可以进入后台
1 | signals: |
使用signals声明,返回值是void
1 | emit sig_add(socre++); |
Qt的子线程无法直接修改ui,需要发送信号到ui线程进行修改
1 | qRegisterMetaType<Score>("Score"); |
Qt槽函数的参数需要和信号的参数保持一致, 可以比信号的参数少, 但是不能顺序不同, 也不能比信号的参数多
使用泛型解决信号重载问题
1 | connect(ui->comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), |
- 信号是由对象在某个特定事件发生时发出的消息。信号本身并不执行任何操作,它仅仅是表示某种状态的变化或事件的发生。例如,当一个按钮被点击时,它会发出一个
clicked()信号- 槽是一个函数,可以接收并处理信号。当一个信号被发出时,与该信号连接的槽函数就会被调用。槽函数可以是任何成员函数、全局函数或lambda表达式
未选中 0
半选中 1
选中 2


stm32f1没有内部温度传感器
1.开启对应时钟和ADC1时钟,设置PA1为模拟输入
1 | // 开启时钟 |
2.复位ADC1,同时设置ADC1参数
1 | ADC_DeInit(ADC1); |
3.使能ADC
1 | ADC_Cmd(ADC1,ENABLE); |
4.配置规则通道参数
1 | ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_7Cycles5); // 通道的转换顺序 如果设置Rank为1 |
5.开启软件转换
1 | ADC_SoftwareStartConvCmd(ADC1,ENABLE); // 软件触发转换 |
6.等待转换完成,读取ADC值
1 | ADC_GetConversionValue(ADC1); |