null

部署机器学习模型可能具有挑战性,尤其是在寻求可扩展和可维护的部署时。Kubernetes (K8s) 通过自动编排和扩展简化了此过程,而 Docker 则允许轻松打包和移植应用程序。本文提供了在 Kubernetes 上部署 Ollama(用于运行机器学习模型的模型服务器)的详细分步指南。我们将介绍配置文件、Docker 使用和 API 交互,以帮助你为机器学习模型设置一个强大且可扩展的环境。

Ollama 简介及其在 Kubernetes 上的部署

Ollama 是一个模型服务应用程序,旨在托管机器学习模型,使其能够通过 API 端点访问。在 Kubernetes 上部署 Ollama 有几个好处:

  • • 可扩展性: Kubernetes 可以根据需求自动扩展你的部署。
  • • 弹性: Kubernetes 通过管理容器健康和重启故障容器来确保高可用性。
  • • 灵活性:动态调整资源分配和配置以适应不同的工作负载。

Kubernetes 可自动部署、扩展和管理容器化应用程序。Ollama 通过提供强大的模型管理功能(包括通过 REST API 加载、标记和查询模型)对此进行了补充。本指南将引导你在Kubernetes上配置和部署 Ollama,解释每个组件并演示如何有效地与 API 交互。

先决条件

继续操作之前,请确保你已准备好以下物品:

  1. \1. Kubernetes 集群:
  • • 正在运行的 Kubernetes 集群,可以在云提供商(例如 AWS EKS、Google GKE、Azure AKS)上运行,也可以在本地使用 Minikube 或 Kind 等工具运行。
  1. \2. kubectl 命令行工具:
  • • 已安装并配置为与你的 Kubernetes 集群交互。
  1. \3. Docker:
  • • 如果你计划在本地 Docker 环境中测试 Ollama,则安装。
  1. \4. 基础知识:
  • • 熟悉 Kubernetes 概念(Pod、部署、服务、命名空间)。
  • • 了解 Docker 容器和图像。
  1. \5. 访问凭证:
  • • 在 Kubernetes 集群中创建和管理资源所需的权限。

设置 Kubernetes 资源

部署 Ollama 涉及在专用命名空间内设置各种 Kubernetes 资源。这种逻辑分离可确保资源的有组织和隔离管理。我们将配置以下内容:

  • • 命名空间:将 Ollama 资源与其他应用程序隔离。
  • • 部署:定义 Ollama 容器和辅助容器来加载模型。
  • • 服务:公开 Ollama 的 API 以供外部访问。

命名空间配置

为 Ollama 创建专用命名空间有助于保持其资源的有序性并与其他集群资源隔离。

ns.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: ollama
  labels:
    name: ollama

创建命名空间的步骤:

  1. \1. 将上述 YAML 内容保存到名为 ns.yaml 的文件中 。
  2. \2. 使用以下方式应用配置 kubectl
kubectl apply -f ns.yaml
  1. \1. 验证命名空间创建
kubectl get namespaces

你应该看到 ollama 命名空间中列出的内容。

部署配置

部署定义了 Ollama 及其辅助容器如何在 Kubernetes 集群中运行。它指定了初始化模型所需的容器镜像、资源分配和生命周期挂钩。

关键组件:

  • • 副本: 要运行的 Ollama 实例数量。 在初始部署中,通常从一个副本开始。
  • • 资源请求和限制:确保部署使用适当数量的 CPU 和内存,防止资源争用。
  • • 生命周期钩子:在容器生命周期的特定时间点执行命令,例如在容器启动后加载模型。

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ollama
  namespace: ollama
  labels:
    app: ollama
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ollama
  template:
    metadata:
      labels:
        app: ollama
    spec:
      containers:
      - name: ollama
        image: ollama/ollama:latest
        ports:
        - containerPort: 11434
        resources:
          requests:
            cpu: "1000m"
            memory: "2Gi"
          limits:
            cpu: "2000m"
            memory: "3Gi"
      - name: load-model
        image: curlimages/curl
        command: ["/bin/sh", "-c"]
        args:
          - "sleep infinity"
        lifecycle:
          postStart:
            exec:
              command:
                - "/bin/sh"
                - "-c"
                - >
                  curl -X POST http://localhost:11434/api/pull
                  -H 'Content-Type: application/json'
                  -d '{"name": "llama3.2"}'
        resources:
          requests:
            cpu: "25m"
            memory: "50Mi"
          limits:
            cpu: "25m"
            memory: "50Mi"     

