MiniCPM-o 2.6 本地部署记录,Windows+RTX3060全部跑通!

上一篇中,大致聊了下国产小钢炮MiniCPM的特性,看起来很不错,可玩性很高。

今天,主要来说一下,如何在本地运行这个项目。

配置过程花了一些时间,最终还是成功了,可以正常进行视频通话,语音通话,和聊天机器人。安装和测试过程中遇到了几个棘手的问题。下面就完整记录下安装过程和遇到的问题的解决方案。

基础准备

巧妇难为无米之炊,有些比较基础的东西必须先准备好。

  • Windows10/11
  • 显卡RTX3060或者其他更强显卡
  • 安装软件git,miniconda,Nodejs

这些应该不难,不懂的话,网上资料也很多。

为了运行这个项目中的webdemo,会涉及到Python和NodeJS相关内容,还有一个浏览器的设置问题。所以我们就这几个重点来分块说明。

模型服务的安装和配置

模型服务主要负责模型的载入和推理,然后Web端调用,这个是核心部分。这一部分完全由Python编写。

打开本地CMD或者WIndowws PowerShell 以此运行下面的命令。

克隆项目

git clone https://github.com/OpenBMB/MiniCPM-o.git
cd MiniCPM-o
 

创建虚拟环境并激活

conda create -n MiniCPM-o python=3.10 -y
conda activate MiniCPM-o

单独安装torch和onnxruntime

pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 --index-url https://download.pytorch.org/whl/cu121
pip install onnxruntime-gpu==1.20.1

使用req文件安装其他依赖。

pip install -r requirements_o2.6.txt

因为torch和onnx已经安装完成了,所以这一步运行之前可以打开requirements_o2.6.txt,把相应的项目注释掉或者删除掉。

正常来说,依赖安装到这里就结束了。

其实,最麻烦的才刚刚开始。接下来这个问题,浪费了我一下午的时间。

flash_attn的问题

当你试图启动模型服务的时候,你会遇到这样的错误提示。

ImportError: This modeling file requires the following packages that were not found in your environment: flash_attn. Run `pip install flash_attn`

正常来说,就是根据提示运行如下命令:

pip install flash_attn

然后就完美收工了。

实际上很可能会遇到CUDA需要大于11.7的提示。

为了解决这个问题,只能根据提示升级cuda和cudnn(浪费一波时间)

升级完成之后在执行安装命令,没有错误,但是会开始本地编译。

编译了四个多小时,放弃了…   

之所以会这样,是因为没有匹配本地环境的依赖包。

Windows下无法自动安装一些包也很常见。

一个比较好的解决思路是,找别人编译好的WHL文件。

进过多番查找和尝试,最终解决了这个问题。

直接用编译好的文件,执行命令:

pip install whl\flash_attn-2.7.0.post2-cp310-cp310-win_amd64.whl

之前命令前,获取到这个文件,放到whl文件夹下面。

这里需要注意要几个点:

Python版本为3.10

Torch为2.4.0 对应的cuda为 cu121

上面的版本,但凡搞错一个,就会痛不欲生。

所有依赖正确安装之后,就可以启动模型服务了。

运行服务器:

python web_demos/minicpm-o_2.6/model_server.py

运行之后,会自动去HF下载模型,模型大概有10G+,所以需要一个较好的网络,并且保持网络通畅。

运行成功之后会会显示Application startup complete,同时显示服务运行在某个端口。

由于默认下载的是没有量化的版本,所以加载这个模型需要18G显存

我一直以为12G的3060无法载入这个模型,但是实际情况是,它会使用虚拟内存。最终整个电脑用去了18.5的显存。除去其他软件的使用量,确实和官方要求的18G非常接近。

这里顺带提一嘴:

MiniCPM-o 2.6 int4 的显存需求为9GB

MiniCPM-V 2.6 gguf的显存需求为6GB

这就是之前说到的低配电脑也能运行的原因所在。

到这里Python部分就完成了。

网页服务的安装和配置

网页服务使用了vue相关技术,需要nodejs环境,如果没有用过,需要先安装nodejs。

安装nodejs

这个很简单,打开nodejs.org,下载Node.js ,然后双击运行安装即可。

安装过程一路Next默认设置安装。

如果之前就有Nodejs 使用  node -v 命令查看一下版本。版本太低需要升级一下。

运行web服务:

cd web_demos/minicpm-o_2.6/web_server
npm install -g pnpm
pnpm install  # install requirements
pnpm run dev  # start server

这个过程非常快。

启动成功之后显示如下:

这里有好多地址,包括本地local还有不同网络的IP地址。本机测试直接打开local地址,如果局域网其他电脑测试,或者手机测试,可以打开局域网地址。比如我这里的192.168.31.214 就是局域网地址。

浏览器的设置

我首先是在本地电脑测试,但是遇到了一个问题,让我摸不着头脑。实时通话和实时语音点了之后全部没有反应,而聊天机器人可以正常使用。这一度让我以为是的安装配置有问题。

其实是和浏览器权限有关系。由于本地IP运行,没有https证书。所以chrome浏览器会直接限制你调用本地相机和麦克风。这种限制甚至不会有任何提示。左上角不会弹出授权提示!!!

为了解决这个问题,需要进行如下设置:

1️⃣地址栏输入chrome://flags/

2️⃣找到insecure 选项

3️⃣输入本地的Ip地址

4️⃣启动改选项

5️⃣重新启动浏览器

再次打开,你就可以通过下面的设置启动摄像头和麦克风了。

显示点击浏览器左上角的地址栏前面的不安全。

在弹出菜单中点击网站设置。

在网站设置中,对该网址启用摄像头和麦克风权限

下拉中选择询问或者允许。

设置完成之后,刷新网页。应该就可以了。

可以看到摄像头和麦克风都已经启用了。

到这里Chrome的设置就完成了。

运行测试

所有设置完成之后,就可以开始尝试各种功能了。

视频通话:

点击视频通话,就可以开始了。

由于我使用了原版模型,加载时使用了虚拟内存,所以导致速度非常…慢,但是确实能用。另外由于我本地摄像头比较多,不知道chrome是什么逻辑,调用了虚拟摄像头Wecam。

语音通话:

语音通话也完全没问题,接通后直接说就行了。

但是这个功能也面临一些问题,比如声音输入检测问题,检测不好,会有大量干扰声音,在吵杂的环境中很难测试。另外一个问题,可能是电脑配置关系,声音会断断续续。另外,语音对话的声音会发生变化。

毕竟是Demo,还有很多完善的空间。

聊天机器人:

这个功能,没有语音和视频,用起来就稳定很多。只要上传一个张图片或视频,就可以分析上传的内容,并进行讨论了。通过功能就可以对它的图片,视频理解能力做一个直观的测试。

这个使用很流畅,没啥问题,就是必须上传图片或者视频之后,才能开启对话。

安装配置就是这样了,后面就是换台电脑搞个量化模型,把显存降下来,速度拉上去。

收工收工!

