VMware虚拟机搭建深度学习训练环境
1. 为什么要在虚拟机里做深度学习训练
很多人第一次接触深度学习时,会直接在物理机上安装CUDA、cuDNN和各种框架,结果很快遇到一堆问题:显卡驱动冲突、不同项目依赖版本打架、环境配置好了却不敢升级系统……我曾经也这样折腾过,直到有次误操作导致整个开发环境崩溃,重装系统花了整整两天。
后来发现,用VMware虚拟机搭建深度学习环境,就像给你的AI实验建了个安全沙盒——所有操作都在里面进行,出了问题删掉重来就行,完全不影响主机系统。更重要的是,它能帮你解决几个实际痛点:
- 环境隔离:一个项目用PyTorch 1.12 + CUDA 11.3,另一个用TensorFlow 2.11 + CUDA 11.8,互不干扰
- 快速复现:把配置好的虚拟机导出成OVF文件,团队成员导入就能获得一模一样的环境
- 硬件兼容:即使你手头只有普通笔记本,也能通过GPU直通让虚拟机直接使用独显算力
- 教学演示:给学生或同事分享环境时,不用再发几十条命令,直接给个虚拟机镜像
当然,虚拟机不是万能的。如果你要做超大规模分布式训练,或者对延迟极其敏感的实时推理,那还是得上物理机。但对大多数个人开发者、学生和中小团队来说,VMware虚拟机是个既安全又高效的起点。
2. 准备工作:硬件与软件清单
在动手之前,先确认你的设备是否满足基本要求。这不是纸上谈兵,而是避免后面卡在某个环节的关键检查。
2.1 硬件要求
最核心的是显卡——必须是NVIDIA的消费级或专业级GPU,因为CUDA只支持NVIDIA。AMD显卡目前无法在VMware中直通用于深度学习训练。
| 组件 | 最低要求 | 推荐配置 | 说明 |
|---|---|---|---|
| CPU | Intel i5-8400 或 AMD Ryzen 5 2600 | Intel i7-10700K 或 AMD Ryzen 7 5800X | 需要支持VT-x/AMD-V虚拟化技术,BIOS中必须开启 |
| GPU | NVIDIA GTX 1060 6GB | RTX 3060 12GB 或更高 | 显存越大越好,训练大模型时6GB可能不够用 |
| 内存 | 16GB | 32GB或以上 | 虚拟机至少分配12GB,剩余内存给宿主机运行其他程序 |
| 存储 | 256GB SSD | 1TB NVMe SSD | 深度学习数据集动辄几十GB,SSD能显著提升IO速度 |
特别提醒:如果你用的是笔记本,务必确认它有独立显卡(不是核显),并且BIOS中能开启Intel VT-d或AMD-Vi(IOMMU)功能。很多轻薄本为了省电默认关闭这些选项。
2.2 软件准备
需要下载三个关键软件,建议都从官网获取最新稳定版:
- VMware Workstation Pro(Windows/Linux)或VMware Fusion(macOS):注意,免费的VMware Player不支持GPU直通,必须用Pro或Fusion版本
- Ubuntu 22.04 LTS ISO镜像:选择长期支持版本,避免频繁升级带来的兼容性问题
- NVIDIA显卡驱动安装包:从NVIDIA官网下载对应你GPU型号的最新驱动,不要用系统自带的开源驱动
下载完成后,把它们放在同一个文件夹里,比如D:\vmware-ai-env\,这样后面找起来方便。顺便检查下磁盘空间,确保有至少100GB空闲——虚拟机磁盘文件会随着训练数据不断膨胀。
3. 创建虚拟机:从零开始的详细步骤
现在进入实操环节。我会带你一步步创建虚拟机,每一步都说明为什么这么做,而不是简单罗列命令。
3.1 新建虚拟机向导设置
打开VMware Workstation,点击“创建新的虚拟机”,选择“典型(推荐)”模式:
- 安装程序光盘映像:浏览到你下载的Ubuntu 22.04 ISO文件
- 客户机操作系统:选择“Linux”,版本选“Ubuntu 64位”
- 虚拟机名称和位置:建议命名为
ubuntu-ai-train,位置选SSD盘,比如D:\vmware-ai-env\ - 磁盘容量:至少100GB,勾选“将虚拟磁盘存储为单个文件”——这样管理起来更方便,虽然初始占用小,但会随需增长
点击“完成”后,先别急着开机。在虚拟机设置里做几处关键调整:
- 处理器:勾选“虚拟化Intel VT-x/EPT或AMD-V/RVI”,这是GPU直通的前提
- 内存:分配12GB(如果你主机有32GB内存),不要超过主机内存的50%
- 网络适配器:选择“NAT模式”,这样虚拟机能上网但外部访问不到,更安全
- USB控制器:添加USB 3.0控制器,方便后续连接U盘传输数据
这些设置看似琐碎,但每一条都关系到后续能否顺利安装驱动和运行训练任务。
3.2 安装Ubuntu系统
点击“开启此虚拟机”,进入Ubuntu安装界面:
- 选择语言后,取消勾选“安装时下载更新”和“安装第三方软件”——网络不稳定时容易卡住,我们手动安装更可控
- 分区方案选“清除整个磁盘并安装Ubuntu”,接受默认LVM分区(自动管理磁盘空间)
- 创建用户时,用户名建议用全小写字母,比如
aiuser,密码自己记住就行
安装过程约10-15分钟。完成后重启,首次登录时会提示安装VMware Tools,先别点——我们要等NVIDIA驱动装好后再装,否则可能冲突。
登录桌面后,打开终端(Ctrl+Alt+T),执行两条基础命令更新系统:
sudo apt update && sudo apt upgrade -y sudo reboot重启后,系统就干净了,可以开始真正的深度学习环境搭建。
4. GPU直通配置:让虚拟机真正用上显卡
这才是VMware搭建深度学习环境的核心难点。很多教程到这里就失败了,关键在于理解原理:GPU直通不是简单“分配”显卡,而是让虚拟机绕过宿主机,直接和GPU硬件对话。
4.1 宿主机端配置(Windows为例)
首先在Windows宿主机上确认GPU是否支持直通。按Win+R输入dxdiag,在“显示”选项卡里看显卡型号。然后做三件事:
启用Hyper-V和Windows Hypervisor Platform:
# 以管理员身份运行PowerShell dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All /NoRestart bcdedit /set hypervisorlaunchtype auto重启电脑。
禁用显卡驱动的WDDM模式(防止Windows占用GPU):
- 打开设备管理器 → 显示适配器 → 右键NVIDIA显卡 → 属性 → “电源管理” → 取消勾选“允许计算机关闭此设备以节约电源”
- 在“详细信息”选项卡 → 属性下拉菜单选“硬件ID”,记下PCI总线号,比如
PCI\VEN_10DE&DEV_2484
修改VMware配置文件:
- 关闭VMware Workstation
- 找到虚拟机目录下的
.vmx文件(如ubuntu-ai-train.vmx) - 用记事本打开,在文件末尾添加:
其中mce.enable = "TRUE" pciPassthru0.id = "0000:01:00.0" pciPassthru0.allowMSI = "TRUE" pciPassthru0.romFile = ""0000:01:00.0是你刚才记下的PCI总线号,格式为0000:BB:DD.F(B=总线,D=设备,F=功能)
4.2 虚拟机内安装NVIDIA驱动
启动虚拟机,登录后打开终端,按顺序执行:
# 1. 禁用nouveau开源驱动(它会和NVIDIA驱动冲突) echo 'blacklist nouveau' | sudo tee /etc/modprobe.d/blacklist-nouveau.conf echo 'options nouveau modeset=0' | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u # 2. 安装编译依赖 sudo apt install build-essential libprocps-dev pkg-config libglvnd-dev -y # 3. 下载并安装NVIDIA驱动(以525.85.02为例,根据你的GPU型号选) wget https://us.download.nvidia.com/XFree86/Linux-x86_64/525.85.02/NVIDIA-Linux-x86_64-525.85.02.run chmod +x NVIDIA-Linux-x86_64-525.85.02.run sudo ./NVIDIA-Linux-x86_64-525.85.02.run --no-opengl-files --no-opengl-libs --no-x-check # 4. 验证安装 nvidia-smi如果看到类似这样的输出,说明GPU直通成功:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.85.02 Driver Version: 525.85.02 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... On | 00000000:01:00.0 Off | N/A | | 35% 42C P0 28W / 170W | 0MiB / 12288MiB | 0% Default | +-------------------------------+----------------------+----------------------+注意:如果nvidia-smi报错“NVIDIA-SMI has failed”,大概率是PCI总线号填错了,回去检查第4.1步。
5. 深度学习框架安装:PyTorch与TensorFlow双环境
GPU能用了,接下来安装框架。这里推荐同时装PyTorch和TensorFlow,因为不同项目可能依赖不同框架,而且它们的CUDA版本要求略有差异。
5.1 安装CUDA与cuDNN
虽然NVIDIA驱动已包含CUDA运行时,但深度学习框架需要完整的CUDA Toolkit。我们用conda安装,避免版本冲突:
# 1. 安装Miniconda(比Anaconda轻量) wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3 $HOME/miniconda3/bin/conda init bash source ~/.bashrc # 2. 创建两个独立环境 conda create -n pytorch-env python=3.9 conda create -n tf-env python=3.8 # 3. 在pytorch-env中安装CUDA 11.8(PyTorch 2.0推荐) conda activate pytorch-env conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia # 4. 在tf-env中安装CUDA 11.2(TensorFlow 2.11推荐) conda activate tf-env conda install tensorflow-gpu=2.11.0 cudatoolkit=11.2 -c conda-forge验证是否识别GPU:
# 切换到pytorch环境 conda activate pytorch-env python -c "import torch; print(torch.cuda.is_available())" # 应输出True # 切换到TensorFlow环境 conda activate tf-env python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))" # 应显示GPU设备5.2 配置Jupyter Notebook远程访问
训练时经常需要在宿主机浏览器查看训练过程,所以配置Jupyter远程访问很实用:
# 在pytorch-env中安装jupyter conda activate pytorch-env pip install jupyter notebook # 生成配置文件 jupyter notebook --generate-config # 设置密码(运行后按提示输入两次密码) python -c "from notebook.auth import passwd; print(passwd())" # 编辑配置文件 nano ~/.jupyter/jupyter_notebook_config.py在配置文件末尾添加:
c.NotebookApp.ip = '0.0.0.0' c.NotebookApp.port = 8888 c.NotebookApp.open_browser = False c.NotebookApp.allow_remote_access = True c.NotebookApp.password = 'sha1:your_hash_here' # 替换为上一步生成的hash启动服务:
jupyter notebook --no-browser --port=8888然后在Windows浏览器访问http://192.168.x.x:8888(x.x是虚拟机IP,用ip a命令查看),输入密码即可进入。
6. 实战测试:运行一个图像分类训练
环境搭好了,最后用一个经典案例验证是否真正可用。我们用PyTorch训练一个简单的CNN模型识别CIFAR-10数据集。
6.1 编写训练脚本
在虚拟机中创建train_cifar.py文件:
import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoader import time # 1. 数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)) ]) trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2) # 2. 定义简单CNN模型 class SimpleCNN(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(3, 32, 3) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(32, 64, 3) self.fc1 = nn.Linear(64 * 6 * 6, 512) self.fc2 = nn.Linear(512, 10) def forward(self, x): x = self.pool(torch.relu(self.conv1(x))) x = self.pool(torch.relu(self.conv2(x))) x = torch.flatten(x, 1) x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 3. 训练设置 device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") print(f"Using device: {device}") net = SimpleCNN().to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters(), lr=0.001) # 4. 开始训练 start_time = time.time() for epoch in range(2): # 只训练2轮,快速验证 running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() if i % 100 == 99: print(f'Epoch {epoch+1}, Batch {i+1}: Loss {running_loss/100:.3f}') running_loss = 0.0 print(f'Training completed in {time.time()-start_time:.1f} seconds')6.2 运行并监控GPU使用
保存文件后,在终端运行:
conda activate pytorch-env python train_cifar.py同时新开一个终端窗口,运行:
watch -n 1 nvidia-smi你会看到GPU利用率(GPU-Util)在训练时跳到70%-90%,显存(Memory-Usage)占用约3-4GB,这证明GPU确实在工作。如果利用率一直是0%,说明代码没走GPU路径,检查inputs.to(device)和net.to(device)是否遗漏。
训练完成后,模型就在GPU上跑起来了。你可以把train_cifar.py稍作修改,换成自己的数据集,就开始真正的深度学习项目了。
7. 常见问题与优化建议
实际使用中,总会遇到一些意料之外的问题。我把最常遇到的几个整理出来,并给出经过验证的解决方案。
7.1 虚拟机启动黑屏或卡在logo
这是GPU直通最常见的问题,90%是因为显卡被宿主机占用了。解决方法:
- 在Windows设备管理器中,右键NVIDIA显卡 → “禁用设备”
- 重启宿主机,再启动虚拟机
- 如果需要宿主机也用显卡,可以考虑双显卡方案:一块给宿主机,一块直通给虚拟机
7.2nvidia-smi显示“Failed to initialize NVML”
说明NVIDIA驱动没装好。重新执行4.2节的安装步骤,特别注意:
- 必须在文本模式(Ctrl+Alt+F3)下安装,不能在图形界面
- 安装时加上
--no-opengl-files参数,避免和VMware Tools冲突 - 安装后重启虚拟机,不要只是重启图形界面
7.3 训练速度比物理机慢很多
虚拟机性能损耗是正常的,但慢太多就该优化了:
- CPU分配:在VMware设置中,给虚拟机分配更多CPU核心(比如4核),并勾选“虚拟化CPU性能计数器”
- 内存设置:确保分配了足够内存,避免频繁swap
- 磁盘IO:把虚拟机磁盘文件放在SSD上,虚拟机设置中启用“磁盘缓存”
- 数据加载:在DataLoader中增加
num_workers=4和pin_memory=True,充分利用多核CPU预处理数据
7.4 如何备份和迁移环境
环境配置好后,千万别只留一个虚拟机。建议:
- 定期导出OVF:VMware菜单 → 文件 → 导出为OVF → 生成压缩包,这样在其他电脑上双击就能导入
- 记录conda环境:在每个环境中执行
conda env export > environment.yml,需要时用conda env create -f environment.yml恢复 - Git管理代码:把训练脚本、配置文件都放到GitHub,虚拟机只负责运行
这样即使某天虚拟机损坏,半小时内就能重建整个环境。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。