4. 在WSL2中运行ollama
前阵子为了运行黑吗喽,将工作站上的 RTX3060 拆下来安装回了游戏主机上。
虽然最近已经比较少在本地运行大模型,可总有想尝鲜的时候,于是测试下了在 WSL2 中使用 N 卡加速 ollama,目前看来没有什么问题,一路安装下去即可。
为了方便折腾,这次也尝试了使用远程桌面访问 Windows 11,这里就做一下记录。
系统是 Windows 11 23H2,显卡为笔记本端魔改的 3060 12G,显卡驱动版本 560.94,对应 CUDA 版本 12.6.1。
WSL2 的开启比较简单,在控制面板上启用两个 Windows 功能:
- 适用于 Linux 的 Windows 子系统
- 虚拟机平台
然后在应用商店下载安装 Linux 发行版即可,我这里使用的是 Debian 12:
➜ ~ wsl.exe -l -v
NAME STATE VERSION
* Debian Running 2
WLS2 使用 hyper-v 虚拟化技术,需要安装专用 WSL 内核,在通过命令设置 WSL 版本时会提示下载安装内核文件安装。
最后是开启 root 用户,并启用 systemd,只需要在 Linux 系统上添加一个 /etc/wsl.conf 文件即可,内容如下:
➜ ~ cat /etc/wsl.conf
[boot]
systemd=true
[user]
default=root
为了方便连接 Windows 11 里的 Debian 12,我使用 gost 的端口转发功能,将软路由的一个端口映射到 WSL2 系统的 sshd 服务,这样就可以直接 ssh 登录 WSL2,详情参考:Linux笔记 / Proxmox VE / 7. 内网穿透
魔改显卡依旧需要使用对应的魔改驱动,而 CUDA 自带显卡驱动,正确的做法是:
- 安装魔改显卡驱动
- 找到魔改驱动版本对应的 CUDA 版本,下载完整离线安装包
- 安装 CUDA,安装过程中选择不安装 CUDA 自带的显卡驱动
普通显卡直接安装 CUDA 即可:CUDA Downloads,现在无需注册账号就可以下载,建议选择 exe (local) 类型离线安装包。
以 N 卡驱动 560.94 及对应的 CUDA 版本 12.6.1 为例,安装完成后会自动为 WSL2 启用显卡驱动支持,从 Windows Terminal 打开 Debian 12 时,默认的 PATH 环境变量如下:
➜ ~ echo $PATH
/root/dev/go/current/bin:/root/dev/go/path/bin:/root/dev/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.6/bin:/mnt/c/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v12.6/libnvvp:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/c/Program Files/NVIDIA Corporation/Nsight Compute 2024.3.1/:/mnt/c/Users/mikum/AppData/Local/Microsoft/WindowsApps
/usr/lib/wsl/lib 及 C 盘常用文件路径都都会被添加到 PATH 中,但这些路径在使用 ssh 登录 WSL2 时是不会自动配置的,我们可以将 Windows Terminal 中默认注入的 PATH 路径同步到 shell 配置文件中。
WSL2 的使用体验与普通 Linux 几乎没有差异:

在 WSL2 中执行以下命令安装 ollama:
curl -fsSL https://ollama.com/install.sh | sh
Linux 版本的 ollama 默认集成多种显卡驱动,导致体积接近 1G:
➜ ~ ls -lh /usr/local/bin/ollama
-rwxr-xr-x 1 root root 1020M Sep 8 15:42 /usr/local/bin/ollama
安装完成后查看 ollama 日志,可以看到 ollama 检测到了 N 卡:

拉取一个常用的 gemma2:2b 模型运行一次后,在 nvidia-smi 输出中可以看到 ollama 正在使用显卡:

这里使用了一个本地模型仓库(实际上是通过 caddy 和 ollama 搭建的本地模型缓存),有兴趣的朋友可以看看这个项目:ollama-registry

完成上述配置后,还有一个远程访问的需求,我期望的状态是开机后能自动启动 WSL2 的 Debian 12 实例,但测试下来未能走通,目前可行的办法是:
- 设置 Debian 12 为 Windows Terminal 的默认启动配置
- 设置 Windows Terminal 开机启动
- Windows 11 开机后,用远程桌面软件登录一次,触发 Windows Terminal 自动启动,前台运行 WSL2 系统
接下来就能使用 ssh 远程登录 WSL2 了,具体操作如下。
使用本地帐户

经过测试,只有本地帐户可以使用 Windows 远程桌面登录,如果使用 Microsoft 帐户,会强制开启 PIN 码,开启后使用 账号 + PIN 码 无法远程登录。
只有 本地帐户 + 密码 可以使用远程登录,如果已登录 Microsoft 帐户,可以在设置页面的 帐户 选项中切换到本地帐户。
开启远程访问
在设置页面的 系统 选项中开启 远程桌面。

修改电源策略
在设置页面的 系统 选项中修改 电源 配置,将 插入电源时,设置以下时间后将设备置于睡眠状态 改为 从不,避免关闭远程桌面后系统自动休眠。

另外再使用管理员权限打开 PowerShell,执行 powercfg.exe /hibernate off ,移除 Hiberfil.sys 隐藏系统文件。
最后在 macOS 上可以使用 Microsoft Remote Desktop 远程访问 Windows 11 系统。
