在 Kubernetes(k8s)集群中部署AI大模型 ollama并启用GPU加速

一、引言

在本教程中,你将会进行以下操作:

  1. 使用 K3s 在按需实例上搭建单节点 Kubernetes 集群。
  2. 安装 NVIDIA GPU Operator,以便集群能够使用实例的 GPU。
  3. 在集群中部署 Ollama 来提供 llama3模型服务。
    最终实现在 Kubernetes(k8s)集群中部署AI大模型 ollama并启用GPU加速。

二、搭建单节点 Kubernetes 集群

  1. 启动实例:如果尚未操作,可使用仪表板或云 API 启动一个实例,然后通过 SSH 连接到该实例。
  2. 安装 K3s(Kubernetes):运行以下命令来安装 K3s:
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=644 sh -s - --default-runtime=nvidia
  1. 验证集群状态:通过运行以下命令验证 Kubernetes 集群是否准备就绪:
k3s kubectl get nodes

你应该会看到类似如下的输出:

NAME              STATUS   ROLES                  AGE    VERSION
104-171-203-164   Ready    control-plane,master   100s   v1.30.5+k3s1
  1. 安装 socat:运行以下命令安装 socat,它在后续步骤中用于启用端口转发:
sudo apt -y install socat

三、安装 NVIDIA GPU Operator

在 Kubernetes 集群中运行以下命令来安装 NVIDIA GPU Operator:

cat <<EOF | k3s kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
  name: gpu-operator
---
apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: gpu-operator
  namespace: gpu-operator
spec:
  repo: https://helm.ngc.nvidia.com/nvidia
  chart: gpu-operator
  targetNamespace: gpu-operator
EOF

几分钟后,通过运行以下命令验证集群是否检测到实例的 GPU:

k3s kubectl describe nodes | grep nvidia.com

你应该会看到类似如下的输出,表明集群检测到了相应的 GPU 信息:

nvidia.com/cuda.driver-version.full=535.129.03
nvidia.com/cuda.driver-version.major=535
nvidia.com/cuda.driver-version.minor=129
nvidia.com/cuda.driver-version.revision=03
nvidia.com/cuda.driver.major=535
nvidia.com/cuda.driver.minor=129
nvidia.com/cuda.driver.rev=03
nvidia.com/cuda.runtime-version.full=12.2
nvidia.com/cuda.runtime-version.major=12
nvidia.com/cuda.runtime-version.minor=2
nvidia.com/cuda.runtime.major=12
nvidia.com/cuda.runtime.minor=2
nvidia.com/gfd.timestamp=1727461913
nvidia.com/gpu-driver-upgrade-state=upgrade-done
nvidia.com/gpu.compute.major=7
nvidia.com/gpu.compute.minor=0
nvidia.com/gpu.count=8
nvidia.com/gpu.deploy.container-toolkit=true
nvidia.com/gpu.deploy.dcgm=true
nvidia.com/gpu.deploy.dcgm-exporter=true
nvidia.com/gpu.deploy.device-plugin=true
nvidia.com/gpu.deploy.driver=pre-installed
nvidia.com/gpu.deploy.gpu-feature-discovery=true
nvidia.com/gpu.deploy.node-status-exporter=true
nvidia.com/gpu.deploy.operator-validator=true
nvidia.com/gpu.family=volta
nvidia.com/gpu.machine=Standard-PC-Q35-ICH9-2009
nvidia.com/gpu.memory=16384
nvidia.com/gpu.mode=compute
nvidia.com/gpu.present=true
nvidia.com/gpu.product=Tesla-V100-SXM2-16GB
nvidia.com/gpu.replicas=1
nvidia.com/gpu.sharing-strategy=none
nvidia.com/mig.capable=false
nvidia.com/mig.strategy=single
nvidia.com/mps.capable=false
nvidia.com/vgpu.present=false
nvidia.com/gpu-driver-upgrade-enabled: true

其中,nvidia.com/gpu.count=8 表示集群检测到 8 个 GPU,nvidia.com/gpu.product=Tesla-V100-SXM2-16GB 表明检测到的 GPU 是 Tesla V100 SXM2 16GB GPU。

注意:在本教程中,Ollama 只会使用 1 个 GPU。

四、在 Kubernetes 集群中部署 Ollama

  1. 启动 Ollama 服务器:在 Kubernetes 集群中运行以下命令来启动 Ollama 服务器:
cat <<EOF | k3s kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
  name: ollama
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ollama
  namespace: ollama
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      name: ollama
  template:
    metadata:
      labels:
        name: ollama
    spec:
      containers:
      - name: ollama
        image: ollama/ollama:latest
        env:
        - name: PATH
          value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib:/usr/local/nvidia/lib64
        - name: NVIDIA_DRIVER_CAPABILITIES
          value: compute,utility
        ports:
        - name: http
          containerPort: 11434
          protocol: TCP
        resources:
          limits:
            nvidia.com/gpu: 1
      tolerations:
      - key: nvidia.com/gpu
        operator: Exists
        effect: NoSchedule
