xinference+deepseek-r1-distill-llama本地部署完整流程
Xinference+deepseek-r1-distill-llama本地部署完整流程
目录
包含虚拟机创建、前置环境搭建(yum源更换、显驱安装、配置NVIDIA容器工具包、部署docker服务)、拉取Xinference镜像、下载并启动deepseek模型
实例所需配置如下:
服务器宿主机型号: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 内置 yum包管理器后面会更换阿里云yum源
显卡驱动选用了570.133.07,CUDA版本为12.8(这是去年的版本,CUDA版本最好大于案例的版本)
nvidia-container-tools版本为 1.18.2-1
Docker版本 29.2.1, build a5c7197
Xinference版本为1.7.0
deepseek-r1模型选用了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 ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.228 netmask 255.255.255.0 broadcast 192.168.1.1 inet6 fe80::63b9:ca7f:e2fd:2be0 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:be:42:df txqueuelen 1000(Ethernet) RX packets 267 bytes 23798(23.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 293 bytes 39567(38.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0## 测试连接状态[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 Name: bilibili.com Address: 119.3.70.188 Name: bilibili.com Address: 8.134.50.24 Name: bilibili.com Address: 139.159.241.37 [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=1ttl=41time=32.5 ms 64 bytes from ecs-119-3-70-188.compute.hwclouds-dns.com (119.3.70.188): icmp_seq=2ttl=41time=32.5 ms ^C --- bilibili.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev =32.453/32.458/32.463/0.005 ms ## 如果到这一步仍未通外网,作为个人主机需要验证dns解析、真机虚拟网络是否配置正确 VMWare Workstation 有时重启 VMWare NET 服务会意外解决,如果作为服务器主要验证虚拟机到防火墙之间的通路是否异常yum源更换并部署docker服务
网络环境通畅进行下一步,更换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=1enabled=1gpgkey=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=1enabled=1gpgkey=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=1enabled=1gpgkey=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$basearchenabled=1gpgcheck=0repo_gpgcheck=0 EOF ## 清除yum缓存并重新生成缓存,测试repo源是否可用[root@AliyunMyServer ~]# yum clean all20 files removed [root@AliyunMyServer ~]# yum makecache Docker CE Stable - x86_64 374 kB/s |70 kB 00:00 Extra Packages for Enterprise Linux 9 - x86_64 66 kB/s |20 MB 05:14 Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64 1.1 kB/s |2.5 kB 00:02 NVIDIA Container Toolkit 9.4 kB/s |7.0 kB 00:00 Errors during downloading metadata for repository 'nvidia-container-toolkit': - Status code: 404for https://nvidia.github.io/libnvidia-container/stable/rpm/el9x86_64/repodata/repomd.xml (IP: 185.199.110.153) Error: Failed to download metadata for repo 'nvidia-container-toolkit': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried [root@AliyunMyServer ~]# yum repolist repo id repo name appstream Rocky Linux 9 - AppStream baseos Rocky Linux 9 - BaseOS docker-ce-stable Docker CE Stable - x86_64 epel Extra Packages for Enterprise Linux 9 - x86_64 epel-cisco-openh264 Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64 extras Rocky Linux 9 - Extras nvidia-container-toolkit NVIDIA Container Toolkit # 如果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 添加仓库自:http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo [root@localhost ~]# yum install -y docker-ce docker-ce-cli containerd.io Docker CE Stable - x86_64 61 kB/s |17 kB 00:00 [root@localhost ~]# systemctl enable docker.socket --now Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /usr/lib/systemd/system/docker.socket. [root@localhost ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled) Active: active (running)显驱安装
GeForce 和 Tesla 使用同一套驱动程序,案例使用的Geforce系列显卡,如果是Tesla系列也可以用这个驱动
## 首先验证当前虚拟机是否能识别显卡[root@localhost ~]# lspci -vnnn | grep -i nvidia13: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 nvidia13: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.runProprietary(闭源驱动功能完整,另一个是开源功能有限)
Install without signing(不签名安装)
NO(不需要32位兼容库)
Rebuild initramfs (重建initramfs,它会将Nouveau完全移除,防止干扰英伟达驱动)
YES(最后一步自动配置 /etc/X11/xorg.conf 文件让图形化界面也是用英伟达驱动)
安装完成后验证结果
## 英伟达显驱为图形化安装,方向键操控,回车选择。选项分别选择:[root@localhost ~]# nvidia-smi配置NVIDIA容器工具包
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 警告:libnvidia-container1-1.18.2-1.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID f796ecb0: NOKEY Verifying... ################################# [100%] 准备中... ################################# [100%] 正在升级/安装... 1:libnvidia-container1-1.18.2-1 ################################# [100%]# 然后安装工具包[root@localhost ~]# rpm -ivh libnvidia-container-tools-1.18.2-1.x86_64.rpm 警告:libnvidia-container-tools-1.18.2-1.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID f796ecb0: NOKEY Verifying... ################################# [100%] 准备中... ################################# [100%] 正在升级/安装... 1:libnvidia-container-tools-1.18.2-################################# [100%]# 再安装基础组件[root@localhost ~]# rpm -ivh nvidia-container-toolkit-base-1.18.2-1.x86_64.rpm 警告:nvidia-container-toolkit-base-1.18.2-1.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID f796ecb0: NOKEY Verifying... ################################# [100%] 准备中... ################################# [100%] 正在升级/安装... 1:nvidia-container-toolkit-base-1.1################################# [100%] Created symlink /etc/systemd/system/multi-user.target.wants/nvidia-cdi-refresh.path → /etc/systemd/system/nvidia-cdi-refresh.path. Created symlink /etc/systemd/system/multi-user.target.wants/nvidia-cdi-refresh.service → /etc/systemd/system/nvidia-cdi-refresh.service. Regenerating NVIDIA CDI specification... # 最后安装主程序[root@localhost ~]# rpm -ivh nvidia-container-toolkit-1.18.2-1.x86_64.rpm 警告:nvidia-container-toolkit-1.18.2-1.x86_64.rpm: 头V4 RSA/SHA512 Signature, 密钥 ID f796ecb0: NOKEY Verifying... ################################# [100%] 准备中... ################################# [100%] 正在升级/安装... 1:nvidia-container-toolkit-1.18.2-1################################# [100%]## 检验安装是否成功[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. 三、拉取镜像启动容器
拉取Xinference镜像
官方文档连接
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目录下,这是宿主机的物理目录可以按实际需求更改
xinference:v1.7.0 xinference-local -H 0.0.0.0
更多详细的参数,参考这位大佬的解释:
https://blog.ZEEKLOG.net/gitblog_01429/article/details/150380320
# 启动容器[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端互动