跳转至

01 - 环境搭建:UAV VLA/VLM/World Model 项目实践环境

预计阅读:15 分钟 | 前置知识:Linux 基础命令、Python 虚拟环境概念、GPU 驱动基本概念

本指南面向希望在本地复现 UAV 领域视觉语言动作模型(VLA)、视觉语言模型(VLM)及世界模型(World Model)相关论文的同学。我们将从零开始搭建一套完整的实验环境,覆盖 CUDA、PyTorch、ROS2、PX4 仿真及常用 Python 包。


目录

  1. 硬件需求总览
  2. NVIDIA 驱动与 CUDA 安装
  3. PyTorch 安装
  4. ROS2 Humble 在 WSL2 中的安装
  5. PX4 SITL 仿真环境
  6. 常用 Python 包安装
  7. 环境验证清单
  8. 常见问题与解决方案

1. 硬件需求总览

不同项目对硬件的要求差异较大。以下表格列出各类型项目的最低与推荐配置:

硬件需求表

项目类型 典型代表 GPU 显存(最低) GPU 显存(推荐) 内存(RAM) 磁盘空间 CPU
VLM 推理(7B 参数) GeoChat, LLaVA 16 GB 24 GB (RTX 4090) 32 GB 100 GB SSD 8 核+
VLM 微调(7B 参数) GeoChat Fine-tune 24 GB 48 GB (A6000) 64 GB 200 GB SSD 16 核+
VLA 模型(OpenVLA 系列) UAV-Flow 24 GB 48 GB 64 GB 200 GB SSD 8 核+
视频生成推理(现成 I2V 模型) FlightDiffusion §9 未实测 未实测 32 GB 200 GB SSD 8 核+
世界模型训练(DreamerV3) DreamerV3-Drone 12 GB 24 GB 32 GB 100 GB SSD 8 核+
PX4 SITL + ROS2 仿真飞行测试 无需 GPU — 16 GB 50 GB 4 核+
数据集处理/可视化 MotionScape 无需 GPU — 16 GB 500 GB+ 4 核+

表中数字是经验估算,不是实测。显存那两栏最容易误导:它取决于权重、梯度、优化器状态与激活四项,只有激活必须实测,而激活又主要随每个样本的 token 数变。本节末尾的动手验证把这笔账拆开算了一遍。

提示:如果本地 GPU 不足,可考虑使用 Google Colab Pro(A100)、AutoDL 或 Lambda Cloud 等云 GPU 平台。

推荐硬件配置(个人开发)

  • GPU:NVIDIA RTX 4090 (24 GB) 或 RTX 3090 (24 GB)
  • CPU:AMD Ryzen 9 / Intel i9,16 核以上
  • 内存:64 GB DDR4/DDR5
  • 存储:1 TB NVMe SSD(系统+环境)+ 2 TB HDD(数据集)
  • 操作系统:Windows 11 + WSL2 (Ubuntu 22.04) 或原生 Ubuntu 22.04

2. NVIDIA 驱动与 CUDA 安装

2.1 确认 GPU 型号与当前驱动

# 在 Windows PowerShell 中查看 GPU 信息
nvidia-smi

# 输出示例:
# NVIDIA-SMI 546.xx   Driver Version: 546.xx   CUDA Version: 12.x
# GPU Name        | Bus-Id
# NVIDIA GeForce RTX 4090 | 00000000:01:00.0

2.2 安装/更新 NVIDIA 驱动

访问 NVIDIA 官方驱动下载页面,选择对应 GPU 型号下载最新 Game Ready Driver 或 Studio Driver。

2.3 CUDA Toolkit 安装

当前 PyTorch 主流版本支持 CUDA 11.8 和 CUDA 12.1。建议安装 CUDA 12.1。

Windows 安装步骤:

  1. 访问 CUDA Toolkit Archive
  2. 下载 CUDA Toolkit 12.1
  3. 运行安装程序,选择"自定义安装",勾选 CUDA Runtime、CUDA Developer Tools
  4. 安装完成后验证:
nvcc --version
# 应显示:Cuda compilation tools, release 12.1

WSL2 中的 CUDA:

WSL2 中无需单独安装 CUDA Toolkit,Windows 端的驱动会通过 /usr/lib/wsl/lib/ 自动映射到 WSL2 内部。只需确保 Windows 端驱动已正确安装。

# 在 WSL2 终端中验证
nvidia-smi
# 应能看到 GPU 信息

2.4 cuDNN 安装(可选,但推荐)

cuDNN 通常已包含在 PyTorch 的预编译包中,无需单独安装。如果需要从源码编译 PyTorch 或使用 TensorFlow,请从 NVIDIA cuDNN 下载安装。


3. PyTorch 安装

3.1 使用 conda 安装(推荐)

# 创建项目环境
conda create -n uavvla python=3.10 -y
conda activate uavvla

# 安装 PyTorch 2.1 + CUDA 12.1
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia

3.2 使用 pip 安装

# 创建虚拟环境
python -m venv uavvla-env
source uavvla-env/bin/activate  # Linux/WSL2
# uavvla-env\Scripts\activate   # Windows PowerShell

# 安装 PyTorch
pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cu121

3.3 验证 PyTorch 与 CUDA

import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"CUDA version: {torch.version.cuda}")
print(f"GPU name: {torch.cuda.get_device_name(0)}")
print(f"GPU memory: {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB")

# 简单计算测试
x = torch.randn(1000, 1000, device='cuda')
y = torch.matmul(x, x.T)
print(f"Matrix multiplication test passed: {y.shape}")

4. ROS2 Humble 在 WSL2 中的安装

适用于需要 ROS2 + PX4 联合仿真的项目(如 UAV-Flow 的仿真评估环境)。

4.1 系统准备

# 确保 WSL2 使用 Ubuntu 22.04
wsl --list --verbose
# 如果不是 22.04,安装:
wsl --install -d Ubuntu-22.04

4.2 安装 ROS2 Humble

# 设置语言环境
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

# 添加 ROS2 apt 源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 安装 ROS2 Humble
sudo apt update
sudo apt upgrade
sudo apt install ros-humble-desktop

# 安装开发工具
sudo apt install ros-dev-tools

# 配置环境
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

4.3 验证 ROS2 安装

# 终端 1:启动 talker
ros2 run demo_nodes_cpp talker

# 终端 2:启动 listener
ros2 run demo_nodes_py listener
# 应能看到消息收发

4.4 安装 colcon 构建工具

sudo apt install python3-colcon-common-extensions

5. PX4 SITL 仿真环境

5.1 克隆 PX4 仓库

cd ~
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
git checkout v1.14.0  # 使用稳定版本

# 安装依赖
bash Tools/setup/ubuntu.sh

5.2 编译 SITL

# 编译 px4_sitl 默认目标
make px4_sitl_default

# 使用 Gazebo Classic 仿真
make px4_sitl_default gz_classic

# 或使用 Gazebo Harmonic(新版)
make px4_sitl gz_x500

5.3 安装 QGroundControl

# 下载 AppImage —— 官方文件名带架构后缀,无后缀的旧链接已失效
# (2026-10 实测:QGroundControl.AppImage 返回 HTTP 403,带后缀的两个都能取到)
wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl-x86_64.AppImage
chmod +x QGroundControl-x86_64.AppImage
./QGroundControl-x86_64.AppImage

# ARM64 机器改用:
# wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl-aarch64.AppImage

5.4 安装 MAVROS(ROS2-PX4 桥接)

sudo apt install ros-humble-mavros ros-humble-mavros-extras

# 安装 GeographicLib 数据集
sudo /opt/ros/humble/lib/mavros/install_geographiclib_datasets.sh

6. 常用 Python 包安装

6.1 基础科学计算与深度学习包

pip install numpy scipy matplotlib pandas seaborn
pip install opencv-python-headless pillow
pip install scikit-learn scikit-image

6.2 Hugging Face 生态

