Xinference + DeepSeek-R1-Distill-Llama 本地部署完整流程
在 RockyLinux 虚拟机上通过 Docker 部署 Xinference 框架并运行 DeepSeek-R1-Distill-Llama 模型的完整流程。涵盖虚拟机创建、网络配置、Yum 源更换、Docker 及 NVIDIA 驱动安装、容器启动参数配置以及模型可视化部署步骤。重点解决了显存不足导致的推理报错问题,提供了详细的命令行操作指南和参数调整建议。

在 RockyLinux 虚拟机上通过 Docker 部署 Xinference 框架并运行 DeepSeek-R1-Distill-Llama 模型的完整流程。涵盖虚拟机创建、网络配置、Yum 源更换、Docker 及 NVIDIA 驱动安装、容器启动参数配置以及模型可视化部署步骤。重点解决了显存不足导致的推理报错问题,提供了详细的命令行操作指南和参数调整建议。

本文介绍在 RockyLinux 虚拟机上通过 Docker 部署 Xinference 框架并运行 DeepSeek-R1-Distill-Llama 模型的完整流程。涵盖虚拟机创建、网络配置、Yum 源更换、Docker 及 NVIDIA 驱动安装、容器启动参数配置以及模型可视化部署步骤。
实例所需配置如下:
- 服务器宿主机型号:H3C R4900 G5
- CPU:Intel Xeon Silver 4314
- 内存:32G(虚拟机创建)
- GPU:NVIDIA GeForce RTX 4090
- 硬盘:200G(虚拟机创建最好大一些,如果硬盘不够中途还得扩容)
- 架构:×86_64,部署 VMWare ESXI 7.0.3 管理虚拟机
- 系统镜像:RockyLinux 9.5
- 显卡驱动:570.133.07,CUDA 版本 12.8
- nvidia-container-tools 版本:1.18.2-1
- Docker 版本:29.2.1
- Xinference 版本:1.7.0
- 模型:deepseek-r1-distill-llama 8B(占用显存 20G)
此处以 VMWare ESXI 举例在服务器真机创建虚拟机实例,镜像安装系统全部下一步,配置参数如图。
服务器需要提前配置好防火墙策略,ESXi 主机和虚拟机是两个独立的网络层级走的不是同一个物理网口,案例服务器配置了管理网络走不通外网的物理网卡,但虚拟机都走另一张物理网卡通过防火墙出外网,如果实验服务器发现不能通外网,先不着急停止可以继续往下配置。
普通个人电脑只有一张物理网卡,虚拟机和真机都走同一张所以需要配置不同的虚拟网络模式,以及注意光盘镜像连接。
最后一定注意在 虚拟机设置 → 选项 → 高级 → 取消勾选"启用 UEFI 安全引导" 不然在显驱安装会报'内核拒绝加载未签名的 NVIDIA 驱动模块'的错误。
带安装好虚拟机后可能需要配置网络环境,案例的网络环境配置了 DHCP,如果跟跑实验的虚拟机需要手动配置网络 IP,参考配置如下:
## 查看当前网卡
[root@localhost ~]# nmcli connection show
NAME UUID TYPE DEVICE
ens192 8b92a843-29f7-32a6-a7a1-85e5f5fd4233 ethernet ens192
docker0 4bf69c2a-2719-4bd1-8183-51b9e0c2457f bridge docker0
lo 412d741f-1b25-42b9-868a-ffbb53994763 loopback lo
[root@localhost ~]# nmcli connection modify ens192 ipv4.method manual ipv4.addresses 你的 IP 地址 ipv4.gateway 你的网关地址 autoconnect yes
[root@localhost ~]# nmcli connection up ens192 Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@localhost ~]# ifconfig ens192
测试连接状态:
## 测试连接状态
[root@localhost ~]# nslookup bilibili.com
Server: 223.5.5.5 Address: 223.5.5.5#53
Non-authoritative answer:
Name: bilibili.com Address: 47.103.24.173
...
[root@localhost ~]# ping bilibili.com
PING bilibili.com (119.3.70.188) 56(84) bytes of data.
64 bytes from ecs-119-3-70-188.compute.hwclouds-dns.com (119.3.70.188): icmp_seq=1 ttl=41 time=32.5 ms
...
如果到这一步仍未通外网,作为个人主机需要验证 dns 解析、真机虚拟网络是否配置正确。VMWare Workstation 有时重启 VMWare NET 服务会意外解决,如果作为服务器主要验证虚拟机到防火墙之间的通路是否异常。
网络环境通畅进行下一步,更换 yum 源并安装 docker:
## 备份现有 repo,导入阿里云 repo
[root@localhost ~]# mkdir -p /etc/yum.repos.d/backup
[root@localhost ~]# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
[root@localhost ~]# cat > /etc/yum.repos.d/rocky.repo << 'EOF'
[baseos]
name=Rocky Linux $releasever - BaseOS
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-9
[appstream]
name=Rocky Linux $releasever - AppStream
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-9
EOF
[root@localhost ~]# cat > /etc/yum.repos.d/rocky-extras.repo << 'EOF'
[extras]
name=Rocky Linux $releasever - Extras
baseurl=https://mirrors.aliyun.com/rockylinux/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-9
EOF
# 注意如果 nvidia-container-toolkit 的 yum 源无法使用可以先跳过,后续手动下载安装
[root@localhost ~]# cat > /etc/yum.repos.d/nvidia-container-toolkit.repo << 'EOF'
[nvidia-container-toolkit]
name=NVIDIA Container Toolkit
baseurl=https://nvidia.github.io/libnvidia-container/stable/rpm/el9$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
## 清除 yum 缓存并重新生成缓存,测试 repo 源是否可用
[root@AliyunMyServer ~]# yum clean all
[root@AliyunMyServer ~]# yum makecache
# 如果 makecache 成功就忽略这一步,案例中获取失败,为了后续成功安装所以把 nvidia-container-toolkit 源删掉
[root@rocky ~]# rm -rf /etc/yum.repos.d/nvidia-container-toolkit.repo
## 如果不是保守派,系统内核为 debian、ubuntu 等可以将如下三条命令喂给 ai,吐出对应系统的 repo 源
## hostnamectl
## uname -a
## cat /proc/version
## 配置 docker-ce 源,安装 docker 启动服务
[root@localhost ~]# yum install -y yum-utils
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# yum install -y docker-ce docker-ce-cli containerd.io
[root@localhost ~]# systemctl docker.socket --now
[root@localhost ~]# systemctl status docker
GeForce 和 Tesla 使用同一套驱动程序,案例使用的 GeForce 系列显卡,如果是 Tesla 系列也可以用这个驱动:
## 首先验证当前虚拟机是否能识别显卡
[root@localhost ~]# lspci -vnnn | grep -i nvidia
13:00.0 VGA compatible controller [0300]: NVIDIA Corporation AD102 [GeForce RTX 4090][10de:2684](rev a1)(prog-if 00 [VGA controller])
13:00.1 Audio device [0403]: NVIDIA Corporation AD102 High Definition Audio Controller [10de:22ba](rev a1)
[root@localhost ~]# lspci | grep -i nvidia
13:00.0 VGA compatible controller: NVIDIA Corporation AD102 [GeForce RTX 4090](rev a1)
13:00.1 Audio device: NVIDIA Corporation AD102 High Definition Audio Controller (rev a1)
[root@localhost ~]# nvidia-smi
-bash: nvidia-smi:未找到命令
## 禁用系统自带的开源 NVIDIA 驱动,避免与官方驱动冲突,重启后验证输出为空说明成功
[root@localhost ~]# dracut --force /boot/initramfs-$(uname -r).img $(uname -r)
[root@localhost ~]# reboot
[root@localhost ~]# lsmod | grep nouveau
## 安装编译所需的工具和内核头文件
[root@localhost ~]# yum groupinstall -y "Development Tools"
[root@localhost ~]# yum install -y kernel-devel kernel-headers dkms
# 如果内核版本跟案例不同也需要与 yum 源相同的步骤将三条命令喂给 ai,吐出对应的编译工具
# 案例显卡是 GeForce,所以下载 GeForce 的驱动,如果实验用其他显卡,注意甄别类型和版本
# 这是案例中的下载版本 https://www.nvidia.cn/geforce/drivers/results/242281/
[root@localhost ~]# chmod +x NVIDIA-Linux-x86_64-570.133.07.run
[root@localhost ~]# bash NVIDIA-Linux-x86_64-570.133.07.run
Proprietary(闭源驱动功能完整,另一个是开源功能有限) Install without signing(不签名安装) NO(不需要 32 位兼容库) Rebuild initramfs (重建 initramfs,它会将 Nouveau 完全移除,防止干扰英伟达驱动) YES(最后一步自动配置 /etc/X11/xorg.conf 文件让图形化界面也是用英伟达驱动)
安装完成后验证结果:
## 英伟达显驱为图形化安装,方向键操控,回车选择。选项分别选择:
[root@localhost ~]# nvidia-smi
NVIDIA Container Toolkit 能够让 Docker 调用 GPU 硬件的工具。 若不安装直接启动容器时加上–gpus all 参数会报错,不加 GPU 参数也不用工具包确实可以启动容器但会导致部署的大模型跑在 CPU 上。
## 第一步中成功配置了 NVIDIA Container Toolkit 的 repo 源直接 yum 安装,安装后跳到验证安装环节
[root@localhost ~]# yum install -y nvidia-container-toolkit
# 如果第一步中 NVIDIA Container Toolkit 的 repo 源没成功,手动方式看这里
# 没有条件可以用夸克链接,18.2 版本是 26 年 1 月发布 https://pan.quark.cn/s/2276680510ea
# 有条件打开连接自己下载 https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/stable/rpm/el9/x86_64
# 一共需要四个包并且版本一致:libnvidia-container1-*.rpm、libnvidia-container-tools-*.rpm、nvidia-container-toolkit-base-*.rpm、nvidia-container-toolkit-*.rpm
# 先安装基础库
[root@localhost ~]# rpm -ivh libnvidia-container1-1.18.2-1.x86_64.rpm
# 然后安装工具包
[root@localhost ~]# rpm -ivh libnvidia-container-tools-1.18.2-1.x86_64.rpm
# 再安装基础组件
[root@localhost ~]# rpm -ivh nvidia-container-toolkit-base-1.18.2-1.x86_64.rpm
# 最后安装主程序
[root@localhost ~]# rpm -ivh nvidia-container-toolkit-1.18.2-1.x86_64.rpm
## 检验安装是否成功
[root@localhost ~]# nvidia-ctk --version
NVIDIA Container Toolkit CLI version 1.18.2 commit: 9e88ed39710fd94c7e49fbb26d96492c45e574fb
[root@localhost ~]# nvidia-ctk runtime configure --runtime=docker
INFO[0000] Loading config from /etc/docker/daemon.json
INFO[0000] Wrote updated config to /etc/docker/daemon.json
INFO[0000] It is recommended that docker daemon be restarted.
官方文档连接:https://xorbitsai.readthedocs.io/zh-cn/latest/getting_started/index.html
实例通过 docker 容器部署,不选择本地运行的原因很简单,所有数据存储在物理卷,容器想删就删,最起码搞砸了不用担心前面的步骤重来一遍。
这是官网地址的拉取地址,但案例里试了很多次非常容易连接超时,如果有条件优先拉取官方地址:docker pull xprobe/xinference:latest
如果一样拉不到镜像,可以尝试自己从网上找其他云地址:crpi-49yei0hvmhr144pw.cn-hangzhou.personal.cr.aliyuncs.com/xprobe_xinference2/xinference:latest
## 通过国内镜像版部署 docker 容器
[root@localhost ~]# docker pull crpi-49yei0hvmhr144pw.cn-hangzhou.personal.cr.aliyuncs.com/xprobe_xinference2/xinference:latest
# 这里为了方便操作更改了标签
[root@localhost ~]# docker tag 0949777d1ea9 xinference:v1.7.0
[root@localhost ~]# docker rmi crpi-49yei0hvmhr144pw.cn-hangzhou.personal.cr.aliyuncs.com/xprobe_xinference2/xinference:latest
[root@localhost ~]# docker images
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
xinference:v1.7.0 0949777d1ea9 27GB 0B U
## 成功拉取镜像直接跳至下一步,如果硬盘不够也没有 harbor,临时找一个虚拟机只要硬盘容量大,拉取镜像后打包上传给宿主机再导入
# 临时机拉取打包导出:
[root@localhost ~]# docker save swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/xprobe/xinference:v1.7.0.post1 | gzip > xinference-v1.7.0.post1.tar.gz
[root@localhost ~]# rsync -av xinference-v1.7.0.post1.tar.gz [email protected]:/root/#
# 宿主机上导入:
[root@localhost ~]# docker load < xinference-v1.7.0.post1.tar.gz
参数说明:
--gpus all:容器识别宿主机的所有 GPU 设备,不设置会导致模型跑带 CPU 上-e XINFERENCE_MODEL_SRC=modelscope:配置模型下载的来源,默认从 Hugging Face 下载模型,国内首选 modelscope(魔搭社区),如果有本地缓存可以设置从本地加载路径-e XINFERENCE_GPU_ENABLED=true:Xinference 启用 GPU 模式--ipc=host:与宿主机共享 IPC(进程间通信)命名空间,深度学习框架推理时使用共享内存进行数据加载、缓存模型中间结果,进程间传递张量数据时与宿主机共享 IPC 命名空间--ulimit memlock=16000000000:锁定内存 16GB,防止内存被 Swap 交换或者内存满时避免被优先 OOM Killer,可以按实际需求更改-p 9997:9997:端口映射,通过宿主机 9997 端口访问 xinference 服务,端口号可以按照实际需求更改-v /data/xinference/models:/root/.xinference:挂载卷,下载的模型保存在宿主机内,容器可以放心随意删除,需要注意案例挂载到宿主机的/data/xinference 目录下,这是宿主机的物理目录可以按实际需求更改-v /data/xinference/data:/data:xinference 的其他数据文件,需要注意案例挂载到宿主机的/data/xinference 目录下,这是宿主机的物理目录可以按实际需求更改更多详细的参数,参考官方文档。
# 启动容器
[root@localhost ~]# docker run -d \
--name xinference \
--gpus all \
-e XINFERENCE_MODEL_SRC=modelscope \
-e XINFERENCE_GPU_ENABLED=true \
--ipc=host \
--ulimit memlock=16000000000 \
-p 9998:9997 \
-v /data/xinference/models:/root/.xinference \
-v /data/xinference/data:/data \
xinference:v1.7.0 xinference-local -H 0.0.0.0
# 以上步骤完成后,检查容器内是否识别显卡
[root@localhost ~]# docker exec xinference nvidia-smi
# 至此镜像部署完毕,在另一台网络通常的机器通过宿主机 ip:端口号访问 Xinference 服务
来到浏览器内输入宿主机 ip:端口号访问 web 版 Xinference,案例使用语言对话模型的 deepseek-r1-distill-llama 举例。
模型引擎、推理格式、大小等模型参数如图,具体选择区别可以直接询问 ai,案例中多添加了两个参数分别是:
gpu_memory_utilization:设置推理引擎可以使用的 GPU 显存比例并按百分比表示,4090 的 GPU 显存本身并不富裕,所以案例设置了 95%,具体按照实际需求更改max_model_len:设定最大上下文窗口,该参数也决定了模型一次能'记住'多长的对话历史或处理多长的文档。参考报错中 KV cache (40320) 括号内的值# 如果模型无法启动,并且容器日志中报错如下两行说明显存不足以支持模型运行
[root@localhost ~]# docker logs --tail 2 xinference
ValueError: The model's max seq len (131072) is larger than the maximum number of tokens that can be stored in KV cache (40320). Try increasing `gpu_memory_utilization` or decreasing `max_model_len`
# 需要在页面最下面"Additional parameters passed to the inference engine"中添加两个参数的键值
{"gpu_memory_utilization":0.95, "max_model_len":32768}
打开容器日志可以看到内部正在下载模型资源:
# 下图中输出了另一个模型 FLUX.1-schnell 的下载日志做展示
[root@localhost ~]# docker logs -f xinference
下载完在网页端点击左侧的 Running Models 就可以看到运行的 AI 模型了,通过右边 Actions 进入该模型的 web 端互动。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online