应用部署的步骤:

  1. \1. 将上述 YAML 内容保存到名为 deploy.yaml 的文件中。
  2. \2. 使用以下方式应用配置 kubectl
kubectl apply -f deploy.yaml
  1. \1. 验证部署
kubectl get deployments -n ollama
  1. \1. 检查 Pod 的状态:
kubectl get pods -n ollama

部署说明:

  • • 主容器 (ollama): 在 11434 端口运行 Ollama 服务器。 资源请求可确保容器有足够的 CPU 和内存,而限制则可防止容器消耗过多资源。
  • • 辅助容器 ( load-model):使用 curlimages/curl 图像与 Ollama API 交互。 它运行 postStart 生命周期钩子,在 Ollama 容器启动后发送 POST 请求以加载 llama3.2 模型。 sleep infinity 命令会保持容器运行,确保生命周期钩子得以执行。

服务配置

为了让外部可以访问 Ollama 的 API,我们需要创建一个 Kubernetes 服务,通过 11434 端口将流量路由到 Ollama pod。

svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: ollama
  namespace: ollama
  labels:
    app: ollama
spec:
  type: LoadBalancer
  ports:
  - port: 11434
    targetPort: 11434
    protocol: TCP
    name: http
  selector:
    app: ollama

应用服务配置的步骤:

  1. \1. 将上述 YAML 内容保存到 svc.yaml
  2. \2. 使用以下方式应用配置 kubectl
kubectl apply -f svc.yaml

  1. \1. 验证服务:
kubectl get services -n ollama

了解服务类型:

  • • ClusterIP(默认): 通过群集中的内部 IP 提供服务。 如果只需要内部访问,请选择此选项。
  • • NodePort:在每个节点的 IP 上以静态端口提供服务。 适用于没有云负载平衡器的简单外部访问。
  • • LoadBalancer(负载平衡器): 创建外部负载平衡器(如果云提供商支持),并为服务分配一个固定的外部 IP。 非常适合需要高可用性的生产环境。

在上面的 svc.yaml 示例中,我们使用 LoadBalancer 来促进外部访问。 根据你的环境,你可能会选择不同的服务类型。

使用 Docker 在本地运行 Ollama

出于测试或开发目的,你可能更喜欢在本地 Docker 容器中运行 Ollama。这种方法很简单,但缺乏 Kubernetes 提供的可扩展性和编排优势。

使用 Docker 运行 Ollama 的步骤:

  1. \1. 拉取 Ollama Docker 镜像:
docker pull ollama/ollama:latest

  1. \1. 运行 Ollama 容器:
docker run -d -p 11434:11434 --name ollama ollama/ollama:latest

  • -d:以分离模式运行容器。
  • -p 11434:11434:将主机的 11434 端口映射到容器的 11434 端口。
  • --name ollama:为容器命名 ollama,以便于引用。
  1. \1. 验证容器正在运行:
docker ps

  1. \1. 直接加载模型:运行容器后,你可以使用以下命令加载模型:
docker exec -it ollama ollama run llama3.2

该命令在运行的容器内执行 ollama run llama3.2 命令,启动模型加载过程。

本地与 Ollama API 交互:

在容器运行时,你可以使用 curl 或任何 HTTP 客户端与 Ollama API 进行交互。

示例:列出可用模型

curl http://localhost:11434/api/tags

与 Ollama API 交互

部署 Ollama 后,它会公开一个用于管理和与模型交互的 REST API。以下是你可以用来与 Ollama 交互的一些主要 API 调用。

列出可用模型

使用 GET 请求检索 Ollama 环境中所有可用模型的列表。

命令:

curl http://localhost:11434/api/tags

预期响应:

{  "tags": ["llama3.2", "another-model"]}

解释:

  • • 该 /api/tags 端点返回 Ollama 环境中可用的模型标签列表。这可以帮助你识别可以加载或查询哪些模型。

下载模型

要下载和加载特定模型(如 llama3.2),请向 /api/pull 端点发送 POST 请求并注明模型名称。

命令

curl -X POST http://localhost:11434/api/pull \
     -H 'Content-Type: application/json' \
     -d '{
           "name": "llama3.2"
         }'

预期响应:

{
  "status": "success",
  "message": "Model llama3.2 downloaded and loaded successfully."
}

解释:

  • /api/pull 端点启动指定模型的下载和加载。 这样,模型就可用于后续查询。

生成查询响应

加载模型后,你可以使用 /api/generate 端点提示其响应。如果你希望在单个有效负载中接收完整响应,也可以选择禁用流式传输。