pip install transformers>=4.36.0
pip install diffusers>=0.25.0
pip install accelerate
pip install datasets
pip install tokenizers
pip install safetensors
pip install huggingface_hub

# 登录 Hugging Face(下载 gated 模型需要)
huggingface-cli login

6.3 训练与实验管理

pip install wandb            # 实验追踪
pip install tensorboard      # 日志可视化
pip install peft             # 参数高效微调(LoRA 等)
pip install bitsandbytes     # 量化训练
pip install deepspeed        # 分布式训练
pip install xformers         # 高效注意力机制

6.4 机器人与仿真相关

pip install gymnasium        # Gym 环境接口(替代旧版 gym)
pip install stable-baselines3  # RL 基线算法
pip install pyquaternion     # 四元数运算
pip install transforms3d     # 3D 变换
pip install trimesh          # 3D 网格处理
pip install open3d           # 点云处理

6.5 数据处理与标注

pip install h5py             # HDF5 数据读写
pip install av               # 视频解码(PyAV)
pip install imageio[ffmpeg]  # 视频读写
pip install supervision      # 目标检测标注工具
pip install albumentations   # 数据增强

7. 环境验证清单

完成上述安装后,运行以下脚本验证环境完整性:

"""
环境验证脚本 - 检查 UAV VLA/VLM/World Model 项目所需组件
运行方式: python check_env.py
"""

def check_package(name, import_name=None):
    """检查 Python 包是否安装"""
    import_name = import_name or name
    try:
        mod = __import__(import_name)
        version = getattr(mod, '__version__', 'unknown')
        print(f"  [OK] {name}: {version}")
        return True
    except ImportError:
        print(f"  [MISSING] {name}")
        return False

def check_all():
    print("=" * 50)
    print("UAV VLA/VLM/World Model 环境检查")
    print("=" * 50)

    # 1. CUDA
    import torch
    print(f"\n[GPU]")
    print(f"  CUDA available: {torch.cuda.is_available()}")
    if torch.cuda.is_available():
        print(f"  GPU: {torch.cuda.get_device_name(0)}")
        print(f"  VRAM: {torch.cuda.get_device_properties(0).total_memory / 1e9:.1f} GB")

    # 2. 核心包
    print(f"\n[Core]")
    for pkg in ['torch', 'torchvision', 'torchaudio']:
        check_package(pkg)

    # 3. Hugging Face
    print(f"\n[Hugging Face]")
    for pkg in ['transformers', 'diffusers', 'datasets', 'accelerate', 'peft', 'huggingface_hub']:
        check_package(pkg)

    # 4. 科学计算
    print(f"\n[Scientific]")
    for pkg in ['numpy', 'scipy', 'matplotlib', 'opencv-python', 'PIL:pillow']:
        if ':' in pkg:
            name, imp = pkg.split(':')
            check_package(name, imp)
        else:
            check_package(pkg)

    # 5. 机器人与仿真
    print(f"\n[Robotics & Sim]")
    for pkg in ['gymnasium', 'pyquaternion', 'transforms3d']:
        check_package(pkg)

    print(f"\n{'=' * 50}")
    print("环境检查完成。如果所有项均为 [OK],可以开始实验。")

if __name__ == '__main__':
    check_all()

8. 常见问题与解决方案

Q1: torch.cuda.is_available() 返回 False

原因与解决方案:

  • 检查 NVIDIA 驱动是否安装正确:运行 nvidia-smi
  • PyTorch 版本与 CUDA 版本不匹配:重新安装对应版本的 PyTorch
  • WSL2 中未安装 nvidia-cuda-toolkit:确保 Windows 端驱动是最新版本
  • 多 GPU 环境中 CUDA_VISIBLE_DEVICES 设置错误:检查环境变量

Q2: WSL2 中内存不足(OOM)

# 在 Windows 端创建 %UserProfile%\.wslconfig 文件
# 内容如下:
[wsl2]
memory=48GB
swap=8GB
processors=16

Q3: Hugging Face 模型下载速度慢

