炼丹日记00-RTX4070 windows系统跑通MMPose示例代码(解决了ValueError: numpy.dtype size changed,...)

MMPose RTX 40系列GPU上的终极部署方案 (解决了ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject问题)

背景提要

本方案旨在解决使用较新NVIDIA显卡(如RTX 4070, 计算能力sm_89)时,因旧版CUDA/PyTorch不兼容而导致的一系列连锁依赖问题。最终目标是在一个全新的Docker环境中,从零开始完整部署并成功运行MMPose的图像推理demo。

解决了配置MMPose过程中的什么问题?

  1. MMPose官方docker镜像cuda版本过低,无法支持RTX 40系列架构GPU的问题
  2. 示例代码缺少运行系统库问题
  3. numpy和xtcocotools的二进制冲突问题 (最关键的问题,也是解决起来最有技术含量的问题:ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject)

部署步骤

第一步:环境准备 - 构建一个现代化的Docker容器

问题的根源是官方docker镜像的cuda本本过低无法驱动40系GPU。因此,第一步是拉取一个预装了高版本CUDA和PyTorch的Docker镜像。

  1. 拉取Docker镜像 (此镜像内置CUDA 11.8和PyTorch 2.3.0):

    docker pull pytorch/pytorch:2.3.0-cuda11.8-cudnn8-devel
    
  2. 配置并启动容器:
    修改你的 docker-compose.ymldocker run 命令,将

