01 - 环境搭建:UAV VLA/VLM/World Model 项目实践环境¶
预计阅读:15 分钟 | 前置知识:Linux 基础命令、Python 虚拟环境概念、GPU 驱动基本概念
本指南面向希望在本地复现 UAV 领域视觉语言动作模型(VLA)、视觉语言模型(VLM)及世界模型(World Model)相关论文的同学。我们将从零开始搭建一套完整的实验环境,覆盖 CUDA、PyTorch、ROS2、PX4 仿真及常用 Python 包。
目录¶
- 硬件需求总览
- NVIDIA 驱动与 CUDA 安装
- PyTorch 安装
- ROS2 Humble 在 WSL2 中的安装
- PX4 SITL 仿真环境
- 常用 Python 包安装
- 环境验证清单
- 常见问题与解决方案
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 安装步骤:
- 访问 CUDA Toolkit Archive
- 下载 CUDA Toolkit 12.1
- 运行安装程序,选择"自定义安装",勾选 CUDA Runtime、CUDA Developer Tools
- 安装完成后验证:
WSL2 中的 CUDA:
WSL2 中无需单独安装 CUDA Toolkit,Windows 端的驱动会通过 /usr/lib/wsl/lib/ 自动映射到 WSL2 内部。只需确保 Windows 端驱动已正确安装。
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 系统准备¶
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 构建工具¶
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)¶
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%,不能全记在序列长度头上。

运行完整脚本¶
下一步¶
环境搭建完成后,你可以根据兴趣选择以下方向进行实践:
- 02 - 复现 UAV-Flow — 视觉语言动作模型
- 03 - 复现 CognitiveDrone — 认知无人机数据采集
- 04 - 复现 FlightDiffusion — 扩散模型生成 FPV 视频
- 05 - 使用 MotionScape 数据集 — 运动场景数据集
- 06 - 复现 GeoChat — 遥感视觉语言模型
- 07 - 复现 DreamerV3-Drone — 世界模型无人机竞速
思考题¶
-
选型判断:上面那张硬件需求表里,每一行都有"最低"和"推荐"两栏。如果手上只有一张 RTX 4090(24 GB),表里哪些项目跑得动、哪些跑不动?判断时说清楚你用的是哪一栏。
-
环境隔离:Q4 反复强调 ROS2 环境和深度学习环境不要混用。为什么混用会出问题?文档给出的具体操作规则是什么?
-
排障顺序:
torch.cuda.is_available()返回False时,Q1 列了四条可能原因。在 WSL2 这个特定环境下,你会按什么顺序排查?为什么某一条在 WSL2 里其实很少是真正的原因? -
成本权衡:Q7 给了五种应对显存不足的方法。对一个 7B VLM 的 LoRA 微调任务、在 24 GB 卡上,你会优先选哪一种?为什么不是另外几种?
-
验证的边界:第 7 节那个环境验证脚本靠逐个
import来检查。它检查不到哪些东西?"全部 [OK]" 能说明什么、不能说明什么?