在 TKE 上部署 AI 大模型
概述
本文介绍如何在 TKE 上部署 AI 大模型,以 DeepSeek-R1 为例。
部署思路
使用 Ollama 运行 AI 大模型,再通过 OpenWebUI 暴露一个聊天交互的界面,OpenWebUI 会调用 ollama 提供的 API 来与大模型交互。
Ollama 与 OpenWebUI 介绍
Ollama 是一个运行大模型的工具,可以看成是大模型领域的 Docker,可以下载所需的大模型并暴露 API。
OpenWebUI 是一个大模型的 Web UI 交互工具,支持 Ollama,即调用 Ollama 暴露的 API 实现与大模型交互:
AI 大模型数据如何存储?
AI 大模型通常占用体积较大,直接打包到容器镜像不太现实,如果启动时通过 initContainers
自动下载又会导致启动时间过长,因此建议使用共享存储来挂载 AI 大模型。
在腾讯云上可使用 CFS 来作为共享存储,CFS 的性能和可用性都非常不错,适合 AI 大模型的存储。本文将使用 CFS 来存储 AI 大模型。
准备 CFS 存储
在【组建管理】中的【存储】找到 CFS-Turbo
或 CFS
插件并安装:
CFS-Turbo
的性能更强,读写速度更快,也更贵,如果希望大模型运行速度更快,可以考虑使 用CFS-Turbo
。
新建 StorageClass
:
- 选项较多,所以该示例通过 TKE 控制台来创建 PVC。如希望通过 YAML 来创建,可先用控制台创建一个测试 PVC,再复制出生成的 YAML。
Provisioner
选文件存储CFS
。存储类型
建议选性能存储
,读写速度比标准存储
更快。
新建 GPU 节点池
在 TKE 控制台的【节点管理】-【节点池】中点击【新建】,如果【原生节点】或【普通节点】,机型在【GPU 机型】中选择一个没售罄的机型;如果选【超级节点】则无需选择机型(在部署的时候通过注解指定 GPU 类型)。
确认 GPU 驱动和所需 CUDA 版本
可随便买一台对应节点池机型的云服务器,上去执行 nvidia-smi
命令,查看 GPU 驱动版本。
在 nvidia 官网的 CUDA Toolkit Release Notes 中,查找适合对应 GPU 驱动版本的 CUDA 版本。
编译 ollama 镜像
准备 Dockerfile
:
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
RUN apt update -y && apt install -y curl
RUN curl -fsSL https://ollama.com/install.sh | sh
基础镜像使用
nvidia/cuda
,具体使用哪个 tag 可根据前面确认的 cuda 版本来定。这里 是所有 tag 的列表。
编译并上传镜像:
docker build -t imroc/ollama:cuda11.8-ubuntu22.04 .
docker push imroc/ollama:cuda11.8-ubuntu22.04
注意修改成自己的镜像名称。
创建 PVC
创建一个 CFS 类型的 PVC,用于存储 AI 大模型:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ai-model
labels:
app: ai-model
spec:
storageClassName: deepseek
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Gi
- 注意替换
storageClassName
。 - 对于 CFS 来说,
storage
大小无所谓,可随意指定,按实际占用空间付费的。
再创建一个 PVC 给 OpenWebUI 用,可使用同一个 storageClassName
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: webui
labels:
app: webui
spec:
accessModes:
- ReadWriteMany
storageClassName: deepseek
resources:
requests:
storage: 100Gi
使用 Job 下载 AI 大模型
下发一个 Job,将需要用的 AI 大模型下载到 CFS 共享存储中:
apiVersion: batch/v1
kind: Job
metadata:
name: pull-model
labels:
app: pull-model
spec:
template:
metadata:
name: pull-model
labels:
app: pull-model
spec:
containers:
- name: pull-model
image: imroc/ollama:cuda11.8-ubuntu22.04
env:
- name: LLM_MODEL
value: deepseek-r1:7b
command:
- bash
- -c
- |
set -ex
ollama serve &
sleep 5
ollama pull $LLM_MODEL
volumeMounts:
- name: data
mountPath: /root/.ollama
volumes:
- name: data
persistentVolumeClaim:
claimName: ai-model
restartPolicy: OnFailure
- 使用之前我们编译好的 ollama 镜像,执行一个脚本去下载 AI 大模型,本例中下载的是 deepseek-r1:7b,完整列表 点击这里跳转,修改
LLM_MODEL
以替换大语言模型。 - ollama 的模型数据存储在
/root/.ollama
目录下,挂载 CFS 类型的 PVC 到该路径。
部署 ollama
通过 Deployment 部署 ollama:
- 原生节点或普通节点
- 超级节点
apiVersion: apps/v1
kind: Deployment
metadata:
name: ollama
labels:
app: ollama
spec:
selector:
matchLabels:
app: ollama
replicas: 1
template:
metadata:
labels:
app: ollama
spec:
containers:
- name: ollama
image: imroc/ollama:cuda11.8-ubuntu22.04
imagePullPolicy: IfNotPresent
command: ["ollama", "serve"]
env:
- name: OLLAMA_HOST
value: ":11434"
resources:
requests:
cpu: 2000m
memory: 2Gi
nvidia.com/gpu: "1"
limits:
cpu: 4000m
memory: 4Gi
nvidia.com/gpu: "1"
ports:
- containerPort: 11434
name: ollama
volumeMounts:
- name: data
mountPath: /root/.ollama
volumes:
- name: data
persistentVolumeClaim:
claimName: ai-model
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: ollama
spec:
selector:
app: ollama
type: ClusterIP
ports:
- name: server
protocol: TCP
port: 11434
targetPort: 11434