使用流式传输生成响应:

命令:

curl -X POST http://localhost:11434/api/generate \
     -H 'Content-Type: application/json' \
     -d '{
           "model": "llama3.2",
           "prompt": "In exactly 10 words or less, explain why the sky is blue."
         }'

预期响应:

{
  "response": "The sky appears blue due to the scattering of light."
}

生成无流式传输的响应:

命令:

curl -X POST http://localhost:11434/api/generate \
     -H 'Content-Type: application/json' \
     -d '{
           "model": "llama3.2",
           "prompt": "In exactly 10 words or less, explain why the sky is blue.",
           "stream": false
         }'

预期响应:

{
  "response": "Rayleigh scattering disperses blue wavelengths, making the sky blue."
}

解释:

  • • 端点 /api/generate 使用指定的模型处理提供的提示并返回响应。
  • • 设置 "stream": false 可确保一次性返回整个响应,这对于在继续之前需要完整答案的应用程序很有用。

其他 API 端点:

Ollama 可能会提供其他端点来执行更新模型、删除模型或管理配置等任务。请参阅 Ollama API 文档[^1], 了解可用端点及其用法的完整列表。

高级 Kubernetes 配置

为了优化你的 Ollama 部署,请考虑实施高级 Kubernetes 配置。这些配置可增强安全性、可靠性和可扩展性。

ConfigMap 和 Secrets

通过 ConfigMaps 和 Secrets,您可以将配置数据和敏感信息与容器映像分开管理,从而推广配置管理的最佳实践。

ConfigMaps:

使用 ConfigMaps 来存储非敏感配置数据,如 API 端点或功能标志。

configmap.yaml 例子:

apiVersion: v1
kind: ConfigMap
metadata:
  name: ollama-config
  namespace: ollama
data:
  MODEL_NAME: "llama3.2"
  API_TIMEOUT: "30s"

Secrets:

使用 Secrets 存储敏感信息,例如 API 密钥或密码。

secret.yaml 例子:

apiVersion: v1
kind: Secret
metadata:
  name: ollama-secrets
  namespace: ollama
type: Opaque
data:
  API_KEY: c2VjcmV0X2tleV9mb3JfbGxhbWE= # Base64 encoded value

安装 ConfigMap 和 Secrets:

更新 deploy.yaml 以将这些配置挂载为环境变量或文件。

更新 deploy.yaml 片段:

spec:
      containers:
      - name: ollama
        image: ollama/ollama:latest
        ports:
        - containerPort: 11434
        env:
        - name: MODEL_NAME
          valueFrom:
            configMapKeyRef:
              name: ollama-config
              key: MODEL_NAME
        - name: API_TIMEOUT
          valueFrom:
            configMapKeyRef:
              name: ollama-config
              key: API_TIMEOUT
        - name: API_KEY
          valueFrom:
            secretKeyRef:
              name: ollama-secrets
              key: API_KEY
        resources:
          requests:
            cpu: "1000m"
            memory: "2Gi"
          limits:
            cpu: "2000m"
            memory: "3Gi"

应用 ConfigMap 和 Secrets:

kubectl apply -f configmap.yaml
kubectl apply -f secret.yaml

持久存储

为了确保你的模型在单个 Pod 的生命周期之外仍然存在,请使用持久卷 (PV) 和持久卷声明 (PVC)。此设置可确保即使重新创建或重新安排 Pod,模型也能保留。

pvc.yaml 例子:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ollama-pvc
  namespace: ollama
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20G  

在部署中挂载 PVC:

更新 deploy.yaml 片段:

spec:
      containers:
      - name: ollama
        image: ollama/ollama:latest
        ports:
        - containerPort: 11434
        volumeMounts:
        - mountPath: /models
          name: model-storage
        # ... other configurations
      volumes:
      - name: model-storage
        persistentVolumeClaim:
          claimName: ollama-pvc

应用 PVC:

kubectl apply -f pvc.yaml

解释:

  • • PVC 申请的持久存储容量为 20Gi。
  • • Ollama 容器将此卷挂载在/models,确保任何下载或加载的模型都持久存储。

自动缩放

Kubernetes 可以根据 CPU 或内存使用情况自动调整 pod 副本数量,确保你的应用程序可以有效地处理不同的负载。

实施 Horizontal Pod Autoscaler (HPA):

hpa.yaml 例子:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: ollama-hpa
  namespace: ollama
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: ollama
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

应用 HPA 的步骤:

  1. \1. 将上述 YAML 内容保存到名为 hpa.yaml 的文件中。
  2. \2. 使用 kubectl 应用配置:
kubectl apply -f hpa.yaml

3.验证 HPA:

kubectl get hpa -n ollama

解释:

  • • HPA 会监控 Ollama 部署的 CPU 使用率。
  • • 如果 CPU 平均使用率超过 70%,Kubernetes 就会增加副本数量,最多不超过 5 个。
  • • 相反,如果 CPU 使用率降至目标值以下,它就会缩减,但不会低于 1 个副本的最小值。

注意:确保你的集群中安装了 Kubernetes Metrics Server,因为 HPA 依赖于它提供的指标。

监控和日志记录

有效的监控和日志记录对于维护 Ollama 部署的健康和性能至关重要。实施监控和日志记录解决方案可帮助你尽早发现问题并优化资源使用率。

Prometheus 和 Grafana

Prometheus 是一个强大的监控工具,可以收集和存储指标,而 Grafana 提供了丰富的仪表板界面来可视化这些指标。

设置 Prometheus 和 Grafana 的步骤:

  1. \1. 安装 Prometheus:你可以使用 Helm 安装 Prometheus:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/prometheus -n monitoring --create-namespace
  1. \1. 安装 Grafana:

类似地,使用 Helm 安装 Grafana:

helm install grafana prometheus-community/grafana -n monitoring

  1. \1. 访问 Grafana 仪表板:
  • • 转发 Grafana 服务端口以便在本地访问:
kubectl port-forward svc/grafana 3000:80 -n monitoring

  • • 打开浏览器并导航至 http://localhost:3000
  • • 默认凭据:
  • • 用户名: admin
  • • 密码:检索方式:
kubectl get secret grafana -o jsonpath="{.data.admin-password}" -n monitoring | base64 --decode ; echo

  1. \1. 在 Grafana 中将 Prometheus 配置为数据源:
  • • 在 Grafana 中,导航到 Configuration > Data Sources > Add data source。
  • • 选择 Prometheus 并将 URL 设置为 http://prometheus-server.monitoring.svc.cluster.local:80
  • • 保存并测试连接。
  1. \1. 创建仪表板:
  • • 使用预建的仪表板或创建自定义仪表板来监控 Ollama 的性能指标,例如 CPU 使用率、内存消耗、请求率和响应时间。

在 Ollama 中集成 Prometheus Metrics:

确保 Ollama 公开与 Prometheus 兼容的指标。这可能涉及配置 Ollama 以公开 /metrics 端点或使用 sidecar 容器来抓取和公开必要的指标。

使用 ELK Stack 进行集中日志记录

ELK Stack(由 Elasticsearch、Logstash 和 Kibana 组成)是一种流行的集中日志记录解决方案。它允许你收集、解析和可视化来自所有 Kubernetes 资源的日志。

设置 ELK Stack 的步骤:

  1. \1. 安装 Elasticsearch 和 Kibana:
helm repo add elastic https://helm.elastic.co
helm repo update
helm install elasticsearch elastic/elasticsearch -n logging --create-namespace
helm install kibana elastic/kibana -n logging
  1. \1. 安装 Logstash 或 Fluentd:对于 Kubernetes 环境,通常首选Fluentd进行日志收集。
helm install fluentd fluent/fluentd -n logging

  1. \1. 配置日志收集:
  • • 确保 Fluentd 已配置为从 Ollama 命名空间收集日志。
  • • 定义日志解析规则和输出目的地(Elasticsearch)。
  1. \1. 访问 Kibana 仪表板:
  • • 转发 Kibana 服务端口:
kubectl port-forward svc/kibana 5601:5601 -n logging

  • • 打开浏览器并导航至 http://localhost:5601
  • • 配置索引模式以可视化来自 Ollama 的日志。

集中日志记录的好处:

  • • 故障排除:通过分析日志快速识别并解决问题。
  • • 审计:出于合规和审计目的维护日志。
  • • 洞察:深入了解应用程序行为和性能趋势。

安全最佳实践

确保 Ollama 部署的安全对于保护敏感数据和确保模型的完整性至关重要。实施以下安全最佳实践:

  1. \1. 网络政策:
  • • 定义 Kubernetes 网络策略来限制 Pod 和服务之间的流量。
  • • 仅允许 Ollama 与其他服务之间进行必要的通信。

network-policy.yaml 例子:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ollama-policy
  namespace: ollama