<think>我们遇到了一个错误:`ValueError: Unknown device: 0000:00:06.0. Please specify device in "bus:slot.func" format`。这个错误常发生在尝试绑定PCI设备时,指定的设备格式不正确。正确的格式应该是`<bus>:<slot>.<func>`,例如`00:06.0`(注意没有前面的`0000:`域)。 在之前的步骤中,我们使用了`0000:00:06.0`作为设备号,但某些工具(比如上面提到的`dpdk-devbind.py`或手动绑定脚本)可能要求设备号以`<bus>:<slot>.<func>`的格式提供,即去掉前面的`0000:`。 ### 解决方法: 1. **确认设备号格式**: 首先,确认设备号的正确表示。使用`lspci`命令查看设备,常设备号会以`域:总线:设备.功能`的格式显示,例如`0000:00:06.0`。但在绑定操作时,很多工具只需要`00:06.0`(即去掉域的部分)即可。 2. **修改绑定命令**: 在绑定命令中,将设备号从`0000:00:06.0`改为`00:06.0`。 ### 具体步骤: #### 步骤1: 使用正确的设备号格式重新绑定 - 如果使用`dpdk-devbind.py`,命令改为: ```bash sudo dpdk-devbind.py -b vfio-pci 00:06.0 ``` - 如果使用手动绑定方法: 1. 获取设备ID(仍然使用完整设备号): ```bash lspci -n -s 0000:00:06.0 ``` 输出示例:`0000:00:06.0 0300: 10de:1c03`,记录设备ID `10de:1c03`。 2. 执行绑定操作(注意设备号使用`0000:00:06.0`): ```bash # 解绑当前驱动 echo 0000:00:06.0 | sudo tee /sys/bus/pci/devices/0000:00:06.0/driver/unbind # 注册设备ID到vfio-pci(如果尚未注册) echo "10de 1c03" | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id # 绑定设备(这一步常在上一步注册后会自动绑定,若未绑定可执行) echo 0000:00:06.0 | sudo tee /sys/bus/pci/drivers/vfio-pci/bind ``` 或者,如果使用`00:06.0`格式,但注意在`/sys/bus/pci/devices/`目录下设备目录是带域的(即`0000:00:06.0`),所以使用完整设备号更稳妥。 #### 步骤2: 验证绑定结果 ```bash lspci -nnk -s 00:06.0 ``` 输出中应该显示`Kernel driver in use: vfio-pci`。 ### 注意事项: - **工具差异**:不同版本的绑定工具可能对设备号格式要求不同。如果使用`dpdk-devbind.py`,请查阅其帮助信息(`dpdk-devbind.py --help`)确认格式要求。 - **设备号获取**:确保设备存在,可过`lspci | grep -i nvidia`查看所有NVIDIA设备。 - **错误原因**:该错误是由于工具无法识别带域的PCI设备号(`0000:00:06.0`)引起的,常只需要提供`<总线>:<设备>.<功能>`部分(即`00:06.0`)即可。 ### 永久绑定配置(防止重启失效) 为了防止重启后绑定失效,我们可以将VFIO配置添加到initramfs中: 1. 编辑 `/etc/modprobe.d/vfio.conf`: ```bash sudo nano /etc/modprobe.d/vfio.conf ``` 添加以下内容(使用设备ID): ``` options vfio-pci ids=10de:1c03 ``` 其中`10de:1c03`替换为你的设备ID。 2. 更新initramfs: ```bash sudo update-initramfs -u ``` 3. 重启系统。 完成以上步骤后,设备应该会在启动时自动绑定到vfio-pci驱动。 §§相关问题§§ 1. 如何验证VFIO驱动是否已正确加载并绑定到PCI设备? 2. 在Ubuntu中如何查看PCI设备的详细信息(包括设备ID、驱动等)? 3. 显卡直需要哪些硬件BIOS设置支持? </think>### 解决 `ValueError: Unknown device: 0000:00:06.0` 错误的方法 这个错误常是由于 PCI 设备标识格式不正确引起的。在显卡直操作中,设备标识需严格遵循 `总线:插槽.功能` 格式(如 `00:06.0`),而非包含域前缀的 `0000:00:06.0` 格式。以下是完整解决方案: --- ### 步骤 1:确认设备标识格式 1. 获取正确设备标识: ```bash lspci | grep -i nvidia ``` 输出示例: ``` 00:06.0 VGA compatible controller: NVIDIA Corporation GA104 [GeForce RTX 3070] ``` **关键点**:记录 `00:06.0` 格式的标识(不带 `0000:` 前缀) 2. 验证设备存在性: ```bash lspci -s 00:06.0 # 使用短格式标识 ``` --- ### 步骤 2:修正绑定命令格式 在绑定命令中**去除域前缀**: ```bash # 使用 dpdk-devbind.py sudo dpdk-devbind.py -b vfio-pci 00:06.0 # 正确格式 # 手动绑定(使用短格式) echo 00:06.0 | sudo tee /sys/bus/pci/drivers/vfio-pci/bind ``` --- ### 步骤 3:完整绑定流程(修正后) 1. 卸载 NVIDIA 驱动: ```bash sudo modprobe -r nvidia_drm nvidia_modeset nvidia_uvm nvidia ``` 2. 解绑原驱动: ```bash echo 0000:00:06.0 | sudo tee /sys/bus/pci/devices/0000:00:06.0/driver/unbind ``` 3. **使用正确格式绑定**: ```bash # 获取设备ID (10de:1c03 格式) lspci -n -s 00:06.0 | awk '{print $3}' # 绑定VFIO(两种等效方式) echo "10de 1c03" | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id # 或 sudo dpdk-devbind.py -b vfio-pci 00:06.0 ``` --- ### 步骤 4:验证绑定结果 ```bash lspci -nnk -s 00:06.0 | grep "Kernel driver" ``` 成功输出应为: ``` Kernel driver in use: vfio-pci ``` --- ### 永久配置(防重启失效) 1. 编辑模块配置: ```bash sudo nano /etc/modprobe.d/vfio.conf ``` 添加: ```conf options vfio-pci ids=10de:1c03 # 替换为你的设备ID ``` 2. 更新 initramfs: ```bash sudo update-initramfs -u ``` 3. 添加内核模块: ```bash echo "vfio-pci" | sudo tee -a /etc/modules ``` --- ### 错误根本原因分析 1. **格式冲突**: - 系统工具期待 `总线:插槽.功能` 格式(3段式) - `0000:00:06.0` 包含多余的 PCI 域前缀(4段式) 2. **工具差异**: - `lspci` 默认显示带域前缀的完整标识 - 绑定工具(如 `dpdk-devbind`)需要短格式标识 3. **解决方案核心**: $$ \text{有效标识} = \text{PCI\_BUS}:\text{PCI\_SLOT}.\text{PCI\_FUNCTION} $$ 需严格遵循此格式规范[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值