☰
虚拟机中搭建深度学习与MATLAB环境:GPU直通与性能调优实战
2026/10/22 10:49:26 网站建设 项目流程

1. 为什么要在虚拟机里搭深度学习与MATLAB环境

把深度学习框架和MATLAB塞进同一台物理机,最直接的冲突就是CUDA版本和系统级依赖的互相打架。MATLAB对显卡驱动有自己的一套要求,而PyTorch、TensorFlow这些框架又对CUDA和cuDNN版本极其挑剔,装在一起经常出现“装了MATLAB之后Python环境崩了”或者“升级了显卡驱动MATLAB又报错”的尴尬局面。我最早是在一台主力工作站上硬扛,结果每次换项目都要重装系统,后来彻底转向虚拟机方案,用VMware把两套环境彻底隔离,物理机只负责提供硬件资源,虚拟机里随便折腾,快照一打,出问题几秒钟回滚。

这套方案的核心价值在于环境隔离和可复现性。深度学习这边,你可以为每个项目单独建一个虚拟机,PyTorch 2.x配CUDA 12.1,另一个虚拟机跑TensorFlow 2.15配CUDA 11.8,互不干扰。MATLAB那边,不同版本对工具箱的支持差异很大,R2023b和R2024a在某些深度学习工具箱的API上就有变化,用虚拟机可以同时保留多个版本,需要哪个开哪个。适合谁参考?我觉得三类人最需要:一是学生和科研人员,实验室电脑不能随便重装,虚拟机是最稳妥的方案;二是算法工程师,本地开发环境需要和服务器环境保持一致,虚拟机可以精确模拟;三是刚入门深度学习的开发者,不想因为环境问题劝退,虚拟机快照能给你兜底。

不过虚拟机方案也不是没有代价。最直接的就是性能损耗,尤其是GPU直通这块,VMware Workstation Pro从16版本开始对PCIe直通的支持好了很多,但配置起来还是有不少坑。CPU和内存的损耗大概在5%到10%,磁盘IO损耗更明显,所以虚拟机磁盘一定要放在SSD上。GPU直通之后性能损耗可以控制在3%以内,基本接近物理机。下面我会把整个搭建过程拆开,从虚拟机创建、系统安装、GPU直通配置,到深度学习环境和MATLAB的部署,每一步都给出具体的参数和踩坑记录。

2. 虚拟机创建与系统安装的实操细节

2.1 VMware版本选择与虚拟机参数规划

VMware Workstation Pro是我用得最顺手的,17版本对Windows 11宿主和Linux客户机的兼容性最好。Player版本虽然免费,但不支持快照和GPU直通的高级配置,做深度学习环境不建议省这个钱。下载安装过程没什么好说的,重点在虚拟机创建时的参数规划。

处理器分配有个经验公式:物理核心数的一半,但不超过16个。比如你的CPU是16核32线程,虚拟机给8核16线程就够了,再多宿主机会卡。内存方面,深度学习训练对内存需求很大,建议物理内存的60%到70%,比如64GB内存的机器,虚拟机给40GB到44GB。但要注意,如果你同时开多个虚拟机,这个比例要重新分配。磁盘是重点,必须用NVMe SSD,虚拟机磁盘类型选SCSI而不是IDE,容量建议200GB起步,因为CUDA工具包加上MATLAB完整安装动辄就是80GB到100GB。磁盘模式选“拆分为多个文件”而不是“单个文件”,虽然性能略低但迁移和备份方便很多。

网络模式我推荐NAT,虚拟机通过宿主上网,不需要额外配置。如果你需要从局域网其他机器访问虚拟机的Jupyter Notebook或者MATLAB Web App,那就选桥接模式,虚拟机会获得独立IP。显卡方面,创建虚拟机时先不要勾选“加速3D图形”,等系统装完再配置直通,否则安装过程中可能黑屏。

2.2 Ubuntu系统安装与基础配置

深度学习环境我强烈推荐Ubuntu 22.04 LTS,这个版本对NVIDIA驱动和CUDA的支持最成熟,社区资料也最全。Ubuntu 24.04虽然更新,但有些深度学习库的依赖还没完全跟上,新手容易踩坑。MATLAB在Ubuntu上的官方支持也是22.04最稳。

安装过程有几个关键点。第一,分区方案:我习惯手动分区,给/根分区100GB,/home分区80GB,swap分区32GB(和内存等大或略小),剩下的空间留给数据盘挂载到/data。这样重装系统时/home和/data的数据不会丢。第二,安装时不要勾选“安装第三方软件”,因为虚拟机环境下的显卡驱动和无线网卡驱动不需要这些,勾了反而可能装错驱动导致进不了桌面。第三,用户名和密码不要用特殊字符,后面配置SSH和Samba共享时省事。