# 使用镜像源
export HF_ENDPOINT=https://hf-mirror.com

# 或使用 huggingface-cli 下载
huggingface-cli download --resume-download model_name --local-dir ./models

Q4: ROS2 与 Python 版本冲突

ROS2 Humble 默认使用 Python 3.10。建议在 ROS2 工作空间使用系统 Python,在深度学习环境使用 conda/venv。两者不要混用。

# 在 ROS2 终端中
source /opt/ros/humble/setup.bash
# 不要在此环境下 conda activate

# 在深度学习终端中
conda activate uavvla
# 不要在此环境下 source ROS2 的 setup.bash

Q5: PX4 SITL 编译失败

# 确保安装了所有依赖
sudo apt install -y git cmake ninja-build gperf \
  ccache dfu-util device-portal-common \
  libglib2.0-dev libpython3-dev pkg-config

# 清理后重新编译
cd PX4-Autopilot
make clean
make px4_sitl_default

Q6: xformers 安装失败

# 确保 PyTorch 和 CUDA 版本匹配
pip install xformers --index-url https://download.pytorch.org/whl/cu121

# 或使用预编译版本
pip install xformers==0.0.23.post1 --extra-index-url https://download.pytorch.org/whl/cu121

Q7: GPU 显存不足怎么办?

# 方法 1: 使用半精度推理
model = model.to(torch.float16)

# 方法 2: 使用 4-bit 量化(需要 bitsandbytes)
from transformers import BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(load_in_4bit=True)
model = AutoModelForCausalLM.from_pretrained(model_name, quantization_config=bnb_config)

# 方法 3: 使用 DeepSpeed ZeRO
# 方法 4: 减小 batch_size
# 方法 5: 使用 gradient checkpointing
model.gradient_checkpointing_enable()

动手验证:硬件需求表里的显存是怎么算出来的?

第 1 节那张表给了每一行的"最低"和"推荐"两栏,但没写这些数是怎么来的。这类表多是经验估算,彼此之间也常常对不上:同为 7B 微调,不同地方给出的数从 18 GB 到 48 GB 都有。

它们不是谁抄错了。显存是四笔账的和:权重 / 梯度 / 优化器状态 / 激活。前三笔是精确算术,只要写清楚哪几项算了、按什么精度算,答案唯一;只有第四笔要实测。而四笔里最容易被漏掉的自变量是每个样本多少个 token —— 各类硬件表几乎都不写它。

前三笔的公式,和一列反解表假设的算式

GB = 2 ** 30                                   # 与 nvidia-smi 的口径一致
P7, N_LAYER, D_MODEL = 7.0e9, 32, 4096         # LLaMA-2 7B 的规模
def pad(s, w, right=False):                    # 中文占两格,str.ljust 数不出来
    n = " " * max(0, w - sum(2 if ord(c) > 0x2E80 else 1 for c in s))
    return n + s if right else s + n
def lora(r):                                   # 每层 4 个 d x d 投影,各挂一对 d x r
    return N_LAYER * 4 * 2 * D_MODEL * r
def static_gb(n_frozen, n_trainable):
    """冻结的只存 fp16 一份;可训练的存 fp16 权重 + fp16 梯度 + fp32 两份动量。"""
    return (2 * n_frozen + 12 * n_trainable) / GB
print("一、静态三项是精确算术,算不出花来")
print("  " + pad("配置", 18) + pad("权重", 8, True) + pad("梯度", 8, True)
      + pad("Adam", 8, True) + pad("合计", 8, True))
for name, nf, nt in (("全量 fp16 + Adam", 0.0, P7), ("只推理, fp16", P7, 0.0),
                     ("LoRA r=64", P7, lora(64))):
    w, g, a = 2 * (nf + nt) / GB, 2 * nt / GB, 8 * nt / GB
    print(f"  {pad(name, 18)}{w:>7.1f}G{g:>7.1f}G{a:>7.1f}G{w + g + a:>7.1f}G")
