CUDA(Compute Unified Device Architecture,统一计算设备架构)是一种由NVIDIA公司推出的并行计算平台和编程模型,它特别适用于需要高性能计算(HPC)和大规模并行处理的场景。当我们在WSL2中开发深度学习与机器学习功能时,会遇到一个阻碍,就是Linux子系统如何调用宿主机的cuda驱动。本文我们将讲解如何解决这个问题。
Windows侧
确定GPU的型号
打开“设备管理器”,在“显示适配器”中找到GPU型号。
然后在https://www.nvidia.com/en-us/drivers/选择对应的GPU和操作系统型号。
下载并安装该程序。
然后我们在CMD中输入下面命令,查看cuda版本
nvcc --version
子系统侧
在https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local中选择WSL-Ubuntu对应的Toolkit
然后执行下面的命令
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.6.1/local_installers/cuda-repo-wsl-ubuntu-12-6-local_12.6.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-6-local_12.6.1-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-6
测试
我们使用《管理Python虚拟环境的脚本》中的脚本,构建虚拟环境。
source env.sh init
source env.sh enter
然后安装相关依赖
source env.sh install numba
source env.sh install numpy
保存下面的Python代码,然后执行
import numba
from numba import cuda
import numpy as np
import time
def simulate_long_gpu_computation():
# 检查是否有可用的GPU
if not cuda.is_available():
print("No GPU is available.")
return
# 打印可用的GPU信息
print("GPU is available.")
print("GPU name:", cuda.get_current_device().name)
# 定义一个复杂的CUDA内核函数
@cuda.jit
def complex_computation(a, b, c):
idx = cuda.grid(1)
if idx < a.size:
for _ in range(1000000): # 增加计算量
c[idx] += a[idx] * b[idx]
# 初始化数据
N = 1000000
a = np.random.rand(N).astype(np.float32)
b = np.random.rand(N).astype(np.float32)
c = np.zeros(N, dtype=np.float32)
# 将数据复制到GPU
a_device = cuda.to_device(a)
b_device = cuda.to_device(b)
c_device = cuda.to_device(c)
# 定义线程和块的数量
threads_per_block = 256
blocks_per_grid = (a.size + (threads_per_block - 1)) // threads_per_block
# 启动CUDA内核函数
start = time.time()
complex_computation[blocks_per_grid, threads_per_block](a_device, b_device, c_device)
cuda.synchronize()
end = time.time()
# 将结果复制回CPU
c = c_device.copy_to_host()
# 打印结果和计算时间
print("Computation completed.")
print("Time taken: {:.2f} seconds".format(end - start))
print("Result (first 10 elements):", c[:10])
if __name__ == "__main__":
simulate_long_gpu_computation()
可以看到如下输出
资源管理器中也会看到GPU的波动