系统装完后第一件事是换国内源,不然apt更新能等到天荒地老。编辑/etc/apt/sources.list,把archive.ubuntu.com替换成mirrors.aliyun.com或者mirrors.tuna.tsinghua.edu.cn。然后执行:

sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential git curl wget vim htop net-tools

这些基础工具后面编译安装和排查问题都会用到。注意:升级内核后如果之前配了GPU直通,可能需要重新编译VMware Tools的内核模块,所以建议在装系统阶段就把所有更新做完,再配置直通。

2.3 VMware Tools安装与共享文件夹配置

VMware Tools是虚拟机和宿主之间沟通的桥梁,剪贴板共享、文件拖拽、分辨率自适应都靠它。Ubuntu 22.04下安装很简单:

sudo apt install -y open-vm-tools open-vm-tools-desktop

装完后重启,剪贴板和拖拽功能就生效了。共享文件夹配置在VMware的虚拟机设置里,添加宿主的一个目录,比如D:\vm_share,然后在Ubuntu里挂载:

sudo mkdir -p /mnt/hgfs/share sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other

为了让共享文件夹开机自动挂载,把下面这行加到/etc/fstab:

.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,defaults 0 0

踩坑记录:如果挂载时报fuse: mountpoint is not empty,说明/mnt/hgfs目录下已经有东西了,清空再挂。另外,共享文件夹的读写权限取决于宿主目录的权限设置,如果Ubuntu里写不进去,检查宿主目录是否给了写权限。

3. GPU直通配置与性能调优

3.1 PCIe直通的前置条件与配置步骤

GPU直通是虚拟机跑深度学习的命门,没有直通就只能用CPU训练,速度差几十倍。VMware Workstation Pro的直通配置在虚拟机设置的“硬件”选项卡里,但前提是宿主机的BIOS里开启了VT-d(Intel)或AMD-Vi(AMD),并且CPU支持IOMMU。Windows宿主要确认“虚拟机平台”和“Windows虚拟机监控程序平台”这两个功能已启用。

配置步骤:关闭虚拟机,在VMware里进入“虚拟机设置”->“硬件”->“添加”->“PCI设备”,选择你的NVIDIA显卡。注意:如果宿主机是Windows且显卡是唯一显示输出,直通后宿主机可能会黑屏,所以最好用核显输出显示,独显专门直通给虚拟机。直通成功后,在Ubuntu里执行lspci | grep -i nvidia应该能看到显卡设备。

关键一步:直通后宿主机不能再使用这块显卡,所以如果你只有一块独显,直通后宿主机就只剩核显了。另外,VMware的直通不支持热插拔,每次开关虚拟机都要重新初始化显卡状态,偶尔会出现直通失败的情况,重启宿主机就能解决。

3.2 NVIDIA驱动安装与CUDA版本选择

驱动安装我推荐用官方.run文件而不是apt,因为apt源里的驱动版本往往偏旧,而且和CUDA工具包的兼容性不好控制。先从NVIDIA官网下载对应显卡的驱动,比如NVIDIA-Linux-x86_64-535.154.05.run。安装前要禁用nouveau驱动:

sudo bash -c "echo 'blacklist nouveau' >> /etc/modprobe.d/blacklist-nouveau.conf" sudo bash -c "echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist-nouveau.conf" sudo update-initramfs -u sudo reboot

重启后按Ctrl+Alt+F3进入命令行模式,停止显示管理器:

sudo systemctl stop gdm3 sudo chmod +x NVIDIA-Linux-x86_64-535.154.05.run sudo ./NVIDIA-Linux-x86_64-535.154.05.run

安装过程中会问是否安装32位兼容库,选是;问是否更新X配置,选是。装完nvidia-smi能看到显卡信息就成功了。

CUDA版本的选择取决于你要用的深度学习框架。PyTorch 2.1到2.3推荐CUDA 12.1,TensorFlow 2.15推荐CUDA 11.8。我一般装两个CUDA版本,通过环境变量切换。CUDA 12.1的安装:

wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run sudo sh cuda_12.1.0_530.30.02_linux.run

安装时取消勾选Driver,因为驱动已经单独装过了。装完把CUDA路径加到~/.bashrc:

export PATH=/usr/local/cuda-12.1/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH

cuDNN的安装就是下载对应版本的压缩包,解压后把文件复制到CUDA目录:

tar -xzvf cudnn-linux-x86_64-8.9.0.131_cuda12-archive.tar.xz sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.1/include sudo cp cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.1/lib64 sudo chmod a+r /usr/local/cuda-12.1/include/cudnn*.h /usr/local/cuda-12.1/lib64/libcudnn*