+-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 570.133.07 Driver Version: 570.133.07 CUDA Version: 12.8 | |-----------------------------------------+------------------------+----------------------+ | 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 RTX A6000 On | 00000000:01:00.0 Off | Off | | 31% 52C P8 29W / 300W | 701MiB / 49140MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ | 1 NVIDIA RTX A6000 On | 00000000:25:00.0 N/A | N/A | |ERR! ERR! P0 N/A / N/A | 4967MiB / 49140MiB | N/A Default | | | | ERR! | +-----------------------------------------+------------------------+----------------------+ | 2 NVIDIA RTX A6000 On | 00000000:41:00.0 Off | Off | | 30% 44C P8 25W / 300W | 25726MiB / 49140MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ | 3 NVIDIA RTX A6000 On | 00000000:61:00.0 Off | Off | | 30% 38C P8 21W / 300W | 25726MiB / 49140MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ | 4 NVIDIA RTX A6000 On | 00000000:C1:00.0 Off | Off | | 30% 39C P8 28W / 300W | 25726MiB / 49140MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ | 5 NVIDIA RTX A6000 On | 00000000:E1:00.0 Off | Off | | 30% 38C P8 29W / 300W | 25726MiB / 49140MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ 能确定是哪张卡出问题了吗
06-06
<think>我们正在解决一个问题:如何确认NVIDIARTXA6000GPU在部署配置(devices.driver:nvidiacount:allcapabilities:[gpu])下是否使用了所有GPU,并结合nvidia-smi的输出定位显示ERR!的故障卡。根据用户提供的引用和之前的问题,我们了解到:-引用[1]提供了nvidia-smi命令的用法,可以输出GPU的状态(温度、利用率、显存等)到CSV,方便分析。-引用[2][3][4]提到GPU的架构(CUDACapability)与CUDA版本、驱动版本以及PyTorch等框架的兼容性问题,可能会导致GPU无法使用。用户当前的部署配置:```yamldeploy:resources:reservations:devices:-driver:nvidiacount:allcapabilities:[gpu]```这个配置的含义是:预留所有NVIDIAGPU资源。因此,该配置会使用节点上所有的NVIDIAGPU。但是,如果其中某张GPU卡出现错误(在nvidia-smi中显示ERR!),我们需要定位并排除。**分析步骤:**###1.确认配置是否使用所有GPU在Docker(或容器编排平台)中,`count:all`表示使用所有可用的GPU。因此,如果系统中有多张A6000GPU,该配置会让容器访问所有GPU。###2.使用nvidia-smi检查GPU状态在宿主机上运行以下命令获取所有GPU的详细状态:```bashnvidia-smi--query-gpu=index,name,temperature.gpu,utilization.gpu,memory.total,memory.used,memory.free,power.draw,power.limit,driver_version,power.state,pstate,gpu_uuid,serial--format=csv```或者使用更简洁的命令(但包含关键信息):```bashnvidia-smi--query-gpu=index,name,utilization.gpu,memory.used,memory.free,power.draw,power.state,pstate,gpu_uuid,serial,display_active,display_mode--format=csv```这个命令会输出每一张GPU的详细信息。重点关注:-`utilization.gpu`:GPU利用率,如果出现错误可能会异常(如0%或100%)-`memory.used`:显存使用情况,错误卡可能显存异常(如为0)-`power.draw`:功耗,错误卡可能功耗异常(如为0或极高)-`power.state`:电源状态,正常应为`P0`(最高性能状态)或`P1`等,错误可能是`P8`(最低功耗状态)或其他-`pstate`:性能状态,正常应在`P0`~`P12`之间,错误卡可能显示为`P8`(即无法正常工作)-如果某张卡有错误,nvidia-smi的表格中该行可能会在显存使用、温度等字段显示`ERR!`###3.定位错误GPU卡在nvidia-smi的输出中,每张卡都有一个`index`(索引号,从0开始)。如果某张卡出现错误,其对应的行中某些字段会显示`ERR!`或者显示为N/A。此外,可以过以下命令查看GPU的错误信息(如果有的话):```bashnvidia-smi-q```这个命令会输出更详细的信息,包括每个GPU的错`ECCErrors`(纠错码错误)、`RetiredPages`(退役页,表示显存损坏)等。如果有硬件错误,这里会显示。###4.检查CUDA是否识别所有GPU在容器内部(或宿主机)运行一个简单的CUDA程序来检测可用的GPU设备。例如,使用Python和PyTorch:```pythonimporttorch#打印CUDA是否可用print(torch.cuda.is_available())#打印设备数量print(torch.cuda.device_count())#打印每个设备的信息foriinrange(torch.cuda.device_count()):print(f"Device{i}:{torch.cuda.get_device_name(i)}")print(f"ComputeCapability:{torch.cuda.get_device_capability(i)}")print(f"TotalMemory:{torch.cuda.get_device_properties(i).total_memory/1024**2:.2f}MB")```如果在运行此脚本时,某张GPU卡导致程序挂起(hang)或抛出异常,那么这张卡就是有问题的。###5.结合部署配置与错误信息如果部署配置使用了`count:all`,但其中某张卡有故障,那么容器在启动时可能会失败(如果框架尝试初始化所有GPU)或者运行时出现错误。因此,在部署时,如果知道某张卡故障,应该避免使用它。可以过以下方式:-部署配置中不设置`count:all`,而是使用`device_ids`指定健康的GPU(如[0,2,3])-过环境变量`NVIDIA_VISIBLE_DEVICES`指定要使用的GPU索引,例如:```yamldeploy:resources:reservations:devices:-driver:nvidiacapabilities:[gpu]device_ids:['0','2']#只使用索引0和2的GPU```###总结1.配置`count:all`会使用所有GPU。2.使用`nvidia-smi`命令(特别是CSV格式输出)可以查看每张卡的状态,定位显示`ERR!`的卡。3.如果某张卡在`nvidia-smi`中显示错误状态,或者在使用CUDA程序时导致问题,那么这张卡就是有故障的。4.建议在部署时排除故障卡,过指定`device_ids`或环境变量`NVIDIA_VISIBLE_DEVICES`。###示例操作流程1.在宿主机运行`nvidia-smi--query-gpu=index,name,memory.used,memory.free,power.state,pstate,gpu_uuid--format=csv`,检查是否有卡出现`ERR!`。2.如果某张卡状态异常(如显存使用显示`ERR!`),记录其索引(index)和UUID。3.在容器内运行PyTorch脚本,确认是否能够正常识别并访问所有GPU。4.如果发现特定卡导致问题,修改部署配置,排除该卡。过以上步骤,可以定位并排除故障GPU卡。---§§相关问题§§1.如何在Kubernetes中指定Pod使用特定的GPU卡?2.如何监控Docker容器的GPU使用情况?3.NVIDIAGPU出现ERR!错误可能的原因和修复方法是什么?4.如何在深度学习训练中实现多GPU故障转移?[^1]:过nvidia-smi可以获取GPU的状态信息,包括错误指示[^1]。[^2][^3][^4]:GPU的使用还受到驱动版本、CUDA版本和框架兼容性的影响[^2][^3][^4]。</think> ### 配置分析与 GPU 故障定位指南 #### 1. **`count: all`是否使用所有GPU?** - **结论:是** 配置`devices.driver:nvidia count:all capabilities:[gpu]`会让容器访问**所有可用的NVIDIA GPU**(包括RTX A6000)[^2][^4]。 - **验证方法**: ```bash nvidia-smi --query-gpu=index,name,utilization.gpu --format=csv ``` 如果输出中所有GPU的`utilization.gpu` > 0%,则全部被使用。示例输出: ``` index, name, utilization.gpu [%] 0, NVIDIA RTX A6000, 75% 1, NVIDIA RTX A6000, 82% 2, NVIDIA RTX A6000, ERR! # 异常卡 3, NVIDIA RTX A6000, 68% ``` #### 2. **定位异常GPU的关键步骤** 使用以下命令组合定位故障卡: ##### (1) **基础状态检测** ```bash nvidia-smi -q | grep -E "Product Name|Faulty|ECC Errors|Retired Pages" ``` - 关注字段: - `Is Faulty : Yes` → 硬件故障 - `Retired Pages` > 0 → 显存损坏 - `ECC Errors`累计值异常 → 计算错误[^1] ##### (2) **性能状态检测** ```bash nvidia-smi --query-gpu=index,pstate,memory.used,memory.free --format=csv ``` - 异常卡典型表现: - `pstate`显示`P8`(最低性能状态)[^1] - 显存异常:`memory.used=0`或`memory.free=ERR!` - 温度异常:与其他卡温差 > 15°C ##### (3) **错误日志定位** ```bash dmesg | grep -i "nvidia.*error" cat /var/log/nvidia-errors.log ``` - 关键错误模式: ``` NVRM: GPU at PCI:0000:01:00.0 GPU-12345-abcd marked faulty NVRM: Xid (PCI:0000:01:00): 79, pid=12345, Channel Error ``` #### 3. **故障卡隔离方案** 当定位到异常GPU(如索引2)时: ##### (1) **部署配置排除** ```yaml deploy: resources: reservations: devices: - driver: nvidia device_ids: ["0", "1", "3"] # 显式跳过索引2 capabilities: [gpu] ``` ##### (2) **运行时排除** ```bash docker run --gpus '"device=0,1,3"' ... ``` #### 4. **兼容性验证(防漏检)** 即使nvidia-smi显示正常,仍需验证CUDA兼容性: ```python import torch for i in range(torch.cuda.device_count()): try: torch.randn(1000, device=f'cuda:{i}') # 显存分配测试 print(f"GPU {i}: OK") except RuntimeError as e: print(f"GPU {i} FAIL: {str(e)}") ``` - **常见错误**:`CUDA error: no kernel image`(架构不匹配)[^3] > 注:RTX A6000需CUDA 11.1+,PyTorch 1.8.1+(支持sm_86架构)[^3][^4] --- ### 排查流程图 ```mermaid graph TD A[执行nvidia-smi检查] --> B{是否报ERR!?} B -->|是| C[定位故障卡索引] B -->|否| D[执行CUDA兼容性测试] C --> E[修改配置排除该卡] D --> F{测试是否过?} F -->|是| G[正常运行] F -->|否| H[升级CUDA/PyTorch] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值