def solve(b1, g1, b2, g2):                     # 设 g = 固定项 + batch x 每样本项
    per = (g2 - g1) / (b2 - b1)
    return g1 - per * b1, per
print("\n二、同一张表里两行只差 batch,就能解出固定项与每样本项")
for name, b1, g1, b2, g2 in (("07/03 ResNet-50", 16, 8.0, 32, 14.0),
                             ("07/04 hidden=256", 32, 10.0, 64, 18.0),
                             ("07/07 DreamerV3", 50, 6.0, 100, 10.0)):
    f, p = solve(b1, g1, b2, g2)
    print(f"  {pad(name, 18)}固定项 {f:>5.2f}G   每样本 {p:>6.3f}G")

本地实测结果

静态三项(7B 参数):

  配置                          权重    梯度    Adam    合计 字节/参数
  全量 fp16 + Adam             13.0G   13.0G   52.2G   78.2G        12
  全量 fp32 + Adam             26.1G   26.1G   52.2G  104.3G        16
  只推理, fp16                 13.0G    0.0G    0.0G   13.0G         2
  LoRA r=16 (29M 可训练)       13.1G    0.1G    0.2G   13.4G         2
  LoRA r=64 (117M 可训练)      13.3G    0.2G    0.9G   14.4G         2

优化器状态这一项不是推的,是真建一个模型、真走一步 Adam 之后数出来的:

二、优化器状态不是估的:真建一个 66K 参数的模型,真走一步 Adam
  实测 528408 字节 / 66049 参数 = 8.0 字节每可训练参数(一阶动量 fp32 + 二阶动量 fp32,正好 8)
  换算:7B 全量微调这一项要 52.2 GB;
        换成 LoRA r=16,可训练参数只剩 0.42%,这一项塌到 0.22 GB。

第四笔账要实测。激活用 torch.autograd.graph.saved_tensors_hooks 拦下反向图保留的每个张量:

三、激活:ResNet-50(25.6M 参数,torchvision 原版结构)
  batch    权重+梯度+Adam     激活     合计
  16                0.29G    1.94G    2.23G
  32                0.29G    3.89G    4.17G
  两行相减解出:固定项 +0.00 GB,每样本 0.121 GB。
  固定项是 0 而不是参数那 0.10 GB——因为参数已经在上一段被剔掉了,
  激活里本来就不该有它。两笔账各归各的,才不会重复计入。

同一套测量放到 7B 那个宽度上(隐藏 4096、512 个 token):

四、激活随规模怎么涨(隐藏 4096、512 个 token)
  层数    batch       激活   每层每样本
  1           1    136.1MB      136.1MB
  1           2    272.1MB      136.1MB
  1           4    544.3MB      136.1MB
  2           1    272.1MB      136.1MB
  2           2    544.3MB      136.1MB
  2           4   1088.6MB      136.1MB
  4           1    544.3MB      136.1MB
  4           2   1088.6MB      136.1MB
  4           4   2177.1MB      136.1MB
  归一化之后九格里只差 0.0%——层数和 batch 都是一次方,所以能安全外推。

于是得到一把尺子:8.5 MB/token(32 层合计),与 batch 无关。它可以两用——先算真实配置的账,再拿去量出处不明的资源表:

六、对账:先算真实配置的账,再把尺子用到资源表上

  六之一、06 号脚本写的是 3 x A100(40G)、per_device_batch 32、seq 2048、r=64
    每卡静态(r=64)= 14.4G,40G 卡留给激活 25.6G
    每卡需要激活 544G(65536 token x 8.5 MB),超预算 21 倍
    静态账怎么算都装得下,装不下的是激活——这就是脚本里
    --gradient_checkpointing True 存在的算术理由。

  六之二、用这把尺子量两张出处不明的表(示例)
  示例              配置                   文档   静态   余额 反解 token
  1               LoRA r=64, bs=2         18G  14.4G   3.6G        220
  2               LoRA r=128, bs=4        24G  15.7G   8.3G        251
  3               全量微调, 4 卡          80G  78.2G   1.8G        213
  4               LoRA, bs=4, fp16        18G  13.4G   4.6G        139
  5               LoRA, bs=8, bf16        40G  13.4G  26.6G        401

  统一按 256 token 重算,GeoChat 那三行几乎重合,UAV-Flow 两行还差一截:
  配置                           文档   按 256 token 重算       差
  LoRA r=64, bs=2                 18G               18.6G      +3%
  LoRA r=128, bs=4                24G               24.2G      +1%
  全量微调, 4 卡                  80G               80.4G      +0%
  LoRA, bs=4, fp16                18G               21.9G     +22%
  LoRA, bs=8, bf16                40G               30.4G     -24%