3.3 性能损耗实测与调优建议

我在一台配置为i9-13900K、64GB DDR5、RTX 4090的宿主机上做了对比测试。虚拟机分配8核16线程、40GB内存、GPU直通。ResNet-50训练CIFAR-10,物理机每epoch耗时42秒,虚拟机45秒,损耗约7%。这个损耗主要来自CPU虚拟化开销和内存延迟,GPU计算部分几乎无损耗。推理测试中,YOLOv8在物理机上单帧8.2ms,虚拟机上8.5ms,损耗3.6%。

调优建议:第一,虚拟机CPU核心数不要超过物理核心数的一半,超线程对深度学习训练帮助有限,反而增加调度开销。第二,内存分配要留足余量,宿主机至少保留16GB,否则VMware会频繁交换内存到磁盘,性能断崖式下跌。第三,虚拟机磁盘用独立SSD,不要和宿主机系统盘共用,IO争抢会严重影响数据加载速度。第四,关闭虚拟机的3D加速,GPU直通后这个功能反而会干扰。第五,VMware的“首选模式”设为“为虚拟机优化”,在虚拟机设置的高级选项里。

4. 深度学习环境部署与MATLAB安装

4.1 Python环境管理与PyTorch/TensorFlow安装

Python环境我强烈推荐Miniconda而不是Anaconda,Anaconda预装了大量用不到的包,拖慢环境创建速度。Miniconda安装:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh

装完创建独立环境:

conda create -n dl python=3.10 conda activate dl

PyTorch安装用官方命令,注意CUDA版本要匹配:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

TensorFlow安装:

pip install tensorflow==2.15.0

验证GPU是否可用:

import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) import tensorflow as tf print(tf.config.list_physical_devices('GPU'))

常见坑:如果torch.cuda.is_available()返回False,先检查驱动版本和CUDA版本是否匹配,再检查虚拟机是否真的直通了GPU。有时候nvidia-smi能看到显卡但PyTorch用不了,多半是CUDA路径没配好,echo $LD_LIBRARY_PATH确认一下。

4.2 MATLAB安装与深度学习工具箱配置

MATLAB在Linux下的安装比Windows麻烦一些,但也不复杂。下载ISO镜像后挂载:

sudo mkdir /mnt/matlab sudo mount -o loop R2024a_Linux.iso /mnt/matlab cd /mnt/matlab sudo ./install

安装时选择“使用文件安装密钥”,输入许可证对应的密钥。安装路径建议/usr/local/MATLAB/R2024a,方便管理。注意:安装过程中会问是否创建符号链接,选是,这样在终端直接输入matlab就能启动。

深度学习工具箱的配置重点在GPU支持。MATLAB的gpuDevice命令可以查看GPU信息,如果报错说找不到支持的GPU,说明MATLAB的CUDA版本和驱动不匹配。R2024a支持CUDA 12.x,对应驱动版本要535以上。在MATLAB里执行:

gpuDevice

如果显示显卡型号和显存信息,说明配置成功。踩坑记录:MATLAB的深度学习工具箱对cuDNN版本有要求,R2024a需要cuDNN 8.9,如果系统里装的是其他版本,需要把对应版本的cuDNN库路径加到MATLAB的LD_LIBRARY_PATH里,或者直接在MATLAB的startup.m里设置。

4.3 环境变量冲突排查与共存方案

深度学习框架和MATLAB共存最大的问题是环境变量冲突。PyTorch需要CUDA 12.1,MATLAB可能依赖CUDA 12.2,两个版本的库文件如果都在LD_LIBRARY_PATH里,程序加载时可能拿错版本。我的解决方案是用脚本动态切换环境变量。

创建一个switch_env.sh:

#!/bin/bash if [ "$1" == "dl" ]; then export PATH=/usr/local/cuda-12.1/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH echo "Deep Learning environment activated" elif [ "$1" == "matlab" ]; then export PATH=/usr/local/cuda-12.2/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH echo "MATLAB environment activated" fi

每次开终端先source switch_env.sh dl或者source switch_env.sh matlab。这样两个环境互不干扰。另外,MATLAB的startup.m里可以单独设置setenv('LD_LIBRARY_PATH', ...),进一步隔离。

另一个坑:MATLAB安装时会自带一套BLAS和LAPACK库,如果Python环境里的numpy链接到了MATLAB的库,可能导致数值计算错误。检查方法:ldd $(python -c "import numpy; print(numpy.__file__)"),看看有没有链接到MATLAB的库。如果有,在conda环境里重装numpy即可。

5. 常见问题排查与避坑经验

5.1 虚拟机启动与GPU直通故障速查表