spec:
  podSelector:
    matchLabels:
      app: ollama
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: allowed
    ports:
    - protocol: TCP
      port: 11434
  egress:
  - to:
    - podSelector:
        matchLabels:
          access: allowed
    ports:
    - protocol: TCP
      port: 80
  • • 该策略只允许来自带有标签 access: allowed 的 pod 的 11434 端口的入口流量,并按指定限制出口流量。
  1. \1. TLS加密:
  • • 为所有 API 通信启用 TLS 以加密传输中的数据。
  • • 使用带有 TLS 证书的 Kubernetes Ingress 控制器或实现相互 TLS (mTLS)。
  1. \1. 基于角色的访问控制(RBAC):
  • • 实施 RBAC 来控制对 Kubernetes 资源的访问。
  • • 为 Ollama 使用的服务账户分配最低权限。

角色和角色绑定示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: ollama
  name: ollama-role
rules:
- apiGroups: [""]
  resources: ["pods", "services"]
  verbs: ["get", "list", "watch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: ollama-rolebinding
  namespace: ollama
subjects:
- kind: ServiceAccount
  name: default
  namespace: ollama
roleRef:
  kind: Role
  name: ollama-role
  apiGroup: rbac.authorization.k8s.io
  1. \1. Secret 管理:
  • • 使用 Kubernetes Secrets 存储 API 密钥和密码等敏感数据。
  • • 避免在配置文件或容器镜像中硬编码机密。
  1. \1. 定期更新和修补:
  • • 使用安全补丁使 Ollama、Docker 镜像和 Kubernetes 组件保持最新状态。
  • • 尽可能实现自动更新以降低漏洞风险。
  1. \1. 审计日志:
  • • 启用 Kubernetes 审计日志来跟踪资源的访问和更改。
  • • 定期检查日志以发现可疑活动。

总结和最佳实践

在 Kubernetes 上部署 Ollama 为机器学习模型提供了可扩展、有弹性且易于管理的环境。以下是确保成功部署的关键步骤和最佳实践的回顾:

关键步骤回顾:

  1. \1. 命名空间创建:在专用的 Kubernetes 命名空间内隔离 Ollama 资源,以实现更好的组织和安全性。
  2. \2. 部署配置:定义一个 Kubernetes 部署,其中包含必要的容器、资源分配和生命周期挂钩,以管理 Ollama 和模型加载。
  3. \3. 服务设置:使用 Kubernetes 服务向外部公开 Ollama 的 API,根据你的环境和要求选择适当的服务类型。
  4. \4. 使用 Docker 进行本地测试:使用 Docker 进行本地开发和测试,在部署到 Kubernetes 之前实现快速迭代。
  5. \5. API 交互:利用 Ollama 的 REST API 来管理和查询模型,实现与你的应用程序的灵活集成。

最佳实践:

  1. \1. 资源分配:根据模型的要求和集群的容量仔细分配 CPU 和内存资源,以防止资源争用并确保最佳性能。
  2. \2. 监控:实施强大的监控解决方案,如 Prometheus 和 Grafana,以跟踪资源使用情况、应用程序性能并及早发现异常。
  3. \3. 自动扩展:使用 Kubernetes 的 Horizontal Pod Autoscaler 根据实时需求自动扩展 Ollama 实例的数量,确保高峰负载期间的高可用性。
  4. \4. 安全性:实施安全最佳实践,包括网络策略、RBAC、TLS 加密和秘密管理,以保护你的部署免受未经授权的访问和漏洞。
  5. \5. 持久存储:利用持久卷声明确保模型和其他关键数据在单个 pod 的生命周期之外持续存在,从而保持数据完整性和可用性。
  6. \6. 日志记录:使用 ELK Stack 等工具设置集中式日志记录,以收集、解析和可视化日志,从而更轻松地进行故障排除和审计。
  7. \7. 配置管理:使用 ConfigMaps 和 Secrets 来独立于容器镜像管理配置数据和敏感信息,从而提高模块化和安全性。
  8. \8. 定期更新:使用最新补丁和版本更新所有组件(包括 Ollama、Kubernetes 和 Docker 镜像),以降低安全风险并从新功能中受益。
  9. \9. 备份和恢复:对关键数据和配置实施备份策略,以确保在发生故障或数据丢失时快速恢复。
  10. \10. 文档和自动化:
  • • 维护部署过程和配置的清晰文档。
  • • 使用基础设施即代码 (IaC) 工具(如 Helm 或 Terraform)来自动化部署,确保一致性和可重复性。

通过遵循这些最佳实践,你可以确保在 Kubernetes 上部署的 Ollama 高效、安全,并且能够轻松处理各种工作负载。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

Logo

更多推荐