---
apiVersion: v1
kind: Service
metadata:
  name: ollama
  namespace: ollama
spec:
  type: ClusterIP
  selector:
    name: ollama
  ports:
  - port: 11434
    name: http
    targetPort: http
    protocol: TCP
EOF
  1. 验证 Ollama 服务器状态:几分钟后,运行以下命令验证 Ollama 服务器是否接受连接并正在使用 GPU:
kubectl logs -n ollama -l name=ollama

你应该会看到类似如下的输出,最后一行表明 Ollama 正在使用单个 Tesla V100 - SXM2 - 16GB GPU:

2024/09/27 18:51:55 routes.go:1153: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: HTTPS_PROXY: HTTP_PROXY: NO_PROXY: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0 OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_LLM_LIBRARY: OLLAMA_LOAD_TIMEOUT:5m0s OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MODELS:/root/.ollama/models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES: http_proxy: https_proxy: no_proxy:]"
time=2024-09-27T18:51:55.719Z level=INFO source=images.go:753 msg="total blobs: 0"
time=2024-09-27T18:51:55.719Z level=INFO source=images.go:760 msg="total unused blobs removed: 0"
time=2024-09-27T18:51:55.719Z level=INFO source=routes.go:1200 msg="Listening on [::]:11434 (version 0.3.12)"
time=2024-09-27T18:51:55.720Z level=INFO source=common.go:49 msg="Dynamic LLM libraries" runners="[cpu_avx cpu_avx2 cuda_v11 cuda_v12 cpu]"
time=2024-09-27T18:51:55.720Z level=INFO source=gpu.go:199 msg="looking for compatible GPUs"
time=2024-09-27T18:51:55.942Z level=INFO source=types.go:107 msg="inference compute" id=GPU-d8c505a1-8af4-7ce4-517d-4f57fa576097 library=cuda variant=v12 compute=7.0 driver=12.2 name="Tesla V100-SXM2-16GB" total="15.8 GiB" available="15.5 GiB"

五、访问 Ollama 服务

进入 Ollama 服务对应的 pod 内部,执行 ollama run llama3 命令进行模型安装。若提前构建了模型的镜像并在部署步骤中进行了部署,则可省略此手动安装步骤。
模型安装完成后,在 namespace 下的其他 pod 中可通过 curl 命令向 Ollama 服务请求已安装的模型。
例如,执行
$ curl -L 'http://ollama:11434/api/generate' -H 'Content-Type: application/json' -d '{"model": "llama3", "prompt": "如何处理职场冲突", "format": "json", "stream": false}'
命令,即可获取模型对职场冲突处理相关问题的回答,展示了 Ollama 服务在 Kubernetes 环境中正常运行并能够对外提供大模型服务的能力。

### 在 Kubernetes部署配置 Ollama #### 安装 K3s 设置 GPU 支持 为了在 Kubernetes (k8s) 中成功部署 AI 大模型 Ollama 启用 GPU 加速,首先需要创建一个支持 GPU 的单节点 Kubernetes 集群。这可以通过安装 K3s 和 NVIDIA GPU Operator 实现。 启动实例后,通过 SSH 连接至该实例,执行如下命令来安装 K3s: ```bash curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=644 sh -s - --default-runtime=nvidia ``` 此命令会下载安装 K3s,在安装过程中指定默认容器运行时为 `nvidia` 以确保后续可以利用 GPU 资源[^1]。 确认集群已正常工作,可通过以下命令查看节点状态: ```bash k3s kubectl get nodes ``` 当看到输出显示至少有一个 Ready 状态的节点,则表示集群已经准备好继续下一步操作。 #### 安装 NVIDIA GPU Operator 为了让 Kubernetes 可识别和管理 GPU 设备,还需要安装 NVIDIA GPU Operator。这个组件负责自动完成必要的驱动程序和其他依赖项的安装。按照官方文档指导进行安装即可。 #### 创建 Ollama Deployment 文件 接下来定义用于部署 Ollama 应用的服务资源清单文件(YAML),其中应包含有关镜像版本、环境变量以及资源配置的信息。下面是一个简单的例子: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: ollama-deployment spec: replicas: 1 selector: matchLabels: app: ollama template: metadata: labels: app: ollama spec: containers: - name: ollama-container image: your-docker-repo/ollama:latest resources: limits: nvidia.com/gpu: 1 # 根据实际情况调整数量 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: ollama-service spec: type: LoadBalancer selector: app: ollama ports: - protocol: TCP port: 80 targetPort: 8080 ``` 上述 YAML 文件描述了一个名为 `ollama-deployment` 的 Pod 组合及其关联的服务 `ollama-service`。这里假设应用程序监听端口 8080,且每台机器最多分配一块 GPU 给应用使用。实际环境中可能需要根据具体需求修改这些参数[^2]。 最后一步就是将编写好的 YAML 文件应用于当前上下文中所指向的目标集群: ```bash kubectl apply -f path/to/deploy.yaml ``` 这样便完成了整个流程——从初始化到最终使能 GPU 加速下的 Ollama 模型服务部署过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值