问题现象可能原因解决方法
虚拟机开机黑屏GPU直通后宿主机显示输出冲突用核显输出,或关闭直通再开机
nvidia-smi报错“No devices found”驱动未安装或直通失败重装驱动,检查VMware直通设置
直通后宿主机花屏独显被虚拟机占用宿主机改用核显,或关机后释放
虚拟机内分辨率无法调整VMware Tools未装或未启动重装open-vm-tools,重启
共享文件夹挂载失败fuse权限或目录非空清空挂载点,加allow_other参数
CUDA程序报“out of memory”虚拟机显存分配不足检查是否直通了完整显卡,非vGPU

5.2 深度学习训练中的性能异常排查

训练速度突然变慢,先看nvidia-smi的GPU利用率。如果利用率低于50%,说明数据加载是瓶颈。检查DataLoader的num_workers设置,虚拟机环境下建议设为CPU核心数的1/4到1/2。比如8核虚拟机,num_workers=2或4。另外,虚拟机的磁盘IO比物理机慢,如果数据集在共享文件夹里,读取速度会非常慢,一定要把数据集复制到虚拟机本地磁盘。

如果GPU利用率高但loss不下降,检查随机种子和初始化。虚拟机环境不会影响数值计算结果,但如果你在多个虚拟机之间迁移代码,注意CUDA版本差异可能导致某些算子行为不同。我遇到过一次PyTorch 2.0和2.1在同一个模型上loss曲线不一致的情况,后来发现是cuDNN的benchmark模式默认值变了,在代码里显式设置torch.backends.cudnn.benchmark = True就统一了。

5.3 MATLAB与Python混合调用的注意事项

MATLAB R2024a支持直接调用Python,但虚拟机环境下路径配置容易出问题。在MATLAB里执行:

pyenv('Version', '/home/user/miniconda3/envs/dl/bin/python')

指定Python解释器路径。注意:MATLAB调用的Python环境里必须装好numpy、scipy等基础库,而且Python版本要和MATLAB兼容,R2024a支持Python 3.9到3.11。如果调用时报“Unable to resolve the name py.xxx”,多半是Python路径没设对,或者环境变量在MATLAB启动后才生效。

反过来,Python调用MATLAB引擎需要安装matlab.engine包:

cd /usr/local/MATLAB/R2024a/extern/engines/python python setup.py install

然后在Python里:

import matlab.engine eng = matlab.engine.start_matlab() result = eng.sqrt(4.0)

踩坑记录:MATLAB引擎启动时会占用较多内存,如果虚拟机内存不足会直接崩溃。建议在调用MATLAB引擎前关闭其他大型程序,或者给虚拟机多分配一些内存。

5.4 快照管理与环境备份策略

虚拟机最大的优势就是快照,但快照不能滥用。我的策略是三层备份:第一层,系统装完+驱动装完+基础工具装完,打一个“base”快照;第二层,深度学习环境和MATLAB都装好并验证通过,打一个“full”快照;第三层,每个重要项目开始前打一个项目快照。快照文件会占用大量磁盘空间,建议定期清理旧快照,只保留最近两三个。

除了快照,conda环境导出也很重要:

conda env export > environment.yml

MATLAB的配置可以通过matlab -batch "matlab.internal.project.util.saveProject"导出,或者直接备份~/.matlab目录。这样即使虚拟机彻底崩了,也能快速重建环境。

6. 个人实操体会与扩展建议

这套虚拟机方案我用了两年多,从VMware 16用到17,从Ubuntu 20.04用到22.04,最大的感受是前期配置麻烦,后期省心。第一次配GPU直通花了整整一个周末,踩了无数坑,但配好之后,换项目、换框架版本、甚至换操作系统,都是几分钟的事。快照功能救了我至少五次,有一次升级CUDA把整个环境搞崩了,回滚快照三分钟恢复。

如果你宿主机内存只有32GB,我建议虚拟机给20GB,深度学习训练用小批量数据,或者用混合精度训练降低显存占用。如果宿主机没有第二块显卡做直通,可以考虑用WSL2作为替代方案,但WSL2的GPU直通配置和VMware完全不同,而且MATLAB在WSL2里的图形界面支持不如虚拟机完善。

后续扩展方向:一是可以配置多虚拟机集群,用VMware的克隆功能快速复制多个相同环境的虚拟机,配合mpirun做分布式训练测试;二是可以把虚拟机磁盘放到网络存储上,实现多台宿主机共享同一个虚拟机环境;三是可以用Ansible或Shell脚本把整个配置过程自动化,以后重建环境只需要跑一个脚本。这些我都在逐步尝试,后面有机会再单独整理。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询