三件事从上面这几段里读出来。

第一,LoRA 真正省下的不是权重,是优化器状态。 权重从 13.0 GB 只涨到 14.4 GB,而 Adam 那一项从 52.2 GB 塌到 0.9 GB。所以第 1 节那张表里「VLM 推理 16 GB / 微调 24 GB」的差距,主要不在参数量,在要不要存两份动量。

第二,静态账怎么算都装得下,装不下的是激活。 本仓库 06 号那份复现指南的真实配置是 batch 32 x 2048 token = 65536 token,按这把尺子要 544 GB,而 40 GB 卡减去静态账只剩 25.6 GB —— 超预算 21 倍。这个缺口只能靠梯度检查点(重算换显存)来补,不可能靠调 LoRA 秩。想省显存和想省算力在这里是对着干的。

第三,这把尺子能验「自洽」,验不了「有出处」。 上面那几行反解出来的序列长度落在 139 ~ 401 token —— 正是 VLM 读一张图加一句指令的量级,每一行看着都合理,算得通。它们之所以是编的,不是因为算不通,而是因为原论文与仓库里根本没有按配置分行的显存数据,那几个数无从产生。看表时先问「这个数在源头存在吗」,再问「它算得通吗」。

第四,量小模型时这把尺子还会失灵。 一张常见的 ResNet-50 显存表自己解出来是固定项 2.0 GB、每样本 0.375 GB,而实测是固定项 0.00 GB、每样本 0.121 GB —— 每样本差 3.1 倍,还凭空多出 2.0 GB。原因在实测那一段:ResNet-50 的参数一共才 0.29 GB,nvidia-smi 读到的东西里框架开销和显存碎片占了大头,那不是能按算法量算出来的。看表之前先看模型有多大。

顺带一个可迁移的算式:同一张表里只要有两行只差 batch,就能解出"固定项"和"每样本项"两个未知数,不需要任何额外信息。三张不同项目的表各自解出来的固定项都是 2.00 GB —— 更可能是同一种估算习惯,而不是三次独立的测量。

限制:激活那一项是 PyTorch eager 模式量出来的,而且 PyTorch 2.x 的 nn.MultiheadAttention 在 need_weights=False 时走 SDPA 融合核,不会把注意力矩阵留在图里 —— 所以这份账里不含 seq² 那一项,这是现代实现的正常样子。真机上 nvidia-smi 还会多出框架开销、cuDNN workspace 和显存碎片,本节没有算,也不该算进算法需求里。

本节只算单卡。ZeRO、张量并行这类分片方案会把静态三项按卡数切开,07/02 和 07/06 里那些"4 卡"的行要按各自实际用的策略另算。

反解出的"序列长度"依赖一个前提:那几行之间除了 batch 和 token 数没有别的变量。UAV-Flow 那两行换过精度(fp16 → bf16)和硬件(4090 → A100),所以它们重算后仍差 21% 和 24%,不能全记在序列长度头上。

显存的三项是精确算术,第四项激活随规模走,而序列长度是那些表从没写过的自变量

运行完整脚本

py -3.9 code/o_budget.py    # 约 2 分钟,CPU 即可,只需 torch 与 torchvision

下一步

环境搭建完成后,你可以根据兴趣选择以下方向进行实践:


思考题

  1. 选型判断:上面那张硬件需求表里,每一行都有"最低"和"推荐"两栏。如果手上只有一张 RTX 4090(24 GB),表里哪些项目跑得动、哪些跑不动?判断时说清楚你用的是哪一栏。

  2. 环境隔离:Q4 反复强调 ROS2 环境和深度学习环境不要混用。为什么混用会出问题?文档给出的具体操作规则是什么?

  3. 排障顺序:torch.cuda.is_available() 返回 False 时,Q1 列了四条可能原因。在 WSL2 这个特定环境下,你会按什么顺序排查?为什么某一条在 WSL2 里其实很少是真正的原因?

  4. 成本权衡:Q7 给了五种应对显存不足的方法。对一个 7B VLM 的 LoRA 微调任务、在 24 GB 卡上,你会优先选哪一种?为什么不是另外几种?

  5. 验证的边界:第 7 节那个环境验证脚本靠逐个 import 来检查。它检查不到哪些东西?"全部 [OK]" 能说明什么、不能说明什么?

参考答案 1. 关键是把两栏分开看。**推荐栏**里能对上 4090(24 GB)的是 VLM 推理(7B,24 GB)和世界模型训练 DreamerV3(24 GB);**最低栏**里能跑的是 VLM 微调(24 GB)、VLA 模型(24 GB)、世界模型训练(12 GB),以及不需要 GPU 的 PX4 SITL 和数据集处理。而 VLM 微调(推荐 48 GB)用 4090 会吃紧——注意这一行"最低 24 GB"和"推荐 48 GB"差一倍,说明最低配置实际体验会很勉强。文档给的替代方案是云 GPU(Colab Pro / AutoDL / Lambda Cloud)。表里"视频生成推理(现成 I2V 模型)"那一行两栏都是"未实测"——**FlightDiffusion 并不训练扩散模型**(用的是现成的 Wan 2.2 I2V Fast),只有推理一档,且这一档尚未量过,两栏都给不出数。 2. ROS2 Humble 默认绑定系统 Python 3.10,而 conda 环境会改写解释器和 `PYTHONPATH`。混用后 `import rclpy` 要么直接失败,要么加载到用错误 Python 版本编译的扩展模块。文档给的规则很明确:**ROS2 终端只 `source /opt/ros/humble/setup.bash`,不要 `conda activate`;深度学习终端只 `conda activate uavvla`,不要 source ROS2 的 setup.bash。** 也就是用两个终端把两套环境物理隔开。 3. 先跑 `nvidia-smi` —— 成本最低,且能一票否决。WSL2 的特殊性在于:**不需要在 WSL2 里单独装 CUDA Toolkit**,Windows 端驱动会通过 `/usr/lib/wsl/lib/` 自动映射进来。所以"WSL2 里没装 cuda-toolkit"这条通常不是真因,该查的是 **Windows 端的驱动版本是否够新**。之后才轮到 PyTorch 版本与 CUDA 是否匹配,最后查 `CUDA_VISIBLE_DEVICES`。 4. 优先 **4-bit 量化(bitsandbytes)+ gradient checkpointing**。理由:LoRA 本身已把可训练参数压得很低,配 4-bit 量化加载基座是这个组合的标准做法,而 6.3 节已经把 `peft` 和 `bitsandbytes` 装好了。半精度(方法 1)对本来就用 fp16 训练的任务收益有限;DeepSpeed ZeRO(方法 3)主要面向多卡或分片优化,单卡收益不如前两者直接;减小 batch_size(方法 4)直接拉长训练时间,通常留作最后手段。 5. 它只覆盖 **Python 侧**。检查不到:CUDA 版本与 PyTorch 是否真正兼容(`is_available()` 为 `True` 时算子仍可能不匹配)、ROS2 / PX4 / MAVROS 这些非 Python 组件、MAVROS 需要的 GeographicLib 数据集是否安装,以及 `xformers` 这类只在运行时才报错的算子包。所以"全部 [OK]"是**必要不充分**条件 —— 它排除了一批低级问题,但不能保证后面复现时不出环境问题。